From BATV+e431fca72d399363b476+2442+infradead.org+hch@bombadil.srs.infradead.org Sat May 1 07:56:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o41CuY2a252632 for ; Sat, 1 May 2010 07:56:36 -0500 X-ASG-Debug-ID: 1272718720-2e0900540000-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 2E41F304F29 for ; Sat, 1 May 2010 05:58:40 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id lNveYqkHpcHorCgE for ; Sat, 01 May 2010 05:58:40 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1O8CHH-0007Bn-Aq; Sat, 01 May 2010 12:58:39 +0000 Date: Sat, 1 May 2010 08:58:39 -0400 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/5] [PATCH] xfs: simplify buffer to transaction matching Subject: Re: [PATCH 4/5] [PATCH] xfs: simplify buffer to transaction matching Message-ID: <20100501125839.GA26342@infradead.org> References: <20100418001041.865247520@bombadil.infradead.org> <20100418001058.677429475@bombadil.infradead.org> <20100420064155.GH15130@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100420064155.GH15130@dastard> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1272718721 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Apr 20, 2010 at 04:41:55PM +1000, Dave Chinner wrote: > Good start, but I think that it should use xfs_trans_first_item() > and xfs_trans_next_item() rather than walking the descriptor > table directly. I tried implementing it, but it doesn't work. We can call the buffer matching routines on transactions that don't have any item linked to it, which will cause xfs_trans_first_item to panic. Compare this code in xfs_trans_buf_item_match: for (licp = &tp->t_items; licp != NULL; licp = licp->lic_next) { if (xfs_lic_are_all_free(licp)) { ASSERT(licp == &tp->t_items); ASSERT(licp->lic_next == NULL); return NULL; } ... } to this in xfs_trans_first_item: licp = &tp->t_items; /* * If it's not in the first chunk, skip to the second. */ if (xfs_lic_are_all_free(licp)) { licp = licp->lic_next; } /* * Return the first non-free descriptor in the chunk. */ ASSERT(!xfs_lic_are_all_free(licp)); From xfs@tlinx.org Sat May 1 08:37:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o41Db8Zx255665 for ; Sat, 1 May 2010 08:37:08 -0500 X-ASG-Debug-ID: 1272721139-30d401ce0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from Ishtar.sc.tlinx.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0D859304E20 for ; Sat, 1 May 2010 06:39:09 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (173-164-175-65-SFBA.hfc.comcastbusiness.net [173.164.175.65]) by cuda.sgi.com with ESMTP id CWrAAYtC3999NOw6 for ; Sat, 01 May 2010 06:39:09 -0700 (PDT) Received: from [192.168.3.12] (Athenae [192.168.3.12]) by Ishtar.sc.tlinx.org (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o41Dcqi7014095; Sat, 1 May 2010 06:38:55 -0700 Message-ID: <4BDC2EEC.9080808@tlinx.org> Date: Sat, 01 May 2010 06:38:52 -0700 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: Peter Shuere CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Building XFSDump but missing uuid development package Subject: Re: Building XFSDump but missing uuid development package References: <53964.41414.qm@web180401.mail.gq1.yahoo.com> In-Reply-To: <53964.41414.qm@web180401.mail.gq1.yahoo.com> X-Stationery: 0.5.1 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 173-164-175-65-SFBA.hfc.comcastbusiness.net[173.164.175.65] X-Barracuda-Start-Time: 1272721155 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.28792 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Peter Shuere wrote: > Hi, > > I am trying to build the XFS utility, but during the build-process, I ran into a problem saying that I need the UUID development package to make the build complete. I am using OpenSUSE 11.2, where should I get the copy of the uuid-devel source (or binary, whichever one that works). (On SuSE 11.2:) > zypper se uuid Loading repository data... Reading installed packages... S | Name | Summary | Type --+---------------------+-------------------------------------------+----------- i | libuuid-devel | Development files for libuuid1 | package | libuuid-devel-32bit | Development files for libuuid1 | package i | libuuid1 | Library to generate UUIDs | package i | libuuid1-32bit | Library to generate UUIDs | package | perl-Data-UUID | Perl extension for generating Globally/-> | package | perl-Data-UUID | Perl extension for generating Globally/-> | srcpackage | uuidd | Utilities for the Second Extended File -> | package --- Does libuuid-devel not work for you? From tytso@thunk.org Sat May 1 14:45:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_ATTENTION autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o41JjOC2019250 for ; Sat, 1 May 2010 14:45:24 -0500 X-ASG-Debug-ID: 1272743250-4d1703230000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from thunker.thunk.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E07601DE2210 for ; Sat, 1 May 2010 12:47:30 -0700 (PDT) Received: from thunker.thunk.org (thunk.org [69.25.196.29]) by cuda.sgi.com with ESMTP id vdVaK8oPWRT2YIM7 for ; Sat, 01 May 2010 12:47:30 -0700 (PDT) Received: from root (helo=closure.thunk.org) by thunker.thunk.org with local-esmtp (Exim 4.50 #1 (Debian)) id 1O8Ied-0004PA-Ah; Sat, 01 May 2010 15:47:11 -0400 Received: from tytso by closure.thunk.org with local (Exim 4.69) (envelope-from ) id 1O8Iec-0001BE-JW; Sat, 01 May 2010 15:47:10 -0400 Date: Sat, 1 May 2010 15:47:10 -0400 From: tytso@mit.edu To: Andrew Morton Cc: "Aneesh Kumar K. V" , Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/4] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: Re: [PATCH 3/4] writeback: pay attention to wbc->nr_to_write in write_cache_pages Message-ID: <20100501194710.GV14986@thunk.org> Mail-Followup-To: tytso@mit.edu, Andrew Morton , "Aneesh Kumar K. V" , Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com References: <1271731314-5893-1-git-send-email-david@fromorbit.com> <1271731314-5893-4-git-send-email-david@fromorbit.com> <20100429143931.331c2bab.akpm@linux-foundation.org> <87sk6dwka6.fsf@linux.vnet.ibm.com> <20100430124329.10a4c02b.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100430124329.10a4c02b.akpm@linux-foundation.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on thunker.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: thunk.org[69.25.196.29] X-Barracuda-Start-Time: 1272743250 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=NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.28814 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Apr 30, 2010 at 12:43:29PM -0700, Andrew Morton wrote: > > Maybe that fs shouldn't be calling write_cache_pages() at all. After > all, write_cache_pages() is a wrapper which emits a sequence of calls > to ->writepage(), and ->writepage() writes a page. On my todo list is to fix ext4 to not call write_cache_pages() at all. We are seriously abusing that function ATM, since we're not actually writing the pages when we call write_cache_pages(). I won't go into what we're doing, because it's too embarassing, but suffice it to say that we end up calling pagevec_lookup() or pagevec_lookup_tag() *four*, count them *four* times while trying to do writeback. I have a simple patch that gives ext4 our own copy of write_cache_pages(), and then simplifies it a lot, and fixes a bunch of problems, but then I discarded it in favor of fundamentally redoing how we do writeback at all, but it's going to take a while to get things completely right. But I am working to try to fix this. If it would help, I can ressurect the "fork write_cache_pages() and simplify" patch, so ext4 isn't dependent on the mm/page-writeback.c's write_cache_pages(), if there is an immediate, short-term need to fix that function. - Ted From admin@sylaba.poznan.pl Sun May 2 21:16:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o432GTvp125859 for ; Sun, 2 May 2010 21:16:30 -0500 X-ASG-Debug-ID: 1272853110-185601e20002-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from brown.mccme.ru (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C95AE306F18 for ; Sun, 2 May 2010 19:18:35 -0700 (PDT) Received: from brown.mccme.ru (brown.mccme.ru [213.171.48.226]) by cuda.sgi.com with ESMTP id TPyqqRSTBrBzJJpj for ; Sun, 02 May 2010 19:18:35 -0700 (PDT) Received: from [213.171.48.246] (helo=webmail.mccme.ru) by brown.mccme.ru with esmtp (Exim 4.69 (FreeBSD)) (envelope-from ) id 1O78YA-0001K7-5s; Wed, 28 Apr 2010 18:47:42 +0400 Received: from 41.138.190.253 (SquirrelMail authenticated user vagordin) by webmail.mccme.ru with HTTP; Wed, 28 Apr 2010 14:47:42 -0000 (UTC) Message-ID: <2974.41.138.190.253.1272466062.squirrel@webmail.mccme.ru> Date: Wed, 28 Apr 2010 14:47:42 -0000 (UTC) X-ASG-Orig-Subj: Drodzy Webmail klient Subject: Drodzy Webmail klient From: "WEBMAIL UPGRADE" Reply-To: webupgradeuser@admin.in.th User-Agent: SquirrelMail/1.4.4 MIME-Version: 1.0 Content-Type: text/plain;charset=koi8-r Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-SA-Exim-Connect-IP: 213.171.48.246 X-SA-Exim-Mail-From: admin@sylaba.poznan.pl X-SA-Exim-Scanned: No (on brown.mccme.ru); SAEximRunCond expanded to false X-Bounce-ID: brown.mccme.ru X-Barracuda-Connect: brown.mccme.ru[213.171.48.226] X-Barracuda-Start-Time: 1272853116 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4311 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.58 X-Barracuda-Spam-Status: No, SCORE=1.58 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.28925 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.58 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Drodzy Webmail klient, Poczty przekroczyła limit 20 GB pamięci, w którym jest określone przez administrator, obecnie używasz na 20.9GB, Może nie być w stanie wysyłać i odbierać pocztę, aż ponownie zweryfikować skrzynki pocztowej. Do ponownej weryfikacji poczty proszę dalej i całkowicie swoje dane poprawnie: Login ID użytkownika e-mail: Hasło: Dzięki Administratora systemu. From SRS0+ChgG+62+fromorbit.com=david@internode.on.net Sun May 2 23:21:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o434Le1Y130030 for ; Sun, 2 May 2010 23:21:40 -0500 X-ASG-Debug-ID: 1272860625-6537001c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7A2A6306F7E for ; Sun, 2 May 2010 21:23:46 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id qKAxlio6K0pGfWwy for ; Sun, 02 May 2010 21:23:46 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 22822888-1927428 for multiple; Mon, 03 May 2010 13:53:44 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1O8nC3-0000qs-BI; Mon, 03 May 2010 14:23:43 +1000 Date: Mon, 3 May 2010 14:23:43 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/5] [PATCH] xfs: simplify buffer to transaction matching Subject: Re: [PATCH 4/5] [PATCH] xfs: simplify buffer to transaction matching Message-ID: <20100503042343.GD2591@dastard> References: <20100418001041.865247520@bombadil.infradead.org> <20100418001058.677429475@bombadil.infradead.org> <20100420064155.GH15130@dastard> <20100501125839.GA26342@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100501125839.GA26342@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1272860627 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.2, rules version 3.2.2.28934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, May 01, 2010 at 08:58:39AM -0400, Christoph Hellwig wrote: > On Tue, Apr 20, 2010 at 04:41:55PM +1000, Dave Chinner wrote: > > Good start, but I think that it should use xfs_trans_first_item() > > and xfs_trans_next_item() rather than walking the descriptor > > table directly. > > I tried implementing it, but it doesn't work. We can call the buffer > matching routines on transactions that don't have any item linked to > it, which will cause xfs_trans_first_item to panic. Compare this code > in xfs_trans_buf_item_match: > > for (licp = &tp->t_items; licp != NULL; licp = licp->lic_next) { > if (xfs_lic_are_all_free(licp)) { > ASSERT(licp == &tp->t_items); > ASSERT(licp->lic_next == NULL); > return NULL; > } > > ... > } > > to this in xfs_trans_first_item: > > licp = &tp->t_items; > /* > * If it's not in the first chunk, skip to the second. > */ > if (xfs_lic_are_all_free(licp)) { > licp = licp->lic_next; > } > > /* > * Return the first non-free descriptor in the chunk. > */ > ASSERT(!xfs_lic_are_all_free(licp)); Is there any reason why xfs_trans_first_item() should panic if it doesn't find a log item? I can't think of one that can't be handled by returning NULL and the caller doing ASSERT(lidp)? The callers: xfs_trans_count_vecs - has assert, triggers shutdown xfs_trans_fill_vecs - has assert, handles null return xfs_trans_committed - handles null return xfs_trans_uncommit - handles null return So it seems like we could make xfs_trans_first_item() not assert fail on debug kernels. The other thing that concerns me is that we have two different definitions of "empty transactions" in these two functions. It seems to me that xfs_trans_first_item() is the correct one - if we remove items from the transaction there is no guarantee that the embedded chunk in the transaction contains any active descriptors. Hence I think the code in xfs_trans_buf_item_match[_all]() is actually buggy... Cheers, Dave. -- Dave Chinner david@fromorbit.com From michael.monnerie@is.it-management.at Mon May 3 01:47:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o436li6G138376 for ; Mon, 3 May 2010 01:47:45 -0500 X-ASG-Debug-ID: 1272869389-464100e40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2D8CA1B06074 for ; Sun, 2 May 2010 23:49:49 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id M7WuN8CD1DHF54Qy for ; Sun, 02 May 2010 23:49:49 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 57769800187 for ; Mon, 3 May 2010 08:49:48 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 1A76D83C823 for ; Mon, 3 May 2010 08:49:48 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_fsr question for improvement Subject: Re: xfs_fsr question for improvement Date: Mon, 3 May 2010 08:49:43 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-vanilla; KDE/4.3.5; x86_64; ; ) References: <201004161043.11243@zmi.at> <20100417012415.GE2493@dastard> In-Reply-To: <20100417012415.GE2493@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart15342380.VbRfVO0Erk"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005030849.47591@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1272869391 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.2, rules version 3.2.2.28942 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart15342380.VbRfVO0Erk Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Samstag, 17. April 2010 Dave Chinner wrote: > They have thousands of extents in them and they are all between > 8-10GB in size, and IO from my VMs are stiall capable of saturating > the disks backing these files. While I'd normally consider these > files fragmented and candidates for running fsr on tme, the number > of extents is not actually a performance limiting factor and so > there's no point in defragmenting them. Especially as that requires > shutting down the VMs... I personally care less about file fragmentation than about=20 metadata/inode/directory fragmentation. This server gets accesses from=20 numerous people, # time find /mountpoint/ -inum 107901420 /mountpoint/some/dir/ectory/path/x.iso real 7m50.732s user 0m0.152s sys 0m2.376s It took nearly 8 minutes to search through that mount point, which is=20 6TB big on a RAID-5 striped over 7 2TB disks, so search speed should be=20 high. Especially as there are only 765.000 files on that disk: =46ilesystem Inodes IUsed IFree IUse% /mountpoint 1258291200 765659 1257525541 1% Wouldn't you say an 8 minutes search over just 765.000 files is slow,=20 even when only using 7x 2TB 7200rpm disks in RAID-5? > > Would it be possible xfs_fsr defrags the meta data in a way that > > they are all together so seeks are faster? >=20 > It's not related to fsr because fsr does not defragment metadata. > Some metadata cannot be defragmented (e.g. inodes cannot be moved), > some metadata cannot be manipulated directly (e.g. free space > btrees), and some is just difficult to do (e.g. directory > defragmentation) so hasn't ever been done. I see. On this particular server I know it would be good for performance=20 to have the metadata defrag'ed, but that's not the aim of xfs_fsr. But maybe some developer is bored once and finds a way to optimize the=20 search&find of files on an aged filesystem, i.e. metadata defrag :-) I tried this two times: # time find /mountpoint/ -inum 107901420 real 8m17.316s user 0m0.148s=20 sys 0m1.964s=20 # time find /mountpoint/ -inum 107901420 real 0m30.113s user 0m0.540s=20 sys 0m9.813s=20 Caching helps the 2nd time :-) =20 > > Currently, when I do "find /this_big_fs -inum 1234", it takes > > *ages* for a run, while there are not so many files on it: > > # iostat -kx 5 555 > > Device: r/s rkB/s avgrq-sz avgqu-sz await svctm=20 > > %util xvdb 23,20 92,80 8,00 0,42 15,28=20 > > 18,17 42,16 xvdc 20,20 84,00 8,32 0,57 =20 > > 28,40 28,36 57,28 >=20 > Well, it's not XFS's fault that each read IO is taking 20-30ms. You > can only do 30-50 IOs a second per drive at that rate, so: >=20 > [...] >=20 > > So I get 43 reads/second at 100% utilization. Well I can see up to >=20 > This is right on the money - it's going as fast a your (slow) RAID-5 > volume will allow it to.... >=20 > > 150r/s, but still that's no "wow". A single run to find an inode > > takes a very long time. >=20 > Raid 5/6 generally provides the same IOPS performance as a single > spindle, regardless of the width of the RAID stripe. A 2TB sata > drive might be able to do 150-200 IOPS, so a RAID5 array made up of > these drives will tend to max out at roughly the same.... Running xfs_fsr, I can see up to 1200r+1200w=3D2400I/Os per second: Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq- sz avgqu-sz await svctm %util xvdc 0,00 0,00 0,00 1191,42 0,00 52320,16 =20 87,83 121,23 96,77 0,71 84,63 xvde 0,00 0,00 1226,35 0,00 52324,15 0,00 =20 85,33 0,77 0,62 0,13 15,33 But on average it's about 600-700 read plus writes per second, so=20 1200-1400 IOPS.=20 Both "disks" are 2TB LVM volumes on the same raidset, I just had to=20 split it as XEN doesn't allow to create >2TB volumes. So, the badly slow I/O I see during "find" are not happening during fsr.=20 How can that be? I'm just running another "find" on a fresh remounted xfs, and I can see=20 the reads are happening on 2 of the 3 2TB volumes parallel: Device: r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await =20 svctm %util xvdb 103,20 0,00 476,80 0,00 9,24 0,46 =20 4,52 4,50 46,40 xvdc 97,80 0,00 455,20 0,00 9,31 0,52 =20 5,29 5,30 51,84 When I created that XFS, I took two 2TB partitions, did pvcreate,=20 vgcreate and lvcreate. Could it be that lvcreate automatically thought=20 it should do a RAID-0? Because all reads are equally split between the=20 two volumes. After a while, I added the 3rd 2TB volume, and I can't see=20 that behaviour there. So maybe this is the source of all evil. BTW: I changed mount options "atime,diratime" to "relatime,reldiratime"=20 now and "find" runtime went from 8 minutes down to 7m14s. =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart15342380.VbRfVO0Erk Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkvecgsACgkQzhSR9xwSCbSnEwCg36nlQTOc1VcH55khyOmjHQqx SLcAoNuGv6TZjgAx5rxovG5apfwZsdwq =EGIU -----END PGP SIGNATURE----- --nextPart15342380.VbRfVO0Erk-- From michael.monnerie@is.it-management.at Mon May 3 02:39:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o437d3RT140627 for ; Mon, 3 May 2010 02:39:03 -0500 X-ASG-Debug-ID: 1272872469-370501ce0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2767C3074EE for ; Mon, 3 May 2010 00:41:09 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id 3PEIhcojGMXEqJsH for ; Mon, 03 May 2010 00:41:09 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 05734800112 for ; Mon, 3 May 2010 09:41:08 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id A6F1883C823 for ; Mon, 3 May 2010 09:41:07 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_fsr question for improvement Subject: Re: xfs_fsr question for improvement Date: Mon, 3 May 2010 09:41:06 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-vanilla; KDE/4.3.5; x86_64; ; ) References: <201004161043.11243@zmi.at> <20100417012415.GE2493@dastard> <201005030849.47591@zmi.at> In-Reply-To: <201005030849.47591@zmi.at> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart2279591.YjFnkzqt7e"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005030941.07109@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1272872470 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.2, rules version 3.2.2.28944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart2279591.YjFnkzqt7e Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable On Montag, 3. Mai 2010 Michael Monnerie wrote: > When I created that XFS, I took two 2TB partitions, did pvcreate, > vgcreate and lvcreate. Could it be that lvcreate automatically > thought it should do a RAID-0? Because all reads are equally split > between the two volumes. After a while, I added the 3rd 2TB volume, > and I can't see that behaviour there. So maybe this is the source of > all evil. I found that lvcreate really is too smart: -i, --stripes Stripes Gives the number of stripes. This is equal to the number=20 of physical volumes to scatter the logical volume. So it seems lvcreate did know that the VG was split among 2 "disks", and=20 therefore used -i2 while I wanted -i1. > reldiratime Should be nodiratime, of course. =2D-=20 mit freundlichen Gr=C3=BCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=C3=A4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart2279591.YjFnkzqt7e Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkvefhMACgkQzhSR9xwSCbQKcQCfSDUqQ+GXWWECSu7Y9CYUOTTn c3cAnRl5Q9y0xbtZ9KaUKQIQc976+mFO =Wm7W -----END PGP SIGNATURE----- --nextPart2279591.YjFnkzqt7e-- From aarora@linux.vnet.ibm.com Mon May 3 03:29:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o438TdTk143035 for ; Mon, 3 May 2010 03:29:39 -0500 X-ASG-Debug-ID: 1272875506-532f00340000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e5.ny.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9FB29307474 for ; Mon, 3 May 2010 01:31:46 -0700 (PDT) Received: from e5.ny.us.ibm.com (e5.ny.us.ibm.com [32.97.182.145]) by cuda.sgi.com with ESMTP id 5JY3DT6atIZPhN1l for ; Mon, 03 May 2010 01:31:46 -0700 (PDT) Received: from d01relay07.pok.ibm.com (d01relay07.pok.ibm.com [9.56.227.147]) by e5.ny.us.ibm.com (8.14.3/8.13.1) with ESMTP id o438G5hu008620 for ; Mon, 3 May 2010 04:16:05 -0400 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay07.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o438Vitj2056410 for ; Mon, 3 May 2010 04:31:44 -0400 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.3/8.13.1/NCO v10.0 AVout) with ESMTP id o438ViA6023257 for ; Mon, 3 May 2010 05:31:44 -0300 Received: from amitarora.in.ibm.com ([9.77.205.175]) by d01av02.pok.ibm.com (8.14.3/8.13.1/NCO v10.0 AVin) with ESMTP id o438Vgqd023174; Mon, 3 May 2010 05:31:43 -0300 Received: from amitarora.in.ibm.com (amitarora.in.ibm.com [127.0.0.1]) by amitarora.in.ibm.com (Postfix) with ESMTP id 806B04854; Mon, 3 May 2010 14:01:41 +0530 (IST) Received: (from amit@localhost) by amitarora.in.ibm.com (8.14.2/8.14.2/Submit) id o438VZ5C019874; Mon, 3 May 2010 14:01:35 +0530 Date: Mon, 3 May 2010 14:01:35 +0530 From: "Amit K. Arora" To: Christoph Hellwig Cc: Andrew Morton , xfs@oss.sgi.com, Nikanth Karthikesan , coly.li@suse.de, Nick Piggin , Alexander Viro , linux-fsdevel@vger.kernel.org, "Theodore Ts'o" , Andreas Dilger , linux-ext4@vger.kernel.org, Eelis , Amit Arora X-ASG-Orig-Subj: [PATCH] New testcase to check if fallocate respects RLIMIT_FSIZE or not Subject: [PATCH] New testcase to check if fallocate respects RLIMIT_FSIZE or not Message-ID: <20100503083135.GC13756@amitarora.in.ibm.com> References: <201004281854.49730.knikanth@suse.de> <4BD85F1F.7030100@suse.de> <201004291014.07194.knikanth@suse.de> <20100430143319.d51d6d77.akpm@linux-foundation.org> <20100501070426.GA9562@amitarora.in.ibm.com> <20100501101846.GA3769@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100501101846.GA3769@infradead.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: e5.ny.us.ibm.com[32.97.182.145] X-Barracuda-Start-Time: 1272875506 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.2, rules version 3.2.2.28948 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, May 01, 2010 at 06:18:46AM -0400, Christoph Hellwig wrote: > On Sat, May 01, 2010 at 12:34:26PM +0530, Amit K. Arora wrote: > > Agreed. How about doing this check in the filesystem specific fallocate > > inode routines instead ? For example, in ext4 we could do : > > That looks okay - in fact XFS should already have this check because > it re-uses the setattr implementation to set the size. > > Can you submit an xfstests testcase to verify this behaviour on all > filesystems? Here is the new testcase. I have run this test on a x86_64 box on XFS and ext4 on 2.6.34-rc6. It passes on XFS, but fails on ext4. Below is the snapshot of results followed by the testcase itself. -- Regards, Amit Arora Test results: ------------ # ./check 228 FSTYP -- xfs (non-debug) PLATFORM -- Linux/x86_64 elm9m93 2.6.34-rc6 228 0s ... Ran: 228 Passed all 1 tests # # umount /mnt # mkfs.ext4 /dev/sda4 >/dev/null mke2fs 1.41.10 (10-Feb-2009) # ./check 228 FSTYP -- ext4 PLATFORM -- Linux/x86_64 elm9m93 2.6.34-rc6 228 0s ... - output mismatch (see 228.out.bad) --- 228.out 2010-05-03 02:51:24.000000000 -0400 +++ 228.out.bad 2010-05-03 04:27:33.000000000 -0400 @@ -1,2 +1 @@ QA output created by 228 -File size limit exceeded (core dumped) Ran: 228 Failures: 228 Failed 1 of 1 tests # Here is the test: ---------------- Add a new testcase to the xfstests suite to check if fallocate respects the limit imposed by RLIMIT_FSIZE (can be set by "ulimit -f XXX") or not, on a particular filesystem. Signed-off-by: Amit Arora diff -Nuarp xfstests-dev.org/228 xfstests-dev/228 --- xfstests-dev.org/228 1969-12-31 19:00:00.000000000 -0500 +++ xfstests-dev/228 2010-05-03 02:45:10.000000000 -0400 @@ -0,0 +1,79 @@ +#! /bin/bash +# FS QA Test No. 228 +# +# Check if fallocate respects RLIMIT_FSIZE +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 IBM Corporation. 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=aarora@in.ibm.com + +seq=`basename $0` +echo "QA output created by $seq" + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +here=`pwd` +tmp=$TEST_DIR/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 25 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +# generic, but xfs_io's fallocate must work +_supported_fs generic +# only Linux supports fallocate +_supported_os Linux + +[ -n "$XFS_IO_PROG" ] || _notrun "xfs_io executable not found" + +rm -f $seq.full + +# Sanity check to see if fallocate works +_require_xfs_io_falloc + +# Check if we have good enough space available +avail=`df -P $TEST_DIR | awk 'END {print $4}'` +[ "$avail" -ge 104000 ] || _notrun "Test device is too small ($avail KiB)" + +# Set the FSIZE ulimit to 100MB and check +ulimit -f 102400 +flim=`ulimit -f` +[ "$flim" != "unlimited" ] || _notrun "Unable to set FSIZE ulimit" +[ "$flim" -eq 102400 ] || _notrun "FSIZE ulimit is not correct (100 MB)" + +# FSIZE limit is now set to 100 MB. +# Lets try to preallocate 101 MB. This should fail. +$XFS_IO_PROG -F -f -c 'falloc 0 101m' $TEST_DIR/ouch +rm -f $TEST_DIR/ouch + +# Lets now try to preallocate 50 MB. This should succeed. +$XFS_IO_PROG -F -f -c 'falloc 0 50m' $TEST_DIR/ouch +rm -f $TEST_DIR/ouch + +# success, all done +status=0 +exit diff -Nuarp xfstests-dev.org/group xfstests-dev/group --- xfstests-dev.org/group 2010-05-03 02:35:09.000000000 -0400 +++ xfstests-dev/group 2010-05-03 02:45:21.000000000 -0400 @@ -341,3 +341,4 @@ deprecated 225 auto quick 226 auto enospc 227 auto fsr +228 rw auto prealloc quick From michael.monnerie@is.it-management.at Mon May 3 03:52:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o438qY3l144246 for ; Mon, 3 May 2010 03:52:34 -0500 X-ASG-Debug-ID: 1272876880-544e01190000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0BAE5307659 for ; Mon, 3 May 2010 01:54:40 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id LHv1InRhONA9ZgBO for ; Mon, 03 May 2010 01:54:40 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id B6B0A800183 for ; Mon, 3 May 2010 10:54:39 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 603CB83C823 for ; Mon, 3 May 2010 10:54:39 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: read slower than write on "mv"? Subject: read slower than write on "mv"? Date: Mon, 3 May 2010 10:54:28 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-vanilla; KDE/4.3.5; x86_64; ; ) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1632245.G5Q5NsuaWY"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005031054.38817@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1272876881 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.2, rules version 3.2.2.28950 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1632245.G5Q5NsuaWY Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable This is not XFS specific, I see it on every filesys. I do a=20 "mv . /newlocation" and see this with iostat: Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq- sz avgqu-sz await svctm %util xvdb 608,60 2,60 25967,20 102,40 85,31 5,37 =20 8,77 1,58 96,72 xvdg 0,00 608,60 0,00 26532,10 87,19 7,55 =20 12,41 0,12 7,44 Reading takes 97% I/O time, writing 7%. This is on the same raidset, but=20 I see the same when copying between two different single disks also. Or=20 is it just an effect of write caching that writes look faster than=20 reads? =2D-=20 mit freundlichen Gr=C3=BCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=C3=A4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart1632245.G5Q5NsuaWY Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkvej04ACgkQzhSR9xwSCbQgCQCgoJg7TW1o4nZ30FAtCjjFyBht 064AoPOsBCaeZxeUjB2J+Mlsgi0J7nhp =YbG2 -----END PGP SIGNATURE----- --nextPart1632245.G5Q5NsuaWY-- From SRS0+ChgG+62+fromorbit.com=david@internode.on.net Mon May 3 06:50:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o43Bo5h4151871 for ; Mon, 3 May 2010 06:50:05 -0500 X-ASG-Debug-ID: 1272887530-541e01c20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 69EC81DE3387 for ; Mon, 3 May 2010 04:52:10 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id BDbJ2ZjC64XKKSHK for ; Mon, 03 May 2010 04:52:10 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11280079-1927428 for multiple; Mon, 03 May 2010 21:22:09 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1O8uBz-0001DU-FC; Mon, 03 May 2010 21:52:07 +1000 Date: Mon, 3 May 2010 21:52:07 +1000 From: Dave Chinner To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: read slower than write on "mv"? Subject: Re: read slower than write on "mv"? Message-ID: <20100503115207.GE2591@dastard> References: <201005031054.38817@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201005031054.38817@zmi.at> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1272887532 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.2, rules version 3.2.2.28960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 03, 2010 at 10:54:28AM +0200, Michael Monnerie wrote: > This is not XFS specific, I see it on every filesys. I do a > "mv . /newlocation" and see this with iostat: > > Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq- > sz avgqu-sz await svctm %util > xvdb 608,60 2,60 25967,20 102,40 85,31 5,37 > 8,77 1,58 96,72 > xvdg 0,00 608,60 0,00 26532,10 87,19 7,55 > 12,41 0,12 7,44 > > Reading takes 97% I/O time, writing 7%. This is on the same raidset, but > I see the same when copying between two different single disks also. Or > is it just an effect of write caching that writes look faster than > reads? Yes, just an effect of write caching hiding IO latency. Cheers, Dave. -- Dave Chinner david@fromorbit.com From peter@palfrader.org Mon May 3 06:52:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o43BqYBk151958 for ; Mon, 3 May 2010 06:52:35 -0500 X-ASG-Debug-ID: 1272887679-050c02a70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from anguilla.debian.or.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9F95D1551D16 for ; Mon, 3 May 2010 04:54:40 -0700 (PDT) Received: from anguilla.debian.or.at (anguilla.debian.or.at [86.59.21.37]) by cuda.sgi.com with ESMTP id K26OKn93kzQZlwfF for ; Mon, 03 May 2010 04:54:40 -0700 (PDT) Received: by anguilla.debian.or.at (Postfix, from userid 1002) id BF21F10EBB8; Mon, 3 May 2010 13:54:38 +0200 (CEST) Date: Mon, 3 May 2010 13:54:38 +0200 From: Peter Palfrader To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, david@fromorbit.com, stable@kernel.org X-ASG-Orig-Subj: [regression,bisected] 2.6.32.12: find(1) on xfs causes OOM Subject: [regression,bisected] 2.6.32.12: find(1) on xfs causes OOM Message-ID: <20100503115438.GA16623@anguilla.noreply.org> Mail-Followup-To: Peter Palfrader , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, david@fromorbit.com, stable@kernel.org MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline X-PGP: 1024D/94C09C7F 5B00 C96D 5D54 AEE1 206B AF84 DE7A AF6E 94C0 9C7F X-Request-PGP: http://www.palfrader.org/keys/94C09C7F.asc X-Accept-Language: de, en User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: anguilla.debian.or.at[86.59.21.37] X-Barracuda-Start-Time: 1272887681 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.2, rules version 3.2.2.28959 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, I have an xfs filesystem in a KVM domain with 512megs of memory and 2 gigs of swap. The filesystem is 750g in size, of which some 500g are in use in about 6 million files. (This XFS filesystem is exported via nfs4. I haven't tested if this makes any difference.) Starting in 2.6.32.12 running something like "find | wc -l" on this filesystem's mountpoint causes the OOM killer to kill off most of the system. (See kern.log[1]) With 2.6.32.11 the system does not behave like this. Bisecting turned up the following commit. Reverting it in 2.6.32.12 also results in a system that works. | 9e1e9675fb29c0e94a7c87146138aa2135feba2f is first bad commit | commit 9e1e9675fb29c0e94a7c87146138aa2135feba2f | Author: Dave Chinner | Date: Fri Mar 12 09:42:10 2010 +1100 | | xfs: reclaim all inodes by background tree walks | | commit 57817c68229984818fea9e614d6f95249c3fb098 upstream | | We cannot do direct inode reclaim without taking the flush lock to | ensure that we do not reclaim an inode under IO. We check the inode | is clean before doing direct reclaim, but this is not good enough | because the inode flush code marks the inode clean once it has | copied the in-core dirty state to the backing buffer. | | It is the flush lock that determines whether the inode is still | under IO, even though it is marked clean, and the inode is still | required at IO completion so we can't reclaim it even though it is | clean in core. Hence the requirement that we need to take the flush | lock even on clean inodes because this guarantees that the inode | writeback IO has completed and it is safe to reclaim the inode. | | With delayed write inode flushing, we could end up waiting a long | time on the flush lock even for a clean inode. The background | reclaim already handles this efficiently, so avoid all the problems | by killing the direct reclaim path altogether. | | Signed-off-by: Dave Chinner | Reviewed-by: Christoph Hellwig | Signed-off-by: Alex Elder | Signed-off-by: Greg Kroah-Hartman | | diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c | index a82a93d..ea7a59a 100644 | --- a/fs/xfs/linux-2.6/xfs_super.c | +++ b/fs/xfs/linux-2.6/xfs_super.c | @@ -953,16 +953,14 @@ xfs_fs_destroy_inode( | ASSERT_ALWAYS(!xfs_iflags_test(ip, XFS_IRECLAIM)); | | /* | - * If we have nothing to flush with this inode then complete the | - * teardown now, otherwise delay the flush operation. | + * We always use background reclaim here because even if the | + * inode is clean, it still may be under IO and hence we have | + * to take the flush lock. The background reclaim path handles | + * this more efficiently than we can here, so simply let background | + * reclaim tear down all inodes. | */ | - if (!xfs_inode_clean(ip)) { | - xfs_inode_set_reclaim_tag(ip); | - return; | - } | - | out_reclaim: | - xfs_ireclaim(ip); | + xfs_inode_set_reclaim_tag(ip); | } | | /* Cheers, Peter 1. http://asteria.noreply.org/~weasel/volatile/2010-05-03-Aju29kSrm0A/kern.log 2. http://asteria.noreply.org/~weasel/volatile/2010-05-03-Aju29kSrm0A/config-2.6.32.12-dsa-amd64 -- | .''`. ** Debian GNU/Linux ** Peter Palfrader | : :' : The universal http://www.palfrader.org/ | `. `' Operating System | `- http://www.debian.org/ From SRS0+ChgG+62+fromorbit.com=david@internode.on.net Mon May 3 07:15:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o43CFDOE153173 for ; Mon, 3 May 2010 07:15:13 -0500 X-ASG-Debug-ID: 1272889038-192f034b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 986F8307F7F for ; Mon, 3 May 2010 05:17:19 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id KsokmC62TlIps8fY for ; Mon, 03 May 2010 05:17:19 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 22881792-1927428 for multiple; Mon, 03 May 2010 21:47:18 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1O8uaK-0001F2-9U; Mon, 03 May 2010 22:17:16 +1000 Date: Mon, 3 May 2010 22:17:16 +1000 From: Dave Chinner To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_fsr question for improvement Subject: Re: xfs_fsr question for improvement Message-ID: <20100503121716.GF2591@dastard> References: <201004161043.11243@zmi.at> <20100417012415.GE2493@dastard> <201005030849.47591@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201005030849.47591@zmi.at> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1272889040 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.2, rules version 3.2.2.28960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 03, 2010 at 08:49:43AM +0200, Michael Monnerie wrote: > On Samstag, 17. April 2010 Dave Chinner wrote: > > They have thousands of extents in them and they are all between > > 8-10GB in size, and IO from my VMs are stiall capable of saturating > > the disks backing these files. While I'd normally consider these > > files fragmented and candidates for running fsr on tme, the number > > of extents is not actually a performance limiting factor and so > > there's no point in defragmenting them. Especially as that requires > > shutting down the VMs... > > I personally care less about file fragmentation than about > metadata/inode/directory fragmentation. This server gets accesses from > numerous people, > > # time find /mountpoint/ -inum 107901420 > /mountpoint/some/dir/ectory/path/x.iso > > real 7m50.732s > user 0m0.152s > sys 0m2.376s > > It took nearly 8 minutes to search through that mount point, which is > 6TB big on a RAID-5 striped over 7 2TB disks, so search speed should be > high. Not necessarily, as your raid array has shown. > > Especially as there are only 765.000 files on that disk: > Filesystem Inodes IUsed IFree IUse% > /mountpoint 1258291200 765659 1257525541 1% > > Wouldn't you say an 8 minutes search over just 765.000 files is slow, > even when only using 7x 2TB 7200rpm disks in RAID-5? Depends on the directory structure and the number of IOs needed to traverse it. If it's only a handful of files per directory, then you get no internal directory readahead to hide read latency. That results in a small random synchronous read workload that might require a couple of hundred thousand IOs to complete. >From your early stats showing a read rate of 50 IO/s from the raid array, then the directory read traverse has requires about 25kiops to complete. That takes about 10s on my laptop's cheap SSD, which does random reads about 50x faster than your RAID array.... > > > Would it be possible xfs_fsr defrags the meta data in a way that > > > they are all together so seeks are faster? > > > > It's not related to fsr because fsr does not defragment metadata. > > Some metadata cannot be defragmented (e.g. inodes cannot be moved), > > some metadata cannot be manipulated directly (e.g. free space > > btrees), and some is just difficult to do (e.g. directory > > defragmentation) so hasn't ever been done. > > I see. On this particular server I know it would be good for performance > to have the metadata defrag'ed, but that's not the aim of xfs_fsr. > But maybe some developer is bored once and finds a way to optimize the > search&find of files on an aged filesystem, i.e. metadata defrag :-) Many have. Find and tar have resisted attempts to optimise them over the years, so stuff like this: http://oss.oracle.com/~mason/acp/ grows on the interwebs all over the place... ;) > I tried this two times: > # time find /mountpoint/ -inum 107901420 > real 8m17.316s > user 0m0.148s > sys 0m1.964s > > # time find /mountpoint/ -inum 107901420 > real 0m30.113s > user 0m0.540s > sys 0m9.813s > > Caching helps the 2nd time :-) That still seems rather slow traversing 750,000 cached directory entries. My laptop (1.3GHz CULV core2 CPU) does 465,000 directory entries in: $ time sudo find / -mount -inum 123809285 real 0m2.196s user 0m0.384s sys 0m1.464s > > Raid 5/6 generally provides the same IOPS performance as a single > > spindle, regardless of the width of the RAID stripe. A 2TB sata > > drive might be able to do 150-200 IOPS, so a RAID5 array made up of > > these drives will tend to max out at roughly the same.... > > Running xfs_fsr, I can see up to 1200r+1200w=2400I/Os per second: > > Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq- > sz avgqu-sz await svctm %util > xvdc 0,00 0,00 0,00 1191,42 0,00 52320,16 > 87,83 121,23 96,77 0,71 84,63 > xvde 0,00 0,00 1226,35 0,00 52324,15 0,00 > 85,33 0,77 0,62 0,13 15,33 > > But on average it's about 600-700 read plus writes per second, so > 1200-1400 IOPS. > Both "disks" are 2TB LVM volumes on the same raidset, I just had to > split it as XEN doesn't allow to create >2TB volumes. > > So, the badly slow I/O I see during "find" are not happening during fsr. > How can that be? Because most of the IO xfs_fsr does is large sequential IO which the RAID caches are optimised for. Directory traversals, OTOH, are small, semi-random IO which are latency sensitive.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+lq9o+62+fromorbit.com=david@internode.on.net Mon May 3 07:34:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o43CY7o9153905 for ; Mon, 3 May 2010 07:34:08 -0500 X-ASG-Debug-ID: 1272890171-542902ae0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 90D0E1DE2960 for ; Mon, 3 May 2010 05:36:12 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id GDIflvHc59Gb0NdI for ; Mon, 03 May 2010 05:36:12 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 22893953-1927428 for multiple; Mon, 03 May 2010 22:06:08 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1O8usY-0001Fe-5J; Mon, 03 May 2010 22:36:06 +1000 Date: Mon, 3 May 2010 22:36:06 +1000 From: Dave Chinner To: Peter Palfrader , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, stable@kernel.org X-ASG-Orig-Subj: Re: [regression,bisected] 2.6.32.12: find(1) on xfs causes OOM Subject: Re: [regression,bisected] 2.6.32.12: find(1) on xfs causes OOM Message-ID: <20100503123606.GG2591@dastard> References: <20100503115438.GA16623@anguilla.noreply.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100503115438.GA16623@anguilla.noreply.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1272890173 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.2, rules version 3.2.2.28961 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 03, 2010 at 01:54:38PM +0200, Peter Palfrader wrote: > Hi, > > I have an xfs filesystem in a KVM domain with 512megs of memory and 2 gigs of > swap. > > The filesystem is 750g in size, of which some 500g are in use in about 6 > million files. (This XFS filesystem is exported via nfs4. I haven't tested if > this makes any difference.) > > Starting in 2.6.32.12 running something like "find | wc -l" on this > filesystem's mountpoint causes the OOM killer to kill off most of the > system. (See kern.log[1]) Knwon problem. As a workaraound, you can increase the frequency at which the xfssyncd runs so that it is less than the default 30s between background reclaim runs. > With 2.6.32.11 the system does not behave like this. > > Bisecting turned up the following commit. Reverting it in 2.6.32.12 > also results in a system that works. > > | 9e1e9675fb29c0e94a7c87146138aa2135feba2f is first bad commit > | commit 9e1e9675fb29c0e94a7c87146138aa2135feba2f > | Author: Dave Chinner > | Date: Fri Mar 12 09:42:10 2010 +1100 > | > | xfs: reclaim all inodes by background tree walks Reverting this leaves you running with a subtly altered and completely untested reclaim path that I'm not sure does the right thing in all situations. I wouldn't run that revert on my machines, nor recommend it for anyone else. But it's up to you if you want to run it on your machines.... The fix for this problem only got to mainline a couple of days ago. http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=9bf729c0af67897ea8498ce17c29b0683f7f2028 I've got to backport it to the stable kernel tree so the next stable kernel should fix this. Cheers, Dave. -- Dave Chinner david@fromorbit.com From peter@palfrader.org Mon May 3 07:42:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o43CgTK3154186 for ; Mon, 3 May 2010 07:42:29 -0500 X-ASG-Debug-ID: 1272890676-4d12034e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from anguilla.debian.or.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6603E132E2FD for ; Mon, 3 May 2010 05:44:36 -0700 (PDT) Received: from anguilla.debian.or.at (anguilla.debian.or.at [86.59.21.37]) by cuda.sgi.com with ESMTP id tU7EVqUBBY99X7lI for ; Mon, 03 May 2010 05:44:36 -0700 (PDT) Received: by anguilla.debian.or.at (Postfix, from userid 1002) id 3711510EBB6; Mon, 3 May 2010 14:44:36 +0200 (CEST) Date: Mon, 3 May 2010 14:44:36 +0200 From: Peter Palfrader To: Dave Chinner Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, stable@kernel.org X-ASG-Orig-Subj: Re: [regression,bisected] 2.6.32.12: find(1) on xfs causes OOM Subject: Re: [regression,bisected] 2.6.32.12: find(1) on xfs causes OOM Message-ID: <20100503124436.GB16623@anguilla.noreply.org> Mail-Followup-To: Peter Palfrader , Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, stable@kernel.org References: <20100503115438.GA16623@anguilla.noreply.org> <20100503123606.GG2591@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: <20100503123606.GG2591@dastard> X-PGP: 1024D/94C09C7F 5B00 C96D 5D54 AEE1 206B AF84 DE7A AF6E 94C0 9C7F X-Request-PGP: http://www.palfrader.org/keys/94C09C7F.asc X-Accept-Language: de, en User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: anguilla.debian.or.at[86.59.21.37] X-Barracuda-Start-Time: 1272890677 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.2, rules version 3.2.2.28961 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 03 May 2010, Dave Chinner wrote: > > Starting in 2.6.32.12 running something like "find | wc -l" on this > > filesystem's mountpoint causes the OOM killer to kill off most of the > > system. (See kern.log[1]) > > Knwon problem. > The fix for this problem only got to mainline a couple of days ago. > > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=9bf729c0af67897ea8498ce17c29b0683f7f2028 > > I've got to backport it to the stable kernel tree so the next stable > kernel should fix this. Thanks, I'll stay on .11 on that machine for now then. -- | .''`. ** Debian GNU/Linux ** Peter Palfrader | : :' : The universal http://www.palfrader.org/ | `. `' Operating System | `- http://www.debian.org/ From BATV+34c124583dd587bcabd0+2444+infradead.org+hch@bombadil.srs.infradead.org Mon May 3 08:32:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o43DWe3v156458 for ; Mon, 3 May 2010 08:32:40 -0500 X-ASG-Debug-ID: 1272893687-68cf03d30000-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 572EB1554454 for ; Mon, 3 May 2010 06:34:48 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id PBFBbK0gy8iletOz for ; Mon, 03 May 2010 06:34:48 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1O8vnL-0005bJ-Gz for xfs@oss.sgi.com; Mon, 03 May 2010 13:34:47 +0000 Date: Mon, 3 May 2010 09:34:47 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: kill xfs_trans_find_item Subject: [PATCH] xfs: kill xfs_trans_find_item Message-ID: <20100503133447.GA21325@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1272893688 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean xfs_trans_find_item is just and awkward way to derefence ->li_desc in the log_item structure. So replace the calls to it with the direct reference, and while we're at it also make these type-safe instead using casts. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/quota/xfs_trans_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c 2010-04-30 18:33:49.928263075 +0200 +++ xfs/fs/xfs/quota/xfs_trans_dquot.c 2010-05-03 15:28:51.713004310 +0200 @@ -93,12 +93,10 @@ xfs_trans_log_dquot( xfs_trans_t *tp, xfs_dquot_t *dqp) { - xfs_log_item_desc_t *lidp; + xfs_log_item_desc_t *lidp = dqp->q_logitem.qli_item.li_desc; ASSERT(dqp->q_transp == tp); ASSERT(XFS_DQ_IS_LOCKED(dqp)); - - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)(&dqp->q_logitem)); ASSERT(lidp != NULL); tp->t_flags |= XFS_TRANS_DIRTY; @@ -890,9 +888,8 @@ xfs_trans_log_quotaoff_item( xfs_trans_t *tp, xfs_qoff_logitem_t *qlp) { - xfs_log_item_desc_t *lidp; + xfs_log_item_desc_t *lidp = qlp->qql_item.li_desc; - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)qlp); ASSERT(lidp != NULL); tp->t_flags |= XFS_TRANS_DIRTY; Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2010-05-01 15:06:36.160254276 +0200 +++ xfs/fs/xfs/xfs_buf_item.c 2010-05-03 15:28:51.714004520 +0200 @@ -441,13 +441,10 @@ xfs_buf_item_unpin_remove( * occurs later in the xfs_trans_uncommit() will try to * reference the buffer which we no longer have a hold on. */ - struct xfs_log_item_desc *lidp; - ASSERT(XFS_BUF_VALUSEMA(bip->bli_buf) <= 0); trace_xfs_buf_item_unpin_stale(bip); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)bip); - xfs_trans_free_item(tp, lidp); + xfs_trans_free_item(tp, bip->bli_item.li_desc); /* * Since the transaction no longer refers to the buffer, the Index: xfs/fs/xfs/xfs_extfree_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_extfree_item.c 2010-04-30 18:33:49.911254275 +0200 +++ xfs/fs/xfs/xfs_extfree_item.c 2010-05-03 15:28:51.719004170 +0200 @@ -132,18 +132,18 @@ STATIC void xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) { struct xfs_ail *ailp = efip->efi_item.li_ailp; - xfs_log_item_desc_t *lidp; spin_lock(&ailp->xa_lock); if (efip->efi_flags & XFS_EFI_CANCELED) { + xfs_log_item_t *lip = &efip->efi_item; + /* * free the xaction descriptor pointing to this item */ - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *) efip); - xfs_trans_free_item(tp, lidp); + xfs_trans_free_item(tp, lip->li_desc); /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); + xfs_trans_ail_delete(ailp, lip); xfs_efi_item_free(efip); } else { efip->efi_flags |= XFS_EFI_COMMITTED; Index: xfs/fs/xfs/xfs_trans_buf.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_buf.c 2010-05-01 14:59:07.653003960 +0200 +++ xfs/fs/xfs/xfs_trans_buf.c 2010-05-03 15:28:51.723003751 +0200 @@ -518,7 +518,7 @@ xfs_trans_brelse(xfs_trans_t *tp, * Find the item descriptor pointing to this buffer's * log item. It must be there. */ - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); + lidp = bip->bli_item.li_desc; ASSERT(lidp != NULL); trace_xfs_trans_brelse(bip); @@ -707,7 +707,7 @@ xfs_trans_log_buf(xfs_trans_t *tp, bip->bli_format.blf_flags &= ~XFS_BLI_CANCEL; } - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); + lidp = bip->bli_item.li_desc; ASSERT(lidp != NULL); tp->t_flags |= XFS_TRANS_DIRTY; @@ -748,7 +748,7 @@ xfs_trans_binval( ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); + lidp = bip->bli_item.li_desc; ASSERT(lidp != NULL); ASSERT(atomic_read(&bip->bli_refcount) > 0); Index: xfs/fs/xfs/xfs_trans_extfree.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_extfree.c 2010-05-01 14:59:07.653003960 +0200 +++ xfs/fs/xfs/xfs_trans_extfree.c 2010-05-03 15:28:51.728005428 +0200 @@ -65,11 +65,10 @@ xfs_trans_log_efi_extent(xfs_trans_t *t xfs_fsblock_t start_block, xfs_extlen_t ext_len) { - xfs_log_item_desc_t *lidp; + xfs_log_item_desc_t *lidp = efip->efi_item.li_desc; uint next_extent; xfs_extent_t *extp; - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)efip); ASSERT(lidp != NULL); tp->t_flags |= XFS_TRANS_DIRTY; @@ -122,11 +121,10 @@ xfs_trans_log_efd_extent(xfs_trans_t *t xfs_fsblock_t start_block, xfs_extlen_t ext_len) { - xfs_log_item_desc_t *lidp; + xfs_log_item_desc_t *lidp = efdp->efd_item.li_desc; uint next_extent; xfs_extent_t *extp; - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)efdp); ASSERT(lidp != NULL); tp->t_flags |= XFS_TRANS_DIRTY; Index: xfs/fs/xfs/xfs_trans_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_inode.c 2010-04-30 18:33:49.886254554 +0200 +++ xfs/fs/xfs/xfs_trans_inode.c 2010-05-03 15:28:51.732005497 +0200 @@ -149,13 +149,11 @@ xfs_trans_log_inode( xfs_inode_t *ip, uint flags) { - xfs_log_item_desc_t *lidp; + xfs_log_item_desc_t *lidp = ip->i_itemp->ili_item.li_desc; ASSERT(ip->i_transp == tp); ASSERT(ip->i_itemp != NULL); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)(ip->i_itemp)); ASSERT(lidp != NULL); tp->t_flags |= XFS_TRANS_DIRTY; Index: xfs/fs/xfs/xfs_trans_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_item.c 2010-05-01 14:59:07.653003960 +0200 +++ xfs/fs/xfs/xfs_trans_item.c 2010-05-03 15:28:51.736005218 +0200 @@ -177,25 +177,6 @@ xfs_trans_free_item(xfs_trans_t *tp, xfs } /* - * This is called to find the descriptor corresponding to the given - * log item. It returns a pointer to the descriptor. - * The log item MUST have a corresponding descriptor in the given - * transaction. This routine does not return NULL, it panics. - * - * The descriptor pointer is kept in the log item's li_desc field. - * Just return it. - */ -/*ARGSUSED*/ -xfs_log_item_desc_t * -xfs_trans_find_item(xfs_trans_t *tp, xfs_log_item_t *lip) -{ - ASSERT(lip->li_desc != NULL); - - return lip->li_desc; -} - - -/* * Return a pointer to the first descriptor in the chunk list. * This does not return NULL if there are none, it panics. * Index: xfs/fs/xfs/xfs_trans_priv.h =================================================================== --- xfs.orig/fs/xfs/xfs_trans_priv.h 2010-05-01 14:59:07.654003960 +0200 +++ xfs/fs/xfs/xfs_trans_priv.h 2010-05-03 15:28:51.740033714 +0200 @@ -30,8 +30,6 @@ struct xfs_log_item_desc *xfs_trans_add_ struct xfs_log_item *); void xfs_trans_free_item(struct xfs_trans *, struct xfs_log_item_desc *); -struct xfs_log_item_desc *xfs_trans_find_item(struct xfs_trans *, - struct xfs_log_item *); struct xfs_log_item_desc *xfs_trans_first_item(struct xfs_trans *); struct xfs_log_item_desc *xfs_trans_next_item(struct xfs_trans *, struct xfs_log_item_desc *); From BATV+34c124583dd587bcabd0+2444+infradead.org+hch@bombadil.srs.infradead.org Mon May 3 10:43:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o43Fh3hN161622 for ; Mon, 3 May 2010 10:43:05 -0500 X-ASG-Debug-ID: 1272901511-4bf800360000-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 7EA84308BC1 for ; Mon, 3 May 2010 08:45:11 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id BQmuZCfbq2rTVskX for ; Mon, 03 May 2010 08:45:11 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1O8xpW-0004db-SH for xfs@oss.sgi.com; Mon, 03 May 2010 15:45:10 +0000 Date: Mon, 3 May 2010 11:45:10 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: kill xfs_trans_find_item Subject: Re: [PATCH] xfs: kill xfs_trans_find_item Message-ID: <20100503154510.GA15411@infradead.org> References: <20100503133447.GA21325@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100503133447.GA21325@infradead.org> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1272901511 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 03, 2010 at 09:34:47AM -0400, Christoph Hellwig wrote: > xfs_trans_find_item is just and awkward way to derefence ->li_desc in > the log_item structure. So replace the calls to it with the direct > reference, and while we're at it also make these type-safe instead using > casts. Actually, ignore this patch for now. I have a larger one that will incorporate it. From SRS0+4mlS+63+fromorbit.com=david@internode.on.net Mon May 3 20:48:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o441meWC190348 for ; Mon, 3 May 2010 20:48:40 -0500 X-ASG-Debug-ID: 1272937845-3f3b03240000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A2DE691E1D0 for ; Mon, 3 May 2010 18:50:46 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id f41DvEVkAU0ZgwO9 for ; Mon, 03 May 2010 18:50:46 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 22782987-1927428 for ; Tue, 04 May 2010 11:20:44 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1O97HW-000285-Rg for xfs@oss.sgi.com; Tue, 04 May 2010 11:50:42 +1000 Date: Tue, 4 May 2010 11:50:42 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [GIT] Delayed Logging V3 Subject: [GIT] Delayed Logging V3 Message-ID: <20100504015042.GA8120@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1272937848 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-ASG-Whitelist: BODY (http://marc\.info/\?) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Folks, This is version 3 of the delayed logging series. I won't repeat everything about what it is, just point you here: http://marc.info/?l=linux-xfs&m=126862777118946&w=2 for the description, and here: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/xfs.git delayed-logging for the current code. Note that this is a rebased branch, so you'll need to pull it again into a new branch to review. All previously known, reproducable issues have been fixed in this release, and as such I consider it ready from a functional POV for inclusion into the -dev tree as an experimental feature. The new cleanups added in this version mean it toucheŃ• more files that the previous versions, but overall it should still be simpler to review because I've collapsed many of the intermediate patches into one "Introduce delayed logging core code" commit. Version 3: 28 files changed, 2366 insertions(+), 506 deletions(-) Version 2: 22 files changed, 2188 insertions(+), 377 deletions(-) Version 1: 19 files changed, 2594 insertions(+), 580 deletions(-) Changes for V3: o changed buffer log item reference counted model to be consistent for both logging modes o cleaned up XFS_BLI flags usage (new commit) o separated out log ticket overrun printing cleanup (new commit) o made sure "delaylog" option shows up in /proc/mounts o collapsed many of the intermediate commits together to make it easier to review o fixed inode buffer tagging issue that was causing shutdowns in log recovery in test 087 and 121 Changes for V2: o 22 files changed, 2188 insertions(+), 377 deletions(-) o fixed some memory leaks o fixed ticket allocation for checkpoints to use KM_NOFS o minor code cleanups o performed stress and scalability testing The following changes since commit 6ff75b78182c314112c1173edaab6c164c95d775: Christoph Hellwig (1): xfs: mark xfs_iomap_write_ helpers static are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/xfs.git delayed-logging Dave Chinner (10): xfs: Improve scalability of busy extent tracking xfs: allow log ticket allocation to take allocation flags xfs: modify buffer item reference counting V2 xfs: allow detection of inode allocation buffers in recovery xfs: clean up log ticket overrun debug output xfs: Delayed logging design documentation xfs: Introduce delayed logging core code xfs: forced unmounts need to push the CIL xfs: enable background pushing of the CIL xfs: allow detection of inode allocation buffers in recovery .../filesystems/xfs-delayed-logging-design.txt | 819 ++++++++++++++++++++ fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_buf.c | 11 +- fs/xfs/linux-2.6/xfs_quotaops.c | 1 + fs/xfs/linux-2.6/xfs_super.c | 12 +- fs/xfs/linux-2.6/xfs_trace.h | 80 ++- fs/xfs/quota/xfs_dquot.c | 6 +- fs/xfs/support/debug.c | 1 + fs/xfs/xfs_ag.h | 21 +- fs/xfs/xfs_alloc.c | 272 ++++--- fs/xfs/xfs_alloc.h | 5 +- fs/xfs/xfs_buf_item.c | 166 ++-- fs/xfs/xfs_buf_item.h | 18 +- fs/xfs/xfs_error.c | 2 +- fs/xfs/xfs_filestream.c | 1 + fs/xfs/xfs_log.c | 107 ++- fs/xfs/xfs_log.h | 12 +- fs/xfs/xfs_log_cil.c | 729 +++++++++++++++++ fs/xfs/xfs_log_priv.h | 118 +++- fs/xfs/xfs_log_recover.c | 46 +- fs/xfs/xfs_log_recover.h | 2 +- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 216 +++++- fs/xfs/xfs_trans.h | 45 +- fs/xfs/xfs_trans_buf.c | 46 +- fs/xfs/xfs_trans_extfree.c | 1 + fs/xfs/xfs_trans_item.c | 114 +--- fs/xfs/xfs_trans_priv.h | 19 +- 28 files changed, 2366 insertions(+), 506 deletions(-) create mode 100644 Documentation/filesystems/xfs-delayed-logging-design.txt create mode 100644 fs/xfs/xfs_log_cil.c Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+Madt+63+fromorbit.com=david@internode.on.net Mon May 3 21:56:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o442uRYN194030 for ; Mon, 3 May 2010 21:56:28 -0500 X-ASG-Debug-ID: 1272941913-46d801070000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2EB9A30ABCB for ; Mon, 3 May 2010 19:58:34 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id gNDedutdGBn5xZkk for ; Mon, 03 May 2010 19:58:34 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11360481-1927428 for ; Tue, 04 May 2010 12:28:32 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1O98Ky-0002Dl-91; Tue, 04 May 2010 12:58:20 +1000 Date: Tue, 4 May 2010 12:58:20 +1000 From: Dave Chinner To: stable@kernel.org Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: stable update for 2.6.32.x and 2.6.33.y Subject: [PATCH] xfs: stable update for 2.6.32.x and 2.6.33.y Message-ID: <20100504025820.GI2591@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1272941915 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.2, rules version 3.2.2.29010 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean G'day, The following patch that adds a inode reclaim shrinker needs to be added to both the 2.6.32.x stable series and the 2.6.33.y stable series. The regression this patch addresses was introduced in the previous round of XFS stable updates that have just been released (2.6.32.12 and 2.6.33.3). However, the fix wasn't upstream until after thoes stable kernels were released, so please consider this for the next stable releaseŃ•. The same patch applies to the XFS code in both 2.6.32.12 and 2.6.33.3 trees, and has passed a run of xfsqa on both kernels with limited memory to trigger the OOM conditions that lead to problems. The upstream commit is 9bf729c0af67897ea8498ce17c29b0683f7f2028. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: add a shrinker to background inode reclaim From: Dave Chinner >From 9bf729c0af67897ea8498ce17c29b0683f7f2028 Thu, 29 Apr 2010 21:22:13 +0000 On low memory boxes or those with highmem, kernel can OOM before the background reclaims inodes via xfssyncd. Add a shrinker to run inode reclaim so that it inode reclaim is expedited when memory is low. This is more complex than it needs to be because the VM folk don't want a context added to the shrinker infrastructure. Hence we need to add a global list of XFS mount structures so the shrinker can traverse them. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_super.c | 5 ++ fs/xfs/linux-2.6/xfs_sync.c | 107 +++++++++++++++++++++++++++++++++++++--- fs/xfs/linux-2.6/xfs_sync.h | 7 ++- fs/xfs/quota/xfs_qm_syscalls.c | 3 +- fs/xfs/xfs_ag.h | 1 + fs/xfs/xfs_mount.h | 1 + 6 files changed, 115 insertions(+), 9 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 77414db..146d491 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1160,6 +1160,7 @@ xfs_fs_put_super( xfs_unmountfs(mp); xfs_freesb(mp); + xfs_inode_shrinker_unregister(mp); xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); xfs_dmops_put(mp); @@ -1523,6 +1524,8 @@ xfs_fs_fill_super( if (error) goto fail_vnrele; + xfs_inode_shrinker_register(mp); + kfree(mtpt); return 0; @@ -1767,6 +1770,7 @@ init_xfs_fs(void) goto out_cleanup_procfs; vfs_initquota(); + xfs_inode_shrinker_init(); error = register_filesystem(&xfs_fs_type); if (error) @@ -1794,6 +1798,7 @@ exit_xfs_fs(void) { vfs_exitquota(); unregister_filesystem(&xfs_fs_type); + xfs_inode_shrinker_destroy(); xfs_sysctl_unregister(); xfs_cleanup_procfs(); xfs_buf_terminate(); diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 6b6b394..57adf2d 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -95,7 +95,8 @@ xfs_inode_ag_walk( struct xfs_perag *pag, int flags), int flags, int tag, - int exclusive) + int exclusive, + int *nr_to_scan) { struct xfs_perag *pag = &mp->m_perag[ag]; uint32_t first_index; @@ -135,7 +136,7 @@ restart: if (error == EFSCORRUPTED) break; - } while (1); + } while ((*nr_to_scan)--); if (skipped) { delay(1); @@ -153,23 +154,30 @@ xfs_inode_ag_iterator( struct xfs_perag *pag, int flags), int flags, int tag, - int exclusive) + int exclusive, + int *nr_to_scan) { int error = 0; int last_error = 0; xfs_agnumber_t ag; + int nr; + nr = nr_to_scan ? *nr_to_scan : INT_MAX; for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { if (!mp->m_perag[ag].pag_ici_init) continue; error = xfs_inode_ag_walk(mp, ag, execute, flags, tag, - exclusive); + exclusive, &nr); if (error) { last_error = error; if (error == EFSCORRUPTED) break; } + if (nr <= 0) + break; } + if (nr_to_scan) + *nr_to_scan = nr; return XFS_ERROR(last_error); } @@ -289,7 +297,7 @@ xfs_sync_data( ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, - XFS_ICI_NO_TAG, 0); + XFS_ICI_NO_TAG, 0, NULL); if (error) return XFS_ERROR(error); @@ -311,7 +319,7 @@ xfs_sync_attr( ASSERT((flags & ~SYNC_WAIT) == 0); return xfs_inode_ag_iterator(mp, xfs_sync_inode_attr, flags, - XFS_ICI_NO_TAG, 0); + XFS_ICI_NO_TAG, 0, NULL); } STATIC int @@ -679,6 +687,7 @@ __xfs_inode_set_reclaim_tag( radix_tree_tag_set(&pag->pag_ici_root, XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), XFS_ICI_RECLAIM_TAG); + pag->pag_ici_reclaimable++; } /* @@ -710,6 +719,7 @@ __xfs_inode_clear_reclaim_tag( { radix_tree_tag_clear(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); + pag->pag_ici_reclaimable--; } STATIC int @@ -770,5 +780,88 @@ xfs_reclaim_inodes( int mode) { return xfs_inode_ag_iterator(mp, xfs_reclaim_inode, mode, - XFS_ICI_RECLAIM_TAG, 1); + XFS_ICI_RECLAIM_TAG, 1, NULL); +} + +/* + * Shrinker infrastructure. + * + * This is all far more complex than it needs to be. It adds a global list of + * mounts because the shrinkers can only call a global context. We need to make + * the shrinkers pass a context to avoid the need for global state. + */ +static LIST_HEAD(xfs_mount_list); +static struct rw_semaphore xfs_mount_list_lock; + +static int +xfs_reclaim_inode_shrink( + int nr_to_scan, + gfp_t gfp_mask) +{ + struct xfs_mount *mp; + xfs_agnumber_t ag; + int reclaimable = 0; + + if (nr_to_scan) { + if (!(gfp_mask & __GFP_FS)) + return -1; + + down_read(&xfs_mount_list_lock); + list_for_each_entry(mp, &xfs_mount_list, m_mplist) { + xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0, + XFS_ICI_RECLAIM_TAG, 1, &nr_to_scan); + if (nr_to_scan <= 0) + break; + } + up_read(&xfs_mount_list_lock); + } + + down_read(&xfs_mount_list_lock); + list_for_each_entry(mp, &xfs_mount_list, m_mplist) { + for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { + + if (!mp->m_perag[ag].pag_ici_init) + continue; + reclaimable += mp->m_perag[ag].pag_ici_reclaimable; + } + } + up_read(&xfs_mount_list_lock); + return reclaimable; +} + +static struct shrinker xfs_inode_shrinker = { + .shrink = xfs_reclaim_inode_shrink, + .seeks = DEFAULT_SEEKS, +}; + +void __init +xfs_inode_shrinker_init(void) +{ + init_rwsem(&xfs_mount_list_lock); + register_shrinker(&xfs_inode_shrinker); +} + +void +xfs_inode_shrinker_destroy(void) +{ + ASSERT(list_empty(&xfs_mount_list)); + unregister_shrinker(&xfs_inode_shrinker); +} + +void +xfs_inode_shrinker_register( + struct xfs_mount *mp) +{ + down_write(&xfs_mount_list_lock); + list_add_tail(&mp->m_mplist, &xfs_mount_list); + up_write(&xfs_mount_list_lock); +} + +void +xfs_inode_shrinker_unregister( + struct xfs_mount *mp) +{ + down_write(&xfs_mount_list_lock); + list_del(&mp->m_mplist); + up_write(&xfs_mount_list_lock); } diff --git a/fs/xfs/linux-2.6/xfs_sync.h b/fs/xfs/linux-2.6/xfs_sync.h index ea932b4..0b28c13 100644 --- a/fs/xfs/linux-2.6/xfs_sync.h +++ b/fs/xfs/linux-2.6/xfs_sync.h @@ -54,6 +54,11 @@ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, int xfs_sync_inode_valid(struct xfs_inode *ip, struct xfs_perag *pag); int xfs_inode_ag_iterator(struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), - int flags, int tag, int write_lock); + int flags, int tag, int write_lock, int *nr_to_scan); + +void xfs_inode_shrinker_init(void); +void xfs_inode_shrinker_destroy(void); +void xfs_inode_shrinker_register(struct xfs_mount *mp); +void xfs_inode_shrinker_unregister(struct xfs_mount *mp); #endif diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 873e07e..145f596 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -891,7 +891,8 @@ xfs_qm_dqrele_all_inodes( uint flags) { ASSERT(mp->m_quotainfo); - xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG, 0); + xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, + XFS_ICI_NO_TAG, 0, NULL); } /*------------------------------------------------------------------------*/ diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 6702bd8..1182604 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -229,6 +229,7 @@ typedef struct xfs_perag int pag_ici_init; /* incore inode cache initialised */ rwlock_t pag_ici_lock; /* incore inode lock */ struct radix_tree_root pag_ici_root; /* incore inode cache root */ + int pag_ici_reclaimable; /* reclaimable inodes */ #endif } xfs_perag_t; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 1df7e45..c95f81a 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -257,6 +257,7 @@ typedef struct xfs_mount { wait_queue_head_t m_wait_single_sync_task; __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ + struct list_head m_mplist; /* inode shrinker mount list */ } xfs_mount_t; /* From BATV+f20da4fa05706f3678eb+2445+infradead.org+hch@bombadil.srs.infradead.org Tue May 4 05:15:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o44AFRHQ219603 for ; Tue, 4 May 2010 05:15:28 -0500 X-ASG-Debug-ID: 1272968256-183b026c0000-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 A9C9930B8E7 for ; Tue, 4 May 2010 03:17:36 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id MG0keEm8Q6WlKNdF for ; Tue, 04 May 2010 03:17:36 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1O9FC1-0000bs-Um; Tue, 04 May 2010 10:17:33 +0000 Date: Tue, 4 May 2010 06:17:33 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [GIT] Delayed Logging V3 Subject: Re: [GIT] Delayed Logging V3 Message-ID: <20100504101733.GA18229@infradead.org> References: <20100504015042.GA8120@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100504015042.GA8120@dastard> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1272968256 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 04, 2010 at 11:50:42AM +1000, Dave Chinner wrote: > The new cleanups added in this version mean it touche?? more files > that the previous versions, but overall it should still be simpler > to review because I've collapsed many of the intermediate patches > into one "Introduce delayed logging core code" commit. Thanks. Btw, a little procedural comment - you include the V2 markers and changelogs in the commit message. Normal procedure is to have them below the -- or what it is marker with the diffstat so that they only get picked up in the mail and not the final commits, and no V2 in the subject line at all. From SRS0+Bo/h+63+fromorbit.com=david@internode.on.net Tue May 4 06:42:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o44BgKZl223520 for ; Tue, 4 May 2010 06:42:21 -0500 X-ASG-Debug-ID: 1272973466-7d9800440000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5217013404E4 for ; Tue, 4 May 2010 04:44:27 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id QU9aL5mjKap7ZsE8 for ; Tue, 04 May 2010 04:44:27 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23031331-1927428 for multiple; Tue, 04 May 2010 21:14:25 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1O9GY4-0002hO-2p; Tue, 04 May 2010 21:44:24 +1000 Date: Tue, 4 May 2010 21:44:24 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [GIT] Delayed Logging V3 Subject: Re: [GIT] Delayed Logging V3 Message-ID: <20100504114423.GC8120@dastard> References: <20100504015042.GA8120@dastard> <20100504101733.GA18229@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100504101733.GA18229@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1272973468 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.2, rules version 3.2.2.29040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 04, 2010 at 06:17:33AM -0400, Christoph Hellwig wrote: > On Tue, May 04, 2010 at 11:50:42AM +1000, Dave Chinner wrote: > > The new cleanups added in this version mean it touche?? more files > > that the previous versions, but overall it should still be simpler > > to review because I've collapsed many of the intermediate patches > > into one "Introduce delayed logging core code" commit. > > Thanks. Btw, a little procedural comment - you include the V2 markers > and changelogs in the commit message. Normal procedure is to have > them below the -- or what it is marker with the diffstat so that they > only get picked up in the mail and not the final commits, and no V2 in > the subject line at all. Yeah, That's typical. The problem is that guilt seems to kill anything I add to the patch headers below a "---" separator. Hence if i don't put it the in commit message it doesn't stick as I rebase my working branches, and hence doesn't get included in the patchbombs I send direct from the repository. For stuff that is in a series that I'm tracking in a separate branch I can probably just keep versioning changes in the series header (the patch 0/N message), but for individual patches it's a bit harder. I'll see what I can do to track this more easily in my workflow. Cheers, Dave. -- Dave Chinner david@fromorbit.com From info@sarfmarketi.com Tue May 4 07:32:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_50,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o44CWKOJ226156 for ; Tue, 4 May 2010 07:32:21 -0500 X-ASG-Debug-ID: 1272976465-4d4003980000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.saubulten.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4E54C30BDFC for ; Tue, 4 May 2010 05:34:25 -0700 (PDT) Received: from mail.saubulten.com (mail.turuncusoft.com [85.153.27.210]) by cuda.sgi.com with ESMTP id bEmmdWkzFokH6wvd for ; Tue, 04 May 2010 05:34:25 -0700 (PDT) Received: from pc1 ([88.233.23.54]) by mail.saubulten.com (IceWarp 9.2.1) with ASMTP id MRM54613 for ; Tue, 04 May 2010 15:34:13 +0300 From: "Tonerci" To: "xfs@oss.sgi.com" Reply-To: info@sarfmarketi.com Date: Tue, 04 May 2010 16:11:14 +0430 X-ASG-Orig-Subj: =?iso-8859-9?Q?Renkli=20Toner=20Dolum=20=DCcretleri?= Subject: =?iso-8859-9?Q?Renkli=20Toner=20Dolum=20=DCcretleri?= MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-9 Content-Transfer-Encoding: quoted-printable X-Mailer: aspNetEmail ver 3.6.0.77 Message-ID: X-Barracuda-Connect: mail.turuncusoft.com[85.153.27.210] X-Barracuda-Start-Time: 1272976467 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4857 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.2, rules version 3.2.2.29045 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean HP CP1215 RENKL=DD TONER DOLUMU 50 TL =0D=0AHP 1600/2600 RENKL=DD= TONER DOLUMU 60 TL=0D=0AHP Q2612 S=DDYAH TONER DOLUMU 14 T= L=0D=0AHP CB435A S=DDYAH TONER DOLUMU 14 TL=0D=0AHP CB46A TONER = DOLUMU 14 TL=0D=0A=0D=0AListemizde olmayan modeller= i=E7in bilgi sorunuz=2E=0D=0AFiyatlara =2518 KDV dahil de=F0ildir=2E=0D=0A= =0D=0A=0D=0ATuruncusoft Bili=FEim ve =DDnternet Hiz=2ELtd=2E=DEti=0D=0ATE= L: 0212-272 70 83=0D=0AMSN: kartus_dolum=40windowslive=2Ecom=0D=0A From info@sarfmarketi.com Tue May 4 07:33:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=BAYES_60,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o44CXcWT226234 for ; Tue, 4 May 2010 07:33:38 -0500 X-ASG-Debug-ID: 1272976529-4d7d03bc0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.saubulten.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 67ADD30BE0C for ; Tue, 4 May 2010 05:35:44 -0700 (PDT) Received: from mail.saubulten.com (mail.turuncusoft.com [85.153.27.210]) by cuda.sgi.com with ESMTP id lAGC2sVHk1DqYQw9 for ; Tue, 04 May 2010 05:35:44 -0700 (PDT) Received: from pc1 ([88.233.23.54]) by mail.saubulten.com (IceWarp 9.2.1) with ASMTP id MRN74922 for ; Tue, 04 May 2010 15:35:22 +0300 From: "Tonerci" To: "linux-xfs@oss.sgi.com" Reply-To: info@sarfmarketi.com Date: Tue, 04 May 2010 16:11:14 +0430 X-ASG-Orig-Subj: =?iso-8859-9?Q?Renkli=20Toner=20Dolum=20=DCcretleri?= Subject: =?iso-8859-9?Q?Renkli=20Toner=20Dolum=20=DCcretleri?= MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-9 Content-Transfer-Encoding: quoted-printable X-Mailer: aspNetEmail ver 3.6.0.77 Message-ID: X-Barracuda-Connect: mail.turuncusoft.com[85.153.27.210] X-Barracuda-Start-Time: 1272976547 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5236 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 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.2, rules version 3.2.2.29045 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean HP CP1215 RENKL=DD TONER DOLUMU 50 TL =0D=0AHP 1600/2600 RENKL=DD= TONER DOLUMU 60 TL=0D=0AHP Q2612 S=DDYAH TONER DOLUMU 14 T= L=0D=0AHP CB435A S=DDYAH TONER DOLUMU 14 TL=0D=0AHP CB46A TONER = DOLUMU 14 TL=0D=0A=0D=0AListemizde olmayan modeller= i=E7in bilgi sorunuz=2E=0D=0AFiyatlara =2518 KDV dahil de=F0ildir=2E=0D=0A= =0D=0A=0D=0ATuruncusoft Bili=FEim ve =DDnternet Hiz=2ELtd=2E=DEti=0D=0ATE= L: 0212-272 70 83=0D=0AMSN: kartus_dolum=40windowslive=2Ecom=0D=0A From info@sarfmarketi.com Tue May 4 07:59:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_50,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o44CxwsC227646 for ; Tue, 4 May 2010 07:59:58 -0500 X-ASG-Debug-ID: 1272978125-7db4018c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.saubulten.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 993151DE4A24 for ; Tue, 4 May 2010 06:02:05 -0700 (PDT) Received: from mail.saubulten.com (mail.turuncusoft.com [85.153.27.210]) by cuda.sgi.com with ESMTP id Ro2auRQFBaoHlwuU for ; Tue, 04 May 2010 06:02:05 -0700 (PDT) Received: from pc1 ([88.233.23.54]) by mail.saubulten.com (IceWarp 9.2.1) with ASMTP id MSF18759 for ; Tue, 04 May 2010 16:01:59 +0300 From: "Tonerci" To: "xfs@oss.sgi.com" Reply-To: info@sarfmarketi.com Date: Tue, 04 May 2010 16:11:14 +0430 X-ASG-Orig-Subj: =?iso-8859-9?Q?Renkli=20Toner=20Dolum=20=DCcretleri?= Subject: =?iso-8859-9?Q?Renkli=20Toner=20Dolum=20=DCcretleri?= MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-9 Content-Transfer-Encoding: quoted-printable X-Mailer: aspNetEmail ver 3.6.0.77 Message-ID: X-Barracuda-Connect: mail.turuncusoft.com[85.153.27.210] X-Barracuda-Start-Time: 1272978126 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4857 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.2, rules version 3.2.2.29047 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean HP CP1215 RENKL=DD TONER DOLUMU 50 TL =0D=0AHP 1600/2600 RENKL=DD= TONER DOLUMU 60 TL=0D=0AHP Q2612 S=DDYAH TONER DOLUMU 14 T= L=0D=0AHP CB435A S=DDYAH TONER DOLUMU 14 TL=0D=0AHP CB46A TONER = DOLUMU 14 TL=0D=0A=0D=0AListemizde olmayan modeller= i=E7in bilgi sorunuz=2E=0D=0AFiyatlara =2518 KDV dahil de=F0ildir=2E=0D=0A= =0D=0A=0D=0ATuruncusoft Bili=FEim ve =DDnternet Hiz=2ELtd=2E=DEti=0D=0ATE= L: 0212-272 70 83=0D=0AMSN: kartus_dolum=40windowslive=2Ecom=0D=0A From info@sarfmarketi.com Tue May 4 08:01:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=BAYES_60,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o44D1Tnp227746 for ; Tue, 4 May 2010 08:01:30 -0500 X-ASG-Debug-ID: 1272978209-718c021b0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.saubulten.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 813D71DE4A42 for ; Tue, 4 May 2010 06:03:29 -0700 (PDT) Received: from mail.saubulten.com (mail.turuncusoft.com [85.153.27.210]) by cuda.sgi.com with ESMTP id uKs3NVGjQaohYCAB for ; Tue, 04 May 2010 06:03:29 -0700 (PDT) Received: from pc1 ([88.233.23.54]) by mail.saubulten.com (IceWarp 9.2.1) with ASMTP id MSH95322 for ; Tue, 04 May 2010 16:03:22 +0300 From: "Tonerci" To: "linux-xfs@oss.sgi.com" Reply-To: info@sarfmarketi.com Date: Tue, 04 May 2010 16:11:14 +0430 X-ASG-Orig-Subj: =?iso-8859-9?Q?Renkli=20Toner=20Dolum=20=DCcretleri?= Subject: =?iso-8859-9?Q?Renkli=20Toner=20Dolum=20=DCcretleri?= MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-9 Content-Transfer-Encoding: quoted-printable X-Mailer: aspNetEmail ver 3.6.0.77 Message-ID: X-Barracuda-Connect: mail.turuncusoft.com[85.153.27.210] X-Barracuda-Start-Time: 1272978218 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4941 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.2, rules version 3.2.2.29047 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean HP CP1215 RENKL=DD TONER DOLUMU 50 TL =0D=0AHP 1600/2600 RENKL=DD= TONER DOLUMU 60 TL=0D=0AHP Q2612 S=DDYAH TONER DOLUMU 14 T= L=0D=0AHP CB435A S=DDYAH TONER DOLUMU 14 TL=0D=0AHP CB46A TONER = DOLUMU 14 TL=0D=0A=0D=0AListemizde olmayan modeller= i=E7in bilgi sorunuz=2E=0D=0AFiyatlara =2518 KDV dahil de=F0ildir=2E=0D=0A= =0D=0A=0D=0ATuruncusoft Bili=FEim ve =DDnternet Hiz=2ELtd=2E=DEti=0D=0ATE= L: 0212-272 70 83=0D=0AMSN: kartus_dolum=40windowslive=2Ecom=0D=0A From BATV+f20da4fa05706f3678eb+2445+infradead.org+hch@bombadil.srs.infradead.org Tue May 4 08:51:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o44DpetU230405 for ; Tue, 4 May 2010 08:51:42 -0500 X-ASG-Debug-ID: 1272981228-7fa303280000-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 D412F30C23C for ; Tue, 4 May 2010 06:53:48 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id BdY5xV8IWNQYPstO for ; Tue, 04 May 2010 06:53:48 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1O9IZI-0005Hl-E9 for xfs@oss.sgi.com; Tue, 04 May 2010 13:53:48 +0000 Date: Tue, 4 May 2010 09:53:48 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH v2] xfs: cleanup log reservation calculactions Subject: [PATCH v2] xfs: cleanup log reservation calculactions Message-ID: <20100504135348.GA18991@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1272981228 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Instead of having small helper functions calling big macros do the calculations for the log reservations directly in the functions. These are mostly 1:1 from the macros execept that the macros kept the quota calculations in their callers. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-04 15:47:36.143004267 +0200 +++ xfs/fs/xfs/xfs_trans.c 2010-05-04 15:49:00.118253812 +0200 @@ -49,134 +49,489 @@ kmem_zone_t *xfs_trans_zone; + +/* + * Various log reservation values. + * + * These are based on the size of the file system block because that is what + * most transactions manipulate. Each adds in an additional 128 bytes per + * item logged to try to account for the overhead of the transaction mechanism. + * + * Note: Most of the reservations underestimate the number of allocation + * groups into which they could free extents in the xfs_bmap_finish() call. + * This is because the number in the worst case is quite high and quite + * unusual. In order to fix this we need to change xfs_bmap_finish() to free + * extents in only a single AG at a time. This will require changes to the + * EFI code as well, however, so that the EFI for the extents not freed is + * logged again in each transaction. See SGI PV #261917. + * + * Reservation functions here avoid a huge stack in xfs_trans_init due to + * register overflow from temporaries in the calculations. + */ + + /* - * Reservation functions here avoid a huge stack in xfs_trans_init - * due to register overflow from temporaries in the calculations. + * In a write transaction we can allocate a maximum of 2 + * extents. This gives: + * the inode getting the new extents: inode size + * the inode's bmap btree: max depth * block size + * the agfs of the ags from which the extents are allocated: 2 * sector + * the superblock free block counter: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + * And the bmap_finish transaction can free bmap blocks in a join: + * the agfs of the ags containing the blocks: 2 * sector size + * the agfls of the ags containing the blocks: 2 * sector size + * the super block free block counter: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size */ STATIC uint -xfs_calc_write_reservation(xfs_mount_t *mp) +xfs_calc_write_reservation( + struct xfs_mount *mp) { - return XFS_CALC_WRITE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + + 2 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 2) + + 128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + + XFS_ALLOCFREE_LOG_COUNT(mp, 2))), + (2 * mp->m_sb.sb_sectsize + + 2 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 2) + + 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); } +/* + * In truncating a file we free up to two extents at once. We can modify: + * the inode being truncated: inode size + * the inode's bmap btree: (max depth + 1) * block size + * And the bmap_finish transaction can free the blocks and bmap blocks: + * the agf for each of the ags: 4 * sector size + * the agfl for each of the ags: 4 * sector size + * the super block to reflect the freed blocks: sector size + * worst case split in allocation btrees per extent assuming 4 extents: + * 4 exts * 2 trees * (2 * max depth - 1) * block size + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (max depth - 1) * block size + */ STATIC uint -xfs_calc_itruncate_reservation(xfs_mount_t *mp) +xfs_calc_itruncate_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ITRUNCATE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + + 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), + (4 * mp->m_sb.sb_sectsize + + 4 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 4) + + 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + + 128 * 5 + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); } +/* + * In renaming a files we can modify: + * the four inodes involved: 4 * inode size + * the two directory btrees: 2 * (max depth + v2) * dir block size + * the two directory bmap btrees: 2 * max depth * block size + * And the bmap_finish transaction can free dir and bmap blocks (two sets + * of bmap blocks) giving: + * the agf for the ags in which the blocks live: 3 * sector size + * the agfl for the ags in which the blocks live: 3 * sector size + * the superblock for the free block count: sector size + * the allocation btrees: 3 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_rename_reservation(xfs_mount_t *mp) +xfs_calc_rename_reservation( + struct xfs_mount *mp) { - return XFS_CALC_RENAME_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((4 * mp->m_sb.sb_inodesize + + 2 * XFS_DIROP_LOG_RES(mp) + + 128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp))), + (3 * mp->m_sb.sb_sectsize + + 3 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 3) + + 128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))); } +/* + * For creating a link to an inode: + * the parent directory inode: inode size + * the linked inode: inode size + * the directory btree could split: (max depth + v2) * dir block size + * the directory bmap btree could join or split: (max depth + v2) * blocksize + * And the bmap_finish transaction can free some bmap blocks giving: + * the agf for the ag in which the blocks live: sector size + * the agfl for the ag in which the blocks live: sector size + * the superblock for the free block count: sector size + * the allocation btrees: 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_link_reservation(xfs_mount_t *mp) +xfs_calc_link_reservation( + struct xfs_mount *mp) { - return XFS_CALC_LINK_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + mp->m_sb.sb_inodesize + + XFS_DIROP_LOG_RES(mp) + + 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), + (mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); } +/* + * For removing a directory entry we can modify: + * the parent directory inode: inode size + * the removed inode: inode size + * the directory btree could join: (max depth + v2) * dir block size + * the directory bmap btree could join or split: (max depth + v2) * blocksize + * And the bmap_finish transaction can free the dir and bmap blocks giving: + * the agf for the ag in which the blocks live: 2 * sector size + * the agfl for the ag in which the blocks live: 2 * sector size + * the superblock for the free block count: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_remove_reservation(xfs_mount_t *mp) +xfs_calc_remove_reservation( + struct xfs_mount *mp) { - return XFS_CALC_REMOVE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + mp->m_sb.sb_inodesize + + XFS_DIROP_LOG_RES(mp) + + 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), + (2 * mp->m_sb.sb_sectsize + + 2 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 2) + + 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); } +/* + * For symlink we can modify: + * the parent directory inode: inode size + * the new inode: inode size + * the inode btree entry: 1 block + * the directory btree: (max depth + v2) * dir block size + * the directory inode's bmap btree: (max depth + v2) * block size + * the blocks for the symlink: 1 kB + * Or in the first xact we allocate some inodes giving: + * the agi and agf of the ag getting the new inodes: 2 * sectorsize + * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_symlink_reservation(xfs_mount_t *mp) +xfs_calc_symlink_reservation( + struct xfs_mount *mp) { - return XFS_CALC_SYMLINK_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, 1) + + XFS_DIROP_LOG_RES(mp) + + 1024 + + 128 * (4 + XFS_DIROP_LOG_COUNT(mp))), + (2 * mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + + XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); } +/* + * For create we can modify: + * the parent directory inode: inode size + * the new inode: inode size + * the inode btree entry: block size + * the superblock for the nlink flag: sector size + * the directory btree: (max depth + v2) * dir block size + * the directory inode's bmap btree: (max depth + v2) * block size + * Or in the first xact we allocate some inodes giving: + * the agi and agf of the ag getting the new inodes: 2 * sectorsize + * the superblock for the nlink flag: sector size + * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (max depth - 1) * block size + */ STATIC uint -xfs_calc_create_reservation(xfs_mount_t *mp) +xfs_calc_create_reservation( + struct xfs_mount *mp) { - return XFS_CALC_CREATE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, 1) + + XFS_DIROP_LOG_RES(mp) + + 128 * (3 + XFS_DIROP_LOG_COUNT(mp))), + (3 * mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + + XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); } +/* + * Making a new directory is the same as creating a new file. + */ STATIC uint -xfs_calc_mkdir_reservation(xfs_mount_t *mp) +xfs_calc_mkdir_reservation( + struct xfs_mount *mp) { - return XFS_CALC_MKDIR_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return xfs_calc_create_reservation(mp); } +/* + * In freeing an inode we can modify: + * the inode being freed: inode size + * the super block free inode counter: sector size + * the agi hash list and counters: sector size + * the inode btree entry: block size + * the on disk inode before ours in the agi hash list: inode cluster size + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (max depth - 1) * block size + */ STATIC uint -xfs_calc_ifree_reservation(xfs_mount_t *mp) +xfs_calc_ifree_reservation( + struct xfs_mount *mp) { - return XFS_CALC_IFREE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, 1) + + MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), + XFS_INODE_CLUSTER_SIZE(mp)) + + 128 * 5 + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); } +/* + * When only changing the inode we log the inode and possibly the superblock + * We also add a bit of slop for the transaction stuff. + */ STATIC uint -xfs_calc_ichange_reservation(xfs_mount_t *mp) +xfs_calc_ichange_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ICHANGE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize + + 512; + } +/* + * Growing the data section of the filesystem. + * superblock + * agi and agf + * allocation btrees + */ STATIC uint -xfs_calc_growdata_reservation(xfs_mount_t *mp) +xfs_calc_growdata_reservation( + struct xfs_mount *mp) { - return XFS_CALC_GROWDATA_LOG_RES(mp); + return mp->m_sb.sb_sectsize * 3 + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); } +/* + * Growing the rt section of the filesystem. + * In the first set of transactions (ALLOC) we allocate space to the + * bitmap or summary files. + * superblock: sector size + * agf of the ag from which the extent is allocated: sector size + * bmap btree for bitmap/summary inode: max depth * blocksize + * bitmap/summary inode: inode size + * allocation btrees for 1 block alloc: 2 * (2 * maxdepth - 1) * blocksize + */ STATIC uint -xfs_calc_growrtalloc_reservation(xfs_mount_t *mp) +xfs_calc_growrtalloc_reservation( + struct xfs_mount *mp) { - return XFS_CALC_GROWRTALLOC_LOG_RES(mp); + return 2 * mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + + mp->m_sb.sb_inodesize + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); } +/* + * Growing the rt section of the filesystem. + * In the second set of transactions (ZERO) we zero the new metadata blocks. + * one bitmap/summary block: blocksize + */ STATIC uint -xfs_calc_growrtzero_reservation(xfs_mount_t *mp) +xfs_calc_growrtzero_reservation( + struct xfs_mount *mp) { - return XFS_CALC_GROWRTZERO_LOG_RES(mp); + return mp->m_sb.sb_blocksize + 128; } +/* + * Growing the rt section of the filesystem. + * In the third set of transactions (FREE) we update metadata without + * allocating any new blocks. + * superblock: sector size + * bitmap inode: inode size + * summary inode: inode size + * one bitmap block: blocksize + * summary blocks: new summary size + */ STATIC uint -xfs_calc_growrtfree_reservation(xfs_mount_t *mp) +xfs_calc_growrtfree_reservation( + struct xfs_mount *mp) { - return XFS_CALC_GROWRTFREE_LOG_RES(mp); + return mp->m_sb.sb_sectsize + + 2 * mp->m_sb.sb_inodesize + + mp->m_sb.sb_blocksize + + mp->m_rsumsize + + 128 * 5; } +/* + * Logging the inode modification timestamp on a synchronous write. + * inode + */ STATIC uint -xfs_calc_swrite_reservation(xfs_mount_t *mp) +xfs_calc_swrite_reservation( + struct xfs_mount *mp) { - return XFS_CALC_SWRITE_LOG_RES(mp); + return mp->m_sb.sb_inodesize + 128; } +/* + * Logging the inode mode bits when writing a setuid/setgid file + * inode + */ STATIC uint xfs_calc_writeid_reservation(xfs_mount_t *mp) { - return XFS_CALC_WRITEID_LOG_RES(mp); + return mp->m_sb.sb_inodesize + 128; } +/* + * Converting the inode from non-attributed to attributed. + * the inode being converted: inode size + * agf block and superblock (for block allocation) + * the new block (directory sized) + * bmap blocks for the new directory block + * allocation btrees + */ STATIC uint -xfs_calc_addafork_reservation(xfs_mount_t *mp) +xfs_calc_addafork_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ADDAFORK_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize * 2 + + mp->m_dirblksize + + XFS_FSB_TO_B(mp, XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (4 + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1 + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); } +/* + * Removing the attribute fork of a file + * the inode being truncated: inode size + * the inode's bmap btree: max depth * block size + * And the bmap_finish transaction can free the blocks and bmap blocks: + * the agf for each of the ags: 4 * sector size + * the agfl for each of the ags: 4 * sector size + * the super block to reflect the freed blocks: sector size + * worst case split in allocation btrees per extent assuming 4 extents: + * 4 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_attrinval_reservation(xfs_mount_t *mp) +xfs_calc_attrinval_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ATTRINVAL_LOG_RES(mp); + return MAX((mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + + 128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))), + (4 * mp->m_sb.sb_sectsize + + 4 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 4) + + 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))); } +/* + * Setting an attribute. + * the inode getting the attribute + * the superblock for allocations + * the agfs extents are allocated from + * the attribute btree * max depth + * the inode allocation btree + * Since attribute transaction space is dependent on the size of the attribute, + * the calculation is done partially at mount time and partially at runtime. + */ STATIC uint -xfs_calc_attrset_reservation(xfs_mount_t *mp) +xfs_calc_attrset_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ATTRSET_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + + 128 * (2 + XFS_DA_NODE_MAXDEPTH); } +/* + * Removing an attribute. + * the inode: inode size + * the attribute btree could join: max depth * block size + * the inode bmap btree could join or split: max depth * block size + * And the bmap_finish transaction can free the attr blocks freed giving: + * the agf for the ag in which the blocks live: 2 * sector size + * the agfl for the ag in which the blocks live: 2 * sector size + * the superblock for the free block count: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_attrrm_reservation(xfs_mount_t *mp) +xfs_calc_attrrm_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ATTRRM_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + + 128 * (1 + XFS_DA_NODE_MAXDEPTH + + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), + (2 * mp->m_sb.sb_sectsize + + 2 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 2) + + 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); } +/* + * Clearing a bad agino number in an agi hash bucket. + */ STATIC uint -xfs_calc_clear_agi_bucket_reservation(xfs_mount_t *mp) +xfs_calc_clear_agi_bucket_reservation( + struct xfs_mount *mp) { - return XFS_CALC_CLEAR_AGI_BUCKET_LOG_RES(mp); + return mp->m_sb.sb_sectsize + 128; } /* @@ -185,11 +540,10 @@ xfs_calc_clear_agi_bucket_reservation(xf */ void xfs_trans_init( - xfs_mount_t *mp) + struct xfs_mount *mp) { - xfs_trans_reservations_t *resp; + struct xfs_trans_reservations *resp = &mp->m_reservations; - resp = &(mp->m_reservations); resp->tr_write = xfs_calc_write_reservation(mp); resp->tr_itruncate = xfs_calc_itruncate_reservation(mp); resp->tr_rename = xfs_calc_rename_reservation(mp); Index: xfs/fs/xfs/xfs_trans.h =================================================================== --- xfs.orig/fs/xfs/xfs_trans.h 2010-05-04 15:47:36.150003848 +0200 +++ xfs/fs/xfs/xfs_trans.h 2010-05-04 15:47:55.115254931 +0200 @@ -300,24 +300,6 @@ xfs_lic_desc_to_chunk(xfs_log_item_desc_ /* - * Various log reservation values. - * These are based on the size of the file system block - * because that is what most transactions manipulate. - * Each adds in an additional 128 bytes per item logged to - * try to account for the overhead of the transaction mechanism. - * - * Note: - * Most of the reservations underestimate the number of allocation - * groups into which they could free extents in the xfs_bmap_finish() - * call. This is because the number in the worst case is quite high - * and quite unusual. In order to fix this we need to change - * xfs_bmap_finish() to free extents in only a single AG at a time. - * This will require changes to the EFI code as well, however, so that - * the EFI for the extents not freed is logged again in each transaction. - * See bug 261917. - */ - -/* * Per-extent log reservation for the allocation btree changes * involved in freeing or allocating an extent. * 2 trees * (2 blocks/level * max depth - 1) * block size @@ -341,429 +323,36 @@ xfs_lic_desc_to_chunk(xfs_log_item_desc_ (XFS_DAENTER_BLOCKS(mp, XFS_DATA_FORK) + \ XFS_DAENTER_BMAPS(mp, XFS_DATA_FORK) + 1) -/* - * In a write transaction we can allocate a maximum of 2 - * extents. This gives: - * the inode getting the new extents: inode size - * the inode's bmap btree: max depth * block size - * the agfs of the ags from which the extents are allocated: 2 * sector - * the superblock free block counter: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - * And the bmap_finish transaction can free bmap blocks in a join: - * the agfs of the ags containing the blocks: 2 * sector size - * the agfls of the ags containing the blocks: 2 * sector size - * the super block free block counter: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_WRITE_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + \ - (2 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ - (128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))),\ - ((2 * (mp)->m_sb.sb_sectsize) + \ - (2 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ - (128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))))) #define XFS_WRITE_LOG_RES(mp) ((mp)->m_reservations.tr_write) - -/* - * In truncating a file we free up to two extents at once. We can modify: - * the inode being truncated: inode size - * the inode's bmap btree: (max depth + 1) * block size - * And the bmap_finish transaction can free the blocks and bmap blocks: - * the agf for each of the ags: 4 * sector size - * the agfl for each of the ags: 4 * sector size - * the super block to reflect the freed blocks: sector size - * worst case split in allocation btrees per extent assuming 4 extents: - * 4 exts * 2 trees * (2 * max depth - 1) * block size - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (max depth - 1) * block size - */ -#define XFS_CALC_ITRUNCATE_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + \ - (128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)))), \ - ((4 * (mp)->m_sb.sb_sectsize) + \ - (4 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 4) + \ - (128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4))) + \ - (128 * 5) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) - #define XFS_ITRUNCATE_LOG_RES(mp) ((mp)->m_reservations.tr_itruncate) - -/* - * In renaming a files we can modify: - * the four inodes involved: 4 * inode size - * the two directory btrees: 2 * (max depth + v2) * dir block size - * the two directory bmap btrees: 2 * max depth * block size - * And the bmap_finish transaction can free dir and bmap blocks (two sets - * of bmap blocks) giving: - * the agf for the ags in which the blocks live: 3 * sector size - * the agfl for the ags in which the blocks live: 3 * sector size - * the superblock for the free block count: sector size - * the allocation btrees: 3 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_RENAME_LOG_RES(mp) \ - (MAX( \ - ((4 * (mp)->m_sb.sb_inodesize) + \ - (2 * XFS_DIROP_LOG_RES(mp)) + \ - (128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp)))), \ - ((3 * (mp)->m_sb.sb_sectsize) + \ - (3 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 3) + \ - (128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))))) - #define XFS_RENAME_LOG_RES(mp) ((mp)->m_reservations.tr_rename) - -/* - * For creating a link to an inode: - * the parent directory inode: inode size - * the linked inode: inode size - * the directory btree could split: (max depth + v2) * dir block size - * the directory bmap btree could join or split: (max depth + v2) * blocksize - * And the bmap_finish transaction can free some bmap blocks giving: - * the agf for the ag in which the blocks live: sector size - * the agfl for the ag in which the blocks live: sector size - * the superblock for the free block count: sector size - * the allocation btrees: 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_LINK_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_inodesize + \ - XFS_DIROP_LOG_RES(mp) + \ - (128 * (2 + XFS_DIROP_LOG_COUNT(mp)))), \ - ((mp)->m_sb.sb_sectsize + \ - (mp)->m_sb.sb_sectsize + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) - #define XFS_LINK_LOG_RES(mp) ((mp)->m_reservations.tr_link) - -/* - * For removing a directory entry we can modify: - * the parent directory inode: inode size - * the removed inode: inode size - * the directory btree could join: (max depth + v2) * dir block size - * the directory bmap btree could join or split: (max depth + v2) * blocksize - * And the bmap_finish transaction can free the dir and bmap blocks giving: - * the agf for the ag in which the blocks live: 2 * sector size - * the agfl for the ag in which the blocks live: 2 * sector size - * the superblock for the free block count: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_REMOVE_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_inodesize + \ - XFS_DIROP_LOG_RES(mp) + \ - (128 * (2 + XFS_DIROP_LOG_COUNT(mp)))), \ - ((2 * (mp)->m_sb.sb_sectsize) + \ - (2 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ - (128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))))) - #define XFS_REMOVE_LOG_RES(mp) ((mp)->m_reservations.tr_remove) - -/* - * For symlink we can modify: - * the parent directory inode: inode size - * the new inode: inode size - * the inode btree entry: 1 block - * the directory btree: (max depth + v2) * dir block size - * the directory inode's bmap btree: (max depth + v2) * block size - * the blocks for the symlink: 1 kB - * Or in the first xact we allocate some inodes giving: - * the agi and agf of the ag getting the new inodes: 2 * sectorsize - * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_SYMLINK_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B(mp, 1) + \ - XFS_DIROP_LOG_RES(mp) + \ - 1024 + \ - (128 * (4 + XFS_DIROP_LOG_COUNT(mp)))), \ - (2 * (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), XFS_IALLOC_BLOCKS((mp))) + \ - XFS_FSB_TO_B((mp), (mp)->m_in_maxlevels) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) - #define XFS_SYMLINK_LOG_RES(mp) ((mp)->m_reservations.tr_symlink) - -/* - * For create we can modify: - * the parent directory inode: inode size - * the new inode: inode size - * the inode btree entry: block size - * the superblock for the nlink flag: sector size - * the directory btree: (max depth + v2) * dir block size - * the directory inode's bmap btree: (max depth + v2) * block size - * Or in the first xact we allocate some inodes giving: - * the agi and agf of the ag getting the new inodes: 2 * sectorsize - * the superblock for the nlink flag: sector size - * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (max depth - 1) * block size - */ -#define XFS_CALC_CREATE_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B(mp, 1) + \ - XFS_DIROP_LOG_RES(mp) + \ - (128 * (3 + XFS_DIROP_LOG_COUNT(mp)))), \ - (3 * (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), XFS_IALLOC_BLOCKS((mp))) + \ - XFS_FSB_TO_B((mp), (mp)->m_in_maxlevels) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) - #define XFS_CREATE_LOG_RES(mp) ((mp)->m_reservations.tr_create) - -/* - * Making a new directory is the same as creating a new file. - */ -#define XFS_CALC_MKDIR_LOG_RES(mp) XFS_CALC_CREATE_LOG_RES(mp) - #define XFS_MKDIR_LOG_RES(mp) ((mp)->m_reservations.tr_mkdir) - -/* - * In freeing an inode we can modify: - * the inode being freed: inode size - * the super block free inode counter: sector size - * the agi hash list and counters: sector size - * the inode btree entry: block size - * the on disk inode before ours in the agi hash list: inode cluster size - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (max depth - 1) * block size - */ -#define XFS_CALC_IFREE_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize + \ - (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), 1) + \ - MAX((__uint16_t)XFS_FSB_TO_B((mp), 1), XFS_INODE_CLUSTER_SIZE(mp)) + \ - (128 * 5) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) - - #define XFS_IFREE_LOG_RES(mp) ((mp)->m_reservations.tr_ifree) - -/* - * When only changing the inode we log the inode and possibly the superblock - * We also add a bit of slop for the transaction stuff. - */ -#define XFS_CALC_ICHANGE_LOG_RES(mp) ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize + 512) - #define XFS_ICHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_ichange) - -/* - * Growing the data section of the filesystem. - * superblock - * agi and agf - * allocation btrees - */ -#define XFS_CALC_GROWDATA_LOG_RES(mp) \ - ((mp)->m_sb.sb_sectsize * 3 + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) - #define XFS_GROWDATA_LOG_RES(mp) ((mp)->m_reservations.tr_growdata) - -/* - * Growing the rt section of the filesystem. - * In the first set of transactions (ALLOC) we allocate space to the - * bitmap or summary files. - * superblock: sector size - * agf of the ag from which the extent is allocated: sector size - * bmap btree for bitmap/summary inode: max depth * blocksize - * bitmap/summary inode: inode size - * allocation btrees for 1 block alloc: 2 * (2 * maxdepth - 1) * blocksize - */ -#define XFS_CALC_GROWRTALLOC_LOG_RES(mp) \ - (2 * (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + \ - (mp)->m_sb.sb_inodesize + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * \ - (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) - #define XFS_GROWRTALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_growrtalloc) - -/* - * Growing the rt section of the filesystem. - * In the second set of transactions (ZERO) we zero the new metadata blocks. - * one bitmap/summary block: blocksize - */ -#define XFS_CALC_GROWRTZERO_LOG_RES(mp) \ - ((mp)->m_sb.sb_blocksize + 128) - #define XFS_GROWRTZERO_LOG_RES(mp) ((mp)->m_reservations.tr_growrtzero) - -/* - * Growing the rt section of the filesystem. - * In the third set of transactions (FREE) we update metadata without - * allocating any new blocks. - * superblock: sector size - * bitmap inode: inode size - * summary inode: inode size - * one bitmap block: blocksize - * summary blocks: new summary size - */ -#define XFS_CALC_GROWRTFREE_LOG_RES(mp) \ - ((mp)->m_sb.sb_sectsize + \ - 2 * (mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_blocksize + \ - (mp)->m_rsumsize + \ - (128 * 5)) - #define XFS_GROWRTFREE_LOG_RES(mp) ((mp)->m_reservations.tr_growrtfree) - -/* - * Logging the inode modification timestamp on a synchronous write. - * inode - */ -#define XFS_CALC_SWRITE_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + 128) - #define XFS_SWRITE_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) - /* * Logging the inode timestamps on an fsync -- same as SWRITE * as long as SWRITE logs the entire inode core */ #define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) - -/* - * Logging the inode mode bits when writing a setuid/setgid file - * inode - */ -#define XFS_CALC_WRITEID_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + 128) - #define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) - -/* - * Converting the inode from non-attributed to attributed. - * the inode being converted: inode size - * agf block and superblock (for block allocation) - * the new block (directory sized) - * bmap blocks for the new directory block - * allocation btrees - */ -#define XFS_CALC_ADDAFORK_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize * 2 + \ - (mp)->m_dirblksize + \ - XFS_FSB_TO_B(mp, (XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1)) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (4 + (XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) - #define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) - -/* - * Removing the attribute fork of a file - * the inode being truncated: inode size - * the inode's bmap btree: max depth * block size - * And the bmap_finish transaction can free the blocks and bmap blocks: - * the agf for each of the ags: 4 * sector size - * the agfl for each of the ags: 4 * sector size - * the super block to reflect the freed blocks: sector size - * worst case split in allocation btrees per extent assuming 4 extents: - * 4 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_ATTRINVAL_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + \ - (128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)))), \ - ((4 * (mp)->m_sb.sb_sectsize) + \ - (4 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 4) + \ - (128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))))) - #define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_reservations.tr_attrinval) - -/* - * Setting an attribute. - * the inode getting the attribute - * the superblock for allocations - * the agfs extents are allocated from - * the attribute btree * max depth - * the inode allocation btree - * Since attribute transaction space is dependent on the size of the attribute, - * the calculation is done partially at mount time and partially at runtime. - */ -#define XFS_CALC_ATTRSET_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), XFS_DA_NODE_MAXDEPTH) + \ - (128 * (2 + XFS_DA_NODE_MAXDEPTH))) - #define XFS_ATTRSET_LOG_RES(mp, ext) \ ((mp)->m_reservations.tr_attrset + \ (ext * (mp)->m_sb.sb_sectsize) + \ (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) - -/* - * Removing an attribute. - * the inode: inode size - * the attribute btree could join: max depth * block size - * the inode bmap btree could join or split: max depth * block size - * And the bmap_finish transaction can free the attr blocks freed giving: - * the agf for the ag in which the blocks live: 2 * sector size - * the agfl for the ag in which the blocks live: 2 * sector size - * the superblock for the free block count: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_ATTRRM_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B((mp), XFS_DA_NODE_MAXDEPTH) + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + \ - (128 * (1 + XFS_DA_NODE_MAXDEPTH + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)))), \ - ((2 * (mp)->m_sb.sb_sectsize) + \ - (2 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ - (128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))))) - #define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) - -/* - * Clearing a bad agino number in an agi hash bucket. - */ -#define XFS_CALC_CLEAR_AGI_BUCKET_LOG_RES(mp) \ - ((mp)->m_sb.sb_sectsize + 128) - #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) From BATV+f20da4fa05706f3678eb+2445+infradead.org+hch@bombadil.srs.infradead.org Tue May 4 08:58:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_61, J_CHICKENPOX_64,J_CHICKENPOX_66,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o44Dw2Oa230669 for ; Tue, 4 May 2010 08:58:03 -0500 X-ASG-Debug-ID: 1272981611-1c1702b40000-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 9858530ACED for ; Tue, 4 May 2010 07:00:11 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id oUAFpicT6sQ8TekY for ; Tue, 04 May 2010 07:00:11 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1O9IfT-00078L-5S for xfs@oss.sgi.com; Tue, 04 May 2010 14:00:11 +0000 Date: Tue, 4 May 2010 10:00:11 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: simplify log item descriptor tracking Subject: [PATCH] xfs: simplify log item descriptor tracking Message-ID: <20100504140011.GA20656@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1272981611 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Currently we track log item descriptor belonging to a transaction using a complex opencoded chunk allocator. This code has been there since day one and seems to work around the lack of an efficient slab allocator. This patch replaces it with dynamically allocated log item descriptors from a dedicated slab pool, linked to the transaction by a linked list. This allows to greatly simplify the log item descriptor tracking to the point where it's just a couple hundred lines in xfs_trans.c instead of a separate file. The external API has also been simplified while we're at it - the xfs_trans_add_item and xfs_trans_del_item functions to add/ delete items from a transaction have been simplified to the bare minium, and the xfs_trans_find_item function is replaced with a direct dereference of the li_desc field. All debug code walking the list of log items in a transaction is down to a simple list_for_each_entry. Note that we could easily use a singly linked list here instead of the double linked list from list.h as the fastpath only does deletion from sequential traversal. But given that we don't have one available as a library function yet I use the list.h functions for simplicity. [the patch applies ontop of Dave's delayed-logging branch] Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_trans_item.c | 441 ------------------------------------- xfs/fs/xfs/Makefile | 1 xfs/fs/xfs/linux-2.6/xfs_super.c | 11 xfs/fs/xfs/quota/xfs_trans_dquot.c | 25 -- xfs/fs/xfs/xfs_bmap.c | 43 --- xfs/fs/xfs/xfs_buf_item.c | 5 xfs/fs/xfs/xfs_extfree_item.c | 8 xfs/fs/xfs/xfs_trans.c | 218 +++++++++++------- xfs/fs/xfs/xfs_trans.h | 105 -------- xfs/fs/xfs/xfs_trans_buf.c | 64 +---- xfs/fs/xfs/xfs_trans_extfree.c | 22 - xfs/fs/xfs/xfs_trans_inode.c | 9 xfs/fs/xfs/xfs_trans_priv.h | 15 - 13 files changed, 200 insertions(+), 767 deletions(-) Index: xfs/fs/xfs/quota/xfs_trans_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c 2010-05-04 15:47:36.063023404 +0200 +++ xfs/fs/xfs/quota/xfs_trans_dquot.c 2010-05-04 15:51:53.153255000 +0200 @@ -59,16 +59,14 @@ xfs_trans_dqjoin( xfs_trans_t *tp, xfs_dquot_t *dqp) { - xfs_dq_logitem_t *lp = &dqp->q_logitem; - ASSERT(dqp->q_transp != tp); ASSERT(XFS_DQ_IS_LOCKED(dqp)); - ASSERT(lp->qli_dquot == dqp); + ASSERT(dqp->q_logitem.qli_dquot == dqp); /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)(lp)); + xfs_trans_add_item(tp, &dqp->q_logitem.qli_item); /* * Initialize i_transp so we can later determine if this dquot is @@ -93,16 +91,11 @@ xfs_trans_log_dquot( xfs_trans_t *tp, xfs_dquot_t *dqp) { - xfs_log_item_desc_t *lidp; - ASSERT(dqp->q_transp == tp); ASSERT(XFS_DQ_IS_LOCKED(dqp)); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)(&dqp->q_logitem)); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + dqp->q_logitem.qli_item.li_desc->lid_flags |= XFS_LID_DIRTY; } /* @@ -874,9 +867,8 @@ xfs_trans_get_qoff_item( /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)q); - - return (q); + xfs_trans_add_item(tp, &q->qql_item); + return q; } @@ -890,13 +882,8 @@ xfs_trans_log_quotaoff_item( xfs_trans_t *tp, xfs_qoff_logitem_t *qlp) { - xfs_log_item_desc_t *lidp; - - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)qlp); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + qlp->qql_item.li_desc->lid_flags |= XFS_LID_DIRTY; } STATIC void Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2010-05-04 15:47:36.071004407 +0200 +++ xfs/fs/xfs/xfs_buf_item.c 2010-05-04 15:51:53.153255000 +0200 @@ -461,13 +461,10 @@ xfs_buf_item_unpin_remove( * occurs later in the xfs_trans_uncommit() will try to * reference the buffer which we no longer have a hold on. */ - struct xfs_log_item_desc *lidp; - ASSERT(XFS_BUF_VALUSEMA(bip->bli_buf) <= 0); trace_xfs_buf_item_unpin_stale(bip); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)bip); - xfs_trans_free_item(tp, lidp); + xfs_trans_del_item(&bip->bli_item); /* * Since the transaction no longer refers to the buffer, the Index: xfs/fs/xfs/xfs_extfree_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_extfree_item.c 2010-05-04 15:47:36.079004407 +0200 +++ xfs/fs/xfs/xfs_extfree_item.c 2010-05-04 15:51:53.160253464 +0200 @@ -132,18 +132,18 @@ STATIC void xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) { struct xfs_ail *ailp = efip->efi_item.li_ailp; - xfs_log_item_desc_t *lidp; spin_lock(&ailp->xa_lock); if (efip->efi_flags & XFS_EFI_CANCELED) { + struct xfs_log_item *lip = &efip->efi_item; + /* * free the xaction descriptor pointing to this item */ - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *) efip); - xfs_trans_free_item(tp, lidp); + xfs_trans_del_item(lip); /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); + xfs_trans_ail_delete(ailp, lip); xfs_efi_item_free(efip); } else { efip->efi_flags |= XFS_EFI_COMMITTED; Index: xfs/fs/xfs/xfs_trans_buf.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_buf.c 2010-05-04 15:47:36.088024871 +0200 +++ xfs/fs/xfs/xfs_trans_buf.c 2010-05-04 15:51:53.164254512 +0200 @@ -51,36 +51,17 @@ xfs_trans_buf_item_match( xfs_daddr_t blkno, int len) { - xfs_log_item_chunk_t *licp; - xfs_log_item_desc_t *lidp; - xfs_buf_log_item_t *blip; - int i; + struct xfs_log_item_desc *lidp; + struct xfs_buf_log_item *blip; len = BBTOB(len); - for (licp = &tp->t_items; licp != NULL; licp = licp->lic_next) { - if (xfs_lic_are_all_free(licp)) { - ASSERT(licp == &tp->t_items); - ASSERT(licp->lic_next == NULL); - return NULL; - } - - for (i = 0; i < licp->lic_unused; i++) { - /* - * Skip unoccupied slots. - */ - if (xfs_lic_isfree(licp, i)) - continue; - - lidp = xfs_lic_slot(licp, i); - blip = (xfs_buf_log_item_t *)lidp->lid_item; - if (blip->bli_item.li_type != XFS_LI_BUF) - continue; - - if (XFS_BUF_TARGET(blip->bli_buf) == target && - XFS_BUF_ADDR(blip->bli_buf) == blkno && - XFS_BUF_COUNT(blip->bli_buf) == len) - return blip->bli_buf; - } + list_for_each_entry(lidp, &tp->t_items, lid_trans) { + blip = (struct xfs_buf_log_item *)lidp->lid_item; + if (blip->bli_item.li_type == XFS_LI_BUF && + XFS_BUF_TARGET(blip->bli_buf) == target && + XFS_BUF_ADDR(blip->bli_buf) == blkno && + XFS_BUF_COUNT(blip->bli_buf) == len) + return blip->bli_buf; } return NULL; @@ -127,7 +108,7 @@ _xfs_trans_bjoin( /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t *)bip); + xfs_trans_add_item(tp, &bip->bli_item); /* * Initialize b_fsprivate2 so we can find it with incore_match() @@ -483,7 +464,6 @@ xfs_trans_brelse(xfs_trans_t *tp, { xfs_buf_log_item_t *bip; xfs_log_item_t *lip; - xfs_log_item_desc_t *lidp; /* * Default to a normal brelse() call if the tp is NULL. @@ -514,13 +494,6 @@ xfs_trans_brelse(xfs_trans_t *tp, ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(atomic_read(&bip->bli_refcount) > 0); - /* - * Find the item descriptor pointing to this buffer's - * log item. It must be there. - */ - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); - ASSERT(lidp != NULL); - trace_xfs_trans_brelse(bip); /* @@ -536,7 +509,7 @@ xfs_trans_brelse(xfs_trans_t *tp, * If the buffer is dirty within this transaction, we can't * release it until we commit. */ - if (lidp->lid_flags & XFS_LID_DIRTY) + if (bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY) return; /* @@ -553,7 +526,7 @@ xfs_trans_brelse(xfs_trans_t *tp, /* * Free up the log item descriptor tracking the released item. */ - xfs_trans_free_item(tp, lidp); + xfs_trans_del_item(&bip->bli_item); /* * Clear the hold flag in the buf log item if it is set. @@ -665,7 +638,6 @@ xfs_trans_log_buf(xfs_trans_t *tp, uint last) { xfs_buf_log_item_t *bip; - xfs_log_item_desc_t *lidp; ASSERT(XFS_BUF_ISBUSY(bp)); ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); @@ -707,11 +679,8 @@ xfs_trans_log_buf(xfs_trans_t *tp, bip->bli_format.blf_flags &= ~XFS_BLF_CANCEL; } - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY; bip->bli_flags |= XFS_BLI_LOGGED; xfs_buf_item_log(bip, first, last); } @@ -740,7 +709,6 @@ xfs_trans_binval( xfs_trans_t *tp, xfs_buf_t *bp) { - xfs_log_item_desc_t *lidp; xfs_buf_log_item_t *bip; ASSERT(XFS_BUF_ISBUSY(bp)); @@ -748,8 +716,6 @@ xfs_trans_binval( ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); - ASSERT(lidp != NULL); ASSERT(atomic_read(&bip->bli_refcount) > 0); trace_xfs_trans_binval(bip); @@ -764,7 +730,7 @@ xfs_trans_binval( ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_INODE_BUF)); ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); - ASSERT(lidp->lid_flags & XFS_LID_DIRTY); + ASSERT(bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY); ASSERT(tp->t_flags & XFS_TRANS_DIRTY); return; } @@ -797,7 +763,7 @@ xfs_trans_binval( bip->bli_format.blf_flags |= XFS_BLF_CANCEL; memset((char *)(bip->bli_format.blf_data_map), 0, (bip->bli_format.blf_map_size * sizeof(uint))); - lidp->lid_flags |= XFS_LID_DIRTY; + bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY; tp->t_flags |= XFS_TRANS_DIRTY; } Index: xfs/fs/xfs/xfs_trans_extfree.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_extfree.c 2010-05-04 15:47:36.096004058 +0200 +++ xfs/fs/xfs/xfs_trans_extfree.c 2010-05-04 15:51:53.170254721 +0200 @@ -50,9 +50,8 @@ xfs_trans_get_efi(xfs_trans_t *tp, /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)efip); - - return (efip); + xfs_trans_add_item(tp, &efip->efi_item); + return efip; } /* @@ -66,15 +65,11 @@ xfs_trans_log_efi_extent(xfs_trans_t *t xfs_fsblock_t start_block, xfs_extlen_t ext_len) { - xfs_log_item_desc_t *lidp; uint next_extent; xfs_extent_t *extp; - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)efip); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + efip->efi_item.li_desc->lid_flags |= XFS_LID_DIRTY; next_extent = efip->efi_next_extent; ASSERT(next_extent < efip->efi_format.efi_nextents); @@ -107,9 +102,8 @@ xfs_trans_get_efd(xfs_trans_t *tp, /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)efdp); - - return (efdp); + xfs_trans_add_item(tp, &efdp->efd_item); + return efdp; } /* @@ -123,15 +117,11 @@ xfs_trans_log_efd_extent(xfs_trans_t *t xfs_fsblock_t start_block, xfs_extlen_t ext_len) { - xfs_log_item_desc_t *lidp; uint next_extent; xfs_extent_t *extp; - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)efdp); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + efdp->efd_item.li_desc->lid_flags |= XFS_LID_DIRTY; next_extent = efdp->efd_next_extent; ASSERT(next_extent < efdp->efd_format.efd_nextents); Index: xfs/fs/xfs/xfs_trans_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_inode.c 2010-05-04 15:47:36.105004547 +0200 +++ xfs/fs/xfs/xfs_trans_inode.c 2010-05-04 15:51:53.176254791 +0200 @@ -93,7 +93,7 @@ xfs_trans_ijoin( /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)(iip)); + xfs_trans_add_item(tp, &iip->ili_item); xfs_trans_inode_broot_debug(ip); @@ -149,17 +149,12 @@ xfs_trans_log_inode( xfs_inode_t *ip, uint flags) { - xfs_log_item_desc_t *lidp; - ASSERT(ip->i_transp == tp); ASSERT(ip->i_itemp != NULL); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)(ip->i_itemp)); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + ip->i_itemp->ili_item.li_desc->lid_flags |= XFS_LID_DIRTY; /* * Always OR in the bits from the ili_last_fields field. Index: xfs/fs/xfs/xfs_trans_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_item.c 2010-05-04 15:47:36.113004197 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,441 +0,0 @@ -/* - * Copyright (c) 2000-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_log.h" -#include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h" -/* XXX: from here down needed until struct xfs_trans has its own ailp */ -#include "xfs_bit.h" -#include "xfs_buf_item.h" -#include "xfs_sb.h" -#include "xfs_ag.h" -#include "xfs_dir2.h" -#include "xfs_dmapi.h" -#include "xfs_mount.h" - -STATIC int xfs_trans_unlock_chunk(xfs_log_item_chunk_t *, - int, int, xfs_lsn_t); - -/* - * This is called to add the given log item to the transaction's - * list of log items. It must find a free log item descriptor - * or allocate a new one and add the item to that descriptor. - * The function returns a pointer to item descriptor used to point - * to the new item. The log item will now point to its new descriptor - * with its li_desc field. - */ -xfs_log_item_desc_t * -xfs_trans_add_item(xfs_trans_t *tp, xfs_log_item_t *lip) -{ - xfs_log_item_desc_t *lidp; - xfs_log_item_chunk_t *licp; - int i=0; - - /* - * If there are no free descriptors, allocate a new chunk - * of them and put it at the front of the chunk list. - */ - if (tp->t_items_free == 0) { - licp = (xfs_log_item_chunk_t*) - kmem_alloc(sizeof(xfs_log_item_chunk_t), KM_SLEEP); - ASSERT(licp != NULL); - /* - * Initialize the chunk, and then - * claim the first slot in the newly allocated chunk. - */ - xfs_lic_init(licp); - xfs_lic_claim(licp, 0); - licp->lic_unused = 1; - xfs_lic_init_slot(licp, 0); - lidp = xfs_lic_slot(licp, 0); - - /* - * Link in the new chunk and update the free count. - */ - licp->lic_next = tp->t_items.lic_next; - tp->t_items.lic_next = licp; - tp->t_items_free = XFS_LIC_NUM_SLOTS - 1; - - /* - * Initialize the descriptor and the generic portion - * of the log item. - * - * Point the new slot at this item and return it. - * Also point the log item at its currently active - * descriptor and set the item's mount pointer. - */ - lidp->lid_item = lip; - lidp->lid_flags = 0; - lidp->lid_size = 0; - lip->li_desc = lidp; - lip->li_mountp = tp->t_mountp; - lip->li_ailp = tp->t_mountp->m_ail; - return lidp; - } - - /* - * Find the free descriptor. It is somewhere in the chunklist - * of descriptors. - */ - licp = &tp->t_items; - while (licp != NULL) { - if (xfs_lic_vacancy(licp)) { - if (licp->lic_unused <= XFS_LIC_MAX_SLOT) { - i = licp->lic_unused; - ASSERT(xfs_lic_isfree(licp, i)); - break; - } - for (i = 0; i <= XFS_LIC_MAX_SLOT; i++) { - if (xfs_lic_isfree(licp, i)) - break; - } - ASSERT(i <= XFS_LIC_MAX_SLOT); - break; - } - licp = licp->lic_next; - } - ASSERT(licp != NULL); - /* - * If we find a free descriptor, claim it, - * initialize it, and return it. - */ - xfs_lic_claim(licp, i); - if (licp->lic_unused <= i) { - licp->lic_unused = i + 1; - xfs_lic_init_slot(licp, i); - } - lidp = xfs_lic_slot(licp, i); - tp->t_items_free--; - lidp->lid_item = lip; - lidp->lid_flags = 0; - lidp->lid_size = 0; - lip->li_desc = lidp; - lip->li_mountp = tp->t_mountp; - lip->li_ailp = tp->t_mountp->m_ail; - return lidp; -} - -/* - * Free the given descriptor. - * - * This requires setting the bit in the chunk's free mask corresponding - * to the given slot. - */ -void -xfs_trans_free_item(xfs_trans_t *tp, xfs_log_item_desc_t *lidp) -{ - uint slot; - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t **licpp; - - slot = xfs_lic_desc_to_slot(lidp); - licp = xfs_lic_desc_to_chunk(lidp); - xfs_lic_relse(licp, slot); - lidp->lid_item->li_desc = NULL; - tp->t_items_free++; - - /* - * If there are no more used items in the chunk and this is not - * the chunk embedded in the transaction structure, then free - * the chunk. First pull it from the chunk list and then - * free it back to the heap. We didn't bother with a doubly - * linked list here because the lists should be very short - * and this is not a performance path. It's better to save - * the memory of the extra pointer. - * - * Also decrement the transaction structure's count of free items - * by the number in a chunk since we are freeing an empty chunk. - */ - if (xfs_lic_are_all_free(licp) && (licp != &(tp->t_items))) { - licpp = &(tp->t_items.lic_next); - while (*licpp != licp) { - ASSERT(*licpp != NULL); - licpp = &((*licpp)->lic_next); - } - *licpp = licp->lic_next; - kmem_free(licp); - tp->t_items_free -= XFS_LIC_NUM_SLOTS; - } -} - -/* - * This is called to find the descriptor corresponding to the given - * log item. It returns a pointer to the descriptor. - * The log item MUST have a corresponding descriptor in the given - * transaction. This routine does not return NULL, it panics. - * - * The descriptor pointer is kept in the log item's li_desc field. - * Just return it. - */ -/*ARGSUSED*/ -xfs_log_item_desc_t * -xfs_trans_find_item(xfs_trans_t *tp, xfs_log_item_t *lip) -{ - ASSERT(lip->li_desc != NULL); - - return lip->li_desc; -} - - -/* - * Return a pointer to the first descriptor in the chunk list. - * This does not return NULL if there are none, it panics. - * - * The first descriptor must be in either the first or second chunk. - * This is because the only chunk allowed to be empty is the first. - * All others are freed when they become empty. - * - * At some point this and xfs_trans_next_item() should be optimized - * to quickly look at the mask to determine if there is anything to - * look at. - */ -xfs_log_item_desc_t * -xfs_trans_first_item(xfs_trans_t *tp) -{ - xfs_log_item_chunk_t *licp; - int i; - - licp = &tp->t_items; - /* - * If it's not in the first chunk, skip to the second. - */ - if (xfs_lic_are_all_free(licp)) { - licp = licp->lic_next; - } - - /* - * Return the first non-free descriptor in the chunk. - */ - ASSERT(!xfs_lic_are_all_free(licp)); - for (i = 0; i < licp->lic_unused; i++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - - return xfs_lic_slot(licp, i); - } - cmn_err(CE_WARN, "xfs_trans_first_item() -- no first item"); - return NULL; -} - - -/* - * Given a descriptor, return the next descriptor in the chunk list. - * This returns NULL if there are no more used descriptors in the list. - * - * We do this by first locating the chunk in which the descriptor resides, - * and then scanning forward in the chunk and the list for the next - * used descriptor. - */ -/*ARGSUSED*/ -xfs_log_item_desc_t * -xfs_trans_next_item(xfs_trans_t *tp, xfs_log_item_desc_t *lidp) -{ - xfs_log_item_chunk_t *licp; - int i; - - licp = xfs_lic_desc_to_chunk(lidp); - - /* - * First search the rest of the chunk. The for loop keeps us - * from referencing things beyond the end of the chunk. - */ - for (i = (int)xfs_lic_desc_to_slot(lidp) + 1; i < licp->lic_unused; i++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - - return xfs_lic_slot(licp, i); - } - - /* - * Now search the next chunk. It must be there, because the - * next chunk would have been freed if it were empty. - * If there is no next chunk, return NULL. - */ - if (licp->lic_next == NULL) { - return NULL; - } - - licp = licp->lic_next; - ASSERT(!xfs_lic_are_all_free(licp)); - for (i = 0; i < licp->lic_unused; i++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - - return xfs_lic_slot(licp, i); - } - ASSERT(0); - /* NOTREACHED */ - return NULL; /* keep gcc quite */ -} - -/* - * This is called to unlock all of the items of a transaction and to free - * all the descriptors of that transaction. - * - * It walks the list of descriptors and unlocks each item. It frees - * each chunk except that embedded in the transaction as it goes along. - */ -void -xfs_trans_free_items( - xfs_trans_t *tp, - xfs_lsn_t commit_lsn, - int flags) -{ - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t *next_licp; - int abort; - - abort = flags & XFS_TRANS_ABORT; - licp = &tp->t_items; - /* - * Special case the embedded chunk so we don't free it below. - */ - if (!xfs_lic_are_all_free(licp)) { - (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn); - xfs_lic_all_free(licp); - licp->lic_unused = 0; - } - licp = licp->lic_next; - - /* - * Unlock each item in each chunk and free the chunks. - */ - while (licp != NULL) { - ASSERT(!xfs_lic_are_all_free(licp)); - (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn); - next_licp = licp->lic_next; - kmem_free(licp); - licp = next_licp; - } - - /* - * Reset the transaction structure's free item count. - */ - tp->t_items_free = XFS_LIC_NUM_SLOTS; - tp->t_items.lic_next = NULL; -} - - - -/* - * This is called to unlock the items associated with a transaction. - * Items which were not logged should be freed. - * Those which were logged must still be tracked so they can be unpinned - * when the transaction commits. - */ -void -xfs_trans_unlock_items(xfs_trans_t *tp, xfs_lsn_t commit_lsn) -{ - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t *next_licp; - xfs_log_item_chunk_t **licpp; - int freed; - - freed = 0; - licp = &tp->t_items; - - /* - * Special case the embedded chunk so we don't free. - */ - if (!xfs_lic_are_all_free(licp)) { - freed = xfs_trans_unlock_chunk(licp, 0, 0, commit_lsn); - } - licpp = &(tp->t_items.lic_next); - licp = licp->lic_next; - - /* - * Unlock each item in each chunk, free non-dirty descriptors, - * and free empty chunks. - */ - while (licp != NULL) { - ASSERT(!xfs_lic_are_all_free(licp)); - freed += xfs_trans_unlock_chunk(licp, 0, 0, commit_lsn); - next_licp = licp->lic_next; - if (xfs_lic_are_all_free(licp)) { - *licpp = next_licp; - kmem_free(licp); - freed -= XFS_LIC_NUM_SLOTS; - } else { - licpp = &(licp->lic_next); - } - ASSERT(*licpp == next_licp); - licp = next_licp; - } - - /* - * Fix the free descriptor count in the transaction. - */ - tp->t_items_free += freed; -} - -/* - * Unlock each item pointed to by a descriptor in the given chunk. - * Stamp the commit lsn into each item if necessary. - * Free descriptors pointing to items which are not dirty if freeing_chunk - * is zero. If freeing_chunk is non-zero, then we need to unlock all - * items in the chunk. - * - * Return the number of descriptors freed. - */ -STATIC int -xfs_trans_unlock_chunk( - xfs_log_item_chunk_t *licp, - int freeing_chunk, - int abort, - xfs_lsn_t commit_lsn) -{ - xfs_log_item_desc_t *lidp; - xfs_log_item_t *lip; - int i; - int freed; - - freed = 0; - lidp = licp->lic_descs; - for (i = 0; i < licp->lic_unused; i++, lidp++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - lip = lidp->lid_item; - lip->li_desc = NULL; - - if (commit_lsn != NULLCOMMITLSN) - IOP_COMMITTING(lip, commit_lsn); - if (abort) - lip->li_flags |= XFS_LI_ABORTED; - IOP_UNLOCK(lip); - - /* - * Free the descriptor if the item is not dirty - * within this transaction and the caller is not - * going to just free the entire thing regardless. - */ - if (!(freeing_chunk) && - (!(lidp->lid_flags & XFS_LID_DIRTY) || abort)) { - xfs_lic_relse(licp, i); - freed++; - } - } - - return freed; -} Index: xfs/fs/xfs/xfs_trans_priv.h =================================================================== --- xfs.orig/fs/xfs/xfs_trans_priv.h 2010-05-04 15:47:36.121026337 +0200 +++ xfs/fs/xfs/xfs_trans_priv.h 2010-05-04 15:51:53.183254651 +0200 @@ -23,20 +23,9 @@ struct xfs_log_item_desc; struct xfs_mount; struct xfs_trans; -/* - * From xfs_trans_item.c - */ -struct xfs_log_item_desc *xfs_trans_add_item(struct xfs_trans *, - struct xfs_log_item *); -void xfs_trans_free_item(struct xfs_trans *, - struct xfs_log_item_desc *); -struct xfs_log_item_desc *xfs_trans_find_item(struct xfs_trans *, - struct xfs_log_item *); -struct xfs_log_item_desc *xfs_trans_first_item(struct xfs_trans *); -struct xfs_log_item_desc *xfs_trans_next_item(struct xfs_trans *, - struct xfs_log_item_desc *); +void xfs_trans_add_item(struct xfs_trans *, struct xfs_log_item *); +void xfs_trans_del_item(struct xfs_log_item *); -void xfs_trans_unlock_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn); void xfs_trans_free_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn, int flags); Index: xfs/fs/xfs/Makefile =================================================================== --- xfs.orig/fs/xfs/Makefile 2010-05-04 15:47:36.156004128 +0200 +++ xfs/fs/xfs/Makefile 2010-05-04 15:51:53.184254931 +0200 @@ -87,7 +87,6 @@ xfs-y += xfs_alloc.o \ xfs_trans_buf.o \ xfs_trans_extfree.o \ xfs_trans_inode.o \ - xfs_trans_item.o \ xfs_utils.o \ xfs_vnodeops.o \ xfs_rw.o \ Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2010-05-04 15:47:36.168004337 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-05-04 15:51:53.186253883 +0200 @@ -1757,6 +1757,12 @@ xfs_init_zones(void) if (!xfs_trans_zone) goto out_destroy_ifork_zone; + xfs_log_item_desc_zone = + kmem_zone_init(sizeof(struct xfs_log_item_desc), + "xfs_log_item_desc"); + if (!xfs_log_item_desc_zone) + goto out_destroy_trans_zone; + /* * The size of the zone allocated buf log item is the maximum * size possible under XFS. This wastes a little bit of memory, @@ -1766,7 +1772,7 @@ xfs_init_zones(void) (((XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK) / NBWORD) * sizeof(int))), "xfs_buf_item"); if (!xfs_buf_item_zone) - goto out_destroy_trans_zone; + goto out_destroy_log_item_desc_zone; xfs_efd_zone = kmem_zone_init((sizeof(xfs_efd_log_item_t) + ((XFS_EFD_MAX_FAST_EXTENTS - 1) * @@ -1803,6 +1809,8 @@ xfs_init_zones(void) kmem_zone_destroy(xfs_efd_zone); out_destroy_buf_item_zone: kmem_zone_destroy(xfs_buf_item_zone); + out_destroy_log_item_desc_zone: + kmem_zone_destroy(xfs_log_item_desc_zone); out_destroy_trans_zone: kmem_zone_destroy(xfs_trans_zone); out_destroy_ifork_zone: @@ -1833,6 +1841,7 @@ xfs_destroy_zones(void) kmem_zone_destroy(xfs_efi_zone); kmem_zone_destroy(xfs_efd_zone); kmem_zone_destroy(xfs_buf_item_zone); + kmem_zone_destroy(xfs_log_item_desc_zone); kmem_zone_destroy(xfs_trans_zone); kmem_zone_destroy(xfs_ifork_zone); kmem_zone_destroy(xfs_dabuf_zone); Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-05-04 15:47:36.134004197 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2010-05-04 15:51:53.193254791 +0200 @@ -5882,43 +5882,18 @@ xfs_bmap_get_bp( bp = NULL; if (!bp) { /* Chase down all the log items to see if the bp is there */ - xfs_log_item_chunk_t *licp; - xfs_trans_t *tp; + struct xfs_log_item_desc *lidp; + struct xfs_buf_log_item *bip; - tp = cur->bc_tp; - licp = &tp->t_items; - while (!bp && licp != NULL) { - if (xfs_lic_are_all_free(licp)) { - licp = licp->lic_next; - continue; - } - for (i = 0; i < licp->lic_unused; i++) { - xfs_log_item_desc_t *lidp; - xfs_log_item_t *lip; - xfs_buf_log_item_t *bip; - xfs_buf_t *lbp; - - if (xfs_lic_isfree(licp, i)) { - continue; - } - - lidp = xfs_lic_slot(licp, i); - lip = lidp->lid_item; - if (lip->li_type != XFS_LI_BUF) - continue; - - bip = (xfs_buf_log_item_t *)lip; - lbp = bip->bli_buf; - - if (XFS_BUF_ADDR(lbp) == bno) { - bp = lbp; - break; /* Found it */ - } - } - licp = licp->lic_next; + list_for_each_entry(lidp, &cur->bc_tp->t_items, lid_trans) { + bip = (struct xfs_buf_log_item *)lidp->lid_item; + if (bip->bli_item.li_type == XFS_LI_BUF && + XFS_BUF_ADDR(bip->bli_buf) == bno) + return bip->bli_buf; } } - return(bp); + + return bp; } STATIC void Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-04 15:49:00.118253812 +0200 +++ xfs/fs/xfs/xfs_trans.c 2010-05-04 15:51:53.201254302 +0200 @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (C) 2010 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -48,6 +49,7 @@ #include "xfs_log_priv.h" kmem_zone_t *xfs_trans_zone; +kmem_zone_t *xfs_log_item_desc_zone; /* @@ -598,8 +600,7 @@ _xfs_trans_alloc( tp->t_magic = XFS_TRANS_MAGIC; tp->t_type = type; tp->t_mountp = mp; - tp->t_items_free = XFS_LIC_NUM_SLOTS; - xfs_lic_init(&(tp->t_items)); + INIT_LIST_HEAD(&tp->t_items); INIT_LIST_HEAD(&tp->t_busy); return tp; } @@ -639,8 +640,7 @@ xfs_trans_dup( ntp->t_magic = XFS_TRANS_MAGIC; ntp->t_type = tp->t_type; ntp->t_mountp = tp->t_mountp; - ntp->t_items_free = XFS_LIC_NUM_SLOTS; - xfs_lic_init(&(ntp->t_items)); + INIT_LIST_HEAD(&ntp->t_items); INIT_LIST_HEAD(&ntp->t_busy); ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); @@ -1144,6 +1144,108 @@ xfs_trans_unreserve_and_mod_sb( } /* + * Add the given log item to the transaction's list of log items. + * + * The log item will now point to its new descriptor with its li_desc field. + */ +void +xfs_trans_add_item( + struct xfs_trans *tp, + struct xfs_log_item *lip) +{ + struct xfs_log_item_desc *lidp; + + ASSERT(lip->li_mountp = tp->t_mountp); + ASSERT(lip->li_ailp = tp->t_mountp->m_ail); + + lidp = kmem_zone_zalloc(xfs_log_item_desc_zone, KM_SLEEP); + + lidp->lid_item = lip; + lidp->lid_flags = 0; + lidp->lid_size = 0; + list_add_tail(&lidp->lid_trans, &tp->t_items); + + lip->li_desc = lidp; +} + +STATIC void +xfs_trans_free_item_desc( + struct xfs_log_item_desc *lidp) +{ + list_del_init(&lidp->lid_trans); + kmem_zone_free(xfs_log_item_desc_zone, lidp); +} + +/* + * Unlink and free the given descriptor. + */ +void +xfs_trans_del_item( + struct xfs_log_item *lip) +{ + xfs_trans_free_item_desc(lip->li_desc); + lip->li_desc = NULL; +} + +/* + * Unlock all of the items of a transaction and free all the descriptors + * of that transaction. + */ +void +xfs_trans_free_items( + struct xfs_trans *tp, + xfs_lsn_t commit_lsn, + int flags) +{ + struct xfs_log_item_desc *lidp, *next; + + list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) { + struct xfs_log_item *lip = lidp->lid_item; + + lip->li_desc = NULL; + + if (commit_lsn != NULLCOMMITLSN) + IOP_COMMITTING(lip, commit_lsn); + if (flags & XFS_TRANS_ABORT) + lip->li_flags |= XFS_LI_ABORTED; + IOP_UNLOCK(lip); + + xfs_trans_free_item_desc(lidp); + } +} + +/* + * Unlock the items associated with a transaction. + * + * Items which were not logged should be freed. Those which were logged must + * still be tracked so they can be unpinned when the transaction commits. + */ +STATIC void +xfs_trans_unlock_items( + struct xfs_trans *tp, + xfs_lsn_t commit_lsn) +{ + struct xfs_log_item_desc *lidp, *next; + + list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) { + struct xfs_log_item *lip = lidp->lid_item; + + lip->li_desc = NULL; + + if (commit_lsn != NULLCOMMITLSN) + IOP_COMMITTING(lip, commit_lsn); + IOP_UNLOCK(lip); + + /* + * Free the descriptor if the item is not dirty + * within this transaction. + */ + if (!(lidp->lid_flags & XFS_LID_DIRTY)) + xfs_trans_free_item_desc(lidp); + } +} + +/* * Total up the number of log iovecs needed to commit this * transaction. The transaction itself needs one for the * transaction header. Ask each dirty item in turn how many @@ -1154,30 +1256,27 @@ xfs_trans_count_vecs( struct xfs_trans *tp) { int nvecs; - xfs_log_item_desc_t *lidp; + struct xfs_log_item_desc *lidp; nvecs = 1; - lidp = xfs_trans_first_item(tp); - ASSERT(lidp != NULL); /* In the non-debug case we need to start bailing out if we * didn't find a log_item here, return zero and let trans_commit * deal with it. */ - if (lidp == NULL) + if (list_empty(&tp->t_items)) { + ASSERT(0); return 0; + } - while (lidp != NULL) { + list_for_each_entry(lidp, &tp->t_items, lid_trans) { /* * Skip items which aren't dirty in this transaction. */ - if (!(lidp->lid_flags & XFS_LID_DIRTY)) { - lidp = xfs_trans_next_item(tp, lidp); + if (!(lidp->lid_flags & XFS_LID_DIRTY)) continue; - } lidp->lid_size = IOP_SIZE(lidp->lid_item); nvecs += lidp->lid_size; - lidp = xfs_trans_next_item(tp, lidp); } return nvecs; @@ -1197,7 +1296,7 @@ xfs_trans_fill_vecs( struct xfs_trans *tp, struct xfs_log_iovec *log_vector) { - xfs_log_item_desc_t *lidp; + struct xfs_log_item_desc *lidp; struct xfs_log_iovec *vecp; uint nitems; @@ -1208,14 +1307,11 @@ xfs_trans_fill_vecs( vecp = log_vector + 1; nitems = 0; - lidp = xfs_trans_first_item(tp); - ASSERT(lidp); - while (lidp) { + ASSERT(!list_empty(&tp->t_items)); + list_for_each_entry(lidp, &tp->t_items, lid_trans) { /* Skip items which aren't dirty in this transaction. */ - if (!(lidp->lid_flags & XFS_LID_DIRTY)) { - lidp = xfs_trans_next_item(tp, lidp); + if (!(lidp->lid_flags & XFS_LID_DIRTY)) continue; - } /* * The item may be marked dirty but not log anything. This can @@ -1226,7 +1322,6 @@ xfs_trans_fill_vecs( IOP_FORMAT(lidp->lid_item, vecp); vecp += lidp->lid_size; IOP_PIN(lidp->lid_item); - lidp = xfs_trans_next_item(tp, lidp); } /* @@ -1321,24 +1416,15 @@ xfs_trans_committed( struct xfs_trans *tp, int abortflag) { - xfs_log_item_desc_t *lidp; - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t *next_licp; + struct xfs_log_item_desc *lidp, *next; /* Call the transaction's completion callback if there is one. */ if (tp->t_callback != NULL) tp->t_callback(tp, tp->t_callarg); - for (lidp = xfs_trans_first_item(tp); - lidp != NULL; - lidp = xfs_trans_next_item(tp, lidp)) { + list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) { xfs_trans_item_committed(lidp->lid_item, tp->t_lsn, abortflag); - } - - /* free the item chunks, ignoring the embedded chunk */ - for (licp = tp->t_items.lic_next; licp != NULL; licp = next_licp) { - next_licp = licp->lic_next; - kmem_free(licp); + xfs_trans_free_item_desc(lidp); } xfs_trans_free_busy(tp->t_mountp, &tp->t_busy); @@ -1354,11 +1440,9 @@ xfs_trans_uncommit( struct xfs_trans *tp, uint flags) { - xfs_log_item_desc_t *lidp; + struct xfs_log_item_desc *lidp; - for (lidp = xfs_trans_first_item(tp); - lidp != NULL; - lidp = xfs_trans_next_item(tp, lidp)) { + list_for_each_entry(lidp, &tp->t_items, lid_trans) { /* * Unpin all but those that aren't dirty. */ @@ -1530,33 +1614,28 @@ STATIC struct xfs_log_vec * xfs_trans_alloc_log_vecs( xfs_trans_t *tp) { - xfs_log_item_desc_t *lidp; + struct xfs_log_item_desc *lidp; struct xfs_log_vec *lv = NULL; struct xfs_log_vec *ret_lv = NULL; - lidp = xfs_trans_first_item(tp); /* Bail out if we didn't find a log item. */ - if (!lidp) { + if (list_empty(&tp->t_items)) { ASSERT(0); return NULL; } - while (lidp != NULL) { + list_for_each_entry(lidp, &tp->t_items, lid_trans) { struct xfs_log_vec *new_lv; /* Skip items which aren't dirty in this transaction. */ - if (!(lidp->lid_flags & XFS_LID_DIRTY)) { - lidp = xfs_trans_next_item(tp, lidp); + if (!(lidp->lid_flags & XFS_LID_DIRTY)) continue; - } /* Skip items that do not have any vectors for writing */ lidp->lid_size = IOP_SIZE(lidp->lid_item); - if (!lidp->lid_size) { - lidp = xfs_trans_next_item(tp, lidp); + if (!lidp->lid_size) continue; - } new_lv = kmem_zalloc(sizeof(*new_lv) + lidp->lid_size * sizeof(struct xfs_log_iovec), @@ -1569,7 +1648,6 @@ xfs_trans_alloc_log_vecs( else lv->lv_next = new_lv; lv = new_lv; - lidp = xfs_trans_next_item(tp, lidp); } return ret_lv; @@ -1592,29 +1670,25 @@ xfs_trans_fill_log_vecs( struct xfs_trans *tp, struct xfs_log_vec *log_vector) { - xfs_log_item_desc_t *lidp; + struct xfs_log_item_desc *lidp; struct xfs_log_vec *lv = log_vector; - lidp = xfs_trans_first_item(tp); - ASSERT(lidp); - while (lidp) { + ASSERT(!list_empty(&tp->t_items)); + list_for_each_entry(lidp, &tp->t_items, lid_trans) { /* * Skip items which aren't dirty in this transaction. */ - if (!(lidp->lid_flags & XFS_LID_DIRTY)) { - lidp = xfs_trans_next_item(tp, lidp); + if (!(lidp->lid_flags & XFS_LID_DIRTY)) continue; - } + /* Skip items that do not have any vectors for writing */ - if (!lidp->lid_size) { - lidp = xfs_trans_next_item(tp, lidp); + if (!lidp->lid_size) continue; - } + IOP_FORMAT(lidp->lid_item, lv->lv_iovecp); lv->lv_niovecs = lidp->lid_size; lv->lv_item = lidp->lid_item; - lidp = xfs_trans_next_item(tp, lidp); lv = lv->lv_next; } } @@ -1779,12 +1853,6 @@ xfs_trans_cancel( int flags) { int log_flags; -#ifdef DEBUG - xfs_log_item_chunk_t *licp; - xfs_log_item_desc_t *lidp; - xfs_log_item_t *lip; - int i; -#endif xfs_mount_t *mp = tp->t_mountp; /* @@ -1803,21 +1871,11 @@ xfs_trans_cancel( xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); } #ifdef DEBUG - if (!(flags & XFS_TRANS_ABORT)) { - licp = &(tp->t_items); - while (licp != NULL) { - lidp = licp->lic_descs; - for (i = 0; i < licp->lic_unused; i++, lidp++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - - lip = lidp->lid_item; - if (!XFS_FORCED_SHUTDOWN(mp)) - ASSERT(!(lip->li_type == XFS_LI_EFD)); - } - licp = licp->lic_next; - } + if (!(flags & XFS_TRANS_ABORT) && !XFS_FORCED_SHUTDOWN(mp)) { + struct xfs_log_item_desc *lidp; + + list_for_each_entry(lidp, &tp->t_items, lid_trans) + ASSERT(!(lidp->lid_item->li_type == XFS_LI_EFD)); } #endif xfs_trans_unreserve_and_mod_sb(tp); Index: xfs/fs/xfs/xfs_trans.h =================================================================== --- xfs.orig/fs/xfs/xfs_trans.h 2010-05-04 15:47:55.115254931 +0200 +++ xfs/fs/xfs/xfs_trans.h 2010-05-04 15:51:53.209254302 +0200 @@ -161,105 +161,14 @@ typedef struct xfs_trans_header { * the amount of space needed to log the item it describes * once we get to commit processing (see xfs_trans_commit()). */ -typedef struct xfs_log_item_desc { +struct xfs_log_item_desc { struct xfs_log_item *lid_item; - ushort lid_size; - unsigned char lid_flags; - unsigned char lid_index; -} xfs_log_item_desc_t; + ushort lid_size; + unsigned char lid_flags; + struct list_head lid_trans; +}; #define XFS_LID_DIRTY 0x1 -#define XFS_LID_PINNED 0x2 - -/* - * This structure is used to maintain a chunk list of log_item_desc - * structures. The free field is a bitmask indicating which descriptors - * in this chunk's array are free. The unused field is the first value - * not used since this chunk was allocated. - */ -#define XFS_LIC_NUM_SLOTS 15 -typedef struct xfs_log_item_chunk { - struct xfs_log_item_chunk *lic_next; - ushort lic_free; - ushort lic_unused; - xfs_log_item_desc_t lic_descs[XFS_LIC_NUM_SLOTS]; -} xfs_log_item_chunk_t; - -#define XFS_LIC_MAX_SLOT (XFS_LIC_NUM_SLOTS - 1) -#define XFS_LIC_FREEMASK ((1 << XFS_LIC_NUM_SLOTS) - 1) - - -/* - * Initialize the given chunk. Set the chunk's free descriptor mask - * to indicate that all descriptors are free. The caller gets to set - * lic_unused to the right value (0 matches all free). The - * lic_descs.lid_index values are set up as each desc is allocated. - */ -static inline void xfs_lic_init(xfs_log_item_chunk_t *cp) -{ - cp->lic_free = XFS_LIC_FREEMASK; -} - -static inline void xfs_lic_init_slot(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_descs[slot].lid_index = (unsigned char)(slot); -} - -static inline int xfs_lic_vacancy(xfs_log_item_chunk_t *cp) -{ - return cp->lic_free & XFS_LIC_FREEMASK; -} - -static inline void xfs_lic_all_free(xfs_log_item_chunk_t *cp) -{ - cp->lic_free = XFS_LIC_FREEMASK; -} - -static inline int xfs_lic_are_all_free(xfs_log_item_chunk_t *cp) -{ - return ((cp->lic_free & XFS_LIC_FREEMASK) == XFS_LIC_FREEMASK); -} - -static inline int xfs_lic_isfree(xfs_log_item_chunk_t *cp, int slot) -{ - return (cp->lic_free & (1 << slot)); -} - -static inline void xfs_lic_claim(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_free &= ~(1 << slot); -} - -static inline void xfs_lic_relse(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_free |= 1 << slot; -} - -static inline xfs_log_item_desc_t * -xfs_lic_slot(xfs_log_item_chunk_t *cp, int slot) -{ - return &(cp->lic_descs[slot]); -} - -static inline int xfs_lic_desc_to_slot(xfs_log_item_desc_t *dp) -{ - return (uint)dp->lid_index; -} - -/* - * Calculate the address of a chunk given a descriptor pointer: - * dp - dp->lid_index give the address of the start of the lic_descs array. - * From this we subtract the offset of the lic_descs field in a chunk. - * All of this yields the address of the chunk, which is - * cast to a chunk pointer. - */ -static inline xfs_log_item_chunk_t * -xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp) -{ - return (xfs_log_item_chunk_t*) \ - (((xfs_caddr_t)((dp) - (dp)->lid_index)) - \ - (xfs_caddr_t)(((xfs_log_item_chunk_t*)0)->lic_descs)); -} #define XFS_TRANS_MAGIC 0x5452414E /* 'TRAN' */ /* @@ -516,8 +425,7 @@ typedef struct xfs_trans { int64_t t_rblocks_delta;/* superblock rblocks change */ int64_t t_rextents_delta;/* superblocks rextents chg */ int64_t t_rextslog_delta;/* superblocks rextslog chg */ - unsigned int t_items_free; /* log item descs free */ - xfs_log_item_chunk_t t_items; /* first log item desc chunk */ + struct list_head t_items; /* log item descriptors */ xfs_trans_header_t t_header; /* header for in-log trans */ struct list_head t_busy; /* list of busy extents */ unsigned long t_pflags; /* saved process flags state */ @@ -596,6 +504,7 @@ int xfs_trans_ail_init(struct xfs_mount void xfs_trans_ail_destroy(struct xfs_mount *); extern kmem_zone_t *xfs_trans_zone; +extern kmem_zone_t *xfs_log_item_desc_zone; #endif /* __KERNEL__ */ From sandeen@redhat.com Tue May 4 15:42:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o44KgWpX253509 for ; Tue, 4 May 2010 15:42:33 -0500 X-ASG-Debug-ID: 1273005880-6e9a023f0000-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 7EAB11B4FFB9 for ; Tue, 4 May 2010 13:44:40 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id eiwwuV6P12gHtAuj for ; Tue, 04 May 2010 13:44:40 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o44KiEwY003285 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 4 May 2010 16:44:14 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o44Ki8sq024509 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 4 May 2010 16:44:11 -0400 Message-ID: <4BE08718.5040608@redhat.com> Date: Tue, 04 May 2010 15:44:08 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: "Amit K. Arora" CC: Christoph Hellwig , Andrew Morton , xfs@oss.sgi.com, Nikanth Karthikesan , coly.li@suse.de, Nick Piggin , Alexander Viro , linux-fsdevel@vger.kernel.org, "Theodore Ts'o" , Andreas Dilger , linux-ext4@vger.kernel.org, Eelis , Amit Arora X-ASG-Orig-Subj: Re: [PATCH] New testcase to check if fallocate respects RLIMIT_FSIZE or not Subject: Re: [PATCH] New testcase to check if fallocate respects RLIMIT_FSIZE or not References: <201004281854.49730.knikanth@suse.de> <4BD85F1F.7030100@suse.de> <201004291014.07194.knikanth@suse.de> <20100430143319.d51d6d77.akpm@linux-foundation.org> <20100501070426.GA9562@amitarora.in.ibm.com> <20100501101846.GA3769@infradead.org> <20100503083135.GC13756@amitarora.in.ibm.com> In-Reply-To: <20100503083135.GC13756@amitarora.in.ibm.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.21 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1273005881 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Amit K. Arora wrote: > On Sat, May 01, 2010 at 06:18:46AM -0400, Christoph Hellwig wrote: >> On Sat, May 01, 2010 at 12:34:26PM +0530, Amit K. Arora wrote: >>> Agreed. How about doing this check in the filesystem specific fallocate >>> inode routines instead ? For example, in ext4 we could do : >> That looks okay - in fact XFS should already have this check because >> it re-uses the setattr implementation to set the size. >> >> Can you submit an xfstests testcase to verify this behaviour on all >> filesystems? > > Here is the new testcase. Thanks! A few comments... > I have run this test on a x86_64 box on XFS and ext4 on 2.6.34-rc6. It > passes on XFS, but fails on ext4. Below is the snapshot of results > followed by the testcase itself. > > -- > Regards, > Amit Arora > > Test results: > ------------ > # ./check 228 > FSTYP -- xfs (non-debug) > PLATFORM -- Linux/x86_64 elm9m93 2.6.34-rc6 > > 228 0s ... > Ran: 228 > Passed all 1 tests > # > # umount /mnt > # mkfs.ext4 /dev/sda4 >/dev/null > mke2fs 1.41.10 (10-Feb-2009) > # ./check 228 > FSTYP -- ext4 > PLATFORM -- Linux/x86_64 elm9m93 2.6.34-rc6 > > 228 0s ... - output mismatch (see 228.out.bad) > --- 228.out 2010-05-03 02:51:24.000000000 -0400 > +++ 228.out.bad 2010-05-03 04:27:33.000000000 -0400 > @@ -1,2 +1 @@ > QA output created by 228 > -File size limit exceeded (core dumped) > Ran: 228 > Failures: 228 > Failed 1 of 1 tests > # 228.out is missing from the patch Also on my fedora box I don't get a coredump by default; can you either make that explicit, or filter out the core message? > > Here is the test: > ---------------- > Add a new testcase to the xfstests suite to check if fallocate respects > the limit imposed by RLIMIT_FSIZE (can be set by "ulimit -f XXX") or > not, on a particular filesystem. ... > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.filter Nitpick, I don't think you need common.filter, doesn't look like you are using it. > +# FSIZE limit is now set to 100 MB. > +# Lets try to preallocate 101 MB. This should fail. > +$XFS_IO_PROG -F -f -c 'falloc 0 101m' $TEST_DIR/ouch > +rm -f $TEST_DIR/ouch > + > +# Lets now try to preallocate 50 MB. This should succeed. > +$XFS_IO_PROG -F -f -c 'falloc 0 50m' $TEST_DIR/ouch > +rm -f $TEST_DIR/ouch Even more nitpicky, but sometimes I think it's nice to have the .out file be a bit more descriptive in and of itself so when you see a failing diff you have a better idea what's gone wrong. Changing the comments to echos, like: +# FSIZE limit is now set to 100 MB. +# echo "Lets try to preallocate 101 MB. This should fail." +$XFS_IO_PROG -F -f -c 'falloc 0 101m' $TEST_DIR/ouch +rm -f $TEST_DIR/ouch etc ... would make a failure look like: --- 228.out 2010-05-04 15:42:31.924278768 -0500 +++ 228.out.bad 2010-05-04 15:42:36.961278392 -0500 @@ -1,3 +1,2 @@ QA output created by 228 Lets try to preallocate 101 MB. This should fail. -File size limit exceeded Lets now try to preallocate 50 MB. This should succeed. ... just a thought. Thanks, -Eric From aarora@linux.vnet.ibm.com Wed May 5 02:54:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o457s3aJ022593 for ; Wed, 5 May 2010 02:54:03 -0500 X-ASG-Debug-ID: 1273046171-306000680000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e32.co.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F0B4F30FBAD for ; Wed, 5 May 2010 00:56:11 -0700 (PDT) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.150]) by cuda.sgi.com with ESMTP id cdV4c9hhaTvR9QVZ for ; Wed, 05 May 2010 00:56:11 -0700 (PDT) Received: from d03relay01.boulder.ibm.com (d03relay01.boulder.ibm.com [9.17.195.226]) by e32.co.us.ibm.com (8.14.3/8.13.1) with ESMTP id o457n8uo007082 for ; Wed, 5 May 2010 01:49:08 -0600 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by d03relay01.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o457u8XO148940 for ; Wed, 5 May 2010 01:56:08 -0600 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.14.3/8.13.1/NCO v10.0 AVout) with ESMTP id o457u6Ep031774 for ; Wed, 5 May 2010 01:56:08 -0600 Received: from amitarora.in.ibm.com ([9.124.212.65]) by d03av02.boulder.ibm.com (8.14.3/8.13.1/NCO v10.0 AVin) with ESMTP id o457u400031601; Wed, 5 May 2010 01:56:05 -0600 Received: from amitarora.in.ibm.com (amitarora.in.ibm.com [127.0.0.1]) by amitarora.in.ibm.com (Postfix) with ESMTP id 2E3484854; Wed, 5 May 2010 13:26:03 +0530 (IST) Received: (from amit@localhost) by amitarora.in.ibm.com (8.14.2/8.14.2/Submit) id o457tuSh017681; Wed, 5 May 2010 13:25:56 +0530 Date: Wed, 5 May 2010 13:25:56 +0530 From: "Amit K. Arora" To: Eric Sandeen Cc: Christoph Hellwig , Andrew Morton , xfs@oss.sgi.com, Nikanth Karthikesan , coly.li@suse.de, Nick Piggin , Alexander Viro , linux-fsdevel@vger.kernel.org, "Theodore Ts'o" , Andreas Dilger , linux-ext4@vger.kernel.org, Eelis , Amit Arora X-ASG-Orig-Subj: [PATCH v2] New testcase to check if fallocate respects RLIMIT_FSIZE or not Subject: [PATCH v2] New testcase to check if fallocate respects RLIMIT_FSIZE or not Message-ID: <20100505075556.GA5142@amitarora.in.ibm.com> References: <201004281854.49730.knikanth@suse.de> <4BD85F1F.7030100@suse.de> <201004291014.07194.knikanth@suse.de> <20100430143319.d51d6d77.akpm@linux-foundation.org> <20100501070426.GA9562@amitarora.in.ibm.com> <20100501101846.GA3769@infradead.org> <20100503083135.GC13756@amitarora.in.ibm.com> <4BE08718.5040608@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4BE08718.5040608@redhat.com> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: e32.co.us.ibm.com[32.97.110.150] X-Barracuda-Start-Time: 1273046171 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.2, rules version 3.2.2.29111 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 04, 2010 at 03:44:08PM -0500, Eric Sandeen wrote: > Amit K. Arora wrote: > > Here is the new testcase. > Thanks! A few comments... Thanks for the review! > 228.out is missing from the patch Ok, added it in the new patch. > Also on my fedora box I don't get a coredump by default; can > you either make that explicit, or filter out the core message? Hmm.. for some strange reason I am no longer seeing this message. Tried on the same system as last time and couple of others also. > > > > Here is the test: > > ---------------- > > Add a new testcase to the xfstests suite to check if fallocate respects > > the limit imposed by RLIMIT_FSIZE (can be set by "ulimit -f XXX") or > > not, on a particular filesystem. > > ... > > > +# get standard environment, filters and checks > > +. ./common.rc > > +. ./common.filter > > Nitpick, I don't think you need common.filter, doesn't look like you are > using it. Right. Removed it.. > > +# FSIZE limit is now set to 100 MB. > > +# Lets try to preallocate 101 MB. This should fail. > > +$XFS_IO_PROG -F -f -c 'falloc 0 101m' $TEST_DIR/ouch > > +rm -f $TEST_DIR/ouch > > + > > +# Lets now try to preallocate 50 MB. This should succeed. > > +$XFS_IO_PROG -F -f -c 'falloc 0 50m' $TEST_DIR/ouch > > +rm -f $TEST_DIR/ouch > > Even more nitpicky, but sometimes I think it's nice to have the .out > file be a bit more descriptive in and of itself so when you see a > failing diff you have a better idea what's gone wrong. Agreed. Done. Here is the new patch with the changes: Add a new testcase to the xfstests suite to check if fallocate respects the limit imposed by RLIMIT_FSIZE (can be set by "ulimit -f XXX") or not, on a particular filesystem. Signed-off-by: Amit Arora diff -Nuarp xfstests-dev.org/228 xfstests-dev/228 --- xfstests-dev.org/228 1969-12-31 19:00:00.000000000 -0500 +++ xfstests-dev/228 2010-05-05 02:37:48.000000000 -0400 @@ -0,0 +1,79 @@ +#! /bin/bash +# FS QA Test No. 228 +# +# Check if fallocate respects RLIMIT_FSIZE +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 IBM Corporation. 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=aarora@in.ibm.com + +seq=`basename $0` +echo "QA output created by $seq" + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +here=`pwd` +tmp=$TEST_DIR/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 25 + +# get standard environment, filters and checks +. ./common.rc + +# real QA test starts here +# generic, but xfs_io's fallocate must work +_supported_fs generic +# only Linux supports fallocate +_supported_os Linux + +[ -n "$XFS_IO_PROG" ] || _notrun "xfs_io executable not found" + +rm -f $seq.full + +# Sanity check to see if fallocate works +_require_xfs_io_falloc + +# Check if we have good enough space available +avail=`df -P $TEST_DIR | awk 'END {print $4}'` +[ "$avail" -ge 104000 ] || _notrun "Test device is too small ($avail KiB)" + +# Set the FSIZE ulimit to 100MB and check +ulimit -f 102400 +flim=`ulimit -f` +[ "$flim" != "unlimited" ] || _notrun "Unable to set FSIZE ulimit" +[ "$flim" -eq 102400 ] || _notrun "FSIZE ulimit is not correct (100 MB)" + +echo "File size limit is now set to 100 MB." +echo "Let us try to preallocate 101 MB. This should fail." +$XFS_IO_PROG -F -f -c 'falloc 0 101m' $TEST_DIR/ouch +rm -f $TEST_DIR/ouch + +echo "Let us now try to preallocate 50 MB. This should succeed." +$XFS_IO_PROG -F -f -c 'falloc 0 50m' $TEST_DIR/ouch +rm -f $TEST_DIR/ouch + +echo "Test over." +# success, all done +status=0 +exit diff -Nuarp xfstests-dev.org/228.out xfstests-dev/228.out --- xfstests-dev.org/228.out 1969-12-31 19:00:00.000000000 -0500 +++ xfstests-dev/228.out 2010-05-05 02:38:30.000000000 -0400 @@ -0,0 +1,6 @@ +QA output created by 228 +File size limit is now set to 100 MB. +Let us try to preallocate 101 MB. This should fail. +File size limit exceeded +Let us now try to preallocate 50 MB. This should succeed. +Test over. diff -Nuarp xfstests-dev.org/group xfstests-dev/group --- xfstests-dev.org/group 2010-05-03 02:35:09.000000000 -0400 +++ xfstests-dev/group 2010-05-05 02:38:00.000000000 -0400 @@ -341,3 +341,4 @@ deprecated 225 auto quick 226 auto enospc 227 auto fsr +228 rw auto prealloc quick From Philippe.DENIEL@CEA.FR Wed May 5 08:52:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_92 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o45DqrOd037882 for ; Wed, 5 May 2010 08:52:53 -0500 X-ASG-Debug-ID: 1273067700-6c6601df0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from cirse-out.extra.cea.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 714DA310CBF for ; Wed, 5 May 2010 06:55:00 -0700 (PDT) Received: from cirse-out.extra.cea.fr (cirse-out.extra.cea.fr [132.166.172.106]) by cuda.sgi.com with ESMTP id Vx2pz7iQ6IhA7oYe for ; Wed, 05 May 2010 06:55:00 -0700 (PDT) Received: from pisaure.intra.cea.fr (pisaure.intra.cea.fr [132.166.88.21]) by cirse.extra.cea.fr (8.14.2/8.14.2/CEAnet-Internet-out-2.0) with ESMTP id o45Dsxgh022241 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT) for ; Wed, 5 May 2010 15:54:59 +0200 Received: from muguet2.intra.cea.fr (muguet2.intra.cea.fr [132.166.192.7]) by pisaure.intra.cea.fr (8.14.4/8.14.4) with ESMTP id o45DsxjP017128 for ; Wed, 5 May 2010 15:54:59 +0200 (envelope-from Philippe.DENIEL@CEA.FR) Received: from zia.bruyeres.cea.fr (esteban.dam.intra.cea.fr [132.165.76.10]) by muguet2.intra.cea.fr (8.13.8/8.13.8/CEAnet-Intranet-out-1.1) with SMTP id o45DsxZX001414 for ; Wed, 5 May 2010 15:54:59 +0200 Received: (qmail 10082 invoked from network); 5 May 2010 13:54:59 -0000 Message-ID: <4BE178B3.8030501@cea.fr> Date: Wed, 05 May 2010 15:54:59 +0200 From: DENIEL Philippe Organization: CEA-DAM User-Agent: Thunderbird 2.0.0.6 (X11/20070728) MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Question : Using libhandle from xfsprogs and xfs actions made "by handle" Subject: Question : Using libhandle from xfsprogs and xfs actions made "by handle" Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 May 2010 13:54:59.0160 (UTC) FILETIME=[8D142580:01CAEC5A] X-Barracuda-Connect: cirse-out.extra.cea.fr[132.166.172.106] X-Barracuda-Start-Time: 1273067701 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.2, rules version 3.2.2.29131 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, I had a look at the stuff within xfsprogs and it really look pretty nice. One thing is of great interest to me : the libhandle.so library. I am currently developing a NFS server running in userspace (see http://nfs-ganesha.sourceforge.net for details). As you know, the NFS protocol has a "handle based" semantics in the way it manages FS objects. All objects are identified by a unique filehandle or by their name and the parent's directory filehandle. The trouble is that libC does not include such "by handle" calls to manage FS, only the old fashioned POSIX API which is a "By path" API. When looking at XFS, I saw there was "open_by_handle" and "path_to_handle" calls. This sounds very very good to me : this sounds like kind of bridge to build a handle-based API to address XFS. But so far, I am a bit stuck : for exporting XFS through my NFS server, I would need to do "by handle" everything that can be done through POSIX calls, open/read/write/close files, create files/directories/symlinks, erasing or moving files... and so on. I do not know if this is possible with the calls in libhandle.so. But if I had such handle based tools, I think I could make a nice NFS server on top of XFS (I did this kind of port for LUSTRE (which has a full handle based API) in my NFS server and I had really good performances). Can someone provide me with information about this ? Regards Philippe From sandeen@redhat.com Wed May 5 10:48:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o45Fmo8I042650 for ; Wed, 5 May 2010 10:48:51 -0500 X-ASG-Debug-ID: 1273074658-153202ab0000-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 4B3BB94443B for ; Wed, 5 May 2010 08:50:58 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3G3vav7Ko7FvhkXw for ; Wed, 05 May 2010 08:50:58 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o45FoAUN026171 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 May 2010 11:50:10 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o45Fo8tD009208; Wed, 5 May 2010 11:50:08 -0400 Message-ID: <4BE193AF.3070505@redhat.com> Date: Wed, 05 May 2010 10:50:07 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100301 Fedora/3.0.3-1.fc11 Lightning/1.0b2pre Thunderbird/3.0.3 MIME-Version: 1.0 To: "Amit K. Arora" CC: Christoph Hellwig , Andrew Morton , xfs@oss.sgi.com, Nikanth Karthikesan , coly.li@suse.de, Nick Piggin , Alexander Viro , linux-fsdevel@vger.kernel.org, "Theodore Ts'o" , Andreas Dilger , linux-ext4@vger.kernel.org, Eelis , Amit Arora X-ASG-Orig-Subj: Re: [PATCH v2] New testcase to check if fallocate respects RLIMIT_FSIZE or not Subject: Re: [PATCH v2] New testcase to check if fallocate respects RLIMIT_FSIZE or not References: <201004281854.49730.knikanth@suse.de> <4BD85F1F.7030100@suse.de> <201004291014.07194.knikanth@suse.de> <20100430143319.d51d6d77.akpm@linux-foundation.org> <20100501070426.GA9562@amitarora.in.ibm.com> <20100501101846.GA3769@infradead.org> <20100503083135.GC13756@amitarora.in.ibm.com> <4BE08718.5040608@redhat.com> <20100505075556.GA5142@amitarora.in.ibm.com> In-Reply-To: <20100505075556.GA5142@amitarora.in.ibm.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1273074660 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 05/05/2010 02:55 AM, Amit K. Arora wrote: > On Tue, May 04, 2010 at 03:44:08PM -0500, Eric Sandeen wrote: >> Amit K. Arora wrote: >>> Here is the new testcase. >> Thanks! A few comments... > Thanks for the review! Sure thing - looks good, I'll merge it after a retest if it all goes well. :) -Eric From lists@nabble.com Wed May 5 15:07:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o45K7KgN052556 for ; Wed, 5 May 2010 15:07:20 -0500 X-ASG-Debug-ID: 1273090168-0ae700c40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kuber.nabble.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3EA271BD4CE3 for ; Wed, 5 May 2010 13:09:28 -0700 (PDT) Received: from kuber.nabble.com (kuber.nabble.com [216.139.236.158]) by cuda.sgi.com with ESMTP id EN57YOvciPBrVMRK for ; Wed, 05 May 2010 13:09:28 -0700 (PDT) Received: from isper.nabble.com ([192.168.236.156]) by kuber.nabble.com with esmtp (Exim 4.63) (envelope-from ) id 1O9kuO-0002wM-0U for xfs@oss.sgi.com; Wed, 05 May 2010 13:09:28 -0700 Message-ID: <28465863.post@talk.nabble.com> Date: Wed, 5 May 2010 13:09:27 -0700 (PDT) From: Rafal Blaszczyk To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Fwd: xfs - fixing wrong xfs size Subject: Re: Fwd: xfs - fixing wrong xfs size In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Nabble-From: blaszczykr+linux@gmail.com References: <49E353FD.5060207@sandeen.net> X-Barracuda-Connect: kuber.nabble.com[216.139.236.158] X-Barracuda-Start-Time: 1273090169 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.2, rules version 3.2.2.29149 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Apr 13, 2009 at 5:02 PM, Eric Sandeen wrote: > > attempt to access beyond end of device > > md0: rw=0, want=123024384, limit=123023488 > > I/O error in filesystem ("md0") meta-data dev md0 block 0x75533f8 > > ("xfs_read_buf") error 5 buf count 4096 > > > > XFS: size check 2 failed Hi, I've had similiar problems with md on top of lvm after converting from single LV to mirrored (md device). I've managed to solve it by expanding underlying devices by just a few megabytes. I suppose it's not your case because you're dealing with bare devices. But you could still try to experiment with xfs_growfs or other xfs_* tools. >From my case - this is not md's fault. XFS wants to have more underlying space than it has and it cannot be mounted. -- View this message in context: http://old.nabble.com/xfs---fixing-wrong-xfs-size-tp23023562p28465863.html Sent from the Xfs - General mailing list archive at Nabble.com. From sandeen@sandeen.net Wed May 5 17:09:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o45M9t5k056550 for ; Wed, 5 May 2010 17:09:56 -0500 X-ASG-Debug-ID: 1273097524-4a7c01ac0000-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 6E21C94AFC4 for ; Wed, 5 May 2010 15:12:05 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zqsjKnUs16pol6pf for ; Wed, 05 May 2010 15:12:05 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o45MC3jB005031 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 May 2010 18:12:03 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o45MC2iM028754; Wed, 5 May 2010 18:12:03 -0400 Message-ID: <4BE1ED32.7010108@sandeen.net> Date: Wed, 05 May 2010 17:12:02 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100301 Fedora/3.0.3-1.fc11 Lightning/1.0b2pre Thunderbird/3.0.3 MIME-Version: 1.0 To: Rafal Blaszczyk CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Fwd: xfs - fixing wrong xfs size Subject: Re: Fwd: xfs - fixing wrong xfs size References: <49E353FD.5060207@sandeen.net> <28465863.post@talk.nabble.com> In-Reply-To: <28465863.post@talk.nabble.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.21 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1273097525 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 05/05/2010 03:09 PM, Rafal Blaszczyk wrote: > > > > On Mon, Apr 13, 2009 at 5:02 PM, Eric Sandeen wrote: > > >>> attempt to access beyond end of device >>> md0: rw=0, want=123024384, limit=123023488 >>> I/O error in filesystem ("md0") meta-data dev md0 block 0x75533f8 >> >> ("xfs_read_buf") error 5 buf count 4096 >>> >>> XFS: size check 2 failed > > Hi, > I've had similiar problems with md on top of lvm after converting from > single LV to mirrored (md device). I've managed to solve it by expanding > underlying devices by just a few megabytes. I suppose it's not your case > because you're dealing with bare devices. > But you could still try to experiment with xfs_growfs or other xfs_* tools. > > From my case - this is not md's fault. XFS wants to have more underlying > space than it has and it cannot be mounted. xfs wants only as much space as it has when it was created :) If that changes such that it is smaller, you'll get this warning at mount time. This is almost certainly the result of something that happened outside xfs's control. -Eric From sandeen@sandeen.net Wed May 5 17:20:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o45MKEUW057004 for ; Wed, 5 May 2010 17:20:15 -0500 X-ASG-Debug-ID: 1273098144-462c02550000-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 7DC2294B1A2 for ; Wed, 5 May 2010 15:22:24 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ua8FdzbZXHpYaYAs for ; Wed, 05 May 2010 15:22:24 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o45MMLwS004751 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 May 2010 18:22:22 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o45MMLJG023319; Wed, 5 May 2010 18:22:21 -0400 Message-ID: <4BE1EF9D.2030901@sandeen.net> Date: Wed, 05 May 2010 17:22:21 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100301 Fedora/3.0.3-1.fc11 Lightning/1.0b2pre Thunderbird/3.0.3 MIME-Version: 1.0 To: Nebojsa Trpkovic CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Fwd: xfs - fixing wrong xfs size Subject: Re: Fwd: xfs - fixing wrong xfs size References: <49E353FD.5060207@sandeen.net> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1273098144 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 04/13/2009 11:33 AM, Nebojsa Trpkovic wrote: > how can I set superblock block-count value (now I have realy nothing to > loose - the only other option is to give up of that data) ? Sorry, I never replied to this :( You can use xfs_db to set it; or you could comment out the kernel check... and mount readonly, and copy off the data you can get to? -Eric From SRS0+o8Pk+65+fromorbit.com=dave@internode.on.net Wed May 5 20:43:50 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-3.8 required=5.0 tests=BAYES_00,FRT_ADOBE2, J_CHICKENPOX_64,J_CHICKENPOX_65,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o461hn2h064952 for ; Wed, 5 May 2010 20:43:50 -0500 X-ASG-Debug-ID: 1273110355-746600af0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2EB421B0A122 for ; Wed, 5 May 2010 18:45:56 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id h5nacnRybBUXEhhA for ; Wed, 05 May 2010 18:45:56 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23089810-1927428 for ; Thu, 06 May 2010 11:15:54 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1O9q9w-0005DS-Ep for xfs@oss.sgi.com; Thu, 06 May 2010 11:45:52 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1O9q9v-0000cR-G4 for xfs@oss.sgi.com; Thu, 06 May 2010 11:45:51 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 05/11] xfs: Clean up XFS_BLI_* flag namespace Subject: [PATCH 05/11] xfs: Clean up XFS_BLI_* flag namespace Date: Thu, 6 May 2010 11:45:45 +1000 Message-Id: <1273110351-2333-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273110351-2333-1-git-send-email-david@fromorbit.com> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1273110358 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.2, rules version 3.2.2.29166 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Clean up the buffer log format (XFS_BLI_*) flags because they have a polluted namespace. They XFS_BLI_ prefix is used for both in-memory and on-disk flag feilds, but have overlapping values for different flags. Rename the buffer log format flags to use the XFS_BLF_* prefix to avoid confusing them with the in-memory XFS_BLI_* prefixed flags. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 2 +- fs/xfs/quota/xfs_dquot.c | 6 ++-- fs/xfs/xfs_buf_item.c | 42 +++++++++++++++++++------------------- fs/xfs/xfs_buf_item.h | 14 ++++++------ fs/xfs/xfs_log_recover.c | 46 +++++++++++++++++++++--------------------- fs/xfs/xfs_log_recover.h | 2 +- fs/xfs/xfs_trans_buf.c | 28 ++++++++++++------------ 7 files changed, 70 insertions(+), 70 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index a43d09e..1e88c98 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1753,7 +1753,7 @@ xfs_init_zones(void) * but it is much faster. */ xfs_buf_item_zone = kmem_zone_init((sizeof(xfs_buf_log_item_t) + - (((XFS_MAX_BLOCKSIZE / XFS_BLI_CHUNK) / + (((XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK) / NBWORD) * sizeof(int))), "xfs_buf_item"); if (!xfs_buf_item_zone) goto out_destroy_trans_zone; diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index b89ec5d..585e763 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -344,9 +344,9 @@ xfs_qm_init_dquot_blk( for (i = 0; i < q->qi_dqperchunk; i++, d++, curid++) xfs_qm_dqinit_core(curid, type, d); xfs_trans_dquot_buf(tp, bp, - (type & XFS_DQ_USER ? XFS_BLI_UDQUOT_BUF : - ((type & XFS_DQ_PROJ) ? XFS_BLI_PDQUOT_BUF : - XFS_BLI_GDQUOT_BUF))); + (type & XFS_DQ_USER ? XFS_BLF_UDQUOT_BUF : + ((type & XFS_DQ_PROJ) ? XFS_BLF_PDQUOT_BUF : + XFS_BLF_GDQUOT_BUF))); xfs_trans_log_buf(tp, bp, 0, BBTOB(q->qi_dqchunklen) - 1); } diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 4cd5f61..bcbb661 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -64,7 +64,7 @@ xfs_buf_item_log_debug( nbytes = last - first + 1; bfset(bip->bli_logged, first, nbytes); for (x = 0; x < nbytes; x++) { - chunk_num = byte >> XFS_BLI_SHIFT; + chunk_num = byte >> XFS_BLF_SHIFT; word_num = chunk_num >> BIT_TO_WORD_SHIFT; bit_num = chunk_num & (NBWORD - 1); wordp = &(bip->bli_format.blf_data_map[word_num]); @@ -166,7 +166,7 @@ xfs_buf_item_size( * cancel flag in it. */ trace_xfs_buf_item_size_stale(bip); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); return 1; } @@ -197,9 +197,9 @@ xfs_buf_item_size( } else if (next_bit != last_bit + 1) { last_bit = next_bit; nvecs++; - } else if (xfs_buf_offset(bp, next_bit * XFS_BLI_CHUNK) != - (xfs_buf_offset(bp, last_bit * XFS_BLI_CHUNK) + - XFS_BLI_CHUNK)) { + } else if (xfs_buf_offset(bp, next_bit * XFS_BLF_CHUNK) != + (xfs_buf_offset(bp, last_bit * XFS_BLF_CHUNK) + + XFS_BLF_CHUNK)) { last_bit = next_bit; nvecs++; } else { @@ -261,7 +261,7 @@ xfs_buf_item_format( * cancel flag in it. */ trace_xfs_buf_item_format_stale(bip); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); bip->bli_format.blf_size = nvecs; return; } @@ -294,28 +294,28 @@ xfs_buf_item_format( * keep counting and scanning. */ if (next_bit == -1) { - buffer_offset = first_bit * XFS_BLI_CHUNK; + buffer_offset = first_bit * XFS_BLF_CHUNK; vecp->i_addr = xfs_buf_offset(bp, buffer_offset); - vecp->i_len = nbits * XFS_BLI_CHUNK; + vecp->i_len = nbits * XFS_BLF_CHUNK; vecp->i_type = XLOG_REG_TYPE_BCHUNK; nvecs++; break; } else if (next_bit != last_bit + 1) { - buffer_offset = first_bit * XFS_BLI_CHUNK; + buffer_offset = first_bit * XFS_BLF_CHUNK; vecp->i_addr = xfs_buf_offset(bp, buffer_offset); - vecp->i_len = nbits * XFS_BLI_CHUNK; + vecp->i_len = nbits * XFS_BLF_CHUNK; vecp->i_type = XLOG_REG_TYPE_BCHUNK; nvecs++; vecp++; first_bit = next_bit; last_bit = next_bit; nbits = 1; - } else if (xfs_buf_offset(bp, next_bit << XFS_BLI_SHIFT) != - (xfs_buf_offset(bp, last_bit << XFS_BLI_SHIFT) + - XFS_BLI_CHUNK)) { - buffer_offset = first_bit * XFS_BLI_CHUNK; + } else if (xfs_buf_offset(bp, next_bit << XFS_BLF_SHIFT) != + (xfs_buf_offset(bp, last_bit << XFS_BLF_SHIFT) + + XFS_BLF_CHUNK)) { + buffer_offset = first_bit * XFS_BLF_CHUNK; vecp->i_addr = xfs_buf_offset(bp, buffer_offset); - vecp->i_len = nbits * XFS_BLI_CHUNK; + vecp->i_len = nbits * XFS_BLF_CHUNK; vecp->i_type = XLOG_REG_TYPE_BCHUNK; /* You would think we need to bump the nvecs here too, but we do not * this number is used by recovery, and it gets confused by the boundary @@ -399,7 +399,7 @@ xfs_buf_item_unpin( ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); ASSERT(!(XFS_BUF_ISDELAYWRITE(bp))); ASSERT(XFS_BUF_ISSTALE(bp)); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); trace_xfs_buf_item_unpin_stale(bip); /* @@ -550,7 +550,7 @@ xfs_buf_item_unlock( */ if (bip->bli_flags & XFS_BLI_STALE) { trace_xfs_buf_item_unlock_stale(bip); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); if (!aborted) { atomic_dec(&bip->bli_refcount); return; @@ -707,12 +707,12 @@ xfs_buf_item_init( } /* - * chunks is the number of XFS_BLI_CHUNK size pieces + * chunks is the number of XFS_BLF_CHUNK size pieces * the buffer can be divided into. Make sure not to * truncate any pieces. map_size is the size of the * bitmap needed to describe the chunks of the buffer. */ - chunks = (int)((XFS_BUF_COUNT(bp) + (XFS_BLI_CHUNK - 1)) >> XFS_BLI_SHIFT); + chunks = (int)((XFS_BUF_COUNT(bp) + (XFS_BLF_CHUNK - 1)) >> XFS_BLF_SHIFT); map_size = (int)((chunks + NBWORD) >> BIT_TO_WORD_SHIFT); bip = (xfs_buf_log_item_t*)kmem_zone_zalloc(xfs_buf_item_zone, @@ -780,8 +780,8 @@ xfs_buf_item_log( /* * Convert byte offsets to bit numbers. */ - first_bit = first >> XFS_BLI_SHIFT; - last_bit = last >> XFS_BLI_SHIFT; + first_bit = first >> XFS_BLF_SHIFT; + last_bit = last >> XFS_BLF_SHIFT; /* * Calculate the total number of bits to be set. diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index df44545..8cbb82b 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -41,22 +41,22 @@ typedef struct xfs_buf_log_format { * This flag indicates that the buffer contains on disk inodes * and requires special recovery handling. */ -#define XFS_BLI_INODE_BUF 0x1 +#define XFS_BLF_INODE_BUF 0x1 /* * This flag indicates that the buffer should not be replayed * during recovery because its blocks are being freed. */ -#define XFS_BLI_CANCEL 0x2 +#define XFS_BLF_CANCEL 0x2 /* * This flag indicates that the buffer contains on disk * user or group dquots and may require special recovery handling. */ -#define XFS_BLI_UDQUOT_BUF 0x4 -#define XFS_BLI_PDQUOT_BUF 0x8 -#define XFS_BLI_GDQUOT_BUF 0x10 +#define XFS_BLF_UDQUOT_BUF 0x4 +#define XFS_BLF_PDQUOT_BUF 0x8 +#define XFS_BLF_GDQUOT_BUF 0x10 -#define XFS_BLI_CHUNK 128 -#define XFS_BLI_SHIFT 7 +#define XFS_BLF_CHUNK 128 +#define XFS_BLF_SHIFT 7 #define BIT_TO_WORD_SHIFT 5 #define NBWORD (NBBY * sizeof(unsigned int)) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 0de08e3..14a69ae 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1576,7 +1576,7 @@ xlog_recover_reorder_trans( switch (ITEM_TYPE(item)) { case XFS_LI_BUF: - if (!(buf_f->blf_flags & XFS_BLI_CANCEL)) { + if (!(buf_f->blf_flags & XFS_BLF_CANCEL)) { trace_xfs_log_recover_item_reorder_head(log, trans, item, pass); list_move(&item->ri_list, &trans->r_itemq); @@ -1638,7 +1638,7 @@ xlog_recover_do_buffer_pass1( /* * If this isn't a cancel buffer item, then just return. */ - if (!(flags & XFS_BLI_CANCEL)) { + if (!(flags & XFS_BLF_CANCEL)) { trace_xfs_log_recover_buf_not_cancel(log, buf_f); return; } @@ -1696,7 +1696,7 @@ xlog_recover_do_buffer_pass1( * Check to see whether the buffer being recovered has a corresponding * entry in the buffer cancel record table. If it does then return 1 * so that it will be cancelled, otherwise return 0. If the buffer is - * actually a buffer cancel item (XFS_BLI_CANCEL is set), then decrement + * actually a buffer cancel item (XFS_BLF_CANCEL is set), then decrement * the refcount on the entry in the table and remove it from the table * if this is the last reference. * @@ -1721,7 +1721,7 @@ xlog_check_buffer_cancelled( * There is nothing in the table built in pass one, * so this buffer must not be cancelled. */ - ASSERT(!(flags & XFS_BLI_CANCEL)); + ASSERT(!(flags & XFS_BLF_CANCEL)); return 0; } @@ -1733,7 +1733,7 @@ xlog_check_buffer_cancelled( * There is no corresponding entry in the table built * in pass one, so this buffer has not been cancelled. */ - ASSERT(!(flags & XFS_BLI_CANCEL)); + ASSERT(!(flags & XFS_BLF_CANCEL)); return 0; } @@ -1752,7 +1752,7 @@ xlog_check_buffer_cancelled( * one in the table and remove it if this is the * last reference. */ - if (flags & XFS_BLI_CANCEL) { + if (flags & XFS_BLF_CANCEL) { bcp->bc_refcount--; if (bcp->bc_refcount == 0) { if (prevp == NULL) { @@ -1772,7 +1772,7 @@ xlog_check_buffer_cancelled( * We didn't find a corresponding entry in the table, so * return 0 so that the buffer is NOT cancelled. */ - ASSERT(!(flags & XFS_BLI_CANCEL)); + ASSERT(!(flags & XFS_BLF_CANCEL)); return 0; } @@ -1874,8 +1874,8 @@ xlog_recover_do_inode_buffer( nbits = xfs_contig_bits(data_map, map_size, bit); ASSERT(nbits > 0); - reg_buf_offset = bit << XFS_BLI_SHIFT; - reg_buf_bytes = nbits << XFS_BLI_SHIFT; + reg_buf_offset = bit << XFS_BLF_SHIFT; + reg_buf_bytes = nbits << XFS_BLF_SHIFT; item_index++; } @@ -1889,7 +1889,7 @@ xlog_recover_do_inode_buffer( } ASSERT(item->ri_buf[item_index].i_addr != NULL); - ASSERT((item->ri_buf[item_index].i_len % XFS_BLI_CHUNK) == 0); + ASSERT((item->ri_buf[item_index].i_len % XFS_BLF_CHUNK) == 0); ASSERT((reg_buf_offset + reg_buf_bytes) <= XFS_BUF_COUNT(bp)); /* @@ -1955,9 +1955,9 @@ xlog_recover_do_reg_buffer( nbits = xfs_contig_bits(data_map, map_size, bit); ASSERT(nbits > 0); ASSERT(item->ri_buf[i].i_addr != NULL); - ASSERT(item->ri_buf[i].i_len % XFS_BLI_CHUNK == 0); + ASSERT(item->ri_buf[i].i_len % XFS_BLF_CHUNK == 0); ASSERT(XFS_BUF_COUNT(bp) >= - ((uint)bit << XFS_BLI_SHIFT)+(nbits<blf_flags & - (XFS_BLI_UDQUOT_BUF|XFS_BLI_PDQUOT_BUF|XFS_BLI_GDQUOT_BUF)) { + (XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) { if (item->ri_buf[i].i_addr == NULL) { cmn_err(CE_ALERT, "XFS: NULL dquot in %s.", __func__); @@ -1987,9 +1987,9 @@ xlog_recover_do_reg_buffer( } memcpy(xfs_buf_offset(bp, - (uint)bit << XFS_BLI_SHIFT), /* dest */ + (uint)bit << XFS_BLF_SHIFT), /* dest */ item->ri_buf[i].i_addr, /* source */ - nbits<blf_flags & XFS_BLI_UDQUOT_BUF) + if (buf_f->blf_flags & XFS_BLF_UDQUOT_BUF) type |= XFS_DQ_USER; - if (buf_f->blf_flags & XFS_BLI_PDQUOT_BUF) + if (buf_f->blf_flags & XFS_BLF_PDQUOT_BUF) type |= XFS_DQ_PROJ; - if (buf_f->blf_flags & XFS_BLI_GDQUOT_BUF) + if (buf_f->blf_flags & XFS_BLF_GDQUOT_BUF) type |= XFS_DQ_GROUP; /* * This type of quotas was turned off, so ignore this buffer @@ -2173,7 +2173,7 @@ xlog_recover_do_dquot_buffer( * here which overlaps that may be stale. * * When meta-data buffers are freed at run time we log a buffer item - * with the XFS_BLI_CANCEL bit set to indicate that previous copies + * with the XFS_BLF_CANCEL bit set to indicate that previous copies * of the buffer in the log should not be replayed at recovery time. * This is so that if the blocks covered by the buffer are reused for * file data before we crash we don't end up replaying old, freed @@ -2207,7 +2207,7 @@ xlog_recover_do_buffer_trans( if (pass == XLOG_RECOVER_PASS1) { /* * In this pass we're only looking for buf items - * with the XFS_BLI_CANCEL bit set. + * with the XFS_BLF_CANCEL bit set. */ xlog_recover_do_buffer_pass1(log, buf_f); return 0; @@ -2244,7 +2244,7 @@ xlog_recover_do_buffer_trans( mp = log->l_mp; buf_flags = XBF_LOCK; - if (!(flags & XFS_BLI_INODE_BUF)) + if (!(flags & XFS_BLF_INODE_BUF)) buf_flags |= XBF_MAPPED; bp = xfs_buf_read(mp->m_ddev_targp, blkno, len, buf_flags); @@ -2257,10 +2257,10 @@ xlog_recover_do_buffer_trans( } error = 0; - if (flags & XFS_BLI_INODE_BUF) { + if (flags & XFS_BLF_INODE_BUF) { error = xlog_recover_do_inode_buffer(mp, item, bp, buf_f); } else if (flags & - (XFS_BLI_UDQUOT_BUF|XFS_BLI_PDQUOT_BUF|XFS_BLI_GDQUOT_BUF)) { + (XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) { xlog_recover_do_dquot_buffer(mp, log, item, bp, buf_f); } else { xlog_recover_do_reg_buffer(mp, item, bp, buf_f); diff --git a/fs/xfs/xfs_log_recover.h b/fs/xfs/xfs_log_recover.h index 75d7492..1c55ccb 100644 --- a/fs/xfs/xfs_log_recover.h +++ b/fs/xfs/xfs_log_recover.h @@ -28,7 +28,7 @@ #define XLOG_RHASH(tid) \ ((((__uint32_t)tid)>>XLOG_RHASH_SHIFT) & (XLOG_RHASH_SIZE-1)) -#define XLOG_MAX_REGIONS_IN_ITEM (XFS_MAX_BLOCKSIZE / XFS_BLI_CHUNK / 2 + 1) +#define XLOG_MAX_REGIONS_IN_ITEM (XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK / 2 + 1) /* diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 9cd8090..3390c3e 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -114,7 +114,7 @@ _xfs_trans_bjoin( xfs_buf_item_init(bp, tp->t_mountp); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(!(bip->bli_flags & XFS_BLI_LOGGED)); if (reset_recur) bip->bli_recur = 0; @@ -511,7 +511,7 @@ xfs_trans_brelse(xfs_trans_t *tp, bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(bip->bli_item.li_type == XFS_LI_BUF); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(atomic_read(&bip->bli_refcount) > 0); /* @@ -619,7 +619,7 @@ xfs_trans_bhold(xfs_trans_t *tp, bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(atomic_read(&bip->bli_refcount) > 0); bip->bli_flags |= XFS_BLI_HOLD; trace_xfs_trans_bhold(bip); @@ -641,7 +641,7 @@ xfs_trans_bhold_release(xfs_trans_t *tp, bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT(bip->bli_flags & XFS_BLI_HOLD); bip->bli_flags &= ~XFS_BLI_HOLD; @@ -704,7 +704,7 @@ xfs_trans_log_buf(xfs_trans_t *tp, bip->bli_flags &= ~XFS_BLI_STALE; ASSERT(XFS_BUF_ISSTALE(bp)); XFS_BUF_UNSTALE(bp); - bip->bli_format.blf_flags &= ~XFS_BLI_CANCEL; + bip->bli_format.blf_flags &= ~XFS_BLF_CANCEL; } lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); @@ -762,8 +762,8 @@ xfs_trans_binval( ASSERT(!(XFS_BUF_ISDELAYWRITE(bp))); ASSERT(XFS_BUF_ISSTALE(bp)); ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_INODE_BUF)); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_INODE_BUF)); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); ASSERT(lidp->lid_flags & XFS_LID_DIRTY); ASSERT(tp->t_flags & XFS_TRANS_DIRTY); return; @@ -774,7 +774,7 @@ xfs_trans_binval( * in the buf log item. The STALE flag will be used in * xfs_buf_item_unpin() to determine if it should clean up * when the last reference to the buf item is given up. - * We set the XFS_BLI_CANCEL flag in the buf log format structure + * We set the XFS_BLF_CANCEL flag in the buf log format structure * and log the buf item. This will be used at recovery time * to determine that copies of the buffer in the log before * this should not be replayed. @@ -793,8 +793,8 @@ xfs_trans_binval( XFS_BUF_STALE(bp); bip->bli_flags |= XFS_BLI_STALE; bip->bli_flags &= ~(XFS_BLI_LOGGED | XFS_BLI_DIRTY); - bip->bli_format.blf_flags &= ~XFS_BLI_INODE_BUF; - bip->bli_format.blf_flags |= XFS_BLI_CANCEL; + bip->bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; + bip->bli_format.blf_flags |= XFS_BLF_CANCEL; memset((char *)(bip->bli_format.blf_data_map), 0, (bip->bli_format.blf_map_size * sizeof(uint))); lidp->lid_flags |= XFS_LID_DIRTY; @@ -826,7 +826,7 @@ xfs_trans_inode_buf( bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(atomic_read(&bip->bli_refcount) > 0); - bip->bli_format.blf_flags |= XFS_BLI_INODE_BUF; + bip->bli_format.blf_flags |= XFS_BLF_INODE_BUF; } /* @@ -908,9 +908,9 @@ xfs_trans_dquot_buf( ASSERT(XFS_BUF_ISBUSY(bp)); ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); - ASSERT(type == XFS_BLI_UDQUOT_BUF || - type == XFS_BLI_PDQUOT_BUF || - type == XFS_BLI_GDQUOT_BUF); + ASSERT(type == XFS_BLF_UDQUOT_BUF || + type == XFS_BLF_PDQUOT_BUF || + type == XFS_BLF_GDQUOT_BUF); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(atomic_read(&bip->bli_refcount) > 0); -- 1.5.6.5 From SRS0+QjcZ+65+fromorbit.com=dave@internode.on.net Wed May 5 20:43:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o461huLt064969 for ; Wed, 5 May 2010 20:43:56 -0500 X-ASG-Debug-ID: 1273110364-707500d60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9FD311B0A173 for ; Wed, 5 May 2010 18:46:04 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id Og2TiwyOnl4F3hsp for ; Wed, 05 May 2010 18:46:04 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11655209-1927428 for ; Thu, 06 May 2010 11:16:03 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1O9q9w-0005DL-6Z for xfs@oss.sgi.com; Thu, 06 May 2010 11:45:52 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1O9q9v-0000cF-5z for xfs@oss.sgi.com; Thu, 06 May 2010 11:45:51 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 01/11] xfs: Don't reuse the same transaciton ID for duplicated transactions. Subject: [PATCH 01/11] xfs: Don't reuse the same transaciton ID for duplicated transactions. Date: Thu, 6 May 2010 11:45:41 +1000 Message-Id: <1273110351-2333-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273110351-2333-1-git-send-email-david@fromorbit.com> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1273110365 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.2, rules version 3.2.2.29166 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The transaction ID is written into the log as the unique identifier for transactions during recover. When duplicating a transaction, we reuse the log ticket, which means it has the same transaction ID as the previous transaction. Rather than regenerating a random transaction ID for the duplicated transaction, just add one to the current ID so that duplicated transaction can be easily spotted in the log and during recovery during problem diagnosis. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 3038dd5..687b220 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -360,6 +360,15 @@ xfs_log_reserve( ASSERT(flags & XFS_LOG_PERM_RESERV); internal_ticket = *ticket; + /* + * this is a new transaction on the ticket, so we need to + * change the transaction ID so that the next transaction has a + * different TID in the log. Just add one to the existing tid + * so that we can see chains of rolling transactions in the log + * easily. + */ + internal_ticket->t_tid++; + trace_xfs_log_reserve(log, internal_ticket); xlog_grant_push_ail(mp, internal_ticket->t_unit_res); -- 1.5.6.5 From SRS0+QjcZ+65+fromorbit.com=dave@internode.on.net Wed May 5 20:43:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o461hutx064981 for ; Wed, 5 May 2010 20:43:57 -0500 X-ASG-Debug-ID: 1273110364-137202cb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 51FD33139B0 for ; Wed, 5 May 2010 18:46:04 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id qcUOHz0n7KEjpG5G for ; Wed, 05 May 2010 18:46:04 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23180505-1927428 for ; Thu, 06 May 2010 11:16:03 +0930 (CST) Received: from [192.168.1.9] (helo=disturbed) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1O9qA6-0005DN-70 for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:02 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1O9q9v-0000cK-AJ for xfs@oss.sgi.com; Thu, 06 May 2010 11:45:51 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 03/11] xfs: allow log ticket allocation to take allocation flags Subject: [PATCH 03/11] xfs: allow log ticket allocation to take allocation flags Date: Thu, 6 May 2010 11:45:43 +1000 Message-Id: <1273110351-2333-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273110351-2333-1-git-send-email-david@fromorbit.com> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1273110366 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.2, rules version 3.2.2.29166 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Delayed logging currently requires ticket allocation to succeed, so we need to be able to sleep on allocation. It also should not allow memory allocation to recurse into the filesystem. hence we need to pass allocation flags directing the type of allocation the caller requires. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 687b220..83be6a6 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -88,11 +88,9 @@ STATIC void xlog_ungrant_log_space(xlog_t *log, /* local ticket functions */ -STATIC xlog_ticket_t *xlog_ticket_alloc(xlog_t *log, - int unit_bytes, - int count, - char clientid, - uint flags); +STATIC xlog_ticket_t *xlog_ticket_alloc(xlog_t *log, int unit_bytes, int count, + char clientid, uint flags, + int alloc_flags); #if defined(DEBUG) STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr); @@ -376,7 +374,8 @@ xfs_log_reserve( } else { /* may sleep if need to allocate more tickets */ internal_ticket = xlog_ticket_alloc(log, unit_bytes, cnt, - client, flags); + client, flags, + KM_SLEEP|KM_MAYFAIL); if (!internal_ticket) return XFS_ERROR(ENOMEM); internal_ticket->t_trans_type = t_type; @@ -3331,13 +3330,14 @@ xlog_ticket_alloc( int unit_bytes, int cnt, char client, - uint xflags) + uint xflags, + int alloc_flags) { struct xlog_ticket *tic; uint num_headers; int iclog_space; - tic = kmem_zone_zalloc(xfs_log_ticket_zone, KM_SLEEP|KM_MAYFAIL); + tic = kmem_zone_zalloc(xfs_log_ticket_zone, alloc_flags); if (!tic) return NULL; -- 1.5.6.5 From SRS0+8lZF+65+fromorbit.com=dave@internode.on.net Wed May 5 20:43:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o461hu5k064977 for ; Wed, 5 May 2010 20:43:56 -0500 X-ASG-Debug-ID: 1273110364-706800fd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7BD9C1B0A173 for ; Wed, 5 May 2010 18:46:05 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id riOHIoqezqvMTVcE for ; Wed, 05 May 2010 18:46:05 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23118553-1927428 for ; Thu, 06 May 2010 11:16:03 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1O9q9w-0005DK-6U for xfs@oss.sgi.com; Thu, 06 May 2010 11:45:52 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1O9q9v-0000cD-44 for xfs@oss.sgi.com; Thu, 06 May 2010 11:45:51 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/11] xfs: delayed logging Subject: [PATCH 0/11] xfs: delayed logging Date: Thu, 6 May 2010 11:45:40 +1000 Message-Id: <1273110351-2333-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1273110366 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-ASG-Whitelist: BODY (http://marc\.info/\?) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Folks, This is version 4 of the delayed logging series. I won't repeat everything about what it is, just point you here: http://marc.info/?l=linux-xfs&m=126862777118946&w=2 for the description, and here: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/xfs.git delayed-logging for the current code. Note that this is a rebased branch, so you'll need to pull it again into a new branch to review. This version includes a number of fixes and cleanups related to the busy extent tracking. This includes fixing a long standing off-by-one that was causing assert failures when inserting busy extents that overlapped with existing busy extents. The patch series follows this mail to make it easier for people to respond to specific pieces of the code during review. I'm still making the entire patch set available through git, though. The changes are mostly small and isolated, so there isn't much change from the previous version: Version 4: 26 files changed, 2351 insertions(+), 510 deletions(-) Version 3: 28 files changed, 2366 insertions(+), 506 deletions(-) Version 2: 22 files changed, 2188 insertions(+), 377 deletions(-) Version 1: 19 files changed, 2594 insertions(+), 580 deletions(-) Changes for V4: o fixes duplicate transaction IDs on rolling transactions (new commit) o folded in a busy extent freeing cleanup from Christoph Hellwig o made API prefix consistent (xfs_alloc_busy_*) o combined xfs_alloc_mark_busy and xfs_alloc_busy_insert o reverted back to tracking transaction pointers in busy extents o removed exporting of transaction ID for busy extents o fixed an off-by-one in the extent range match in the busy extent search code that has been triggering assert failures o use list_splice_init() when splicing busy extents from the transaction to the checkpoint context to ensure we don't get transactions thinking they have busy extents to free after we've already attached them to the checkpoint. Changes for V3: o changed buffer log item reference counted model to be consistent for both logging modes o cleaned up XFS_BLI flags usage (new commit) o separated out log ticket overrun printing cleanup (new commit) o made sure "delaylog" option shows up in /proc/mounts o collapsed many of the intermediate commits together to make it easier to review o fixed inode buffer tagging issue that was causing shutdowns in log recovery in test 087 and 121 Changes for V2: o 22 files changed, 2188 insertions(+), 377 deletions(-) o fixed some memory leaks o fixed ticket allocation for checkpoints to use KM_NOFS o minor code cleanups o performed stress and scalability testing The following changes since commit 6ff75b78182c314112c1173edaab6c164c95d775: Christoph Hellwig (1): xfs: mark xfs_iomap_write_ helpers static are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/xfs.git delayed-logging Dave Chinner (11): xfs: Don't reuse the same transaciton ID for duplicated transactions. xfs: Improve scalability of busy extent tracking xfs: allow log ticket allocation to take allocation flags xfs: modify buffer item reference counting V2 xfs: Clean up XFS_BLI_* flag namespace xfs: clean up log ticket overrun debug output xfs: Delayed logging design documentation xfs: Introduce delayed logging core code xfs: forced unmounts need to push the CIL xfs: enable background pushing of the CIL xfs: Ensure inode allocation buffers are fully replayed .../filesystems/xfs-delayed-logging-design.txt | 819 ++++++++++++++++++++ fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_buf.c | 11 +- fs/xfs/linux-2.6/xfs_quotaops.c | 1 + fs/xfs/linux-2.6/xfs_super.c | 12 +- fs/xfs/linux-2.6/xfs_trace.h | 80 ++- fs/xfs/quota/xfs_dquot.c | 6 +- fs/xfs/xfs_ag.h | 21 +- fs/xfs/xfs_alloc.c | 276 ++++--- fs/xfs/xfs_alloc.h | 7 +- fs/xfs/xfs_alloc_btree.c | 2 +- fs/xfs/xfs_buf_item.c | 166 ++-- fs/xfs/xfs_buf_item.h | 18 +- fs/xfs/xfs_error.c | 2 +- fs/xfs/xfs_log.c | 116 ++- fs/xfs/xfs_log.h | 10 +- fs/xfs/xfs_log_cil.c | 733 ++++++++++++++++++ fs/xfs/xfs_log_priv.h | 116 +++- fs/xfs/xfs_log_recover.c | 46 +- fs/xfs/xfs_log_recover.h | 2 +- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 195 ++++- fs/xfs/xfs_trans.h | 44 +- fs/xfs/xfs_trans_buf.c | 46 +- fs/xfs/xfs_trans_item.c | 114 +--- fs/xfs/xfs_trans_priv.h | 16 +- 26 files changed, 2351 insertions(+), 510 deletions(-) create mode 100644 Documentation/filesystems/xfs-delayed-logging-design.txt create mode 100644 fs/xfs/xfs_log_cil.c From SRS0+8lZF+65+fromorbit.com=dave@internode.on.net Wed May 5 20:44:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o461i1ek065016 for ; Wed, 5 May 2010 20:44:01 -0500 X-ASG-Debug-ID: 1273110369-4479034d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CFECB1B0A17B for ; Wed, 5 May 2010 18:46:09 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id oEIuuqgC2UrMJLrl for ; Wed, 05 May 2010 18:46:09 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23118559-1927428 for ; Thu, 06 May 2010 11:16:08 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1O9qAB-0005Dv-H3 for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:07 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1O9qA5-0000cc-OW for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 09/11] xfs: forced unmounts need to push the CIL Subject: [PATCH 09/11] xfs: forced unmounts need to push the CIL Date: Thu, 6 May 2010 11:45:49 +1000 Message-Id: <1273110351-2333-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273110351-2333-1-git-send-email-david@fromorbit.com> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1273110370 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0206 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.2, rules version 3.2.2.29166 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner If the filesystem is being shut down and the there is no log error, the current code forces out the current log buffers. This code now needs to push the CIL before it forces out the log buffers to acheive the same result. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 88cdfac..7aabd79 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -3684,6 +3684,11 @@ xlog_state_ioerror( * c. nothing new gets queued up after (a) and (b) are done. * d. if !logerror, flush the iclogs to disk, then seal them off * for business. + * + * Note: for delayed logging the !logerror case needs to flush the regions + * held in memory out to the iclogs before flushing them to disk. This needs + * to be done before the log is marked as shutdown, otherwise the flush to the + * iclogs will fail. */ int xfs_log_force_umount( @@ -3717,6 +3722,16 @@ xfs_log_force_umount( return 1; } retval = 0; + + /* + * Flush the in memory commit item list before marking the log as + * being shut down. We need to do it in this order to ensure all the + * completed transactions are flushed to disk with the xfs_log_force() + * call below. + */ + if (!logerror && (mp->m_flags & XFS_MOUNT_DELAYLOG)) + xlog_cil_push(log, 1); + /* * We must hold both the GRANT lock and the LOG lock, * before we mark the filesystem SHUTDOWN and wake -- 1.5.6.5 From SRS0+o8Pk+65+fromorbit.com=dave@internode.on.net Wed May 5 20:44:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o461i08w065010 for ; Wed, 5 May 2010 20:44:01 -0500 X-ASG-Debug-ID: 1273110367-742e00c80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2609B1B0A17A for ; Wed, 5 May 2010 18:46:07 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id hOUitqjtS9RJ9bjv for ; Wed, 05 May 2010 18:46:07 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23089826-1927428 for ; Thu, 06 May 2010 11:16:04 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1O9q9w-0005DM-7d for xfs@oss.sgi.com; Thu, 06 May 2010 11:45:52 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1O9q9v-0000cH-82 for xfs@oss.sgi.com; Thu, 06 May 2010 11:45:51 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 02/11] xfs: Improve scalability of busy extent tracking Subject: [PATCH 02/11] xfs: Improve scalability of busy extent tracking Date: Thu, 6 May 2010 11:45:42 +1000 Message-Id: <1273110351-2333-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273110351-2333-1-git-send-email-david@fromorbit.com> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1273110369 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29166 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean When we free a metadata extent, we record it in the per-AG busy extent array so that it is not re-used before the freeing transaction hits the disk. This array is fixed size, so when it overflows we make further allocation transactions synchronous because we cannot track more freed extents until those transactions hit the disk and are completed. Under heavy mixed allocation and freeing workloads with large log buffers, we can overflow this array quite easily. Further, the array is sparsely populated, which means that inserts need to search for a free slot, and array searches often have to search many more slots that are actually used to check all the busy extents. Quite inefficient, really. To enable this aspect of extent freeing to scale better, we need a structure that can grow dynamically. While in other areas of XFS we have used radix trees, the extents being freed are at random locations on disk so are better suited to being indexed by an rbtree. So, use a per-AG rbtree indexed by block number to track busy extents. This incures a memory allocation when marking an extent busy, but should not occur too often in low memory situations. This should scale to an arbitrary number of extents so should not be a limitation for features such as in-memory aggregation of transactions. However, there are still situations where we can't avoid allocating busy extents (such as allocation from the AGFL). To minimise the overhead of such occurences, we need to avoid doing a synchronous log force while holding the AGF locked to ensure that the previous transactions are safely on disk before we use the extent. We can do this by marking the transaction doing the allocation as synchronous rather issuing a log force. Because of the locking involved and the ordering of transactions, the synchronous transaction provides the same guarantees as a synchronous log force because it ensures that all the prior transactions are already on disk when the synchronous transaction hits the disk. i.e. it preserves the free->allocate order of the extent correctly in recovery. By doing this, we avoid holding the AGF locked while log writes are in progress, hence reducing the length of time the lock is held and therefore we increase the rate at which we can allocate and free from the allocation group, thereby increasing overall throughput. The only problem with this approach is that when a metadata buffer is marked stale (e.g. a directory block is removed), then buffer remains pinned and locked until the log goes to disk. The issue here is that if that stale buffer is reallocated in a subsequent transaction, the attempt to lock that buffer in the transaction will hang waiting the log to go to disk to unlock and unpin the buffer. Hence if someone tries to lock a pinned, stale, locked buffer we need to push on the log to get it unlocked ASAP. Effectively we are trading off a guaranteed log force for a much less common trigger for log force to occur. Ideally we should not reallocate busy extents. That is a much more complex fix to the problem as it involves direct intervention in the allocation btree searches in many places. This is left to a future set of modifications. Finally, now that we track busy extents in allocated memory, we don't need the descriptors in the transaction structure to point to them. We can replace the complex busy chunk infrastructure with a simple linked list of busy extents. This allows us to remove a large chunk of code, making the overall change a net reduction in code size. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_buf.c | 9 ++ fs/xfs/linux-2.6/xfs_quotaops.c | 1 + fs/xfs/linux-2.6/xfs_trace.h | 80 ++++++++---- fs/xfs/xfs_ag.h | 21 ++-- fs/xfs/xfs_alloc.c | 276 ++++++++++++++++++++++++--------------- fs/xfs/xfs_alloc.h | 7 +- fs/xfs/xfs_alloc_btree.c | 2 +- fs/xfs/xfs_trans.c | 41 ++----- fs/xfs/xfs_trans.h | 35 +----- fs/xfs/xfs_trans_item.c | 109 --------------- fs/xfs/xfs_trans_priv.h | 4 - 11 files changed, 265 insertions(+), 320 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 6873afc..82678bf 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -37,6 +37,7 @@ #include "xfs_sb.h" #include "xfs_inum.h" +#include "xfs_log.h" #include "xfs_ag.h" #include "xfs_dmapi.h" #include "xfs_mount.h" @@ -850,6 +851,12 @@ xfs_buf_lock_value( * Note that this in no way locks the underlying pages, so it is only * useful for synchronizing concurrent use of buffer objects, not for * synchronizing independent access to the underlying pages. + * + * If we come across a stale, pinned, locked buffer, we know that we + * are being asked to lock a buffer that has been reallocated. Because + * it is pinned, we know that the log has not been pushed to disk and + * hence it will still be locked. Rather than sleeping until someone + * else pushes the log, push it ourselves before trying to get the lock. */ void xfs_buf_lock( @@ -857,6 +864,8 @@ xfs_buf_lock( { trace_xfs_buf_lock(bp, _RET_IP_); + if (atomic_read(&bp->b_pin_count) && (bp->b_flags & XBF_STALE)) + xfs_log_force(bp->b_mount, 0); if (atomic_read(&bp->b_io_remaining)) blk_run_address_space(bp->b_target->bt_mapping); down(&bp->b_sema); diff --git a/fs/xfs/linux-2.6/xfs_quotaops.c b/fs/xfs/linux-2.6/xfs_quotaops.c index 1947514..2e73688 100644 --- a/fs/xfs/linux-2.6/xfs_quotaops.c +++ b/fs/xfs/linux-2.6/xfs_quotaops.c @@ -19,6 +19,7 @@ #include "xfs_dmapi.h" #include "xfs_sb.h" #include "xfs_inum.h" +#include "xfs_log.h" #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_quota.h" diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 8a319cf..0934a27 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -1059,83 +1059,109 @@ TRACE_EVENT(xfs_bunmap, ); +#define XFS_BUSY_SYNC \ + { 0, "async" }, \ + { 1, "sync" } + TRACE_EVENT(xfs_alloc_busy, - TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, - xfs_extlen_t len, int slot), - TP_ARGS(mp, agno, agbno, len, slot), + TP_PROTO(struct xfs_trans *trans, xfs_agnumber_t agno, + xfs_agblock_t agbno, xfs_extlen_t len, int sync), + TP_ARGS(trans, agno, agbno, len, sync), TP_STRUCT__entry( __field(dev_t, dev) + __field(struct xfs_trans *, tp) __field(xfs_agnumber_t, agno) __field(xfs_agblock_t, agbno) __field(xfs_extlen_t, len) - __field(int, slot) + __field(int, sync) ), TP_fast_assign( - __entry->dev = mp->m_super->s_dev; + __entry->dev = trans->t_mountp->m_super->s_dev; + __entry->tp = trans; __entry->agno = agno; __entry->agbno = agbno; __entry->len = len; - __entry->slot = slot; + __entry->sync = sync; ), - TP_printk("dev %d:%d agno %u agbno %u len %u slot %d", + TP_printk("dev %d:%d trans 0x%p agno %u agbno %u len %u %s", MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->tp, __entry->agno, __entry->agbno, __entry->len, - __entry->slot) + __print_symbolic(__entry->sync, XFS_BUSY_SYNC)) ); -#define XFS_BUSY_STATES \ - { 0, "found" }, \ - { 1, "missing" } - TRACE_EVENT(xfs_alloc_unbusy, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, - int slot, int found), - TP_ARGS(mp, agno, slot, found), + xfs_agblock_t agbno, xfs_extlen_t len), + TP_ARGS(mp, agno, agbno, len), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_agnumber_t, agno) - __field(int, slot) - __field(int, found) + __field(xfs_agblock_t, agbno) + __field(xfs_extlen_t, len) ), TP_fast_assign( __entry->dev = mp->m_super->s_dev; __entry->agno = agno; - __entry->slot = slot; - __entry->found = found; + __entry->agbno = agbno; + __entry->len = len; ), - TP_printk("dev %d:%d agno %u slot %d %s", + TP_printk("dev %d:%d agno %u agbno %u len %u", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, - __entry->slot, - __print_symbolic(__entry->found, XFS_BUSY_STATES)) + __entry->agbno, + __entry->len) ); +#define XFS_BUSY_STATES \ + { 0, "missing" }, \ + { 1, "found" } + TRACE_EVENT(xfs_alloc_busysearch, - TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, - xfs_extlen_t len, xfs_lsn_t lsn), - TP_ARGS(mp, agno, agbno, len, lsn), + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t agbno, xfs_extlen_t len, int found), + TP_ARGS(mp, agno, agbno, len, found), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_agnumber_t, agno) __field(xfs_agblock_t, agbno) __field(xfs_extlen_t, len) - __field(xfs_lsn_t, lsn) + __field(int, found) ), TP_fast_assign( __entry->dev = mp->m_super->s_dev; __entry->agno = agno; __entry->agbno = agbno; __entry->len = len; - __entry->lsn = lsn; + __entry->found = found; ), - TP_printk("dev %d:%d agno %u agbno %u len %u force lsn 0x%llx", + TP_printk("dev %d:%d agno %u agbno %u len %u %s", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, __entry->agbno, __entry->len, + __print_symbolic(__entry->found, XFS_BUSY_STATES)) +); + +TRACE_EVENT(xfs_trans_commit_lsn, + TP_PROTO(struct xfs_trans *trans), + TP_ARGS(trans), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(struct xfs_trans *, tp) + __field(xfs_lsn_t, lsn) + ), + TP_fast_assign( + __entry->dev = trans->t_mountp->m_super->s_dev; + __entry->tp = trans; + __entry->lsn = trans->t_commit_lsn; + ), + TP_printk("dev %d:%d trans 0x%p commit_lsn 0x%llx", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->tp, __entry->lsn) ); diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index abb8222..3972018 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -175,14 +175,17 @@ typedef struct xfs_agfl { } xfs_agfl_t; /* - * Busy block/extent entry. Used in perag to mark blocks that have been freed - * but whose transactions aren't committed to disk yet. + * Busy block/extent entry. Indexed by a rbtree in perag to mark blocks that + * have been freed but whose transactions aren't committed to disk yet. */ -typedef struct xfs_perag_busy { - xfs_agblock_t busy_start; - xfs_extlen_t busy_length; - struct xfs_trans *busy_tp; /* transaction that did the free */ -} xfs_perag_busy_t; +struct xfs_busy_extent { + struct rb_node rb_node; /* ag by-bno indexed search tree */ + struct list_head list; /* transaction busy extent list */ + xfs_agnumber_t agno; + xfs_agblock_t bno; + xfs_extlen_t length; + struct xfs_trans *tp; +}; /* * Per-ag incore structure, copies of information in agf and agi, @@ -216,7 +219,8 @@ typedef struct xfs_perag { xfs_agino_t pagl_leftrec; xfs_agino_t pagl_rightrec; #ifdef __KERNEL__ - spinlock_t pagb_lock; /* lock for pagb_list */ + spinlock_t pagb_lock; /* lock for pagb_tree */ + struct rb_root pagb_tree; /* ordered tree of busy extents */ atomic_t pagf_fstrms; /* # of filestreams active in this AG */ @@ -226,7 +230,6 @@ typedef struct xfs_perag { int pag_ici_reclaimable; /* reclaimable inodes */ #endif int pagb_count; /* pagb slots in use */ - xfs_perag_busy_t pagb_list[XFS_PAGB_NUM_SLOTS]; /* unstable blocks */ } xfs_perag_t; /* diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 94cddbf..673a526 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -46,11 +46,9 @@ #define XFSA_FIXUP_BNO_OK 1 #define XFSA_FIXUP_CNT_OK 2 -STATIC void -xfs_alloc_search_busy(xfs_trans_t *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len); +static int +xfs_alloc_busy_search(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t bno, xfs_extlen_t len); /* * Prototypes for per-ag allocation routines @@ -540,9 +538,16 @@ xfs_alloc_ag_vextent( be32_to_cpu(agf->agf_length)); xfs_alloc_log_agf(args->tp, args->agbp, XFS_AGF_FREEBLKS); - /* search the busylist for these blocks */ - xfs_alloc_search_busy(args->tp, args->agno, - args->agbno, args->len); + /* + * Search the busylist for these blocks and mark the + * transaction as synchronous if blocks are found. This + * avoids the need to block in due to a synchronous log + * force to ensure correct ordering as the synchronous + * transaction will guarantee that for us. + */ + if (xfs_alloc_busy_search(args->mp, args->agno, + args->agbno, args->len)) + xfs_trans_set_sync(args->tp); } if (!args->isfl) xfs_trans_mod_sb(args->tp, @@ -1693,7 +1698,7 @@ xfs_free_ag_extent( * when the iclog commits to disk. If a busy block is allocated, * the iclog is pushed up to the LSN that freed the block. */ - xfs_alloc_mark_busy(tp, agno, bno, len); + xfs_alloc_busy_insert(tp, agno, bno, len); return 0; error0: @@ -1993,10 +1998,17 @@ xfs_alloc_get_freelist( * and remain there until the freeing transaction is committed to * disk. Now that we have allocated blocks, this list must be * searched to see if a block is being reused. If one is, then - * the freeing transaction must be pushed to disk NOW by forcing - * to disk all iclogs up that transaction's LSN. - */ - xfs_alloc_search_busy(tp, be32_to_cpu(agf->agf_seqno), bno, 1); + * the freeing transaction must be pushed to disk before this + * transaction. + * + * We do this by setting the current transaction + * to a sync transaction which guarantees that the freeing transaction + * is on disk before this transaction. This is done instead of a + * synchronous log force here so that we don't sit and wait with + * the AGF locked in the transaction during the log force. + */ + if (xfs_alloc_busy_search(mp, be32_to_cpu(agf->agf_seqno), bno, 1)) + xfs_trans_set_sync(tp); return 0; } @@ -2201,7 +2213,7 @@ xfs_alloc_read_agf( be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]); spin_lock_init(&pag->pagb_lock); pag->pagb_count = 0; - memset(pag->pagb_list, 0, sizeof(pag->pagb_list)); + pag->pagb_tree = RB_ROOT; pag->pagf_init = 1; } #ifdef DEBUG @@ -2479,127 +2491,185 @@ error0: * list is reused, the transaction that freed it must be forced to disk * before continuing to use the block. * - * xfs_alloc_mark_busy - add to the per-ag busy list - * xfs_alloc_clear_busy - remove an item from the per-ag busy list + * xfs_alloc_busy_insert - add to the per-ag busy list + * xfs_alloc_busy_clear - remove an item from the per-ag busy list + * xfs_alloc_busy_search - search for a busy extent */ + void -xfs_alloc_mark_busy(xfs_trans_t *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len) +xfs_alloc_busy_insert( + struct xfs_trans *tp, + xfs_agnumber_t agno, + xfs_agblock_t bno, + xfs_extlen_t len) { - xfs_perag_busy_t *bsy; + struct xfs_busy_extent *new; + struct xfs_busy_extent *busyp; struct xfs_perag *pag; - int n; - - pag = xfs_perag_get(tp->t_mountp, agno); - spin_lock(&pag->pagb_lock); + struct rb_node **rbp; + struct rb_node *parent; - /* search pagb_list for an open slot */ - for (bsy = pag->pagb_list, n = 0; - n < XFS_PAGB_NUM_SLOTS; - bsy++, n++) { - if (bsy->busy_tp == NULL) { - break; - } - } - trace_xfs_alloc_busy(tp->t_mountp, agno, bno, len, n); - - if (n < XFS_PAGB_NUM_SLOTS) { - bsy = &pag->pagb_list[n]; - pag->pagb_count++; - bsy->busy_start = bno; - bsy->busy_length = len; - bsy->busy_tp = tp; - xfs_trans_add_busy(tp, agno, n); - } else { + new = kmem_zalloc(sizeof(struct xfs_busy_extent), KM_MAYFAIL); + if (!new) { /* - * The busy list is full! Since it is now not possible to - * track the free block, make this a synchronous transaction - * to insure that the block is not reused before this - * transaction commits. + * No Memory! Since it is now not possible to track the free + * block, make this a synchronous transaction to insure that + * the block is not reused before this transaction commits. */ + trace_xfs_alloc_busy(tp, agno, bno, len, 1); xfs_trans_set_sync(tp); + return; } - spin_unlock(&pag->pagb_lock); - xfs_perag_put(pag); -} + new->agno = agno; + new->bno = bno; + new->length = len; + new->tp = tp; -void -xfs_alloc_clear_busy(xfs_trans_t *tp, - xfs_agnumber_t agno, - int idx) -{ - struct xfs_perag *pag; - xfs_perag_busy_t *list; + INIT_LIST_HEAD(&new->list); - ASSERT(idx < XFS_PAGB_NUM_SLOTS); - pag = xfs_perag_get(tp->t_mountp, agno); - spin_lock(&pag->pagb_lock); - list = pag->pagb_list; + /* trace before insert to be able to see failed inserts */ + trace_xfs_alloc_busy(tp, agno, bno, len, 0); - trace_xfs_alloc_unbusy(tp->t_mountp, agno, idx, list[idx].busy_tp == tp); + pag = xfs_perag_get(tp->t_mountp, new->agno); +restart: + spin_lock(&pag->pagb_lock); + rbp = &pag->pagb_tree.rb_node; + parent = NULL; + while (*rbp) { + parent = *rbp; + busyp = rb_entry(parent, struct xfs_busy_extent, rb_node); + + if (new->bno < busyp->bno) + rbp = &(*rbp)->rb_left; + else if (new->bno > busyp->bno) + rbp = &(*rbp)->rb_right; + else { - if (list[idx].busy_tp == tp) { - list[idx].busy_tp = NULL; - pag->pagb_count--; + /* + * We're trying to reuse an already busy extent? + * + * That means the transaction that marked it busy must + * still be committing, but we are freeing it again + * here. This could be the same transaction (btree + * manipulations may allocate and free blocks + * multiple times in a transaction), so if it is make + * sure the transaction is marked synchronous already + * and update the length of the busy extent to match + * the new range being freed. + * + * If it is not the same transaction, then we need to + * wait for the transaction that marked this extent + * busy to complete. I don' think we can avoid a log + * force in this case. We can't rely on the contents of + * the transaction point in busyp, so we have to force + * everything. + * + * Note that we do not use the transaction structure + * for identifying equal transactions. This is because + * there is the possibility of transaction structures + * being reallocated from the slab after being freed + * and triggering false detections here. Hence use the + * transaction ticket ID to determine if it is the same + * transaction. + */ + if (busyp->tp != tp) { + spin_unlock(&pag->pagb_lock); + xfs_log_force(tp->t_mountp, XFS_LOG_SYNC); + goto restart; + } + busyp->length = max(busyp->length, new->length); + spin_unlock(&pag->pagb_lock); + ASSERT(tp->t_flags & XFS_TRANS_SYNC); + xfs_perag_put(pag); + kmem_free(new); + return; + } } + rb_link_node(&new->rb_node, parent, rbp); + rb_insert_color(&new->rb_node, &pag->pagb_tree); + + list_add(&new->list, &tp->t_busy); spin_unlock(&pag->pagb_lock); xfs_perag_put(pag); } - /* - * If we find the extent in the busy list, force the log out to get the - * extent out of the busy list so the caller can use it straight away. + * Search for a busy extent within the range of the extent we are about to + * allocate. You need to be holding the busy extent tree lock when calling + * xfs_alloc_busy_search(). This function returns 0 for no overlapping busy + * extent, -1 for an overlapping but not exact busy extent, and 1 for an exact + * match. This is done so that a non-zero return indicates an overlap that + * will require a synchronous transaction, but it can still be + * used to distinguish between a partial or exact match. */ -STATIC void -xfs_alloc_search_busy(xfs_trans_t *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len) +static int +xfs_alloc_busy_search( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_agblock_t bno, + xfs_extlen_t len) { struct xfs_perag *pag; - xfs_perag_busy_t *bsy; + struct rb_node *rbp; xfs_agblock_t uend, bend; - xfs_lsn_t lsn = 0; - int cnt; + struct xfs_busy_extent *busyp; + int match = 0; - pag = xfs_perag_get(tp->t_mountp, agno); + pag = xfs_perag_get(mp, agno); spin_lock(&pag->pagb_lock); - cnt = pag->pagb_count; - /* - * search pagb_list for this slot, skipping open slots. We have to - * search the entire array as there may be multiple overlaps and - * we have to get the most recent LSN for the log force to push out - * all the transactions that span the range. - */ uend = bno + len - 1; - for (cnt = 0; cnt < pag->pagb_count; cnt++) { - bsy = &pag->pagb_list[cnt]; - if (!bsy->busy_tp) - continue; - - bend = bsy->busy_start + bsy->busy_length - 1; - if (bno > bend || uend < bsy->busy_start) - continue; - - /* (start1,length1) within (start2, length2) */ - if (XFS_LSN_CMP(bsy->busy_tp->t_commit_lsn, lsn) > 0) - lsn = bsy->busy_tp->t_commit_lsn; + rbp = pag->pagb_tree.rb_node; + + /* find closest start bno overlap */ + while (rbp) { + busyp = rb_entry(rbp, struct xfs_busy_extent, rb_node); + bend = busyp->bno + busyp->length - 1; + if (bno < busyp->bno) { + /* may overlap, but exact start block is lower */ + if (uend >= busyp->bno) + match = -1; + rbp = rbp->rb_left; + } else if (bno > busyp->bno) { + /* may overlap, but exact start block is higher */ + if (bno <= bend) + match = -1; + rbp = rbp->rb_right; + } else { + /* bno matches busyp, length determines exact match */ + match = (busyp->length == len) ? 1 : -1; + break; + } } spin_unlock(&pag->pagb_lock); + trace_xfs_alloc_busysearch(mp, agno, bno, len, !!match); xfs_perag_put(pag); - trace_xfs_alloc_busysearch(tp->t_mountp, agno, bno, len, lsn); + return match; +} - /* - * If a block was found, force the log through the LSN of the - * transaction that freed the block - */ - if (lsn) - xfs_log_force_lsn(tp->t_mountp, lsn, XFS_LOG_SYNC); +void +xfs_alloc_busy_clear( + struct xfs_mount *mp, + struct xfs_busy_extent *busyp) +{ + struct xfs_perag *pag; + + trace_xfs_alloc_unbusy(mp, busyp->agno, busyp->bno, + busyp->length); + + ASSERT(xfs_alloc_busy_search(mp, busyp->agno, busyp->bno, + busyp->length) == 1); + + list_del_init(&busyp->list); + + pag = xfs_perag_get(mp, busyp->agno); + spin_lock(&pag->pagb_lock); + rb_erase(&busyp->rb_node, &pag->pagb_tree); + spin_unlock(&pag->pagb_lock); + xfs_perag_put(pag); + + kmem_free(busyp); } diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h index 599bffa..6d05199 100644 --- a/fs/xfs/xfs_alloc.h +++ b/fs/xfs/xfs_alloc.h @@ -22,6 +22,7 @@ struct xfs_buf; struct xfs_mount; struct xfs_perag; struct xfs_trans; +struct xfs_busy_extent; /* * Freespace allocation types. Argument to xfs_alloc_[v]extent. @@ -119,15 +120,13 @@ xfs_alloc_longest_free_extent(struct xfs_mount *mp, #ifdef __KERNEL__ void -xfs_alloc_mark_busy(xfs_trans_t *tp, +xfs_alloc_busy_insert(xfs_trans_t *tp, xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len); void -xfs_alloc_clear_busy(xfs_trans_t *tp, - xfs_agnumber_t ag, - int idx); +xfs_alloc_busy_clear(struct xfs_mount *mp, struct xfs_busy_extent *busyp); #endif /* __KERNEL__ */ diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index b726e10..83f4942 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -134,7 +134,7 @@ xfs_allocbt_free_block( * disk. If a busy block is allocated, the iclog is pushed up to the * LSN that freed the block. */ - xfs_alloc_mark_busy(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); + xfs_alloc_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); xfs_trans_agbtree_delta(cur->bc_tp, -1); return 0; } diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index be578ec..40d9595 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -44,6 +44,7 @@ #include "xfs_trans_priv.h" #include "xfs_trans_space.h" #include "xfs_inode_item.h" +#include "xfs_trace.h" kmem_zone_t *xfs_trans_zone; @@ -243,9 +244,8 @@ _xfs_trans_alloc( tp->t_type = type; tp->t_mountp = mp; tp->t_items_free = XFS_LIC_NUM_SLOTS; - tp->t_busy_free = XFS_LBC_NUM_SLOTS; xfs_lic_init(&(tp->t_items)); - XFS_LBC_INIT(&(tp->t_busy)); + INIT_LIST_HEAD(&tp->t_busy); return tp; } @@ -255,8 +255,13 @@ _xfs_trans_alloc( */ STATIC void xfs_trans_free( - xfs_trans_t *tp) + struct xfs_trans *tp) { + struct xfs_busy_extent *busyp, *n; + + list_for_each_entry_safe(busyp, n, &tp->t_busy, list) + xfs_alloc_busy_clear(tp->t_mountp, busyp); + atomic_dec(&tp->t_mountp->m_active_trans); xfs_trans_free_dqinfo(tp); kmem_zone_free(xfs_trans_zone, tp); @@ -285,9 +290,8 @@ xfs_trans_dup( ntp->t_type = tp->t_type; ntp->t_mountp = tp->t_mountp; ntp->t_items_free = XFS_LIC_NUM_SLOTS; - ntp->t_busy_free = XFS_LBC_NUM_SLOTS; xfs_lic_init(&(ntp->t_items)); - XFS_LBC_INIT(&(ntp->t_busy)); + INIT_LIST_HEAD(&ntp->t_busy); ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); ASSERT(tp->t_ticket != NULL); @@ -423,7 +427,6 @@ undo_blocks: return error; } - /* * Record the indicated change to the given field for application * to the file system's superblock when the transaction commits. @@ -930,26 +933,6 @@ xfs_trans_item_committed( IOP_UNPIN(lip); } -/* Clear all the per-AG busy list items listed in this transaction */ -static void -xfs_trans_clear_busy_extents( - struct xfs_trans *tp) -{ - xfs_log_busy_chunk_t *lbcp; - xfs_log_busy_slot_t *lbsp; - int i; - - for (lbcp = &tp->t_busy; lbcp != NULL; lbcp = lbcp->lbc_next) { - i = 0; - for (lbsp = lbcp->lbc_busy; i < lbcp->lbc_unused; i++, lbsp++) { - if (XFS_LBC_ISFREE(lbcp, i)) - continue; - xfs_alloc_clear_busy(tp, lbsp->lbc_ag, lbsp->lbc_idx); - } - } - xfs_trans_free_busy(tp); -} - /* * This is typically called by the LM when a transaction has been fully * committed to disk. It needs to unpin the items which have @@ -984,7 +967,6 @@ xfs_trans_committed( kmem_free(licp); } - xfs_trans_clear_busy_extents(tp); xfs_trans_free(tp); } @@ -1013,7 +995,6 @@ xfs_trans_uncommit( xfs_trans_unreserve_and_mod_dquots(tp); xfs_trans_free_items(tp, flags); - xfs_trans_free_busy(tp); xfs_trans_free(tp); } @@ -1075,6 +1056,8 @@ xfs_trans_commit_iclog( *commit_lsn = xfs_log_done(mp, tp->t_ticket, &commit_iclog, log_flags); tp->t_commit_lsn = *commit_lsn; + trace_xfs_trans_commit_lsn(tp); + if (nvec > XFS_TRANS_LOGVEC_COUNT) kmem_free(log_vector); @@ -1260,7 +1243,6 @@ out_unreserve: } current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); xfs_trans_free_items(tp, error ? XFS_TRANS_ABORT : 0); - xfs_trans_free_busy(tp); xfs_trans_free(tp); XFS_STATS_INC(xs_trans_empty); @@ -1339,7 +1321,6 @@ xfs_trans_cancel( current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); xfs_trans_free_items(tp, flags); - xfs_trans_free_busy(tp); xfs_trans_free(tp); } diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index c62beee..ff7e9e6 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -813,6 +813,7 @@ struct xfs_log_item_desc; struct xfs_mount; struct xfs_trans; struct xfs_dquot_acct; +struct xfs_busy_extent; typedef struct xfs_log_item { struct list_head li_ail; /* AIL pointers */ @@ -872,34 +873,6 @@ typedef struct xfs_item_ops { #define XFS_ITEM_PUSHBUF 3 /* - * This structure is used to maintain a list of block ranges that have been - * freed in the transaction. The ranges are listed in the perag[] busy list - * between when they're freed and the transaction is committed to disk. - */ - -typedef struct xfs_log_busy_slot { - xfs_agnumber_t lbc_ag; - ushort lbc_idx; /* index in perag.busy[] */ -} xfs_log_busy_slot_t; - -#define XFS_LBC_NUM_SLOTS 31 -typedef struct xfs_log_busy_chunk { - struct xfs_log_busy_chunk *lbc_next; - uint lbc_free; /* free slots bitmask */ - ushort lbc_unused; /* first unused */ - xfs_log_busy_slot_t lbc_busy[XFS_LBC_NUM_SLOTS]; -} xfs_log_busy_chunk_t; - -#define XFS_LBC_MAX_SLOT (XFS_LBC_NUM_SLOTS - 1) -#define XFS_LBC_FREEMASK ((1U << XFS_LBC_NUM_SLOTS) - 1) - -#define XFS_LBC_INIT(cp) ((cp)->lbc_free = XFS_LBC_FREEMASK) -#define XFS_LBC_CLAIM(cp, slot) ((cp)->lbc_free &= ~(1 << (slot))) -#define XFS_LBC_SLOT(cp, slot) (&((cp)->lbc_busy[(slot)])) -#define XFS_LBC_VACANCY(cp) (((cp)->lbc_free) & XFS_LBC_FREEMASK) -#define XFS_LBC_ISFREE(cp, slot) ((cp)->lbc_free & (1 << (slot))) - -/* * This is the type of function which can be given to xfs_trans_callback() * to be called upon the transaction's commit to disk. */ @@ -950,8 +923,7 @@ typedef struct xfs_trans { unsigned int t_items_free; /* log item descs free */ xfs_log_item_chunk_t t_items; /* first log item desc chunk */ xfs_trans_header_t t_header; /* header for in-log trans */ - unsigned int t_busy_free; /* busy descs free */ - xfs_log_busy_chunk_t t_busy; /* busy/async free blocks */ + struct list_head t_busy; /* list of busy extents */ unsigned long t_pflags; /* saved process flags state */ } xfs_trans_t; @@ -1025,9 +997,6 @@ int _xfs_trans_commit(xfs_trans_t *, void xfs_trans_cancel(xfs_trans_t *, int); int xfs_trans_ail_init(struct xfs_mount *); void xfs_trans_ail_destroy(struct xfs_mount *); -xfs_log_busy_slot_t *xfs_trans_add_busy(xfs_trans_t *tp, - xfs_agnumber_t ag, - xfs_extlen_t idx); extern kmem_zone_t *xfs_trans_zone; diff --git a/fs/xfs/xfs_trans_item.c b/fs/xfs/xfs_trans_item.c index eb3fc57..2937a1e 100644 --- a/fs/xfs/xfs_trans_item.c +++ b/fs/xfs/xfs_trans_item.c @@ -438,112 +438,3 @@ xfs_trans_unlock_chunk( return freed; } - - -/* - * This is called to add the given busy item to the transaction's - * list of busy items. It must find a free busy item descriptor - * or allocate a new one and add the item to that descriptor. - * The function returns a pointer to busy descriptor used to point - * to the new busy entry. The log busy entry will now point to its new - * descriptor with its ???? field. - */ -xfs_log_busy_slot_t * -xfs_trans_add_busy(xfs_trans_t *tp, xfs_agnumber_t ag, xfs_extlen_t idx) -{ - xfs_log_busy_chunk_t *lbcp; - xfs_log_busy_slot_t *lbsp; - int i=0; - - /* - * If there are no free descriptors, allocate a new chunk - * of them and put it at the front of the chunk list. - */ - if (tp->t_busy_free == 0) { - lbcp = (xfs_log_busy_chunk_t*) - kmem_alloc(sizeof(xfs_log_busy_chunk_t), KM_SLEEP); - ASSERT(lbcp != NULL); - /* - * Initialize the chunk, and then - * claim the first slot in the newly allocated chunk. - */ - XFS_LBC_INIT(lbcp); - XFS_LBC_CLAIM(lbcp, 0); - lbcp->lbc_unused = 1; - lbsp = XFS_LBC_SLOT(lbcp, 0); - - /* - * Link in the new chunk and update the free count. - */ - lbcp->lbc_next = tp->t_busy.lbc_next; - tp->t_busy.lbc_next = lbcp; - tp->t_busy_free = XFS_LIC_NUM_SLOTS - 1; - - /* - * Initialize the descriptor and the generic portion - * of the log item. - * - * Point the new slot at this item and return it. - * Also point the log item at its currently active - * descriptor and set the item's mount pointer. - */ - lbsp->lbc_ag = ag; - lbsp->lbc_idx = idx; - return lbsp; - } - - /* - * Find the free descriptor. It is somewhere in the chunklist - * of descriptors. - */ - lbcp = &tp->t_busy; - while (lbcp != NULL) { - if (XFS_LBC_VACANCY(lbcp)) { - if (lbcp->lbc_unused <= XFS_LBC_MAX_SLOT) { - i = lbcp->lbc_unused; - break; - } else { - /* out-of-order vacancy */ - cmn_err(CE_DEBUG, "OOO vacancy lbcp 0x%p\n", lbcp); - ASSERT(0); - } - } - lbcp = lbcp->lbc_next; - } - ASSERT(lbcp != NULL); - /* - * If we find a free descriptor, claim it, - * initialize it, and return it. - */ - XFS_LBC_CLAIM(lbcp, i); - if (lbcp->lbc_unused <= i) { - lbcp->lbc_unused = i + 1; - } - lbsp = XFS_LBC_SLOT(lbcp, i); - tp->t_busy_free--; - lbsp->lbc_ag = ag; - lbsp->lbc_idx = idx; - return lbsp; -} - - -/* - * xfs_trans_free_busy - * Free all of the busy lists from a transaction - */ -void -xfs_trans_free_busy(xfs_trans_t *tp) -{ - xfs_log_busy_chunk_t *lbcp; - xfs_log_busy_chunk_t *lbcq; - - lbcp = tp->t_busy.lbc_next; - while (lbcp != NULL) { - lbcq = lbcp->lbc_next; - kmem_free(lbcp); - lbcp = lbcq; - } - - XFS_LBC_INIT(&tp->t_busy); - tp->t_busy.lbc_unused = 0; -} diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 73e2ad3..901dc0f 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -38,10 +38,6 @@ struct xfs_log_item_desc *xfs_trans_next_item(struct xfs_trans *, void xfs_trans_free_items(struct xfs_trans *, int); void xfs_trans_unlock_items(struct xfs_trans *, xfs_lsn_t); -void xfs_trans_free_busy(xfs_trans_t *tp); -xfs_log_busy_slot_t *xfs_trans_add_busy(xfs_trans_t *tp, - xfs_agnumber_t ag, - xfs_extlen_t idx); /* * AIL traversal cursor. -- 1.5.6.5 From SRS0+o8Pk+65+fromorbit.com=dave@internode.on.net Wed May 5 20:44:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o461i6wn065053 for ; Wed, 5 May 2010 20:44:07 -0500 X-ASG-Debug-ID: 1273110374-707401040000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1E1B11B0A183 for ; Wed, 5 May 2010 18:46:14 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id m7NJICAWh4k3PXd5 for ; Wed, 05 May 2010 18:46:14 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23089836-1927428 for ; Thu, 06 May 2010 11:16:13 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1O9qA6-0005Df-HH for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:02 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1O9qA5-0000cT-H0 for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 06/11] xfs: clean up log ticket overrun debug output Subject: [PATCH 06/11] xfs: clean up log ticket overrun debug output Date: Thu, 6 May 2010 11:45:46 +1000 Message-Id: <1273110351-2333-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273110351-2333-1-git-send-email-david@fromorbit.com> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1273110376 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.2, rules version 3.2.2.29166 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Push the error message output when a ticket overrun is detected into the ticket printing functions. Also remove the debug version of the code as the production version will still panic just as effectively on a debug kernel via the panic mask being set. Signed-off-by: Dave Chinner --- fs/xfs/xfs_error.c | 2 +- fs/xfs/xfs_log.c | 19 +++++-------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index ef96175..047b8a8 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -170,7 +170,7 @@ xfs_cmn_err(int panic_tag, int level, xfs_mount_t *mp, char *fmt, ...) va_list ap; #ifdef DEBUG - xfs_panic_mask |= XFS_PTAG_SHUTDOWN_CORRUPT; + xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES); #endif if (xfs_panic_mask && (xfs_panic_mask & panic_tag) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 83be6a6..1efb303 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1645,6 +1645,10 @@ xlog_print_tic_res(xfs_mount_t *mp, xlog_ticket_t *ticket) "bad-rtype" : res_type_str[r_type-1]), ticket->t_res_arr[i].r_len); } + + xfs_cmn_err(XFS_PTAG_LOGRES, CE_ALERT, mp, + "xfs_log_write: reservation ran out. Need to up reservation"); + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); } /* @@ -1897,21 +1901,8 @@ xlog_write( *start_lsn = 0; len = xlog_write_calc_vec_length(ticket, log_vector); - if (ticket->t_curr_res < len) { + if (ticket->t_curr_res < len) xlog_print_tic_res(log->l_mp, ticket); -#ifdef DEBUG - xlog_panic( - "xfs_log_write: reservation ran out. Need to up reservation"); -#else - /* Customer configurable panic */ - xfs_cmn_err(XFS_PTAG_LOGRES, CE_ALERT, log->l_mp, - "xfs_log_write: reservation ran out. Need to up reservation"); - - /* If we did not panic, shutdown the filesystem */ - xfs_force_shutdown(log->l_mp, SHUTDOWN_CORRUPT_INCORE); -#endif - } - ticket->t_curr_res -= len; index = 0; -- 1.5.6.5 From SRS0+QjcZ+65+fromorbit.com=dave@internode.on.net Wed May 5 20:44:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_66,LOCAL_GNU_PATCH,TVD_PH_BODY_ACCOUNTS_PRE autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o461i1Sp065022 for ; Wed, 5 May 2010 20:44:01 -0500 X-ASG-Debug-ID: 1273110367-167902c70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 712193139BA for ; Wed, 5 May 2010 18:46:07 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id 0WQAsL6sRw9LigfH for ; Wed, 05 May 2010 18:46:07 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23226481-1927428 for ; Thu, 06 May 2010 11:16:05 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1O9qA6-0005Dj-Ln for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:02 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1O9qA5-0000cZ-LX for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 08/11] xfs: Introduce delayed logging core code Subject: [PATCH 08/11] xfs: Introduce delayed logging core code Date: Thu, 6 May 2010 11:45:48 +1000 Message-Id: <1273110351-2333-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273110351-2333-1-git-send-email-david@fromorbit.com> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1273110369 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29166 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The delayed logging code only changes in-memory structures and as such can be enabled and disabled with a mount option. Add the mount option and emit a warning that this is an experimental feature that should not be used in production yet. We also need infrastructure to track committed items that have not yet been written to the log. This is what the Committed Item List (CIL) is for. The log item also needs to be extended to track the current log vector, the associated memory buffer and it's location in the Commit Item List. Extend the log item and log vector structures to enable this tracking. To maintain the current log format for transactions with delayed logging, we need to introduce a checkpoint transaction and a context for tracking each checkpoint from initiation to transaction completion. This includes adding a log ticket for tracking space log required/used by the context checkpoint. To track all the changes we need an io vector array per log item, rather than a single array for the entire transaction. Using the new log vector structure for this requires two passes - the first to allocate the log vector structures and chain them together, and the second to fill them out. This log vector chain can then be passed to the CIL for formatting, pinning and insertion into the CIL. Formatting of the log vector chain is relatively simple - it's just a loop over the iovecs on each log vector, but it is made slightly more complex because we re-write the iovec after the copy to point back at the memory buffer we just copied into. This code also needs to pin log items. If the log item is not already tracked in this checkpoint context, then it needs to be pinned. Otherwise it is already pinned and we don't need to pin it again. The only other complexity is calculating the amount of new log space the formatting has consumed. This needs to be accounted to the transaction in progress, and the accounting is made more complex becase we need also to steal space from it for log metadata in the checkpoint transaction. Calculate all this at insert time and update all the tickets, counters, etc correctly. Once we've formatted all the log items in the transaction, attach the busy extents to the checkpoint context so the busy extents live until checkpoint completion and can be processed at that point in time. Transactions can then be freed at this point in time. Now we need to issue checkpoints - we are tracking the amount of log space used by the items in the CIL, so we can trigger background checkpoints when the space usage gets to a certain threshold. Otherwise, checkpoints need ot be triggered when a log synchronisation point is reached - a log force event. Because the log write code already handles chained log vectors, writing the transaction is trivial, too. Construct a transaction header, add it to the head of the chain and write it into the log, then issue a commit record write. Then we can release the checkpoint log ticket and attach the context to the log buffer so it can be called during Io completion to complete the checkpoint. We also need to allow for synchronising multiple in-flight checkpoints. This is needed for two things - the first is to ensure that checkpoint commit records appear in the log in the correct sequence order (so they are replayed in the correct order). The second is so that xfs_log_force_lsn() operates correctly and only flushes and/or waits for the specific sequence it was provided with. To do this we need a wait variable and a list tracking the checkpoint commits in progress. We can walk this list and wait for the checkpoints to change state or complete easily, an this provides the necessary synchronisation for correct operation in both cases. Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_super.c | 10 + fs/xfs/xfs_log.c | 67 ++++- fs/xfs/xfs_log.h | 9 +- fs/xfs/xfs_log_cil.c | 666 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_log_priv.h | 71 +++++- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 144 +++++++++- fs/xfs/xfs_trans.h | 8 +- fs/xfs/xfs_trans_item.c | 5 +- fs/xfs/xfs_trans_priv.h | 12 +- 11 files changed, 963 insertions(+), 31 deletions(-) create mode 100644 fs/xfs/xfs_log_cil.c diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index b4769e4..c8fb13f 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -77,6 +77,7 @@ xfs-y += xfs_alloc.o \ xfs_itable.o \ xfs_dfrag.o \ xfs_log.o \ + xfs_log_cil.o \ xfs_log_recover.o \ xfs_mount.o \ xfs_mru_cache.o \ diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 1e88c98..6a7c8c9 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -118,6 +118,8 @@ mempool_t *xfs_ioend_pool; #define MNTOPT_DMAPI "dmapi" /* DMI enabled (DMAPI / XDSM) */ #define MNTOPT_XDSM "xdsm" /* DMI enabled (DMAPI / XDSM) */ #define MNTOPT_DMI "dmi" /* DMI enabled (DMAPI / XDSM) */ +#define MNTOPT_DELAYLOG "delaylog" /* Delayed loging enabled */ +#define MNTOPT_NODELAYLOG "nodelaylog" /* Delayed loging disabled */ /* * Table driven mount option parser. @@ -373,6 +375,13 @@ xfs_parseargs( mp->m_flags |= XFS_MOUNT_DMAPI; } else if (!strcmp(this_char, MNTOPT_DMI)) { mp->m_flags |= XFS_MOUNT_DMAPI; + } else if (!strcmp(this_char, MNTOPT_DELAYLOG)) { + mp->m_flags |= XFS_MOUNT_DELAYLOG; + cmn_err(CE_WARN, + "Enabling EXPERIMENTAL delayed logging feature " + "- use at your own risk.\n"); + } else if (!strcmp(this_char, MNTOPT_NODELAYLOG)) { + mp->m_flags &= ~XFS_MOUNT_DELAYLOG; } else if (!strcmp(this_char, "ihashsize")) { cmn_err(CE_WARN, "XFS: ihashsize no longer used, option is deprecated."); @@ -534,6 +543,7 @@ xfs_showargs( { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, { XFS_MOUNT_DMAPI, "," MNTOPT_DMAPI }, { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, + { XFS_MOUNT_DELAYLOG, "," MNTOPT_DELAYLOG }, { 0, NULL } }; static struct proc_xfs_info xfs_info_unset[] = { diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 1efb303..88cdfac 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -54,9 +54,6 @@ STATIC xlog_t * xlog_alloc_log(xfs_mount_t *mp, STATIC int xlog_space_left(xlog_t *log, int cycle, int bytes); STATIC int xlog_sync(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_dealloc_log(xlog_t *log); -STATIC int xlog_write(struct log *log, struct xfs_log_vec *log_vector, - struct xlog_ticket *tic, xfs_lsn_t *start_lsn, - xlog_in_core_t **commit_iclog, uint flags); /* local state machine functions */ STATIC void xlog_state_done_syncing(xlog_in_core_t *iclog, int); @@ -86,12 +83,6 @@ STATIC int xlog_regrant_write_log_space(xlog_t *log, STATIC void xlog_ungrant_log_space(xlog_t *log, xlog_ticket_t *ticket); - -/* local ticket functions */ -STATIC xlog_ticket_t *xlog_ticket_alloc(xlog_t *log, int unit_bytes, int count, - char clientid, uint flags, - int alloc_flags); - #if defined(DEBUG) STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr); STATIC void xlog_verify_grant_head(xlog_t *log, int equals); @@ -460,6 +451,16 @@ xfs_log_mount( /* Normal transactions can now occur */ mp->m_log->l_flags &= ~XLOG_ACTIVE_RECOVERY; + /* + * Now the log has been fully initialised and we know were our + * space grant counters are, we can initialise the permanent ticket + * needed for delayed logging to work. + */ + error = xlog_cil_init_post_recovery(mp->m_log); + if (error) { + ASSERT(0); + goto out_destroy_ail; + } return 0; out_destroy_ail: @@ -666,6 +667,10 @@ xfs_log_item_init( item->li_ailp = mp->m_ail; item->li_type = type; item->li_ops = ops; + item->li_lv = NULL; + + INIT_LIST_HEAD(&item->li_ail); + INIT_LIST_HEAD(&item->li_cil); } /* @@ -1176,6 +1181,9 @@ xlog_alloc_log(xfs_mount_t *mp, *iclogp = log->l_iclog; /* complete ring */ log->l_iclog->ic_prev = prev_iclog; /* re-write 1st prev ptr */ + error = xlog_cil_init(log); + if (error) + goto out_free_iclog; return log; out_free_iclog: @@ -1502,6 +1510,8 @@ xlog_dealloc_log(xlog_t *log) xlog_in_core_t *iclog, *next_iclog; int i; + xlog_cil_destroy(log); + iclog = log->l_iclog; for (i=0; il_iclog_bufs; i++) { sv_destroy(&iclog->ic_force_wait); @@ -1544,8 +1554,10 @@ xlog_state_finish_copy(xlog_t *log, * print out info relating to regions written which consume * the reservation */ -STATIC void -xlog_print_tic_res(xfs_mount_t *mp, xlog_ticket_t *ticket) +void +xlog_print_tic_res( + struct xfs_mount *mp, + struct xlog_ticket *ticket) { uint i; uint ophdr_spc = ticket->t_res_num_ophdrs * (uint)sizeof(xlog_op_header_t); @@ -1877,7 +1889,7 @@ xlog_write_copy_finish( * we don't update ic_offset until the end when we know exactly how many * bytes have been written out. */ -STATIC int +int xlog_write( struct log *log, struct xfs_log_vec *log_vector, @@ -1901,9 +1913,26 @@ xlog_write( *start_lsn = 0; len = xlog_write_calc_vec_length(ticket, log_vector); - if (ticket->t_curr_res < len) + if (log->l_cilp) { + /* + * Region headers and bytes are already accounted for. + * We only need to take into account start records and + * split regions in this function. + */ + if (ticket->t_flags & XLOG_TIC_INITED) + ticket->t_curr_res -= sizeof(xlog_op_header_t); + + /* + * Commit record headers need to be accounted for. These + * come in as separate writes so are easy to detect. + */ + if (flags & (XLOG_COMMIT_TRANS | XLOG_UNMOUNT_TRANS)) + ticket->t_curr_res -= sizeof(xlog_op_header_t); + } else + ticket->t_curr_res -= len; + + if (ticket->t_curr_res < 0) xlog_print_tic_res(log->l_mp, ticket); - ticket->t_curr_res -= len; index = 0; lv = log_vector; @@ -2999,6 +3028,8 @@ _xfs_log_force( XFS_STATS_INC(xs_log_force); + xlog_cil_push(log, 1); + spin_lock(&log->l_icloglock); iclog = log->l_iclog; @@ -3148,6 +3179,12 @@ _xfs_log_force_lsn( XFS_STATS_INC(xs_log_force); + if (log->l_cilp) { + lsn = xlog_cil_push_lsn(log, lsn); + if (lsn == NULLCOMMITLSN) + return 0; + } + try_again: spin_lock(&log->l_icloglock); iclog = log->l_iclog; @@ -3315,7 +3352,7 @@ xfs_log_ticket_get( /* * Allocate and initialise a new log ticket. */ -STATIC xlog_ticket_t * +xlog_ticket_t * xlog_ticket_alloc( struct log *log, int unit_bytes, diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 229d1f3..1764f11 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -114,6 +114,9 @@ struct xfs_log_vec { struct xfs_log_vec *lv_next; /* next lv in build list */ int lv_niovecs; /* number of iovecs in lv */ struct xfs_log_iovec *lv_iovecp; /* iovec array */ + struct xfs_log_item *lv_item; /* owner */ + char *lv_buf; /* formatted buffer */ + int lv_buf_len; /* size of formatted buffer */ }; /* @@ -134,6 +137,7 @@ struct xlog_in_core; struct xlog_ticket; struct xfs_log_item; struct xfs_item_ops; +struct xfs_trans; void xfs_log_item_init(struct xfs_mount *mp, struct xfs_log_item *item, @@ -187,9 +191,12 @@ int xfs_log_need_covered(struct xfs_mount *mp); void xlog_iodone(struct xfs_buf *); -struct xlog_ticket * xfs_log_ticket_get(struct xlog_ticket *ticket); +struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket); void xfs_log_ticket_put(struct xlog_ticket *ticket); +int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, + struct xfs_log_vec *log_vector, + xfs_lsn_t *commit_lsn, int flags); #endif diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c new file mode 100644 index 0000000..3cb1957 --- /dev/null +++ b/fs/xfs/xfs_log_cil.c @@ -0,0 +1,666 @@ +/* + * Copyright (c) 2010 Redhat, 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_log.h" +#include "xfs_inum.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_log_priv.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_dir2.h" +#include "xfs_dmapi.h" +#include "xfs_mount.h" +#include "xfs_error.h" +#include "xfs_alloc.h" + +/* + * Perform initial CIL structure initialisation. If the CIL is not + * enabled in this filesystem, ensure the log->l_cilp is null so + * we can check this conditional to determine if we are doing delayed + * logging or not. + */ +int +xlog_cil_init( + struct log *log) +{ + struct xfs_cil *cil; + struct xfs_cil_ctx *ctx; + + log->l_cilp = NULL; + if (!(log->l_mp->m_flags & XFS_MOUNT_DELAYLOG)) + return 0; + + cil = kmem_zalloc(sizeof(*cil), KM_SLEEP|KM_MAYFAIL); + if (!cil) + return ENOMEM; + + ctx = kmem_zalloc(sizeof(*ctx), KM_SLEEP|KM_MAYFAIL); + if (!ctx) { + kmem_free(cil); + return ENOMEM; + } + + INIT_LIST_HEAD(&cil->xc_cil); + INIT_LIST_HEAD(&cil->xc_committing); + spin_lock_init(&cil->xc_cil_lock); + init_rwsem(&cil->xc_ctx_lock); + sv_init(&cil->xc_commit_wait, SV_DEFAULT, "cilwait"); + + INIT_LIST_HEAD(&ctx->committing); + INIT_LIST_HEAD(&ctx->busy_extents); + ctx->sequence = 1; + ctx->cil = cil; + cil->xc_ctx = ctx; + + cil->xc_log = log; + log->l_cilp = cil; + return 0; +} + +void +xlog_cil_destroy( + struct log *log) +{ + if (!log->l_cilp) + return; + + if (log->l_cilp->xc_ctx) { + if (log->l_cilp->xc_ctx->ticket) + xfs_log_ticket_put(log->l_cilp->xc_ctx->ticket); + kmem_free(log->l_cilp->xc_ctx); + } + + ASSERT(list_empty(&log->l_cilp->xc_cil)); + kmem_free(log->l_cilp); +} + +/* + * Allocate a new ticket. Failing to get a new ticket makes it really hard to + * recover, so we don't allow failure here. Also, we allocate in a context that + * we don't want to be issuing transactions from, so we need to tell the + * allocation code this as well. + * + * We don't reserve any space for the ticket - we are going to steal whatever + * space we require from transactions as they commit. To ensure we reserve all + * the space required, we need to set the current reservation of the ticket to + * zero so that we know to steal the initial transaction overhead from the + * first transaction commit. + */ +static struct xlog_ticket * +xlog_cil_ticket_alloc( + struct log *log) +{ + struct xlog_ticket *tic; + + tic = xlog_ticket_alloc(log, 0, 1, XFS_TRANSACTION, 0, + KM_SLEEP|KM_NOFS); + tic->t_trans_type = XFS_TRANS_CHECKPOINT; + + /* + * set the current reservation to zero so we know to steal the basic + * transaction overhead reservation from the first transaction commit. + */ + tic->t_curr_res = 0; + return tic; +} + +/* + * After the first stage of log recovery is done, we know where the head and + * tail of the log are. We need this log initialisation done before we can + * initialise the first CIL checkpoint context. + * + * Here we allocate a log ticket to track space usage during a CIL push. This + * ticket is passed to xlog_write() directly so that we don't slowly leak log + * space by failing to account for space used by log headers and additional + * region headers for split regions. + */ +int +xlog_cil_init_post_recovery( + struct log *log) +{ + if (!log->l_cilp) + return 0; + + log->l_cilp->xc_ctx->ticket = xlog_cil_ticket_alloc(log); + log->l_cilp->xc_ctx->sequence = 1; + log->l_cilp->xc_ctx->commit_lsn = xlog_assign_lsn(log->l_curr_cycle, + log->l_curr_block); + return 0; +} + +/* + * Insert the log item into the CIL and calculate the difference in space + * consumed by the item. Add the space to the checkpoint ticket and calculate + * if the change requires additional log metadata. If it does, take that space + * as well. Remove the amount of space we addded to the checkpoint ticket from + * the current transaction ticket so that the accounting works out correctly. + * + * If this is the first time the item is being placed into the CIL in this + * context, pin it so it can't be written to disk until the CIL is flushed to + * the iclog and the iclog written to disk. + */ +static void +xlog_cil_insert( + struct log *log, + struct xlog_ticket *ticket, + struct xfs_log_item *item, + struct xfs_log_vec *lv) +{ + struct xfs_cil *cil = log->l_cilp; + struct xfs_log_vec *old = lv->lv_item->li_lv; + struct xfs_cil_ctx *ctx = cil->xc_ctx; + int len; + int diff_iovecs; + int iclog_space; + + if (old) { + /* existing lv on log item, space used is a delta */ + ASSERT(!list_empty(&item->li_cil)); + ASSERT(old->lv_buf && old->lv_buf_len && old->lv_niovecs); + + len = lv->lv_buf_len - old->lv_buf_len; + diff_iovecs = lv->lv_niovecs - old->lv_niovecs; + kmem_free(old->lv_buf); + kmem_free(old); + } else { + /* new lv, must pin the log item */ + ASSERT(!lv->lv_item->li_lv); + ASSERT(list_empty(&item->li_cil)); + + len = lv->lv_buf_len; + diff_iovecs = lv->lv_niovecs; + IOP_PIN(lv->lv_item); + + } + len += diff_iovecs * sizeof(xlog_op_header_t); + + /* attach new log vector to log item */ + lv->lv_item->li_lv = lv; + + spin_lock(&cil->xc_cil_lock); + list_move_tail(&item->li_cil, &cil->xc_cil); + ctx->nvecs += diff_iovecs; + + /* + * Now transfer enough transaction reservation to the context ticket + * for the checkpoint. The context ticket is special - the unit + * reservation has to grow as well as the current reservation as we + * steal from tickets so we can correctly determine the space used + * during the transaction commit. + */ + if (ctx->ticket->t_curr_res == 0) { + /* first commit in checkpoint, steal the header reservation */ + ASSERT(ticket->t_curr_res >= ctx->ticket->t_unit_res + len); + ctx->ticket->t_curr_res = ctx->ticket->t_unit_res; + ticket->t_curr_res -= ctx->ticket->t_unit_res; + } + + /* do we need space for more log record headers? */ + iclog_space = log->l_iclog_size - log->l_iclog_hsize; + if (len > 0 && (ctx->space_used / iclog_space != + (ctx->space_used + len) / iclog_space)) { + int hdrs; + + hdrs = (len + iclog_space - 1) / iclog_space; + /* need to take into account split region headers, too */ + hdrs *= log->l_iclog_hsize + sizeof(struct xlog_op_header); + ctx->ticket->t_unit_res += hdrs; + ctx->ticket->t_curr_res += hdrs; + ticket->t_curr_res -= hdrs; + ASSERT(ticket->t_curr_res >= len); + } + ticket->t_curr_res -= len; + ctx->space_used += len; + + spin_unlock(&cil->xc_cil_lock); +} + +/* + * Format log item into a flat buffers + * + * For delayed logging, we need to hold a formatted buffer containing + * all the changes on the log item. This enables us to relog the item + * in memory and write it out asynchronously without needing to relock + * the object that was modified at the time it gets written into the + * iclog. + * + * This function works out the length of the buffer needed for each + * log item, allocates them and formats the the log vector for the item + * into the buffer. The buffer is then attached to the log item and the + * vector is formatted into the buffer. The log item and formatted log vector + * are then inserted into the Committed Item List for tracking until the + * next checkpoint is written out. + */ +static void +xlog_cil_format_items( + struct log *log, + struct xfs_log_vec *log_vector, + struct xlog_ticket *ticket, + xfs_lsn_t *start_lsn) +{ + struct xfs_log_vec *lv; + + if (start_lsn) + *start_lsn = log->l_cilp->xc_ctx->sequence; + + /* + * we don't set up region headers here; we simply copy the regions into + * the flat buffer. We can do this because we still have to do a + * formatting step to write the regions into the iclog buffer. Writing + * the ophdrs during the iclog write means that we can support + * splitting large regions across iclog boundares without needing a + * change in the format of the item/region encapsulation. + * + * Hence what we need to do now is change the vector buffer pointer to + * point to the copied region inside the buffer we just allocated. This + * allows us to format the regions into the iclog as though they are + * being formatted directly out of the objects themselves. + */ + ASSERT(log_vector); + for (lv = log_vector; lv; lv = lv->lv_next) { + void *ptr; + int index; + int offset = 0; + int len = 0; + + for (index = 0; index < lv->lv_niovecs; index++) + len += lv->lv_iovecp[index].i_len; + + lv->lv_buf_len = len; + lv->lv_buf = kmem_zalloc(lv->lv_buf_len, KM_SLEEP|KM_NOFS); + ptr = lv->lv_buf; + + for (index = 0; index < lv->lv_niovecs; index++) { + struct xfs_log_iovec *vec = &lv->lv_iovecp[index]; + + memcpy(ptr, vec->i_addr, vec->i_len); + vec->i_addr = ptr; + xlog_write_adv_cnt(&ptr, &len, &offset, vec->i_len); + } + ASSERT(len == 0); + + xlog_cil_insert(log, ticket, lv->lv_item, lv); + } +} + +static void +xlog_cil_free_logvec( + struct xfs_log_vec *log_vector) +{ + struct xfs_log_vec *lv; + + for (lv = log_vector; lv; ) { + struct xfs_log_vec *next = lv->lv_next; + kmem_free(lv->lv_buf); + kmem_free(lv); + lv = next; + } +} + +/* + * Commit a transaction with the given vector to the Committed Item List. + * + * To do this, we need to format the item, pin it in memory if required and + * account for the space used by the transaction. Once we have done that we + * need to release the unused reservation for the transaction, attach the + * transaction to the checkpoint context so we carry the busy extents through + * to checkpoint completion, and then unlock all the items in the transaction. + * + * For more specific information about the order of operations in + * xfs_log_commit_cil() please refer to the comments in + * xfs_trans_commit_iclog(). + */ +int +xfs_log_commit_cil( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_log_vec *log_vector, + xfs_lsn_t *commit_lsn, + int flags) +{ + struct log *log = mp->m_log; + int log_flags = 0; + + if (flags & XFS_TRANS_RELEASE_LOG_RES) + log_flags = XFS_LOG_REL_PERM_RESERV; + + if (XLOG_FORCED_SHUTDOWN(log)) { + xlog_cil_free_logvec(log_vector); + return XFS_ERROR(EIO); + } + + /* lock out background commit */ + down_read(&log->l_cilp->xc_ctx_lock); + xlog_cil_format_items(log, log_vector, tp->t_ticket, commit_lsn); + + /* check we didn't blow the reservation */ + if (tp->t_ticket->t_curr_res < 0) + xlog_print_tic_res(log->l_mp, tp->t_ticket); + + /* attach the transaction to the CIL if it has any busy extents */ + if (!list_empty(&tp->t_busy)) { + spin_lock(&log->l_cilp->xc_cil_lock); + list_splice_init(&tp->t_busy, + &log->l_cilp->xc_ctx->busy_extents); + spin_unlock(&log->l_cilp->xc_cil_lock); + } + + tp->t_commit_lsn = *commit_lsn; + xfs_log_done(mp, tp->t_ticket, NULL, log_flags); + xfs_trans_unreserve_and_mod_sb(tp); + + /* background commit is allowed again */ + up_read(&log->l_cilp->xc_ctx_lock); + current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + + /* xfs_trans_free_items() unlocks them first */ + xfs_trans_free_items(tp, *commit_lsn, 0); + xfs_trans_free(tp); + return 0; +} + +/* + * Mark all items committed and clear busy extents. We free the log vector + * chains in a separate pass so that we unpin the log items as quickly as + * possible. + */ +static void +xlog_cil_committed( + void *args, + int abort) +{ + struct xfs_cil_ctx *ctx = args; + struct xfs_log_vec *lv; + int abortflag = abort ? XFS_LI_ABORTED : 0; + struct xfs_busy_extent *busyp, *n; + + /* unpin all the log items */ + for (lv = ctx->lv_chain; lv; lv = lv->lv_next ) { + xfs_trans_item_committed(lv->lv_item, ctx->start_lsn, + abortflag); + } + + list_for_each_entry_safe(busyp, n, &ctx->busy_extents, list) + xfs_alloc_busy_clear(ctx->cil->xc_log->l_mp, busyp); + + spin_lock(&ctx->cil->xc_cil_lock); + list_del(&ctx->committing); + spin_unlock(&ctx->cil->xc_cil_lock); + + xlog_cil_free_logvec(ctx->lv_chain); + kmem_free(ctx); +} + +/* + * Push the Committed Item List to the log. If the push_now flag is not set, + * then it is a background flush and so we can chose to ignore it. + */ +int +xlog_cil_push( + struct log *log, + int push_now) +{ + struct xfs_cil *cil = log->l_cilp; + struct xfs_log_vec *lv; + struct xfs_cil_ctx *ctx; + struct xfs_cil_ctx *new_ctx; + struct xlog_in_core *commit_iclog; + struct xlog_ticket *tic; + int num_lv; + int num_iovecs; + int len; + int error = 0; + struct xfs_trans_header thdr; + struct xfs_log_iovec lhdr; + struct xfs_log_vec lvhdr = { NULL }; + xfs_lsn_t commit_lsn; + + if (!cil) + return 0; + + /* XXX: don't sleep for background? */ + new_ctx = kmem_zalloc(sizeof(*new_ctx), KM_SLEEP|KM_NOFS); + new_ctx->ticket = xlog_cil_ticket_alloc(log); + + /* lock out transaction commit */ + down_write(&cil->xc_ctx_lock); + ctx = cil->xc_ctx; + + /* check if we've anything to push */ + if (list_empty(&cil->xc_cil)) { + up_write(&cil->xc_ctx_lock); + xfs_log_ticket_put(new_ctx->ticket); + kmem_free(new_ctx); + return 0; + } + + /* + * pull all the log vectors off the items in the CIL, and + * remove the items from the CIL. We don't need the CIL lock + * here because it's only needed on the transaction commit + * side which is currently locked out by the flush lock. + */ + lv = NULL; + num_lv = 0; + num_iovecs = 0; + len = 0; + while (!list_empty(&cil->xc_cil)) { + struct xfs_log_item *item; + int i; + + item = list_first_entry(&cil->xc_cil, + struct xfs_log_item, li_cil); + list_del_init(&item->li_cil); + if (!ctx->lv_chain) + ctx->lv_chain = item->li_lv; + else + lv->lv_next = item->li_lv; + lv = item->li_lv; + item->li_lv = NULL; + + num_lv++; + num_iovecs += lv->lv_niovecs; + for (i = 0; i < lv->lv_niovecs; i++) + len += lv->lv_iovecp[i].i_len; + } + + /* + * initialise the new context and attach it to the CIL. Then attach + * the current context to the CIL committing lsit so it can be found + * during log forces to extract the commit lsn of the sequence that + * needs to be forced. + */ + INIT_LIST_HEAD(&new_ctx->committing); + INIT_LIST_HEAD(&new_ctx->busy_extents); + new_ctx->sequence = ctx->sequence + 1; + new_ctx->cil = cil; + cil->xc_ctx = new_ctx; + + /* + * The switch is now done, so we can drop the context lock and move out + * of a shared context. We can't just go straight to the commit record, + * though - we need to synchronise with previous and future commits so + * that the commit records are correctly ordered in the log to ensure + * that we process items during log IO completion in the correct order. + * + * For example, if we get an EFI in one checkpoint and the EFD in the + * next (e.g. due to log forces), we do not want the checkpoint with + * the EFD to be committed before the checkpoint with the EFI. Hence + * we must strictly order the commit records of the checkpoints so + * that: a) the checkpoint callbacks are attached to the iclogs in the + * correct order; and b) the checkpoints are replayed in correct order + * in log recovery. + * + * Hence we need to add this context to the committing context list so + * that higher sequences will wait for us to write out a commit record + * before they do. + */ + spin_lock(&cil->xc_cil_lock); + list_add(&ctx->committing, &cil->xc_committing); + spin_unlock(&cil->xc_cil_lock); + up_write(&cil->xc_ctx_lock); + + /* + * Build a checkpoint transaction header and write it to the log to + * begin the transaction. We need to account for the space used by the + * transaction header here as it is not accounted for in xlog_write(). + * + * The LSN we need to pass to the log items on transaction commit is + * the LSN reported by the first log vector write. If we use the commit + * record lsn then we can move the tail beyond the grant write head. + */ + tic = ctx->ticket; + thdr.th_magic = XFS_TRANS_HEADER_MAGIC; + thdr.th_type = XFS_TRANS_CHECKPOINT; + thdr.th_tid = tic->t_tid; + thdr.th_num_items = num_iovecs; + lhdr.i_addr = (xfs_caddr_t)&thdr; + lhdr.i_len = sizeof(xfs_trans_header_t); + lhdr.i_type = XLOG_REG_TYPE_TRANSHDR; + tic->t_curr_res -= lhdr.i_len + sizeof(xlog_op_header_t); + + lvhdr.lv_niovecs = 1; + lvhdr.lv_iovecp = &lhdr; + lvhdr.lv_next = ctx->lv_chain; + + error = xlog_write(log, &lvhdr, tic, &ctx->start_lsn, NULL, 0); + if (error) + goto out_abort; + + /* + * now that we've written the checkpoint into the log, strictly + * order the commit records so replay will get them in the right order. + */ +restart: + spin_lock(&cil->xc_cil_lock); + list_for_each_entry(new_ctx, &cil->xc_committing, committing) { + /* + * Higher sequences will wait for this one so skip them. + * Don't wait for own own sequence, either. + */ + if (new_ctx->sequence >= ctx->sequence) + continue; + if (!new_ctx->commit_lsn) { + /* + * It is still being pushed! Wait for the push to + * complete, then start again from the beginning. + */ + sv_wait(&cil->xc_commit_wait, 0, &cil->xc_cil_lock, 0); + goto restart; + } + } + spin_unlock(&cil->xc_cil_lock); + + commit_lsn = xfs_log_done(log->l_mp, tic, &commit_iclog, 0); + if (error || commit_lsn == -1) + goto out_abort; + + /* attach all the transactions w/ busy extents to iclog */ + ctx->log_cb.cb_func = xlog_cil_committed; + ctx->log_cb.cb_arg = ctx; + error = xfs_log_notify(log->l_mp, commit_iclog, &ctx->log_cb); + if (error) + goto out_abort; + + /* + * now the checkpoint commit is complete and we've attached the + * callbacks to the iclog we can assign the commit LSN to the context + * and wake up anyone who is waiting for the commit to complete. + */ + spin_lock(&cil->xc_cil_lock); + ctx->commit_lsn = commit_lsn; + sv_broadcast(&cil->xc_commit_wait); + spin_unlock(&cil->xc_cil_lock); + + /* release the hounds! */ + return xfs_log_release_iclog(log->l_mp, commit_iclog); + +out_abort: + xlog_cil_committed(ctx, XFS_LI_ABORTED); + return XFS_ERROR(EIO); +} + +/* + * Conditionally push the CIL based on the sequence passed in. + * + * We only need to push if we haven't already pushed the sequence + * number given. Hence the only time we will trigger a push here is + * if the push sequence is the same as the current context. + * + * We return the current commit lsn to allow the callers to determine if a + * iclog flush is necessary following this call. + * + * XXX: Initially, just push the CIL unconditionally and return whatever + * commit lsn is there. It'll be empty, so this is broken for now. + */ +xfs_lsn_t +xlog_cil_push_lsn( + struct log *log, + xfs_lsn_t push_seq) +{ + struct xfs_cil *cil = log->l_cilp; + struct xfs_cil_ctx *ctx; + xfs_lsn_t commit_lsn = NULLCOMMITLSN; + +restart: + down_write(&cil->xc_ctx_lock); + ASSERT(push_seq <= cil->xc_ctx->sequence); + + /* check to see if we need to force out the current context */ + if (push_seq == cil->xc_ctx->sequence) { + up_write(&cil->xc_ctx_lock); + xlog_cil_push(log, 1); + goto restart; + } + + /* + * See if we can find a previous sequence still committing. + * We can drop the flush lock as soon as we have the cil lock + * because we are now only comparing contexts protected by + * the cil lock. + * + * We need to wait for all previous sequence commits to complete + * before allowing the force of push_seq to go ahead. Hence block + * on commits for those as well. + */ + spin_lock(&cil->xc_cil_lock); + up_write(&cil->xc_ctx_lock); + list_for_each_entry(ctx, &cil->xc_committing, committing) { + if (ctx->sequence > push_seq) + continue; + if (!ctx->commit_lsn) { + /* + * It is still being pushed! Wait for the push to + * complete, then start again from the beginning. + */ + sv_wait(&cil->xc_commit_wait, 0, &cil->xc_cil_lock, 0); + goto restart; + } + if (ctx->sequence != push_seq) + continue; + /* found it! */ + commit_lsn = ctx->commit_lsn; + } + spin_unlock(&cil->xc_cil_lock); + return commit_lsn; +} + diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 9cf6951..e9e8324 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -379,6 +379,54 @@ typedef struct xlog_in_core { } xlog_in_core_t; /* + * The CIL context is used to aggregate per-transaction details as well be + * passed to the iclog for checkpoint post-commit processing. After being + * passed to the iclog, another context needs to be allocated for tracking the + * next set of transactions to be aggregated into a checkpoint. + */ +struct xfs_cil; + +struct xfs_cil_ctx { + struct xfs_cil *cil; + xfs_lsn_t sequence; /* chkpt sequence # */ + xfs_lsn_t start_lsn; /* first LSN of chkpt commit */ + xfs_lsn_t commit_lsn; /* chkpt commit record lsn */ + struct xlog_ticket *ticket; /* chkpt ticket */ + int nvecs; /* number of regions */ + int space_used; /* aggregate size of regions */ + struct list_head busy_extents; /* busy extents in chkpt */ + struct xfs_log_vec *lv_chain; /* logvecs being pushed */ + xfs_log_callback_t log_cb; /* completion callback hook. */ + struct list_head committing; /* ctx committing list */ +}; + +/* + * Committed Item List structure + * + * This structure is used to track log items that have been committed but not + * yet written into the log. It is used only when the delayed logging mount + * option is enabled. + * + * This structure tracks the list of committing checkpoint contexts so + * we can avoid the problem of having to hold out new transactions during a + * flush until we have a the commit record LSN of the checkpoint. We can + * traverse the list of committing contexts in xlog_cil_push_lsn() to find a + * sequence match and extract the commit LSN directly from there. If the + * checkpoint is still in the process of committing, we can block waiting for + * the commit LSN to be determined as well. This should make synchronous + * operations almost as efficient as the old logging methods. + */ +struct xfs_cil { + struct log *xc_log; + struct list_head xc_cil; + spinlock_t xc_cil_lock; + struct xfs_cil_ctx *xc_ctx; + struct rw_semaphore xc_ctx_lock; + struct list_head xc_committing; + sv_t xc_commit_wait; +}; + +/* * The reservation head lsn is not made up of a cycle number and block number. * Instead, it uses a cycle number and byte number. Logs don't expect to * overflow 31 bits worth of byte offset, so using a byte number will mean @@ -388,6 +436,7 @@ typedef struct log { /* The following fields don't need locking */ struct xfs_mount *l_mp; /* mount point */ struct xfs_ail *l_ailp; /* AIL log is working with */ + struct xfs_cil *l_cilp; /* CIL log is working with */ struct xfs_buf *l_xbuf; /* extra buffer for log * wrapping */ struct xfs_buftarg *l_targ; /* buftarg of log */ @@ -438,14 +487,17 @@ typedef struct log { #define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) - /* common routines */ extern xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); extern int xlog_recover(xlog_t *log); extern int xlog_recover_finish(xlog_t *log); extern void xlog_pack_data(xlog_t *log, xlog_in_core_t *iclog, int); -extern kmem_zone_t *xfs_log_ticket_zone; +extern kmem_zone_t *xfs_log_ticket_zone; +struct xlog_ticket *xlog_ticket_alloc(struct log *log, int unit_bytes, + int count, char client, uint xflags, + int alloc_flags); + static inline void xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes) @@ -455,6 +507,21 @@ xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes) *off += bytes; } +void xlog_print_tic_res(struct xfs_mount *mp, struct xlog_ticket *ticket); +int xlog_write(struct log *log, struct xfs_log_vec *log_vector, + struct xlog_ticket *tic, xfs_lsn_t *start_lsn, + xlog_in_core_t **commit_iclog, uint flags); + +/* + * Committed Item List interfaces + */ +int xlog_cil_init(struct log *log); +int xlog_cil_init_post_recovery(struct log *log); +void xlog_cil_destroy(struct log *log); + +int xlog_cil_push(struct log *log, int push_now); +xfs_lsn_t xlog_cil_push_lsn(struct log *log, xfs_lsn_t push_sequence); + /* * Unmount record type is used as a pseudo transaction type for the ticket. * It's value must be outside the range of XFS_TRANS_* values. diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 9ff48a1..1d2c7ee 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -268,6 +268,7 @@ typedef struct xfs_mount { #define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops must be synchronous except for space allocations */ +#define XFS_MOUNT_DELAYLOG (1ULL << 1) /* delayed logging is enabled */ #define XFS_MOUNT_DMAPI (1ULL << 2) /* dmapi is enabled */ #define XFS_MOUNT_WAS_CLEAN (1ULL << 3) #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 40d9595..9bdb492 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -253,7 +253,7 @@ _xfs_trans_alloc( * Free the transaction structure. If there is more clean up * to do when the structure is freed, add it here. */ -STATIC void +void xfs_trans_free( struct xfs_trans *tp) { @@ -655,7 +655,7 @@ xfs_trans_apply_sb_deltas( * XFS_TRANS_SB_DIRTY will not be set when the transaction is updated but we * still need to update the incore superblock with the changes. */ -STATIC void +void xfs_trans_unreserve_and_mod_sb( xfs_trans_t *tp) { @@ -883,7 +883,7 @@ xfs_trans_fill_vecs( * they could be immediately flushed and we'd have to race with the flusher * trying to pull the item from the AIL as we add it. */ -static void +void xfs_trans_item_committed( struct xfs_log_item *lip, xfs_lsn_t commit_lsn, @@ -994,7 +994,7 @@ xfs_trans_uncommit( xfs_trans_unreserve_and_mod_sb(tp); xfs_trans_unreserve_and_mod_dquots(tp); - xfs_trans_free_items(tp, flags); + xfs_trans_free_items(tp, NULLCOMMITLSN, flags); xfs_trans_free(tp); } @@ -1144,6 +1144,132 @@ xfs_trans_commit_iclog( return xfs_log_release_iclog(mp, commit_iclog); } +/* + * Walk the log items and allocate log vector structures for + * each item large enough to fit all the vectors they require. + * Note that this format differs from the old log vector format in + * that there is no transaction header in these log vectors. + */ +STATIC struct xfs_log_vec * +xfs_trans_alloc_log_vecs( + xfs_trans_t *tp) +{ + xfs_log_item_desc_t *lidp; + struct xfs_log_vec *lv = NULL; + struct xfs_log_vec *ret_lv = NULL; + + lidp = xfs_trans_first_item(tp); + + /* Bail out if we didn't find a log item. */ + if (!lidp) { + ASSERT(0); + return NULL; + } + + while (lidp != NULL) { + struct xfs_log_vec *new_lv; + + /* Skip items which aren't dirty in this transaction. */ + if (!(lidp->lid_flags & XFS_LID_DIRTY)) { + lidp = xfs_trans_next_item(tp, lidp); + continue; + } + + /* Skip items that do not have any vectors for writing */ + lidp->lid_size = IOP_SIZE(lidp->lid_item); + if (!lidp->lid_size) { + lidp = xfs_trans_next_item(tp, lidp); + continue; + } + + new_lv = kmem_zalloc(sizeof(*new_lv) + + lidp->lid_size * sizeof(struct xfs_log_iovec), + KM_SLEEP); + + /* The allocated iovec region lies beyond the log vector. */ + new_lv->lv_iovecp = (struct xfs_log_iovec *)&new_lv[1]; + if (!ret_lv) + ret_lv = new_lv; + else + lv->lv_next = new_lv; + lv = new_lv; + lidp = xfs_trans_next_item(tp, lidp); + } + + return ret_lv; +} + +/* + * Fill in the vector with pointers to data to be logged + * by this transaction. + * Each dirty item takes the + * number of vectors it indicated it needed in xfs_trans_alloc_log_vecs(). + * There is no transaction header in this format. + * + * We do not pin the items here as they are formatted, we leave that to + * the CIL commit. This is done because the pinning of the item is + * conditional on whether the item is already pinned in the CIL. Hence + * the check and pin must be done under the protection of the flush lock. + */ +STATIC void +xfs_trans_fill_log_vecs( + struct xfs_trans *tp, + struct xfs_log_vec *log_vector) +{ + xfs_log_item_desc_t *lidp; + struct xfs_log_vec *lv = log_vector; + + lidp = xfs_trans_first_item(tp); + ASSERT(lidp); + while (lidp) { + /* + * Skip items which aren't dirty in this transaction. + */ + if (!(lidp->lid_flags & XFS_LID_DIRTY)) { + lidp = xfs_trans_next_item(tp, lidp); + continue; + } + /* Skip items that do not have any vectors for writing */ + if (!lidp->lid_size) { + lidp = xfs_trans_next_item(tp, lidp); + continue; + } + IOP_FORMAT(lidp->lid_item, lv->lv_iovecp); + lv->lv_niovecs = lidp->lid_size; + lv->lv_item = lidp->lid_item; + + lidp = xfs_trans_next_item(tp, lidp); + lv = lv->lv_next; + } +} + +static int +xfs_trans_commit_cil( + struct xfs_mount *mp, + struct xfs_trans *tp, + xfs_lsn_t *commit_lsn, + int flags) +{ + struct xfs_log_vec *log_vector; + + /* + * Get each log item to allocate a vector structure for + * the log item to to pass to the log write code. + */ + log_vector = xfs_trans_alloc_log_vecs(tp); + if (!log_vector) + return ENOMEM; + + /* + * Fill in the log_vector and pin the logged items, and + * then write the transaction to the log. We have to lock + * out CIL flushes from this point as we are going to pin + */ + xfs_trans_fill_log_vecs(tp, log_vector); + + return xfs_log_commit_cil(mp, tp, log_vector, commit_lsn, flags); + +} /* * xfs_trans_commit @@ -1204,7 +1330,11 @@ _xfs_trans_commit( xfs_trans_apply_sb_deltas(tp); xfs_trans_apply_dquot_deltas(tp); - error = xfs_trans_commit_iclog(mp, tp, &commit_lsn, flags); + if (mp->m_flags & XFS_MOUNT_DELAYLOG) + error = xfs_trans_commit_cil(mp, tp, &commit_lsn, flags); + else + error = xfs_trans_commit_iclog(mp, tp, &commit_lsn, flags); + if (error == ENOMEM) { xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); error = XFS_ERROR(EIO); @@ -1242,7 +1372,7 @@ out_unreserve: error = XFS_ERROR(EIO); } current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); - xfs_trans_free_items(tp, error ? XFS_TRANS_ABORT : 0); + xfs_trans_free_items(tp, NULLCOMMITLSN, error ? XFS_TRANS_ABORT : 0); xfs_trans_free(tp); XFS_STATS_INC(xs_trans_empty); @@ -1320,7 +1450,7 @@ xfs_trans_cancel( /* mark this thread as no longer being in a transaction */ current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); - xfs_trans_free_items(tp, flags); + xfs_trans_free_items(tp, NULLCOMMITLSN, flags); xfs_trans_free(tp); } diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index ff7e9e6..b1ea20c 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -106,7 +106,8 @@ typedef struct xfs_trans_header { #define XFS_TRANS_GROWFSRT_FREE 39 #define XFS_TRANS_SWAPEXT 40 #define XFS_TRANS_SB_COUNT 41 -#define XFS_TRANS_TYPE_MAX 41 +#define XFS_TRANS_CHECKPOINT 42 +#define XFS_TRANS_TYPE_MAX 42 /* new transaction types need to be reflected in xfs_logprint(8) */ #define XFS_TRANS_TYPES \ @@ -148,6 +149,7 @@ typedef struct xfs_trans_header { { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ { XFS_TRANS_SB_COUNT, "SB_COUNT" }, \ + { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ { XFS_TRANS_DUMMY1, "DUMMY1" }, \ { XFS_TRANS_DUMMY2, "DUMMY2" }, \ { XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" } @@ -829,6 +831,10 @@ typedef struct xfs_log_item { /* buffer item iodone */ /* callback func */ struct xfs_item_ops *li_ops; /* function list */ + + /* delayed logging */ + struct list_head li_cil; /* CIL pointers */ + struct xfs_log_vec *li_lv; /* active log vector */ } xfs_log_item_t; #define XFS_LI_IN_AIL 0x1 diff --git a/fs/xfs/xfs_trans_item.c b/fs/xfs/xfs_trans_item.c index 2937a1e..f11d37d 100644 --- a/fs/xfs/xfs_trans_item.c +++ b/fs/xfs/xfs_trans_item.c @@ -299,6 +299,7 @@ xfs_trans_next_item(xfs_trans_t *tp, xfs_log_item_desc_t *lidp) void xfs_trans_free_items( xfs_trans_t *tp, + xfs_lsn_t commit_lsn, int flags) { xfs_log_item_chunk_t *licp; @@ -311,7 +312,7 @@ xfs_trans_free_items( * Special case the embedded chunk so we don't free it below. */ if (!xfs_lic_are_all_free(licp)) { - (void) xfs_trans_unlock_chunk(licp, 1, abort, NULLCOMMITLSN); + (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn); xfs_lic_all_free(licp); licp->lic_unused = 0; } @@ -322,7 +323,7 @@ xfs_trans_free_items( */ while (licp != NULL) { ASSERT(!xfs_lic_are_all_free(licp)); - (void) xfs_trans_unlock_chunk(licp, 1, abort, NULLCOMMITLSN); + (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn); next_licp = licp->lic_next; kmem_free(licp); licp = next_licp; diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 901dc0f..330fa5f 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -35,9 +35,15 @@ struct xfs_log_item_desc *xfs_trans_find_item(struct xfs_trans *, struct xfs_log_item_desc *xfs_trans_first_item(struct xfs_trans *); struct xfs_log_item_desc *xfs_trans_next_item(struct xfs_trans *, struct xfs_log_item_desc *); -void xfs_trans_free_items(struct xfs_trans *, int); -void xfs_trans_unlock_items(struct xfs_trans *, - xfs_lsn_t); + +void xfs_trans_unlock_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn); +void xfs_trans_free_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn, + int flags); + +void xfs_trans_item_committed(struct xfs_log_item *lip, + xfs_lsn_t commit_lsn, int aborted); +void xfs_trans_unreserve_and_mod_sb(struct xfs_trans *tp); +void xfs_trans_free(struct xfs_trans *tp); /* * AIL traversal cursor. -- 1.5.6.5 From SRS0+QjcZ+65+fromorbit.com=dave@internode.on.net Wed May 5 20:44:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=BAYES_00, TVD_PH_BODY_ACCOUNTS_PRE autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o461iB3X065090 for ; Wed, 5 May 2010 20:44:12 -0500 X-ASG-Debug-ID: 1273110376-0ba503140000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 398E11281408 for ; Wed, 5 May 2010 18:46:17 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id PyZOti2eCOWXRzcg for ; Wed, 05 May 2010 18:46:17 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23506668-1927428 for ; Thu, 06 May 2010 11:16:15 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1O9qAG-0005Dx-NL for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:12 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1O9qA5-0000cX-Io for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 07/11] xfs: Delayed logging design documentation Subject: [PATCH 07/11] xfs: Delayed logging design documentation Date: Thu, 6 May 2010 11:45:47 +1000 Message-Id: <1273110351-2333-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273110351-2333-1-git-send-email-david@fromorbit.com> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1273110379 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4283 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.2, rules version 3.2.2.29167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Document the design of the delayed logging implementation. This includes assumptions made, dead ends followed, the reasoning behind the structuring of the code, the layout of various structures, how things fit together, traps and pit-falls avoided, etc. This is all too much to document in the code itself, so do it in a separate file. Signed-off-by: Dave Chinner --- .../filesystems/xfs-delayed-logging-design.txt | 819 ++++++++++++++++++++ 1 files changed, 819 insertions(+), 0 deletions(-) create mode 100644 Documentation/filesystems/xfs-delayed-logging-design.txt diff --git a/Documentation/filesystems/xfs-delayed-logging-design.txt b/Documentation/filesystems/xfs-delayed-logging-design.txt new file mode 100644 index 0000000..961cc8d --- /dev/null +++ b/Documentation/filesystems/xfs-delayed-logging-design.txt @@ -0,0 +1,819 @@ +XFS Delayed Logging Design +-------------------------- + +Introduction to Re-logging in XFS +--------------------------------- + +XFS logging is a combination of logical and physical logging. Some objects, +such as inodes and dquots, are logged in logical format where the details +logged are made up of the changes to in-core structures rather than on-disk +structures. Other objects - typically buffers - have their physical changes +logged. The reason for these differences is to reduce the amount of log space +required for objects that are frequently logged. Parts inodes are more +frequently logged than others, and inodes are typically more frequently logged +than any other object (except maybe the superblock buffer) so keeping the +amount of metadata logged low is of prime importance. + +The reason that this is such a concern is that XFS allows multiple separate +modifications to a single object to be carried in the log at any given time. +This allows the log to avoid needing to flush each change to disk before +recording a new change to the object. XFS does this via a method called +"re-logging". Conceptually, this is quite simple - all it requires is that any +new change to the object is recorded with a *new copy* of all the existing +changes in the new transaction that is written to the log. + +That is, if we have a sequence of changes A through to F, and the object was +written to disk after change D, we would see in the log the following series +of transactions, their contents and the log sequence number (LSN) of the +transaction: + + Transaction Contents LSN + A A X + B A+B X+n + C A+B+C X+n+m + D A+B+C+D X+n+m+o + + E E Y (> X+n+m+o) + F E+F YŮŤ+p + +In other words, each time an object is relogged, the new transaction contains +the aggregation of all the previous changes currently held only in the log. + +This relogging technique also allows objects to be moved forward in the log so +that an object being relogged does not prevent the tail of the log from ever +moving forward. This can be seen in the table above by the changing +(increasing) LSN of each subsquent transaction - the LSN is effectively a +direct encoding of the location in the log of the transaction. + +This relogging is also used to implement long-running, multiple-commit +transactions. These transaction are known as rolling transactions, and require +a special log reservation known as a permanent transaction reservation. A +typical example of a rolling transaction is the removal of extents from an +inode which can only be done at a rate of two extents per transaction because +of reservation size limitations. Hence a rolling extent removal transaction +keeps relogging the inode and btree buffers as they get modified in each +removal operation. This keeps them moving forward in the log as the operation +progresses, ensuring that current operation never gets blocked by itself if the +log wraps around. + +Hence it can be seen that the relogging operation is fundamental to the correct +working of the XFS journalling subsystem. From the above description, most +people should be able to see why the XFS metadata operations writes so much to +the log - repeated operations to the same objects write the same changes to +the log over and over again. Worse is the fact that objects tend to get +dirtier as they get relogged, so each subsequent transaction is writing more +metadata into the log. + +Another feature of the XFS transaction subsystem is that most transactions are +asynchronous. That is, they don't commit to disk until either a log buffer is +filled (a log buffer can hold multiple transactions) or a synchronous operation +forces the log buffers holding the transactions to disk. This means that XFS is +doing aggregation of transactions in memory - batching them, if you like - to +minimise the impact of the log IO on transaction throughput. + +The limitation on asynchrnous transaction throughput is the number and size of +log buffers made available by the log manager. By default there are 8 log +buffers available and the size of each is 32kB - the size can be increased up +to 256kB by use of a mount option. + +Effectively, this gives us the maximum bound out outstanding metadata changes +that can be made to the filesystem at any point in time - if all the log +buffers are full and under IO, then no more transactions can be committed until +the current batch completes. It is now common for a single current CPU core to +be to able to issue enough transactions to keep the log buffers full and under +IO permanently. Hence the XFS journalling subsystem can be considered to be IO +bound. + +Delayed Logging: Concepts +------------------------- + +The key thing to note about the asynchronous logging combined with the +relogging technique XFS uses is that we can be relogging changed objects +multiple times before they are committed to disk in the log buffers. If we +return to the previous relogging example, it is entirely possible that +transactions A through D are committed to disk in the same log buffer. + +That is, a single log buffer may contain multiple copies of the same object, +but only one of those copies needs to be there - the last one "D", as it +contains all the changes from the previous changes. In other words, we have one +necessary copy in the log buffer, and three stale copies that are simply +wasting space. When we are doing repeated operations on the same set of +objects, these "stale objects" can be over 90% of the space used in the log +buffers. It is clear that reducing the number of stale objects logged to the +log would greatly reduce the amount of metadata we write to the log, and +this is the fundamental goal of delayed logging. + +From a conceptual point of view, XFS is already doing relogging in memory (where +memory == log buffer), only it is doing it extremely inefficiently. It is using +logical to physical formatting to do the relogging because there is no +infrastructure to keep track of logical changes in memory prior to physically +formating the changes in a transaction to the log buffer. Hence we cannot avoid +accumulating stale objects in the log buffers. + +Delayed logging is the name we've given to keeping and tracking transactional +changes to objects in memory outside the log buffer infrastructure. Because of +the relogging concept fundamental to the XFS journalling subsystem, this is +actually relatively easy to do - all the changes to logged items are already +tracked in the current infrastructure. The big problem is how to accumulate +them and get them to the log in a consistent, recoverable manner. +Describing the problems and how they have been solved is the focus of this +document. + +One of the key changes that delayed logging makes to the operation of the +journalling subsystem is that is dissociates the amount of outstanding metadata +changes from the size and number of log buffers available. In other words, +instead of there only being a maximum of 2MB of transaction changes not written to +the log at any point in time, there may be a much greater amount being +accumulated in memory. Hence the potential for loss of metadata on a crash is +much greater than for the existing logging mechanism. + +It should be noted that this does not change the guarantee that log recovery +will result in a consistent filesystem. What it does mean is that as far as the +recovered filesysetm is concerned, there may be many thousands of transactions +that simply did not occur as a result of the crash. This makes it even more +important that applications that care about their data use fsync() where they +need to ensure application level data integrity is maintained. + +It should be noted that delayed logging is not an innovative new concept that +warrants rigorous proofs to determine whether it is correct or not. The method +of accumulating changes in memory for some period before writing them to the +log is used effectively in many filesystems including ext3 and ext4. Hence +no time is spent in this document trying to convince the reader that the +concept is sound. Instead it is simply considered a "solved problem" and as +such implementing it in XFS is purely an exercise in software engineering. + +The fundamental requirements for delayed logging in XFS are simple: + + 1. Reduce the amount of metadata written to the log by at least + an order of magnitude. + 2. Supply sufficient statistics to validate Requirement #1. + 3. Supply sufficient new tracing infrastructure to be able to debug + problems with the new code. + 4. No on-disk format change (metadata or log format). + 5. Enable and disable with a mount option. + 6. No performance regressions for synchronous transaction workloads. + +Delayed Logging: Design +----------------------- + +Storing Changes + +The problem with accumulating changes at a logical level (i.e. just using the +existing log item dirty region tracking) is that when it comes to writing the +changes to the log buffers, we need to ensure that the object we are formatting +is not changing while we do this. This requires locking the object to prevent +concurrent modification. Hence flushing the logical changes to the log would +require us to lock every object, format them, and then unlock them again. + +This introduces lots of scope of deadlocks with transactions that are already +running. For example, a transaction has object A locked and modified, but needs +the delayed logging tracking lock to commit the transaction. However, the +flushing thread has the delayed logging tracking lock already held, and is +trying to get the lock on object A to flush it to the log buffer. This appears +to be an unsolvable deadlock condition, and it was solving this problem that +was the barrier to implementing delayed logging for so long. + +The solution is relatively simple - it just a long time to recognise it. Put +simply, the current logging code formats the changes to each item into an +vector array that points to the changed regions in the item. The log write code +simply copies the memory these vectors point to into the log buffer during +transaction commit while the item is locked in the transaction. Instead of +using the log buffer as the destination of the formatting code, we can use +an allocated memory buffer big enough to fit the formatted vector. + +If we then copy the vector into the memory buffer and then rewrite the vector +to point to the memory buffer rather than the object itself, we now have a copy +of the changes in a format that is compatible with the log buffer writing code. +that does not require us to lock the item to access. This formatting and +rewriting can all be done while the object is locked during transaction commit, +resulting in a vector that is transactionally consistent and can be accessed +without needing to lock the owning item. + +Hence we avoid the need to lock items when we need to flush outstanding +asynchronous transactions to the log. The differences between the existing +formatting method and the delayed logging formatting can be seen in the +diagram below. + +Current format log vector: + +Object +---------------------------------------------+ +Vector 1 +----+ +Vector 2 +----+ +Vector 3 +----------+ + +After formatting: + +Log Buffer +-V1-+-V2-+----V3----+ + +Delayed logging vector: + +Object +---------------------------------------------+ +Vector 1 +----+ +Vector 2 +----+ +Vector 3 +----------+ + +After formatting: + +Memory Buffer +-V1-+-V2-+----V3----+ +Vector 1 +----+ +Vector 2 +----+ +Vector 3 +----------+ + +The memory buffer and associated vector need to be passed as a single object, +but still need to be associated with the parent object so if the object is +relogged we can replace the current memory buffer with a new memory buffer that +contains the latest changes. + +The reason for keeping the vector around after we've formatted the memory +buffer is to support splitting vectors across log buffer boundaries correctly. +If we don't keep the vector around, we do not know where the region boundaries +are in the item, so we'd need a new encapsulation method for regions in the log +buffer writing (i.e. double encapsulation). This would be an on-disk format +change and as such is not desirable. It also means we'd have to write the log +region headers in the formatting stage, which is problematic as there is per +region state that needs to be placed into the headers during the log write. + +Hence we need to keep the vector, but by attaching the memory buffer to it and +rewrite the vector addresses to point at the memory buffer we end up with a +self-describing object that it can be passed to the log buffer write code to be +handled in exactly the same manner as the existing log vectors are handled. +Hence we avoid needing a new on-disk format to handle items that have been +relogged in memory. + + +Tracking Changes + +Now that we can record transactional changes in memory in a form that allows +them to be used without limitations, we need to be able to track and accumulate +them so that they can be written to the log at some later point in time. The +log item is the natural place to store this vector and buffer, and also makes sense +to be the object that is used to track committed objects as it will always +exist once the object has been included in a transaction. + +The log item is already used to track the log items that have been written to +the log but not yet written to disk. Such log items are considered "active" +and as such are stored in the Active Item List (AIL) which is a LSN-ordered +double linked list. Items are inserted into this list during log buffer IO +completion, after which they are unpinned and can be written to disk. An object +that is in the AIL can be relogged, which causes the object to be pinned again +and then moved forward in the AIL when the log buffer IO completes for that +transaction. + +Essentially, this shows that an item that is in the AIL can still be modified +and relogged, so any tracking must be separate to the AIL infrastructure. As +such, we cannot reuse the AIL list pointers for tracking committed items, nor +can we store state in any field that is protected by the AIL lock. Hence the +committed item tracking needs it's own locks, lists and state fields in the log +item. + +Similar to the AIL, tracking of committed items is done through a new list +called the Committed Item List (CIL). The list tracks log items that have been +committed and have formatted memory buffers attached to them. It tracks +objects in transaction commit order, so when an object is relogged it is +removed from it's place in the list and re-inserted at the tail. This is entire +arbitrary and done to make it easy for debugging - the last items in the list +are the ones that are most recently modified. Ordering of the CIL is not +necessary for transactional integrity (as discussed in the next section) +so the ordering is done for convenience/sanity of the developers. + + +Delayed Logging: Checkpoints + +When we have a log synchronisation event, commonly known as a "log force", +all the items in the CIL must be written into the log via the log buffers. +We need to write these items in the order that they exist in the CIL, and they +need to be written as an atomic transaction. The need for all the objects to be +written as an atomic transaction comes from the requirements of relogging and +log replay - all the changes in all the objects in a given transaction must +either be completely replayed during log recovery, or not replayed at all. If +a transaction is not replayed because it is not complete in the log, then +no later transactions should be replayed, either. + +To fulfill this requirement, we need to write the entire CIL in a single log +transaction. Fortunately, the XFS log code has no fixed limit on the size of a +transaction, nor does the log replay code. The only fundamental limit is that +the transaction cannot be larger than just under half the size of the log. The +reason for this limit is that to find the head and tail of the log, there must +be at least one complete transaction in the log at any given time. If a +transaction is larger than half the log, then there is the possibility that a +crash during the write of a such a transaction could partially overwrites the +only complete previous transaction in the log. This will result in a recovery +failure and an inconsistent filesystem and hence we must enforce the maximum +size of a checkpoint to be slightly less than a half the log. + +Apart from this size requirement, a checkpoint transaction looks no different +to any other transaction - it contains a transaction header, a series of +formatted log items and a commit record at the tail. From a recovery +perspective, the checkpoint transaction is also no different - just a lot +bigger with a lot more items in it. The worst case effect of this is that we +might need to tune the recovery transaction object hash size. + +Because the checkpoint is just another transaction and all the changes to log +items are stored as log vectors, we can use the existing log buffer writing +code to write the changes into the log. To do this efficiently, we need to +minimise the time we hold the CIL locked while writing the checkpoint +transaction. The current log write code enables us to do this easily with the +way it separates the writing of the transaction contents (the log vectors) from +the transaction commit record, but tracking this requires us to have a +per-checkpoint context that travels through the log write process through to +checkpoint completion. + +Hence a checkpoint has a context that tracks the state of the current +checkpoint from initiation to checkpoint completion. A new context is initiated +at the same time a checkpoint transaction is started. That is, when we remove +all the current items from the CIL during a checkpoint operation, we move all +those changes into the current checkpoint context. We then initialise a new +context and attach that to the CIL for aggregation of new transactions. + +This allows us to unlock the CIL immediately after transfer of all the +committed items and effectively allow new transactions to be issued while we +are formatting the checkpoint into the log. It also allows concurrent +checkpoints to be written into the log buffers in the case of log force heavy +workloads, just like the existing transaction commit code does. This, however, +requires that we strictly order the commit records in the log so that +checkpoint sequence order is maintained during log replay. + +To ensure that we can be writing an item into a checkpoint transaction at +the same time another transaction modifies the item and inserts the log item +into the new CIL, then checkpoint transaction commit code cannot use log items +to store the list of log vectors that need to be written into the transaction. +Hence log vectors need to be able to be chained together to allow them to be +detatched from the log items. That is, when the CIL is flushed the memory +buffer and log vector attached to each log item needs to be attached to the +checkpoint context so that the log item can be released. In diagrammatic form, +the CIL would look like this before the flush: + + CIL Head + | + V + Log Item <-> log vector 1 -> memory buffer + | -> vector array + V + Log Item <-> log vector 2 -> memory buffer + | -> vector array + V + ...... + | + V + Log Item <-> log vector N-1 -> memory buffer + | -> vector array + V + Log Item <-> log vector N -> memory buffer + -> vector array + +And after the flush the CIL head is empty, and the checkpoint context log +vector list would look like: + + Checkpoint Context + | + V + log vector 1 -> memory buffer + | -> vector array + | -> Log Item + V + log vector 2 -> memory buffer + | -> vector array + | -> Log Item + V + ...... + | + V + log vector N-1 -> memory buffer + | -> vector array + | -> Log Item + V + log vector N -> memory buffer + -> vector array + -> Log Item + +Once this transfer is done, the CIL can be unlocked and new transactions can +start, while the checkpoint flush code works over the log vector chain to +commit the checkpoint. + +Once the checkpoint is written into the log buffers, the checkpoint context is +attached to the log buffer that the commit record was written to along with a +completion callback. Log IO completion will call that callback, which can then +run transaction committed processing for the log items (i.e. insert into AIL +and unpin) in the log vector chain and then free the log vector chain and +checkpoint context. + +Discussion Point: I am uncertain as to whether the log item is the most +efficient way to track vectors, even though it seems like the natural way to do +it. The fact that we walk the log items (in the CIL) just to chain the log +vectors and break the link between the log item and the log vector means that +we take a cache line hit for the log item list modification, then another for +the log vector chaining. If we track by the log vectors, then we only need to +break the link between the log item and the log vector, which means we should +dirty only the log item cachelines. Normally I wouldn't be concerned about one +vs two dirty cachelines except for the fact I've seen upwards of 80,000 log +vectors in one checkpoint transaction. I'd guess this is a "measure and +compare" situation that can be done after a working and reviewed implementation +is in the dev tree.... + +Delayed Logging: Checkpoint Sequencing + +One of the key aspects of the XFS transaction subsystem is that it tags +committed transactions with the log sequence number of the transaction commit. +This allows transactions to be issued asynchronously even though there may be +future operations that cannot be completed until that transaction is fully +committed to the log. In the rare case that a dependent operation occurs (e.g. +re-using a freed metadata extent for a data extent), a special, optimised log +force can be issued to force the dependent transaction to disk immediately. + +To do this, transactions need to record the LSN of the commit record of the +transaction. This LSN comes directly from the log buffer the transaction is +written into. While this works just fine for the existing transaction +mechanism, it does not work for delayed logging because transactions are not +written directly into the log buffers. Hence some other method of sequencing +transactions is required. + +As discussed in the checkpoint section, delayed logging uses per-checkpoint +contexts, and as such it is simple to assign a sequence number to each +checkpoint. Because the switching of checkpoint contexts must be done +atomically, it is simple to ensure that each new context has a monotonically +increasing sequence number assigned to it without the need for an external +atomic counter - we can just take the current context sequence number and add +one to it for the new context. + +Then, instead of assigning a log buffer LSN to the transaction commit LSN +during the commit, we can assign the current checkpoint sequence. This allows +operations that track transactions that have not yet completed know what +checkpoint sequence needs to be committed before they can continue. As a +result, the code that forces the log to a specific LSN now needs to ensure that +the log forces to a specific checkpoint. + +To ensure that we can do this, we need to track all the checkpoint contexts +that are currently committing to the log. When we flush a checkpoint, the +context gets added to a "committing" list which can be searched. When a +checkpoint commit completes, it is removed from the committing list. Because +the checkpoint context records the LSN of the commit record for the checkpoint, +we can also wait on the log buffer that contains the commit record, thereby +using the existing log force mechanisms to execute synchronous forces. + +It should be noted that the synchronous forces may need to be extended with +mitigation algorithms similar to the current log buffer code to allow +aggregation of multiple synchronous transactions if there are already +synchronous transactions being flushed. Investigation of the performance of the +current design is needed before making any decisions here. + +The main concern with log forces is to ensure that all the previous checkpoints +are also committed to disk before the one we need to wait for. Therefore we +need to check that all the prior contexts in the committing list are also +complete before waiting on the one we need to complete. We do this +synchronisation in the log force code so that we don't need to wait anywhere +else for such serialisation - it only matters when we do a log force. + +The only remaining complexity is that a log force now also has to handle the +case where the forcing sequence number is the same as the current context. That +is, we need to flush the CIL and potentially wait for it to complete. This is a +simple addition to the existing log forcing code to check the sequence numbers +and push if required. Indeed, placing the current sequence checkpoint flush in +the log force code enables the current mechanism for issuing synchronous +transactions to remain untouched (i.e. commit an asynchronous transaction, then +force the log at the LSN of that transaction) and so the higher level code +behaves the same regardless of whether delayed logging is being used or not. + +Delayed Logging: Checkpoint Log Space Accounting + +The big issue for a checkpoint transaction is the log space reservation for the +transaction. We don't know how big a checkpoint transaction is going to be +ahead of time, nor how many log buffers it will take to write out, nor the +number of split log vector regions are going to be used. We can track the +amount of log space required as we add items to the commit item list, but we +still need to reserve the space in the log for the checkpoint. + +A typical transaction reserves enough space in the log for the worst case space +usage of the transaction. The reservation accounts for log record headers, +transaction and region headers, headers for split regions, buffer tail padding, +etc. as well as the actual space for all the changed metadata in the +transaction. While some of this is fixed overhead, much of it is dependent on +the size of the transaction and the number of regions being logged (the number +of log vectors in the transaction). + +An example of the differences would be logging directory changes versus logging +inode changes. If you modify lots of inode cores (e.g. chmod -R g+w *), then +there are lots of transactions that only contain an inode core and an inode log +format structure. That is, two vectors totalling roughly 150 bytes. If we +modify 10,000 inodes, we have about 1.5MB of metadata to write in 20,000 +vectors. Each vector is 12 bytes, so the total to be logged is approximately +1.75MB. In comparison, if we are logging full directory buffers, they are +typically 4KB each, so we in 1.5MB of directory buffers we'd have roughly 400 +buffers and a buffer format structure for each buffer - roughly 800 vectors or +1.51MB total space. From this, it should be obvious that a static log space +reservation is not particularly flexible and is difficult to select the +"optimal value" for all workloads. + +Further, if we are going to use a static reservation, which bit of the entire +reservation does it cover? We account for space used by the transaction +reservation by tracking the space currently used by the object in the CIL and +then calculating the increase or decrease in space used as the object is +relogged. This allows for a checkpoint reservation to only have to account for +log buffer metadata used such as log header records. + +However, even using a static reservation for just the log metadata is +problematic. Typically log record headers use at least 16KB of log space per +1MB of log space consumed (512 bytes per 32k) and the reservation needs to be +large enough to handle arbitrary sized checkpoint transactions. This +reservation needs to be made before the checkpoint is started, and we need to +be able to reserve the space without sleeping. For a 8MB checkpoint, we need a +reservation of around 150KB, which is a non-trivial amount of space. + +A static reservation needs to manipulate the log grant counters - we can take a +permanent reservation on the space, but we still need to make sure we refresh +the write reservation (the actual space availble to the transaction) after +every checkpoint transaction completion. Unfortunately, if this space is not +available when required, then the regrant code will sleep waiting for it. + +The problem with this is that it can lead to deadlocks as we may need to commit +checkpoints to be able to free up log space (refer back to the description of +rolling transactions for an example of this). Hence we *must* always have +space available in the log if we are to use static reservations, and that is +very difficult and complex to arrange. It is possible to do, but there is a +simpler way. + +The simpler way of doing this is tracking the entire log space used by the +items in the CIL and using this to dynamically calculate the amount of log +space required by the log metadata. If this log metadata space changes as a +result of a transaction commit inserting a new memory buffer into the CIL, then +the difference in space required is removed from the transaction that causes +the change. Transactions at this level will *always* have enough space +available in their reservation for this as they have already reserved the +maximal amount of log metadata space they require, and such a delta reservation +will always be less than or equal to the maximal amount in the reservation. + +Hence we can grow the checkpoint transaction reservation dynamically as items +are added to the CIL and avoid the need for reserving and regranting log space +up front. This avoids deadlocks and removes a blocking point from the +checkpoint flush code. + +As mentioned early, transactions can't grow to more than half the size of the +log. Hence as part of the reservation growing, we need to also check the size +of the reservation against the maximum allowed transaction size. If we reach +the maximum threshold, we need to push the CIL to the log. This is effectively +a "background flush" and is done on demand. This is identical to +a CIL push triggered by a log force, only that there is no waiting for the +checkpoint commit to complete. This background push checked and executed by +transaction commit code. + +If the transaction subsystem goes idle while we still have items in the CIL, +they will be flushed by the periodic log force issued by the xfssyncd. This log +force will push the CIL to disk, and if the transaction subsystem stays idle, +allow the idle log to be covered (effectively marked clean) in exactly the same +manner that is done for the existing logging method. A discussion point is +whether this log force needs to be done more frequently than the current rate +which is once every 30s. + + +Delayed Logging: Log Item Pinning + +Currently log items are pinned during transaction commit while the items are +still locked. This happens just after the items are formatted, though it could +be done any time before the items are unlocked. The result of this mechanism is +that items get pinned once for every transaction that is committed to the log +buffers. Hence items that are relogged in the log buffers will have a pin count +for every outstanding transaction they were dirtied in. When each of these +transactions is completed, they will unpin the item once. As a result, the item +only becomes unpinned when all the transactions complete and there are no +pending transactions. Thus the pinning and unpinning of a log item is symmetric +as there is a 1:1 relationship with transaction commit and log item completion. + +For delayed logging, however, we have an assymetric transaction commit to +completion relationship. Every time an object is relogged in the CIL it goes +through the commit process without a corresponding completion being registered. +That is, we now have a many-to-one relationship between transaction commit and +log item completion. THe result of this is that pinning and unpinning of the +log items becomes unbalanced if we retain the "pin on transaction commit, unpin +on transaction completion" model. + +To keep pin/unpin symmetry, the algorithm needs to change to a "pin on +insertion into the CIL, unpin on checkpoint completion". In other words, the +pinning and unpinning becomes symmetric around a checkpoint context. We have to +pin the object the first time it is inserted into the CIL - if it is already in +the CIL during a transaction commit, then we do not pin it again. Because there +can be multiple outstanding checkpoint contexts, we can still see elevated pin +counts, but as each checkpoint completes the pin count will retain the correct +value according to it's context. + +Just to make matters more slightly more complex, this checkpoint level context +for the pin count means that the pinning of an item must take place under the +CIL commit/flush lock. If we pin the object outside this lock, we cannot +guarantee which context the pin count is associated with. This is because of +the fact pinning the item is dependent on whether the item is present in the +current CIL or not. If we don't pin the CIL first before we check and pin the +object, we have a race with CIL being flushed between the check and the pin +(or not pinning, as the case may be). Hence we must hold the CIL flush/commit +lock to guarantee that we pin the items correctly. + +Delayed Logging: Concurrent Scalability + +A fundamental requirement for the CIL is that accesses through transaction +commits must scale to many concurrent commits. The current transaction commit +code does not break down even when there are transactions coming from 2048 +processors at once. The current transaction code does not go any faster than if +there was only one CPU using it, but it does not slow down either. + +As a result, the delayed logging transaction commit code needs to be designed +for concurrency from the ground up. It is obvious that there are serialisation +points in the design - the three important ones are: + + 1. Locking out new transaction commits while flushing the CIL + 2. Adding items to the CIL and updating item space accounting + 3. Checkpoint commit ordering + +Looking at the transaction commit and CIL flushing interactions, it is clear +that we have a many-to-one interaction here. That is, the only restriction on +the number of concurrent transactions that can be trying to commit at once is +the amount of space available in the log for their reservations. The practical +limit here is in the order of several hundred concurrent transactions for a +128MB log, which means that it is generally one per CPU in a machine. + +The amount of time a transaction commit needs to hold out a flush is a +relatively long period of time - the pinning of log items needs to be done +while we are holding out a CIL flush, so at the moment that means it is held +across the formatting of the objects into memory buffers (i.e. while memcpy()s +are in progress). Ultimately a two pass algorithm where the formatting is done +separately to the pinning of objects could be used to reduce the hold time of +the transaction commit side. + +Because of the number of potential transaction commit side holders, the lock +really needs to be a sleeping lock - if the CIL flush takes the lock, we do not +want every other CPU in the machine spinning on the CIL lock. Given that +flushing the CIL could involve walking a list of tens of thousands of log +items, it will get held for a significant time and so spin contention is a +significant concern. Preventing lots of CPUs spinning doing nothing is the +main reason for choosing a sleeping lock even though nothing in either the +transaction commit or CIL flush side sleeps with the lock held. + +It should also be noted that CIL flushing is also a relatively rare operation +compared to transaction commit for asynchronous transaction workloads - only +time will tell if using a read-write semaphore for exclusion will limit +transaction commit concurrency due to cache line bouncing of the lock on the +read side. + +The second serialisation point is on the transaction commit side where items +are inserted into the CIL. Because transactions can enter this code +concurrently, the CIL needs to be protected separately from the above +commit/flush exclusion. It also needs to be an exclusive lock but it is only +held for a very short time and so a spin lock is appropriate here. It is +possible that this lock will become a contention point, but given the short +hold time once per transaction I think that contention is unlikely. + +The final serialisation point is the checkpoint commit record ordering code +that is run as part of the checkpoint commit and log force sequencing. The code +path that triggers a CIL flush (i.e. whatever triggers the log force) will enter +an ordering loop after writing all the log vectors into the log buffers but +before writing the commit record. This loop walks the list of committing +checkpoints and needs to block waiting for checkpoints to complete their commit +record write. As a result it needs a lock and a wait variable. Log force +sequencing also requires the same lock, list walk, and blocking mechanism to +ensure completion of checkpoints. + +These two sequencing operations can use the mechanism even though the +events they are waiting for are different. The checkpoint commit record +sequencing needs to wait until checkpoint contexts contain a commit LSN +(obtained through completion of a commit record write) while log force +sequencing needs to wait until previous checkpoint contexts are removed from +the committing list (i.e. they've completed). A simple wait variable and +broadcast wakeups (thundering herds) has been used to implement these two +serialisation queues. They use the same lock as the CIL, too. If we see too +much contention on the CIL lock, or too many context switches as a result of +the broadcast wakeups these operations can be put under a new spinlock and +given separate wait lists to reduce lock contention and the number of processes +woken by the wrong event. + + +Lifecycle Changes + +The existing log item life cycle is as follows: + + 1. Transaction allocate + 2. Transaction reserve + 3. Lock item + 4. Join item to transaction + If not already attached, + Allocate log item + Attach log item to owner item + Attach log item to transaction + 5. Modify item + Record modifications in log item + 6. Transaction commit + Pin item in memory + Format item into log buffer + Write commit LSN into transaction + Unlock item + Attach transaction to log buffer + + + + + 7. Transaction completion + Mark log item committed + Insert log item into AIL + Write commit LSN into log item + Unpin log item + 8. AIL traversal + Lock item + Mark log item clean + Flush item to disk + + + + 9. Log item removed from AIL + Moves log tail + Item unlocked + +Essentially, steps 1-6 operate independently from step 7, which is also +independent of steps 8-9. An item can be locked in steps 1-6 or steps 8-9 +at the same time step 7 is occurring, but only steps 1-6 or 8-9 can occur +at the same time. If the log item is in the AIL or between steps 6 and 7 +and steps 1-6 are re-entered, then the item is relogged. Only when steps 8-9 +are entered and completed is the object considered clean.` + +With delayed logging, there are new steps inserted into the life cycle: + + 1. Transaction allocate + 2. Transaction reserve + 3. Lock item + 4. Join item to transaction + If not already attached, + Allocate log item + Attach log item to owner item + Attach log item to transaction + 5. Modify item + Record modifications in log item + 6. Transaction commit + Pin item in memory if not pinned in CIL + Format item into log vector + buffer + Attach log vector and buffer to log item + Insert log item into CIL + Write CIL context sequence into transaction + Unlock item + + + + 7. CIL push + lock CIL flush + Chain log vectors and buffers together + Remove items from CIL + unlock CIL flush + write log vectors into log + sequence commit records + attach checkpoint context to log buffer + + + + + 8. Checkpoint completion + Mark log item committed + Insert item into AIL + Write commit LSN into log item + Unpin log item + 9. AIL traversal + Lock item + Mark log item clean + Flush item to disk + + 10. Log item removed from AIL + Moves log tail + Item unlocked + +From this, it can be seen that the only life cycle differences between the two +logging methods are in the middle of the life cycle - they still have the same +beginning and end and execution constraints. The only differences are in the +commiting of the log items to the log itself and the completion processing. +Hence delayed logging should not introduce any constraints on log item +behaviour, allocation or freeing that don't already exist. + +As a result of this zero-impact "insertion" of delayed logging infrastructure +and the design of the internal structures to avoid on disk format changes, we +can basically switch between delayed logging and the existing mechanism with a +mount option. Fundamentally, there is no reason why the log manager would not +be able to swap methods automatically and transparently depending on load +characteristics, but this should not be necessary if delayed logging works as +designed. + +Roadmap: + +2.6.35 Inclusion in mainline as an experimental mount option + => approximately 2-3 months to merge window + => needs to be in xfs-dev tree in 4-6 weeks + => code is nearing readiness for review + +2.6.37 Remove experimental tag from mount option + => should be roughly 6 months after initial merge + => enough time to: + => gain confidence and fix problems reported by early + adopters (a.k.a. guinea pigs) + => address worst performance regressions and undesired + behaviours + => start tuning/optimising code for parallelism + => start tuning/optimising algorithms consuming + excessive CPU time + +2.6.39 Switch default mount option to use delayed logging + => should be roughly 12 months after initial merge + => enough time to shake out remaining problems before next round of + enterprise distro kernel rebases + + + -- 1.5.6.5 From SRS0+QjcZ+65+fromorbit.com=dave@internode.on.net Wed May 5 20:44:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o461i65F065055 for ; Wed, 5 May 2010 20:44:07 -0500 X-ASG-Debug-ID: 1273110374-137702fb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 432203139C0 for ; Wed, 5 May 2010 18:46:15 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id Uv8a7wHSHAtYPdSV for ; Wed, 05 May 2010 18:46:15 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23180513-1927428 for ; Thu, 06 May 2010 11:16:14 +0930 (CST) Received: from [192.168.1.9] (helo=disturbed) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1O9qAG-0005Do-QL for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:12 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1O9qA5-0000cf-Tx for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 10/11] xfs: enable background pushing of the CIL Subject: [PATCH 10/11] xfs: enable background pushing of the CIL Date: Thu, 6 May 2010 11:45:50 +1000 Message-Id: <1273110351-2333-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273110351-2333-1-git-send-email-david@fromorbit.com> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1273110376 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.2, rules version 3.2.2.29166 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner If we let the CIL grow without bound, it will grow large enough to violate recovery constraints (must be at least one complete transaction in the log at all times) or take forever to write out through the log buffers. Hence we need a check during asynchronous transactions as to whether the CIL needs to be pushed. We track the amount of log space the CIL consumes, so it is relatively simple to limit it on a pure size basis. Make the limit the minimum of just under half the log size (recovery constraint) or 8MB of log space (which is an awful lot of metadata). Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_cil.c | 25 ++++++++++++++++++++++++- fs/xfs/xfs_log_priv.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletions(-) diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 3cb1957..806cf6b 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -339,6 +339,7 @@ xfs_log_commit_cil( { struct log *log = mp->m_log; int log_flags = 0; + int push = 0; if (flags & XFS_TRANS_RELEASE_LOG_RES) log_flags = XFS_LOG_REL_PERM_RESERV; @@ -368,13 +369,26 @@ xfs_log_commit_cil( xfs_log_done(mp, tp->t_ticket, NULL, log_flags); xfs_trans_unreserve_and_mod_sb(tp); - /* background commit is allowed again */ + /* check for background commit */ + if (log->l_cilp->xc_ctx->space_used > XLOG_CIL_SPACE_LIMIT(log)) + push = 1; + up_read(&log->l_cilp->xc_ctx_lock); current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); /* xfs_trans_free_items() unlocks them first */ xfs_trans_free_items(tp, *commit_lsn, 0); xfs_trans_free(tp); + + /* + * We need to push CIL every so often so we don't cache more than we + * can fit in the log. The limit really is that a checkpoint can't be + * more than half the log (the current checkpoint is not allowed to + * overwrite the previous checkpoint), but commit latency and memory + * usage limit this to a smaller size in most cases. + */ + if (push) + xlog_cil_push(log, 0); return 0; } @@ -453,6 +467,15 @@ xlog_cil_push( return 0; } + /* check for spurious background flush */ + if (!push_now && + log->l_cilp->xc_ctx->space_used < XLOG_CIL_SPACE_LIMIT(log)) { + up_write(&cil->xc_ctx_lock); + xfs_log_ticket_put(new_ctx->ticket); + kmem_free(new_ctx); + return 0; + } + /* * pull all the log vectors off the items in the CIL, and * remove the items from the CIL. We don't need the CIL lock diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index e9e8324..7490277 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -427,6 +427,51 @@ struct xfs_cil { }; /* + * The amount of log space we should the CIL to aggregate is difficult to size. + * Whatever we chose we have to make we can get a reservation for the log space + * effectively, that it is large enough to capture sufficient relogging to + * reduce log buffer IO significantly, but it is not too large for the log or + * induces too much latency when writing out through the iclogs. We track both + * space consumed and the number of vectors in the checkpoint context, so we + * need to decide which to use for limiting. + * + * Every log buffer we write out during a push needs a header reserved, which + * is at least one sector and more for v2 logs. Hence we need a reservation of + * at least 512 bytes per 32k of log space just for the LR headers. That means + * 16KB of reservation per megabyte of delayed logging space we will consume, + * plus various headers. The number of headers will vary based on the num of + * io vectors, so limiting on a specific number of vectors is going to result + * in transactions of varying size. IOWs, it is more consistent to track and + * limit space consumed in the log rather than by the number of objects being + * logged in order to prevent checkpoint ticket overruns. + * + * Further, use of static reservations through the log grant mechanism is + * problematic. It introduces a lot of complexity (e.g. reserve grant vs write + * grant) and a significant deadlock potential because regranting write space + * can block on log pushes. Hence if we have to regrant log space during a log + * push, we can deadlock. + * + * However, we can avoid this by use of a dynamic "reservation stealing" + * technique during transaction commit whereby unused reservation space in the + * transaction ticket is transferred to the CIL ctx commit ticket to cover the + * space needed by the checkpoint transaction. This means that we never need to + * specifically reserve space for the CIL checkpoint transaction, nor do we + * need to regrant space once the checkpoint completes. This also means the + * checkpoint transaction ticket is specific to the checkpoint context, rather + * than the CIL itself. + * + * With dynamic reservations, we can basically make up arbitrary limits for the + * checkpoint size so long as they don't violate any other size rules. Hence + * the initial maximum size for the checkpoint transaction will be set to a + * quarter of the log or 8MB, which ever is smaller. 8MB is an arbitrary limit + * right now based on the latency of writing out a large amount of data through + * the circular iclog buffers. + */ + +#define XLOG_CIL_SPACE_LIMIT(log) \ + (min((log->l_logsize >> 2), (8 * 1024 * 1024))) + +/* * The reservation head lsn is not made up of a cycle number and block number. * Instead, it uses a cycle number and byte number. Logs don't expect to * overflow 31 bits worth of byte offset, so using a byte number will mean -- 1.5.6.5 From SRS0+wf72+65+fromorbit.com=dave@internode.on.net Wed May 5 20:44:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o461i91r065079 for ; Wed, 5 May 2010 20:44:09 -0500 X-ASG-Debug-ID: 1273110376-179202780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8A9543139C1 for ; Wed, 5 May 2010 18:46:17 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id Sn9SA8AFJrF7b0Ci for ; Wed, 05 May 2010 18:46:17 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23264927-1927428 for ; Thu, 06 May 2010 11:16:16 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1O9qA6-0005Dp-Uf for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:02 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1O9qA5-0000ch-Ve for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 11/11] xfs: Ensure inode allocation buffers are fully replayed Subject: [PATCH 11/11] xfs: Ensure inode allocation buffers are fully replayed Date: Thu, 6 May 2010 11:45:51 +1000 Message-Id: <1273110351-2333-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273110351-2333-1-git-send-email-david@fromorbit.com> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1273110378 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.2, rules version 3.2.2.29166 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner With delayed logging, we can get inode allocation buffers in the same transaction inode unlink buffers. We don't currently mark inode allocation buffers in the log, so inode unlink buffers take precedence over allocation buffers. The result is that when they are combined into the same checkpoint, only the unlinked inode chain fields are replayed, resulting in uninitialised inode buffers being detected when the next inode modification is replayed. To fix this, we need to ensure that we do not set the inode buffer flag in the buffer log item format flags if the inode allocation has not already hit the log. To avoid requiring a change to log recovery, we really need to make this a modification that relies only on in-memory sate. We can do this by checking during buffer log formatting (while the CIL cannot be flushed) if we are still in the same sequence when we commit the unlink transaction as the inode allocation transaction. If we are, then we do not add the inode buffer flag to the buffer log format item flags. This means the entire buffer will be replayed, not just the unlinked fields. We do this while CIL flusheŃ• are locked out to ensure that we don't race with the sequence numbers changing and hence fail to put the inode buffer flag in the buffer format flags when we really need to. Also, move an assert in the buffer release path outside the hash spinlock so that if the assert is hit the system continues to run in a debuggable state. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_buf.c | 2 +- fs/xfs/xfs_buf_item.c | 14 ++++++++++++ fs/xfs/xfs_buf_item.h | 4 ++- fs/xfs/xfs_log.h | 1 + fs/xfs/xfs_log_cil.c | 48 ++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_trans.c | 16 +++++++++++-- fs/xfs/xfs_trans.h | 1 + fs/xfs/xfs_trans_buf.c | 20 +++++++++--------- 8 files changed, 89 insertions(+), 17 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 82678bf..e085eca 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -800,9 +800,9 @@ xfs_buf_rele( } else if (bp->b_flags & XBF_FS_MANAGED) { spin_unlock(&hash->bh_lock); } else { - ASSERT(!(bp->b_flags & (XBF_DELWRI|_XBF_DELWRI_Q))); list_del_init(&bp->b_hash_list); spin_unlock(&hash->bh_lock); + ASSERT(!(bp->b_flags & (XBF_DELWRI|_XBF_DELWRI_Q))); xfs_buf_free(bp); } } diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index bcbb661..02a8098 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -254,6 +254,20 @@ xfs_buf_item_format( vecp++; nvecs = 1; + /* + * If it is an inode buffer, transfer the in-memory state to the + * format flags and clear the in-memory state. We do not transfer + * this state if the inode buffer allocation has not yet been committed + * to the log as setting the XFS_BLI_INODE_BUF flag will prevent + * correct replay of the inode allocation. + */ + if (bip->bli_flags & XFS_BLI_INODE_BUF) { + if (!((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) && + xfs_log_item_in_current_chkpt(&bip->bli_item))) + bip->bli_format.blf_flags |= XFS_BLF_INODE_BUF; + bip->bli_flags &= ~XFS_BLI_INODE_BUF; + } + if (bip->bli_flags & XFS_BLI_STALE) { /* * The buffer is stale, so all we need to log diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 8cbb82b..f20bb47 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -69,6 +69,7 @@ typedef struct xfs_buf_log_format { #define XFS_BLI_LOGGED 0x08 #define XFS_BLI_INODE_ALLOC_BUF 0x10 #define XFS_BLI_STALE_INODE 0x20 +#define XFS_BLI_INODE_BUF 0x40 #define XFS_BLI_FLAGS \ { XFS_BLI_HOLD, "HOLD" }, \ @@ -76,7 +77,8 @@ typedef struct xfs_buf_log_format { { XFS_BLI_STALE, "STALE" }, \ { XFS_BLI_LOGGED, "LOGGED" }, \ { XFS_BLI_INODE_ALLOC_BUF, "INODE_ALLOC" }, \ - { XFS_BLI_STALE_INODE, "STALE_INODE" } + { XFS_BLI_STALE_INODE, "STALE_INODE" }, \ + { XFS_BLI_INODE_BUF, "INODE_BUF" } #ifdef __KERNEL__ diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 1764f11..ff4c443 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -197,6 +197,7 @@ void xfs_log_ticket_put(struct xlog_ticket *ticket); int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, struct xfs_log_vec *log_vector, xfs_lsn_t *commit_lsn, int flags); +bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); #endif diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 806cf6b..f6733eb 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -201,6 +201,15 @@ xlog_cil_insert( ctx->nvecs += diff_iovecs; /* + * If this is the first time the item is being committed to the CIL, + * store the sequence number on the log item so we can tell + * in future commits whether this is the first checkpoint the item is + * being committed into. + */ + if (!item->li_seq) + item->li_seq = ctx->sequence; + + /* * Now transfer enough transaction reservation to the context ticket * for the checkpoint. The context ticket is special - the unit * reservation has to grow as well as the current reservation as we @@ -328,6 +337,10 @@ xlog_cil_free_logvec( * For more specific information about the order of operations in * xfs_log_commit_cil() please refer to the comments in * xfs_trans_commit_iclog(). + * + * Called with the context lock already held in read mode to lock out + * background commit, returns without it held once background commits are + * allowed again. */ int xfs_log_commit_cil( @@ -346,11 +359,10 @@ xfs_log_commit_cil( if (XLOG_FORCED_SHUTDOWN(log)) { xlog_cil_free_logvec(log_vector); + up_read(&log->l_cilp->xc_ctx_lock); return XFS_ERROR(EIO); } - /* lock out background commit */ - down_read(&log->l_cilp->xc_ctx_lock); xlog_cil_format_items(log, log_vector, tp->t_ticket, commit_lsn); /* check we didn't blow the reservation */ @@ -687,3 +699,35 @@ restart: return commit_lsn; } +/* + * Check if the current log item was first committed in this sequence. + * We can't rely on just the log item being in the CIL, we have to check + * the recorded commit sequence number. + * + * Note: for this to be used in a non-racy manner, it has to be called with + * CIL flushing locked out. As a result, it should only be used during the + * transaction commit process when deciding what to format into the item. + */ +bool +xfs_log_item_in_current_chkpt( + struct xfs_log_item *lip) +{ + struct xfs_cil_ctx *ctx; + + if (!(lip->li_mountp->m_flags & XFS_MOUNT_DELAYLOG)) + return false; + if (list_empty(&lip->li_cil)) + return false; + + ctx = lip->li_mountp->m_log->l_cilp->xc_ctx; + + /* + * li_seq is written on the first commit of a log item to record the + * first checkpoint it is written to. Hence if it is different to the + * current sequence, we're in a new checkpoint. + */ + if (XFS_LSN_CMP(lip->li_seq, ctx->sequence) != 0) + return false; + return true; +} + diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 9bdb492..3e88c3f 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -45,6 +45,7 @@ #include "xfs_trans_space.h" #include "xfs_inode_item.h" #include "xfs_trace.h" +#include "xfs_log_priv.h" kmem_zone_t *xfs_trans_zone; @@ -1261,10 +1262,19 @@ xfs_trans_commit_cil( return ENOMEM; /* - * Fill in the log_vector and pin the logged items, and - * then write the transaction to the log. We have to lock - * out CIL flushes from this point as we are going to pin + * Now we need to fill in the log_vector and pin the logged items, and + * then write the transaction to the log. + * + * Important: We have to lock out CIL flushes from this point as + * transferring state from the in memory log items to the log item + * headers during formatting may require atomicity against log writes + * to ensure that state is transferred to the log without racing + * against flushes. + * + * xfs_log_commit_cil() will release the lock as part of the commit + * process. */ + down_read(&mp->m_log->l_cilp->xc_ctx_lock); xfs_trans_fill_log_vecs(tp, log_vector); return xfs_log_commit_cil(mp, tp, log_vector, commit_lsn, flags); diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index b1ea20c..8c69e78 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -835,6 +835,7 @@ typedef struct xfs_log_item { /* delayed logging */ struct list_head li_cil; /* CIL pointers */ struct xfs_log_vec *li_lv; /* active log vector */ + xfs_lsn_t li_seq; /* CIL commit seq */ } xfs_log_item_t; #define XFS_LI_IN_AIL 0x1 diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 3390c3e..63d81a2 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -792,7 +792,7 @@ xfs_trans_binval( XFS_BUF_UNDELAYWRITE(bp); XFS_BUF_STALE(bp); bip->bli_flags |= XFS_BLI_STALE; - bip->bli_flags &= ~(XFS_BLI_LOGGED | XFS_BLI_DIRTY); + bip->bli_flags &= ~(XFS_BLI_INODE_BUF | XFS_BLI_LOGGED | XFS_BLI_DIRTY); bip->bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; bip->bli_format.blf_flags |= XFS_BLF_CANCEL; memset((char *)(bip->bli_format.blf_data_map), 0, @@ -802,16 +802,16 @@ xfs_trans_binval( } /* - * This call is used to indicate that the buffer contains on-disk - * inodes which must be handled specially during recovery. They - * require special handling because only the di_next_unlinked from - * the inodes in the buffer should be recovered. The rest of the - * data in the buffer is logged via the inodes themselves. + * This call is used to indicate that the buffer contains on-disk inodes which + * must be handled specially during recovery. They require special handling + * because only the di_next_unlinked from the inodes in the buffer should be + * recovered. The rest of the data in the buffer is logged via the inodes + * themselves. * - * All we do is set the XFS_BLI_INODE_BUF flag in the buffer's log - * format structure so that we'll know what to do at recovery time. + * All we do is set the XFS_BLI_INODE_BUF flag in the items flags so it can be + * transferred to the buffer's log format structure so that we'll know what to + * do at recovery time. */ -/* ARGSUSED */ void xfs_trans_inode_buf( xfs_trans_t *tp, @@ -826,7 +826,7 @@ xfs_trans_inode_buf( bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(atomic_read(&bip->bli_refcount) > 0); - bip->bli_format.blf_flags |= XFS_BLF_INODE_BUF; + bip->bli_flags |= XFS_BLI_INODE_BUF; } /* -- 1.5.6.5 From SRS0+61RJ+65+fromorbit.com=dave@internode.on.net Wed May 5 20:44:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o461i6uO065054 for ; Wed, 5 May 2010 20:44:07 -0500 X-ASG-Debug-ID: 1273110374-137502c80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1E0C83139BD for ; Wed, 5 May 2010 18:46:14 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id UEZVoSixDaFVed0Z for ; Wed, 05 May 2010 18:46:14 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23378077-1927428 for ; Thu, 06 May 2010 11:16:13 +0930 (CST) Received: from [192.168.1.9] (helo=disturbed) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1O9qA6-0005DO-AD for xfs@oss.sgi.com; Thu, 06 May 2010 11:46:02 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1O9q9v-0000cN-Cr for xfs@oss.sgi.com; Thu, 06 May 2010 11:45:51 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 04/11] xfs: modify buffer item reference counting V2 Subject: [PATCH 04/11] xfs: modify buffer item reference counting V2 Date: Thu, 6 May 2010 11:45:44 +1000 Message-Id: <1273110351-2333-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273110351-2333-1-git-send-email-david@fromorbit.com> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1273110376 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.2, rules version 3.2.2.29166 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The buffer log item reference counts used to take referenceŃ• for every transaction, similar to the pin counting. This is symmetric (like the pin/unpin) with respect to transaction completion, but with dleayed logging becomes assymetric as the pinning becomes assymetric w.r.t. transaction completion. To make both cases the same, allow the buffer pinning to take a reference to the buffer log item and always drop the reference the transaction has on it when being unlocked. This is balanced correctly because the unpin operation always drops a reference to the log item. Hence reference counting becomes symmetric w.r.t. item pinning as well as w.r.t active transactions and as a result the reference counting model remain consistent between normal and delayed logging. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf_item.c | 110 ++++++++++++++++++++++-------------------------- 1 files changed, 50 insertions(+), 60 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 240340a..4cd5f61 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -341,10 +341,15 @@ xfs_buf_item_format( } /* - * This is called to pin the buffer associated with the buf log - * item in memory so it cannot be written out. Simply call bpin() - * on the buffer to do this. + * This is called to pin the buffer associated with the buf log item in memory + * so it cannot be written out. Simply call bpin() on the buffer to do this. + * + * We also always take a reference to the buffer log item here so that the bli + * is held while the item is pinned in memory. This means that we can + * unconditionally drop the reference count a transaction holds when the + * transaction is completed. */ + STATIC void xfs_buf_item_pin( xfs_buf_log_item_t *bip) @@ -356,6 +361,7 @@ xfs_buf_item_pin( ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT((bip->bli_flags & XFS_BLI_LOGGED) || (bip->bli_flags & XFS_BLI_STALE)); + atomic_inc(&bip->bli_refcount); trace_xfs_buf_item_pin(bip); xfs_bpin(bp); } @@ -489,20 +495,23 @@ xfs_buf_item_trylock( } /* - * Release the buffer associated with the buf log item. - * If there is no dirty logged data associated with the - * buffer recorded in the buf log item, then free the - * buf log item and remove the reference to it in the - * buffer. + * Release the buffer associated with the buf log item. If there is no dirty + * logged data associated with the buffer recorded in the buf log item, then + * free the buf log item and remove the reference to it in the buffer. * - * This call ignores the recursion count. It is only called - * when the buffer should REALLY be unlocked, regardless - * of the recursion count. + * This call ignores the recursion count. It is only called when the buffer + * should REALLY be unlocked, regardless of the recursion count. * - * If the XFS_BLI_HOLD flag is set in the buf log item, then - * free the log item if necessary but do not unlock the buffer. - * This is for support of xfs_trans_bhold(). Make sure the - * XFS_BLI_HOLD field is cleared if we don't free the item. + * We unconditionally drop the transaction's reference to the log item. If the + * item was logged, then another reference was taken when it was pinned, so we + * can safely drop the transaction reference now. This also allows us to avoid + * potential races with the unpin code freeing the bli by not referencing the + * bli after we've dropped the reference count. + * + * If the XFS_BLI_HOLD flag is set in the buf log item, then free the log item + * if necessary but do not unlock the buffer. This is for support of + * xfs_trans_bhold(). Make sure the XFS_BLI_HOLD field is cleared if we don't + * free the item. */ STATIC void xfs_buf_item_unlock( @@ -514,73 +523,54 @@ xfs_buf_item_unlock( bp = bip->bli_buf; - /* - * Clear the buffer's association with this transaction. - */ + /* Clear the buffer's association with this transaction. */ XFS_BUF_SET_FSPRIVATE2(bp, NULL); /* - * If this is a transaction abort, don't return early. - * Instead, allow the brelse to happen. - * Normally it would be done for stale (cancelled) buffers - * at unpin time, but we'll never go through the pin/unpin - * cycle if we abort inside commit. + * If this is a transaction abort, don't return early. Instead, allow + * the brelse to happen. Normally it would be done for stale + * (cancelled) buffers at unpin time, but we'll never go through the + * pin/unpin cycle if we abort inside commit. */ aborted = (bip->bli_item.li_flags & XFS_LI_ABORTED) != 0; /* - * If the buf item is marked stale, then don't do anything. - * We'll unlock the buffer and free the buf item when the - * buffer is unpinned for the last time. + * Before possibly freeing the buf item, determine if we should + * release the buffer at the end of this routine. + */ + hold = bip->bli_flags & XFS_BLI_HOLD; + + /* Clear the per transaction state. */ + bip->bli_flags &= ~(XFS_BLI_LOGGED | XFS_BLI_HOLD); + + /* + * If the buf item is marked stale, then don't do anything. We'll + * unlock the buffer and free the buf item when the buffer is unpinned + * for the last time. */ if (bip->bli_flags & XFS_BLI_STALE) { - bip->bli_flags &= ~XFS_BLI_LOGGED; trace_xfs_buf_item_unlock_stale(bip); ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); - if (!aborted) + if (!aborted) { + atomic_dec(&bip->bli_refcount); return; + } } - /* - * Drop the transaction's reference to the log item if - * it was not logged as part of the transaction. Otherwise - * we'll drop the reference in xfs_buf_item_unpin() when - * the transaction is really through with the buffer. - */ - if (!(bip->bli_flags & XFS_BLI_LOGGED)) { - atomic_dec(&bip->bli_refcount); - } else { - /* - * Clear the logged flag since this is per - * transaction state. - */ - bip->bli_flags &= ~XFS_BLI_LOGGED; - } - - /* - * Before possibly freeing the buf item, determine if we should - * release the buffer at the end of this routine. - */ - hold = bip->bli_flags & XFS_BLI_HOLD; trace_xfs_buf_item_unlock(bip); /* - * If the buf item isn't tracking any data, free it. - * Otherwise, if XFS_BLI_HOLD is set clear it. + * If the buf item isn't tracking any data, free it, otherwise drop the + * reference we hold to it. */ if (xfs_bitmap_empty(bip->bli_format.blf_data_map, - bip->bli_format.blf_map_size)) { + bip->bli_format.blf_map_size)) xfs_buf_item_relse(bp); - } else if (hold) { - bip->bli_flags &= ~XFS_BLI_HOLD; - } + else + atomic_dec(&bip->bli_refcount); - /* - * Release the buffer if XFS_BLI_HOLD was not set. - */ - if (!hold) { + if (!hold) xfs_buf_relse(bp); - } } /* -- 1.5.6.5 From nathans@aconex.com Wed May 5 23:15:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o464FAJ2070817 for ; Wed, 5 May 2010 23:15:10 -0500 X-ASG-Debug-ID: 1273119438-1ad4013f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from postoffice2.aconex.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C6324128138D for ; Wed, 5 May 2010 21:17:19 -0700 (PDT) Received: from postoffice2.aconex.com (mail.aconex.com [203.89.202.182]) by cuda.sgi.com with ESMTP id netBeEfaPKTvED5B for ; Wed, 05 May 2010 21:17:19 -0700 (PDT) Received: from postoffice.aconex.com (localhost [127.0.0.1]) by postoffice2.aconex.com (Spam & Virus Firewall) with ESMTP id 93C8A51790F; Thu, 6 May 2010 14:17:16 +1000 (EST) Received: from postoffice.aconex.com (postoffice.yarra.acx [192.168.102.1]) by postoffice2.aconex.com with ESMTP id 5B0DEFyCxjSYm0Gm; Thu, 06 May 2010 14:17:16 +1000 (EST) Received: from gatekeeper.aconex.com (gatekeeper.yarra.acx [192.168.102.10]) by postoffice.aconex.com (Postfix) with ESMTP id 54D9AA50283; Thu, 6 May 2010 14:14:03 +1000 (EST) Received: from localhost (localhost.localdomain [127.0.0.1]) by gatekeeper.aconex.com (Postfix) with ESMTP id 796224886E5; Thu, 6 May 2010 14:17:16 +1000 (EST) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at aconex.com Received: from gatekeeper.aconex.com ([127.0.0.1]) by localhost (gatekeeper.aconex.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id thZTbe4ceoS4; Thu, 6 May 2010 14:17:11 +1000 (EST) Received: from mail-au.aconex.com (mail-au.aconex.com [192.168.102.12]) by gatekeeper.aconex.com (Postfix) with ESMTP id BF1364886DF; Thu, 6 May 2010 14:17:11 +1000 (EST) Received: from mail-au.aconex.com (mail-au.aconex.com [192.168.102.12]) by mail-au.aconex.com (Postfix) with ESMTP id 9CFC06108EDE; Thu, 6 May 2010 14:17:05 +1000 (EST) Date: Thu, 6 May 2010 14:17:04 +1000 (EST) From: nathans@aconex.com Sender: nscott@aconex.com To: Dave Chinner Cc: xfs@oss.sgi.com Message-ID: <827899224.88951273119424327.JavaMail.root@mail-au> In-Reply-To: <921460991.88921273119221574.JavaMail.root@mail-au> X-ASG-Orig-Subj: Re: [PATCH 07/11] xfs: Delayed logging design documentation Subject: Re: [PATCH 07/11] xfs: Delayed logging design documentation MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [203.89.192.141] X-Mailer: Zimbra 5.0.18_GA_3011.RHEL5_64 (ZimbraWebClient - FF3.0 (Linux)/5.0.18_GA_3011.RHEL5_64) X-Barracuda-Connect: mail.aconex.com[203.89.202.182] X-Barracuda-Start-Time: 1273119439 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=NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29175 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name X-Virus-Status: Clean Yo, Looking good Dave! Thanks for writing this up, it made for some interesting lunch time reading. ;) Here's a few typos I noticed, marked 'em up as I read along... > +required for objects that are frequently logged. Parts inodes are "Some parts of ..."? > +The limitation on asynchrnous transaction throughput is the number "asynchronous" > +Effectively, this gives us the maximum bound out outstanding metadata "out" -> "of" > +formating the changes in a transaction to the log buffer. Hence we "formatting" > +One of the key changes that delayed logging makes to the operation of > the > +journalling subsystem is that is dissociates the amount of "is" -> "it", and "disassociates" (or maybe "dissociates" is what you meant, you chem freak you. ;) > +recovered filesysetm is concerned, there may be many thousands of filesystem. > +This introduces lots of scope of deadlocks with transactions that are "scope for deadlocks"? > +The solution is relatively simple - it just a long time to recognise "took a long time" > +rewrite the vector addresses to point at the memory buffer we end up "and rewriting the" > with a > +self-describing object that it can be passed to the log buffer write "that can be" > is entire > +arbitrary and done to make it easy for debugging - the last items in "is entirely" > +crash during the write of a such a transaction could partially > overwrites the "partially overwrite" > +format structure. That is, two vectors totalling roughly 150 bytes. "totaling" > +the write reservation (the actual space availble to the transaction) "available" > +checkpoint commit to complete. This background push checked and > executed by transaction commit code. "is checked" > +log item completion. THe result of this is that pinning and unpinning "The" > +are entered and completed is the object considered clean.` Spurious "`" there? > + => gain confidence and fix problems reported by early > + adopters (a.k.a. guinea pigs) :-) cheers. -- Nathan From SRS0+i3iU+65+fromorbit.com=david@internode.on.net Thu May 6 01:05:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o46651Ss076163 for ; Thu, 6 May 2010 01:05:01 -0500 X-ASG-Debug-ID: 1273126028-6b48033a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 51A18314366 for ; Wed, 5 May 2010 23:07:08 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id HP0sWxFeVfENdQDF for ; Wed, 05 May 2010 23:07:08 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23303081-1927428 for multiple; Thu, 06 May 2010 15:37:07 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1O9uEk-0005R3-6Y; Thu, 06 May 2010 16:07:06 +1000 Date: Thu, 6 May 2010 16:07:06 +1000 From: Dave Chinner To: nathans@aconex.com Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 07/11] xfs: Delayed logging design documentation Subject: Re: [PATCH 07/11] xfs: Delayed logging design documentation Message-ID: <20100506060706.GB19579@dastard> References: <921460991.88921273119221574.JavaMail.root@mail-au> <827899224.88951273119424327.JavaMail.root@mail-au> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <827899224.88951273119424327.JavaMail.root@mail-au> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1273126030 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.2, rules version 3.2.2.29181 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 06, 2010 at 02:17:04PM +1000, nathans@aconex.com wrote: > Yo, > > Looking good Dave! Thanks for writing this up, it made for some > interesting lunch time reading. ;) > > Here's a few typos I noticed, marked 'em up as I read along... Thanks for the proof reading. ;) I've fixed all the bits you pointed out, and a couple more I found while fixing those.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+1LZ9+65+fromorbit.com=david@internode.on.net Thu May 6 08:24:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o46DOphc095183 for ; Thu, 6 May 2010 08:24:51 -0500 X-ASG-Debug-ID: 1273152405-0b6901100000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1434B315364 for ; Thu, 6 May 2010 06:26:45 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id 2xShjUvp74Qve0e2 for ; Thu, 06 May 2010 06:26:45 -0700 (PDT) Received: from dastard (unverified [121.44.229.111]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23594965-1927428 for ; Thu, 06 May 2010 22:56:43 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OA169-0005qI-VT for xfs@oss.sgi.com; Thu, 06 May 2010 23:26:42 +1000 Date: Thu, 6 May 2010 23:26:41 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/11] xfs: delayed logging Subject: Re: [PATCH 0/11] xfs: delayed logging Message-ID: <20100506132641.GC19579@dastard> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273110351-2333-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1273152407 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-ASG-Whitelist: BODY (http://marc\.info/\?) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 06, 2010 at 11:45:40AM +1000, Dave Chinner wrote: > > Hi Folks, > > This is version 4 of the delayed logging series. > > I won't repeat everything about what it is, just point you > here: > > http://marc.info/?l=linux-xfs&m=126862777118946&w=2 > > for the description, and here: > > git://git.kernel.org/pub/scm/linux/kernel/git/dgc/xfs.git delayed-logging > > for the current code. Note that this is a rebased branch, so you'll > need to pull it again into a new branch to review. > > This version includes a number of fixes and cleanups related to the > busy extent tracking. This includes fixing a long standing > off-by-one that was causing assert failures when inserting busy > extents that overlapped with existing busy extents. Ok, so I'm still getting assert failures, but they are much harder to hit. However, here's the fragment of a trace that points out why delayed logging is now tripping over this problem: $ grep _busy: t.t |tail -20|cut -d ":" -f 2- xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0xa9a1ac8d agno 1 agbno 133 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0xa9a1ac8d agno 1 agbno 24 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0xa9a1ac8d agno 1 agbno 91909 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0xa9a1ac8d agno 1 agbno 75 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0xfe95d7e3 agno 1 agbno 100504 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0xfe95d7e3 agno 1 agbno 100505 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0xfe95d7e3 agno 1 agbno 100506 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0xfe95d7e3 agno 1 agbno 100507 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0xfe95d7e3 agno 1 agbno 100508 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0xfe95d7e3 agno 1 agbno 100509 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff880067c42da0 tid 0xbe3d9ca6 agno 0 agbno 37809 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff880067c42da0 tid 0x4575b77f agno 2 agbno 133387 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff880067c42da0 tid 0xeb882f7e agno 2 agbno 151935 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff880067c42da0 tid 0x362c7c31 agno 2 agbno 133386 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff880067c42da0 tid 0x4dda728f agno 2 agbno 151936 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff880067c42da0 tid 0xc1ca9675 agno 3 agbno 49832 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff880067c42da0 tid 0x8a3e0a41 agno 3 agbno 49833 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff880067c42da0 tid 0x3fe9fb72 agno 1 agbno 109637 len 1 async xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0x69f15b1c agno 1 agbno 91909 len 1 async First thing to note is that there are only two different addresses for transaction structures here, but there are 11 different transaction IDs. That's a bit of a problem, really. The assert fail was triggered by the last line: xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0x69f15b1c agno 1 agbno 91909 len 1 async Which appears to have already been marked busy by a different transaction earlier on: xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0xa9a1ac8d agno 1 agbno 91909 len 1 async If I just pull out the last operations on that block: $ grep "agno 1 agbno 919" t.t |tail -5 fs_mark-2741 [007] 795063.752648: xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0xa9a1ac8d agno 1 agbno 91909 len 1 async fs_mark-2742 [005] 795063.754591: xfs_alloc_busysearch: dev 253:16 agno 1 agbno 91909 len 1 found fs_mark-2745 [007] 795063.775012: xfs_alloc_busy: dev 253:16 trans 0xffff8801067eada0 tid 0x69f15b1c agno 1 agbno 91909 len 1 async xfslogd/4-497 [004] 795063.775540: xfs_alloc_unbusy: dev 253:16 agno 1 agbno 91909 len 1 xfslogd/4-497 [004] 795063.775542: xfs_alloc_busysearch: dev 253:16 agno 1 agbno 91909 len 1 found We can see that there are two separate processes marking the same extent busy, using the same transaction structure address. But they have to be two different transactions, because a transaction is always done in the context of a single kernel thread. i.e: fs_mark-2741 fs_mark-2742 fs_mark-2743 xfslogd xact alloc free 1:91909 mark busy commit xact free xact xact alloc alloc 1:91909 busy search mark xact sync commit xact free xact force log checkpoint starts .... xact alloc free 1:91909 mark busy finds match, not sync *** KABOOM! *** .... log IO completes unbusy 1:91909 checkpoint completes So, now I think I can explain the causes of that assert failure. Firstly, the off-by one I found this morning in the search code which would trigger for both delayed and normal logging modes. This had nothing to do with transaction commits and lifecycles, just a search failing to set the transaction synchronous when it should have. Secondly, for delayed logging only, matching by transaction structure address triggers the failure because busy extents have a much longer life than the transaction structure. It is clear why the transaction ID matching didn't trip over - it would have triggered a log force in this situation, and hence blocked until the checkpoint that fs_mark-2742 had triggered was complete before redoing the rbtree insert. Right now I'm simply going to go back to using the transaction ID for matching transactions, even though the above analysis points out that even that is not as efficient as it could be for delayed logging. That is, we don't even need to force the log or have a synchronous transaction if the extent was first freed in the current checkpoint seqeunce. Doing that, however, requires pinning the checkpoint sequence (i.e. preventing a flush) until the current transaction commits. While that is in the plan for delayed logging, it is future functionality and hence I'm not going to attempt to design and implement it this close to 2.6.35-rc cycle. [*] Christoph - does this answer all your concerns with the busy extent tracking modifications, or is there still something that are left unexplained? Cheers, Dave. [*] Checkpoint pinning is needed to implement atomic multi-transaction operations such as "create with attribute". -- Dave Chinner david@fromorbit.com From aelder@sgi.com Thu May 6 12:24:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o46HO0kk123514 for ; Thu, 6 May 2010 12:24:00 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay2.corp.sgi.com (Postfix) with ESMTP id 08ACA3040D1; Thu, 6 May 2010 10:26:08 -0700 (PDT) Received: from stout.americas.sgi.com (localhost6.localdomain6 [127.0.0.1]) by stout.americas.sgi.com (8.14.3/8.14.2) with ESMTP id o46HQ7WL018284; Thu, 6 May 2010 12:26:07 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o46HQ78v018283; Thu, 6 May 2010 12:26:07 -0500 From: Alex Elder Message-Id: <201005061726.o46HQ78v018283@stout.americas.sgi.com> Date: Thu, 06 May 2010 12:26:07 -0500 To: xfs@oss.sgi.com Subject: [PATCH] xfstests: honor comments in the test group file User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean (Re-posting unchanged in hopes it will get reviewed this time.) There are some spots in the "group" file where test numbers have groups listed after a '#' character, clearly intending for those groups to be commented out. But the way the group list gets generated that commenting doesn't work, and in fact these tests explicitly *are* included in such commented-out groups. This patch fixes that, stripping out all comments (which start with a '#' character and end with a newline) from the file before building the set of test numbers for a group. Signed-off-by: Alex Elder --- common | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) Index: b/common =================================================================== --- a/common +++ b/common @@ -58,9 +58,10 @@ do if $group then # arg after -g - group_list=`sed -n ; Thu, 6 May 2010 14:10:17 -0500 X-ASG-Debug-ID: 1273173141-43ba034f0000-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 90CA1317661 for ; Thu, 6 May 2010 12:12:21 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id jBgYk3hlSCwN5uc9 for ; Thu, 06 May 2010 12:12:21 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OA6Uc-0005kv-Q1; Thu, 06 May 2010 19:12:18 +0000 Date: Thu, 6 May 2010 15:12:18 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/11] xfs: delayed logging Subject: Re: [PATCH 0/11] xfs: delayed logging Message-ID: <20100506191218.GA18555@infradead.org> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> <20100506132641.GC19579@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100506132641.GC19579@dastard> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273173146 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > Secondly, for delayed logging only, matching by transaction > structure address triggers the failure because busy extents > have a much longer life than the transaction structure. It is clear > why the transaction ID matching didn't trip over - it would have > triggered a log force in this situation, and hence blocked until > the checkpoint that fs_mark-2742 had triggered was complete before > redoing the rbtree insert. True, the busy extents get spliced over to the cil context, so they outlive the transaction structure. > Right now I'm simply going to go back to using the transaction ID > for matching transactions, even though the above analysis points out > that even that is not as efficient as it could be for delayed > logging. That is, we don't even need to force the log or have a > synchronous transaction if the extent was first freed in the current > checkpoint seqeunce. Doing that, however, requires pinning the > checkpoint sequence (i.e. preventing a flush) until the current > transaction commits. While that is in the plan for delayed logging, > it is future functionality and hence I'm not going to attempt to > design and implement it this close to 2.6.35-rc cycle. [*] Sounds fine to me. I'm not a fan of exporting the tid, but it seems like there's no good way around it for now. Please make the tid exporting a separate changeset so that it's easily revertable once this is sorted out. And documenting all this in comments in the code so that it's archived would be very useful! From kathyjones@edison.ca Thu May 6 14:28:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.7 required=5.0 tests=BAYES_60,URIBL_BLACK autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o46JSB1Y127641 for ; Thu, 6 May 2010 14:28:12 -0500 X-ASG-Debug-ID: 1273174217-3207004f0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from h2.edison.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 27888155BDBA for ; Thu, 6 May 2010 12:30:17 -0700 (PDT) Received: from h2.edison.ca (h2.goproprio.com [207.134.98.170]) by cuda.sgi.com with ESMTP id YZP4cO2ciX9AIeCW for ; Thu, 06 May 2010 12:30:17 -0700 (PDT) Received: from edison.ca ([207.134.98.155] helo=h2.edison.ca) by h2.edison.ca with smtp (Exim 4.69) (envelope-from ) id 1OA6hm-00086W-LD; Thu, 06 May 2010 15:25:54 -0400 Received: from cologne ([124.217.225.222] helo=cologne) with IPv4:25 by h2.edison.ca; 6 May 2010 15:25:47 -0400 To: emailus@thebravest.com, freshwap14@live.com, oficina@sochiderm.cl, clarkaf@post.queensu.ca X-ASG-Orig-Subj: physician mailing list Subject: physician mailing list Reply-To: kathyjones@edison.ca From: "Riley diminutive" X-Assp-Delay: emailus@thebravest.com not delayed (noProcessing); 6 May 2010 15:25:48 -0400 X-Antivirus-Scanner: Clean mail though you should still use an Antivirus X-Barracuda-Connect: h2.goproprio.com[207.134.98.170] X-Barracuda-Start-Time: 1273174218 Message-Id: <20100506193017.27888155BDBA@cuda.sgi.com> Date: Thu, 6 May 2010 12:30:17 -0700 (PDT) X-Barracuda-Bayes: INNOCENT GLOBAL 0.0058 1.0000 -1.9834 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.98 X-Barracuda-Spam-Status: No, SCORE=-1.98 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.2, rules version 3.2.2.29219 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I have many different good quality lists from various sources. The prices are relatively low as well. Drop me a line here: Hugh.Mathews@realresults.co.cc I'll get you all the details and samples. Send us an email to disappear@realresults.co.cc we will discontinue from the list From BATV+c80a52312441aaaaf662+2447+infradead.org+hch@bombadil.srs.infradead.org Thu May 6 15:33:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_92 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o46KX610130167 for ; Thu, 6 May 2010 15:33:07 -0500 X-ASG-Debug-ID: 1273178116-3b08021f0000-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 4B20E31778B for ; Thu, 6 May 2010 13:35:16 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id IC44Fm77kNGZvLmz for ; Thu, 06 May 2010 13:35:16 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OA7ms-0002Zn-Ud; Thu, 06 May 2010 20:35:14 +0000 Date: Thu, 6 May 2010 16:35:14 -0400 From: Christoph Hellwig To: DENIEL Philippe Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Question : Using libhandle from xfsprogs and xfs actions made "by handle" Subject: Re: Question : Using libhandle from xfsprogs and xfs actions made "by handle" Message-ID: <20100506203514.GA6854@infradead.org> References: <4BE178B3.8030501@cea.fr> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4BE178B3.8030501@cea.fr> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273178117 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 05, 2010 at 03:54:59PM +0200, DENIEL Philippe wrote: > When looking at XFS, I saw there was "open_by_handle" and > "path_to_handle" calls. This sounds very very good to me : this sounds > like kind of bridge to build a handle-based API to address XFS. But so > far, I am a bit stuck : for exporting XFS through my NFS server, I would > need to do "by handle" everything that can be done through POSIX calls, > open/read/write/close files, create files/directories/symlinks, erasing > or moving files... and so on. I do not know if this is possible with the > calls in libhandle.so. But if I had such handle based tools, I think I > could make a nice NFS server on top of XFS (I did this kind of port for > LUSTRE (which has a full handle based API) in my NFS server and I had > really good performances). Can someone provide me with information about > this ? For some reason the handle code currently rejects special files (block/char/fifo) in open_by_handle. I can't see any good reason for that and plan to submit a patch to lift that restriction. Except for that libhandle is exactly what you want - there's various tools that use it for that kind of work, the most prominent is xfsdump/xfsrestore. From BATV+c80a52312441aaaaf662+2447+infradead.org+hch@bombadil.srs.infradead.org Thu May 6 15:34:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o46KYr3x130246 for ; Thu, 6 May 2010 15:34:53 -0500 X-ASG-Debug-ID: 1273178223-4c1400d00000-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 C5A2B3177B2; Thu, 6 May 2010 13:37:03 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id EkUmFMuylpIHXAed; Thu, 06 May 2010 13:37:03 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OA7oc-0002mF-UH; Thu, 06 May 2010 20:37:02 +0000 Date: Thu, 6 May 2010 16:37:02 -0400 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: honor comments in the test group file Subject: Re: [PATCH] xfstests: honor comments in the test group file Message-ID: <20100506203702.GB6854@infradead.org> References: <201005061726.o46HQ78v018283@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201005061726.o46HQ78v018283@stout.americas.sgi.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273178223 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 06, 2010 at 12:26:07PM -0500, Alex Elder wrote: > (Re-posting unchanged in hopes it will get reviewed this time.) > > There are some spots in the "group" file where test numbers have > groups listed after a '#' character, clearly intending for those > groups to be commented out. But the way the group list gets > generated that commenting doesn't work, and in fact these tests > explicitly *are* included in such commented-out groups. > > This patch fixes that, stripping out all comments (which start > with a '#' character and end with a newline) from the file before > building the set of test numbers for a group. > > Signed-off-by: Alex Elder Looks good, Reviewed-by: Christoph Hellwig From BATV+c80a52312441aaaaf662+2447+infradead.org+hch@bombadil.srs.infradead.org Thu May 6 15:39:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o46Kd6jW130380 for ; Thu, 6 May 2010 15:39:06 -0500 X-ASG-Debug-ID: 1273178476-3afa02380000-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 E8DD83177F5 for ; Thu, 6 May 2010 13:41:16 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id xiWjZZHr1HVNzcn8 for ; Thu, 06 May 2010 13:41:16 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OA7sh-0003oo-E6; Thu, 06 May 2010 20:41:15 +0000 Date: Thu, 6 May 2010 16:41:15 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 01/11] xfs: Don't reuse the same transaciton ID for duplicated transactions. Subject: Re: [PATCH 01/11] xfs: Don't reuse the same transaciton ID for duplicated transactions. Message-ID: <20100506204115.GA14309@infradead.org> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> <1273110351-2333-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273110351-2333-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273178476 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 06, 2010 at 11:45:41AM +1000, Dave Chinner wrote: > From: Dave Chinner > > The transaction ID is written into the log as the unique identifier > for transactions during recover. When duplicating a transaction, we > reuse the log ticket, which means it has the same transaction ID as > the previous transaction. > > Rather than regenerating a random transaction ID for the duplicated > transaction, just add one to the current ID so that duplicated > transaction can be easily spotted in the log and during recovery > during problem diagnosis. Oh well, more fun with transaction ids. I'm still not happy with the not guarnateed unique schemes we have here, but for now this should do it. Reviewed-by: Christoph Hellwig From BATV+c80a52312441aaaaf662+2447+infradead.org+hch@bombadil.srs.infradead.org Thu May 6 15:41:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o46Kf0mk130438 for ; Thu, 6 May 2010 15:41:01 -0500 X-ASG-Debug-ID: 1273178591-494501550000-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 4F28D31781D for ; Thu, 6 May 2010 13:43:11 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 8I7HWK0TMSjpkuhk for ; Thu, 06 May 2010 13:43:11 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OA7uY-0003wV-RL; Thu, 06 May 2010 20:43:10 +0000 Date: Thu, 6 May 2010 16:43:10 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/11] xfs: allow log ticket allocation to take allocation flags Subject: Re: [PATCH 03/11] xfs: allow log ticket allocation to take allocation flags Message-ID: <20100506204310.GB14309@infradead.org> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> <1273110351-2333-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273110351-2333-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273178591 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 06, 2010 at 11:45:43AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Delayed logging currently requires ticket allocation to succeed, so > we need to be able to sleep on allocation. It also should not allow > memory allocation to recurse into the filesystem. hence we need to > pass allocation flags directing the type of allocation the caller > requires. Looks good, Reviewed-by: Christoph Hellwig From BATV+c80a52312441aaaaf662+2447+infradead.org+hch@bombadil.srs.infradead.org Thu May 6 15:48:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o46Kmiju130822 for ; Thu, 6 May 2010 15:48:44 -0500 X-ASG-Debug-ID: 1273179054-5580013a0000-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 DB328155BF26 for ; Thu, 6 May 2010 13:50:54 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id b9kHhq5cxLfv93ES for ; Thu, 06 May 2010 13:50:54 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OA822-0006JR-CP; Thu, 06 May 2010 20:50:54 +0000 Date: Thu, 6 May 2010 16:50:54 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 06/11] xfs: clean up log ticket overrun debug output Subject: Re: [PATCH 06/11] xfs: clean up log ticket overrun debug output Message-ID: <20100506205054.GA24110@infradead.org> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> <1273110351-2333-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273110351-2333-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273179054 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 06, 2010 at 11:45:46AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Push the error message output when a ticket overrun is detected > into the ticket printing functions. Also remove the debug version > of the code as the production version will still panic just as > effectively on a debug kernel via the panic mask being set. Looks good, Reviewed-by: Christoph Hellwig From BATV+c80a52312441aaaaf662+2447+infradead.org+hch@bombadil.srs.infradead.org Thu May 6 15:49:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o46KnmE4130867 for ; Thu, 6 May 2010 15:49:48 -0500 X-ASG-Debug-ID: 1273179119-48da01580000-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 401C93178D4 for ; Thu, 6 May 2010 13:51:59 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id PHcOyQzCYFwwwkKZ for ; Thu, 06 May 2010 13:51:59 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OA834-0006S1-V0; Thu, 06 May 2010 20:51:58 +0000 Date: Thu, 6 May 2010 16:51:58 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 05/11] xfs: Clean up XFS_BLI_* flag namespace Subject: Re: [PATCH 05/11] xfs: Clean up XFS_BLI_* flag namespace Message-ID: <20100506205158.GB24110@infradead.org> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> <1273110351-2333-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273110351-2333-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273179119 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 06, 2010 at 11:45:45AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Clean up the buffer log format (XFS_BLI_*) flags because they have a > polluted namespace. They XFS_BLI_ prefix is used for both in-memory > and on-disk flag feilds, but have overlapping values for different > flags. Rename the buffer log format flags to use the XFS_BLF_* > prefix to avoid confusing them with the in-memory XFS_BLI_* prefixed > flags. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+c80a52312441aaaaf662+2447+infradead.org+hch@bombadil.srs.infradead.org Thu May 6 15:58:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o46KwMa9131264 for ; Thu, 6 May 2010 15:58:23 -0500 X-ASG-Debug-ID: 1273179626-554801630000-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 4DA48155C494 for ; Thu, 6 May 2010 14:00:27 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id wjqI5KUYvLCvOomc for ; Thu, 06 May 2010 14:00:27 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OA8BG-00007T-Pd; Thu, 06 May 2010 21:00:26 +0000 Date: Thu, 6 May 2010 17:00:26 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 04/11] xfs: modify buffer item reference counting V2 Subject: Re: [PATCH 04/11] xfs: modify buffer item reference counting V2 Message-ID: <20100506210026.GA30264@infradead.org> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> <1273110351-2333-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273110351-2333-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273179627 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 06, 2010 at 11:45:44AM +1000, Dave Chinner wrote: > From: Dave Chinner > > The buffer log item reference counts used to take reference?? for every > transaction, similar to the pin counting. This is symmetric (like the > pin/unpin) with respect to transaction completion, but with dleayed logging > becomes assymetric as the pinning becomes assymetric w.r.t. transaction > completion. > > To make both cases the same, allow the buffer pinning to take a reference to > the buffer log item and always drop the reference the transaction has on it > when being unlocked. This is balanced correctly because the unpin operation > always drops a reference to the log item. Hence reference counting becomes > symmetric w.r.t. item pinning as well as w.r.t active transactions and as a > result the reference counting model remain consistent between normal and > delayed logging. > > Signed-off-by: Dave Chinner Looks good and makes the buffer refconting model a lot more sensible. Reviewed-by: Christoph Hellwig From SRS0+SkGd+65+fromorbit.com=david@internode.on.net Thu May 6 18:51:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o46Npt8w137294 for ; Thu, 6 May 2010 18:51:55 -0500 X-ASG-Debug-ID: 1273190043-413200670000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1C483136DE43 for ; Thu, 6 May 2010 16:54:04 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id oFMA5tk8poayg6jb for ; Thu, 06 May 2010 16:54:04 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23509891-1927428 for multiple; Fri, 07 May 2010 09:24:02 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OAAtF-0006Z4-Jx; Fri, 07 May 2010 09:54:01 +1000 Date: Fri, 7 May 2010 09:54:01 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/11] xfs: delayed logging Subject: Re: [PATCH 0/11] xfs: delayed logging Message-ID: <20100506235401.GD19579@dastard> References: <1273110351-2333-1-git-send-email-david@fromorbit.com> <20100506132641.GC19579@dastard> <20100506191218.GA18555@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100506191218.GA18555@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1273190045 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0204 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.2, rules version 3.2.2.29236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 06, 2010 at 03:12:18PM -0400, Christoph Hellwig wrote: > > Secondly, for delayed logging only, matching by transaction > > structure address triggers the failure because busy extents > > have a much longer life than the transaction structure. It is clear > > why the transaction ID matching didn't trip over - it would have > > triggered a log force in this situation, and hence blocked until > > the checkpoint that fs_mark-2742 had triggered was complete before > > redoing the rbtree insert. > > True, the busy extents get spliced over to the cil context, so they > outlive the transaction structure. > > > Right now I'm simply going to go back to using the transaction ID > > for matching transactions, even though the above analysis points out > > that even that is not as efficient as it could be for delayed > > logging. That is, we don't even need to force the log or have a > > synchronous transaction if the extent was first freed in the current > > checkpoint seqeunce. Doing that, however, requires pinning the > > checkpoint sequence (i.e. preventing a flush) until the current > > transaction commits. While that is in the plan for delayed logging, > > it is future functionality and hence I'm not going to attempt to > > design and implement it this close to 2.6.35-rc cycle. [*] > > Sounds fine to me. I'm not a fan of exporting the tid, but it > seems like there's no good way around it for now. Please make the > tid exporting a separate changeset so that it's easily revertable > once this is sorted out. Yeah, that's a good idea. > And documenting all this in comments in the code so that it's archived > would be very useful! Will do. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+L8Ek+66+fromorbit.com=dave@internode.on.net Fri May 7 00:38:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o475cvQS148795 for ; Fri, 7 May 2010 00:38:57 -0500 X-ASG-Debug-ID: 1273210865-63e901fe0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BE4E69638F4 for ; Thu, 6 May 2010 22:41:06 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id SxPb1cMAYAWmWS2N for ; Thu, 06 May 2010 22:41:06 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23295655-1927428 for ; Fri, 07 May 2010 15:11:03 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OAGJ4-0006rB-51 for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:02 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OAGJ2-00066F-HB for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:00 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 01/12] xfs: Don't reuse the same transaction ID for duplicated transactions. Subject: [PATCH 01/12] xfs: Don't reuse the same transaction ID for duplicated transactions. Date: Fri, 7 May 2010 15:40:49 +1000 Message-Id: <1273210860-23414-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273210860-23414-1-git-send-email-david@fromorbit.com> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1273210867 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.2, rules version 3.2.2.29248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The transaction ID is written into the log as the unique identifier for transactions during recover. When duplicating a transaction, we reuse the log ticket, which means it has the same transaction ID as the previous transaction. Rather than regenerating a random transaction ID for the duplicated transaction, just add one to the current ID so that duplicated transaction can be easily spotted in the log and during recovery during problem diagnosis. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 3038dd5..687b220 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -360,6 +360,15 @@ xfs_log_reserve( ASSERT(flags & XFS_LOG_PERM_RESERV); internal_ticket = *ticket; + /* + * this is a new transaction on the ticket, so we need to + * change the transaction ID so that the next transaction has a + * different TID in the log. Just add one to the existing tid + * so that we can see chains of rolling transactions in the log + * easily. + */ + internal_ticket->t_tid++; + trace_xfs_log_reserve(log, internal_ticket); xlog_grant_push_ail(mp, internal_ticket->t_unit_res); -- 1.5.6.5 From SRS0+KKyr+66+fromorbit.com=dave@internode.on.net Fri May 7 00:38:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o475cup2148792 for ; Fri, 7 May 2010 00:38:56 -0500 X-ASG-Debug-ID: 1273210865-66df01c80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E95A89638FA for ; Thu, 6 May 2010 22:41:06 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id MRZALpYbNeukYAkv for ; Thu, 06 May 2010 22:41:06 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23442142-1927428 for ; Fri, 07 May 2010 15:11:03 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OAGJ4-0006rA-4y for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:02 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OAGJ2-00066D-F6 for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:00 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/12] xfs: delayed logging V5 Subject: [PATCH 0/12] xfs: delayed logging V5 Date: Fri, 7 May 2010 15:40:48 +1000 Message-Id: <1273210860-23414-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1273210867 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-ASG-Whitelist: BODY (http://marc\.info/\?) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Folks, This is version 5 of the delayed logging series. I won't repeat everything about what it is, just point you here: http://marc.info/?l=linux-xfs&m=126862777118946&w=2 for the description, and here: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/xfs.git delayed-logging for the current code. Note that this is a rebased branch, so you'll need to pull it again into a new branch to review. This version includes a documentation updates and fixes to the busy extent tracking infrastructure. The patch series follows this mail to make it easier for people to respond to specific pieces of the code during review. I'm still making the entire patch set available through git, though. Changes the previous versions: Version 5: 27 files changed, 2457 insertions(+), 513 deletions(-) Version 4: 26 files changed, 2351 insertions(+), 510 deletions(-) Version 3: 28 files changed, 2366 insertions(+), 506 deletions(-) Version 2: 22 files changed, 2188 insertions(+), 377 deletions(-) Version 1: 19 files changed, 2594 insertions(+), 580 deletions(-) Changes for V5: o fixed many typos in the desgin documentation - thanks to Nathan Scott for proof reading it. :) o found another transaction assert failure - un-reverting the change to transaction ID matching as the reason it avoided the assert failures is now known. (new commit for exporting the ticket ID). o added transaction ID to busy extent tracing o added lots of comments explaining the reason for needing transaction ID matching w/ delayed logging. o added overlap detection in busy extent inserts Changes for V4: o fixes duplicate transaction IDs on rolling transactions (new commit) o folded in a busy extent freeing cleanup from Christoph Hellwig o made API prefix consistent (xfs_alloc_busy_*) o combined xfs_alloc_mark_busy and xfs_alloc_busy_insert o reverted back to tracking transaction pointers in busy extents o removed exporting of transaction ID for busy extents o fixed an off-by-one in the extent range match in the busy extent search code that has been triggering assert failures o use list_splice_init() when splicing busy extents from the transaction to the checkpoint context to ensure we don't get transactions thinking they have busy extents to free after we've already attached them to the checkpoint. Changes for V3: o changed buffer log item reference counted model to be consistent for both logging modes o cleaned up XFS_BLI flags usage (new commit) o separated out log ticket overrun printing cleanup (new commit) o made sure "delaylog" option shows up in /proc/mounts o collapsed many of the intermediate commits together to make it easier to review o fixed inode buffer tagging issue that was causing shutdowns in log recovery in test 087 and 121 Changes for V2: o 22 files changed, 2188 insertions(+), 377 deletions(-) o fixed some memory leaks o fixed ticket allocation for checkpoints to use KM_NOFS o minor code cleanups o performed stress and scalability testing The following changes since commit 6ff75b78182c314112c1173edaab6c164c95d775: Christoph Hellwig (1): xfs: mark xfs_iomap_write_ helpers static are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/xfs.git delayed-logging Dave Chinner (12): xfs: Don't reuse the same transaction ID for duplicated transactions. xfs: allow log ticket allocation to take allocation flags xfs: modify buffer item reference counting xfs: Clean up XFS_BLI_* flag namespace xfs: clean up log ticket overrun debug output xfs: make the log ticket ID available outside the log infrastructure xfs: Improve scalability of busy extent tracking xfs: Delayed logging design documentation xfs: Introduce delayed logging core code xfs: forced unmounts need to push the CIL xfs: enable background pushing of the CIL xfs: Ensure inode allocation buffers are fully replayed .../filesystems/xfs-delayed-logging-design.txt | 819 ++++++++++++++++++++ fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_buf.c | 11 +- fs/xfs/linux-2.6/xfs_quotaops.c | 1 + fs/xfs/linux-2.6/xfs_super.c | 12 +- fs/xfs/linux-2.6/xfs_trace.h | 83 ++- fs/xfs/quota/xfs_dquot.c | 6 +- fs/xfs/xfs_ag.h | 24 +- fs/xfs/xfs_alloc.c | 364 +++++++--- fs/xfs/xfs_alloc.h | 7 +- fs/xfs/xfs_alloc_btree.c | 2 +- fs/xfs/xfs_buf_item.c | 166 ++-- fs/xfs/xfs_buf_item.h | 18 +- fs/xfs/xfs_error.c | 2 +- fs/xfs/xfs_log.c | 123 +++- fs/xfs/xfs_log.h | 14 +- fs/xfs/xfs_log_cil.c | 733 ++++++++++++++++++ fs/xfs/xfs_log_priv.h | 118 +++- fs/xfs/xfs_log_recover.c | 46 +- fs/xfs/xfs_log_recover.h | 2 +- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 195 ++++- fs/xfs/xfs_trans.h | 44 +- fs/xfs/xfs_trans_buf.c | 46 +- fs/xfs/xfs_trans_item.c | 114 +--- fs/xfs/xfs_trans_priv.h | 16 +- fs/xfs/xfs_types.h | 2 + 27 files changed, 2457 insertions(+), 513 deletions(-) create mode 100644 Documentation/filesystems/xfs-delayed-logging-design.txt create mode 100644 fs/xfs/xfs_log_cil.c From SRS0+V/pq+66+fromorbit.com=dave@internode.on.net Fri May 7 00:39:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o475d5l2148826 for ; Fri, 7 May 2010 00:39:05 -0500 X-ASG-Debug-ID: 1273210873-077501580000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4F817318A32 for ; Thu, 6 May 2010 22:41:14 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id hefrCQnZYFAMAo9J for ; Thu, 06 May 2010 22:41:14 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23359239-1927428 for ; Fri, 07 May 2010 15:11:13 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OAGJ4-0006rH-CI for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:02 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OAGJ2-00066Q-TI for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:00 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 05/12] xfs: clean up log ticket overrun debug output Subject: [PATCH 05/12] xfs: clean up log ticket overrun debug output Date: Fri, 7 May 2010 15:40:53 +1000 Message-Id: <1273210860-23414-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273210860-23414-1-git-send-email-david@fromorbit.com> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1273210875 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.2, rules version 3.2.2.29248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Push the error message output when a ticket overrun is detected into the ticket printing functions. Also remove the debug version of the code as the production version will still panic just as effectively on a debug kernel via the panic mask being set. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_error.c | 2 +- fs/xfs/xfs_log.c | 19 +++++-------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index ef96175..047b8a8 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -170,7 +170,7 @@ xfs_cmn_err(int panic_tag, int level, xfs_mount_t *mp, char *fmt, ...) va_list ap; #ifdef DEBUG - xfs_panic_mask |= XFS_PTAG_SHUTDOWN_CORRUPT; + xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES); #endif if (xfs_panic_mask && (xfs_panic_mask & panic_tag) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 83be6a6..1efb303 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1645,6 +1645,10 @@ xlog_print_tic_res(xfs_mount_t *mp, xlog_ticket_t *ticket) "bad-rtype" : res_type_str[r_type-1]), ticket->t_res_arr[i].r_len); } + + xfs_cmn_err(XFS_PTAG_LOGRES, CE_ALERT, mp, + "xfs_log_write: reservation ran out. Need to up reservation"); + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); } /* @@ -1897,21 +1901,8 @@ xlog_write( *start_lsn = 0; len = xlog_write_calc_vec_length(ticket, log_vector); - if (ticket->t_curr_res < len) { + if (ticket->t_curr_res < len) xlog_print_tic_res(log->l_mp, ticket); -#ifdef DEBUG - xlog_panic( - "xfs_log_write: reservation ran out. Need to up reservation"); -#else - /* Customer configurable panic */ - xfs_cmn_err(XFS_PTAG_LOGRES, CE_ALERT, log->l_mp, - "xfs_log_write: reservation ran out. Need to up reservation"); - - /* If we did not panic, shutdown the filesystem */ - xfs_force_shutdown(log->l_mp, SHUTDOWN_CORRUPT_INCORE); -#endif - } - ticket->t_curr_res -= len; index = 0; -- 1.5.6.5 From SRS0+KKyr+66+fromorbit.com=dave@internode.on.net Fri May 7 00:39:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o475d5dd148834 for ; Fri, 7 May 2010 00:39:05 -0500 X-ASG-Debug-ID: 1273210874-574703400000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 032AD9638FB for ; Thu, 6 May 2010 22:41:15 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id fcJANYZrLqe88Tc8 for ; Thu, 06 May 2010 22:41:15 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23442150-1927428 for ; Fri, 07 May 2010 15:11:13 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OAGJ4-0006rJ-EI for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:02 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OAGJ2-00066U-VI for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:00 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 06/12] xfs: make the log ticket ID available outside the log infrastructure Subject: [PATCH 06/12] xfs: make the log ticket ID available outside the log infrastructure Date: Fri, 7 May 2010 15:40:54 +1000 Message-Id: <1273210860-23414-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273210860-23414-1-git-send-email-david@fromorbit.com> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1273210877 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The ticket ID is needed to uniquely identify transactions when doing busy extent matching. Delayed logging changes the lifecycle of busy extents with respect to the transaction structure lifecycle. Hence we can no longer use the transaction structure as a means of determining the owner of the busy extent as it may be freed and reused while the busy extent is still active. This commit provides the infrastructure to access the xlog_tid_t held in the ticket from a transaction handle. This avoids the need for callers to peek into the transaction and log structures to find this out. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 7 +++++++ fs/xfs/xfs_log.h | 7 ++++++- fs/xfs/xfs_log_priv.h | 2 -- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 1efb303..19d0c5f 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -3312,6 +3312,13 @@ xfs_log_ticket_get( return ticket; } +xlog_tid_t +xfs_log_get_trans_ident( + struct xfs_trans *tp) +{ + return tp->t_ticket->t_tid; +} + /* * Allocate and initialise a new log ticket. */ diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 229d1f3..38af110 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -18,8 +18,10 @@ #ifndef __XFS_LOG_H__ #define __XFS_LOG_H__ -/* get lsn fields */ +/* transaction ID type */ +typedef __uint32_t xlog_tid_t; +/* get lsn fields */ #define CYCLE_LSN(lsn) ((uint)((lsn)>>32)) #define BLOCK_LSN(lsn) ((uint)(lsn)) @@ -134,6 +136,7 @@ struct xlog_in_core; struct xlog_ticket; struct xfs_log_item; struct xfs_item_ops; +struct xfs_trans; void xfs_log_item_init(struct xfs_mount *mp, struct xfs_log_item *item, @@ -190,6 +193,8 @@ void xlog_iodone(struct xfs_buf *); struct xlog_ticket * xfs_log_ticket_get(struct xlog_ticket *ticket); void xfs_log_ticket_put(struct xlog_ticket *ticket); +xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp); + #endif diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 9cf6951..ac97bdd 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -152,8 +152,6 @@ static inline uint xlog_get_client_id(__be32 i) #define XLOG_RECOVERY_NEEDED 0x4 /* log was recovered */ #define XLOG_IO_ERROR 0x8 /* log hit an I/O error, and being shutdown */ -typedef __uint32_t xlog_tid_t; - #ifdef __KERNEL__ /* -- 1.5.6.5 From SRS0+1K0y+66+fromorbit.com=dave@internode.on.net Fri May 7 00:39:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o475d5Fk148836 for ; Fri, 7 May 2010 00:39:06 -0500 X-ASG-Debug-ID: 1273210874-38b400c10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3168F1370478 for ; Thu, 6 May 2010 22:41:14 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id Zz885nI9sefibWLq for ; Thu, 06 May 2010 22:41:14 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23556234-1927428 for ; Fri, 07 May 2010 15:11:13 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OAGJ4-0006rC-5U for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:02 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OAGJ2-00066H-JK for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:00 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 02/12] xfs: allow log ticket allocation to take allocation flags Subject: [PATCH 02/12] xfs: allow log ticket allocation to take allocation flags Date: Fri, 7 May 2010 15:40:50 +1000 Message-Id: <1273210860-23414-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273210860-23414-1-git-send-email-david@fromorbit.com> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1273210876 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.2, rules version 3.2.2.29248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Delayed logging currently requires ticket allocation to succeed, so we need to be able to sleep on allocation. It also should not allow memory allocation to recurse into the filesystem. hence we need to pass allocation flags directing the type of allocation the caller requires. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 687b220..83be6a6 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -88,11 +88,9 @@ STATIC void xlog_ungrant_log_space(xlog_t *log, /* local ticket functions */ -STATIC xlog_ticket_t *xlog_ticket_alloc(xlog_t *log, - int unit_bytes, - int count, - char clientid, - uint flags); +STATIC xlog_ticket_t *xlog_ticket_alloc(xlog_t *log, int unit_bytes, int count, + char clientid, uint flags, + int alloc_flags); #if defined(DEBUG) STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr); @@ -376,7 +374,8 @@ xfs_log_reserve( } else { /* may sleep if need to allocate more tickets */ internal_ticket = xlog_ticket_alloc(log, unit_bytes, cnt, - client, flags); + client, flags, + KM_SLEEP|KM_MAYFAIL); if (!internal_ticket) return XFS_ERROR(ENOMEM); internal_ticket->t_trans_type = t_type; @@ -3331,13 +3330,14 @@ xlog_ticket_alloc( int unit_bytes, int cnt, char client, - uint xflags) + uint xflags, + int alloc_flags) { struct xlog_ticket *tic; uint num_headers; int iclog_space; - tic = kmem_zone_zalloc(xfs_log_ticket_zone, KM_SLEEP|KM_MAYFAIL); + tic = kmem_zone_zalloc(xfs_log_ticket_zone, alloc_flags); if (!tic) return NULL; -- 1.5.6.5 From SRS0+1K0y+66+fromorbit.com=dave@internode.on.net Fri May 7 00:39:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-3.8 required=5.0 tests=BAYES_00,FRT_ADOBE2, J_CHICKENPOX_64,J_CHICKENPOX_65,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o475dCq8148876 for ; Fri, 7 May 2010 00:39:13 -0500 X-ASG-Debug-ID: 1273210880-38b400c30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 917C71370485 for ; Thu, 6 May 2010 22:41:21 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id cA2n9RAWwqlmR9vB for ; Thu, 06 May 2010 22:41:21 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23556247-1927428 for ; Fri, 07 May 2010 15:11:20 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OAGJA-0006rV-JM for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:08 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OAGJ2-00066O-RU for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:00 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 04/12] xfs: Clean up XFS_BLI_* flag namespace Subject: [PATCH 04/12] xfs: Clean up XFS_BLI_* flag namespace Date: Fri, 7 May 2010 15:40:52 +1000 Message-Id: <1273210860-23414-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273210860-23414-1-git-send-email-david@fromorbit.com> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1273210882 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.2, rules version 3.2.2.29248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Clean up the buffer log format (XFS_BLI_*) flags because they have a polluted namespace. They XFS_BLI_ prefix is used for both in-memory and on-disk flag feilds, but have overlapping values for different flags. Rename the buffer log format flags to use the XFS_BLF_* prefix to avoid confusing them with the in-memory XFS_BLI_* prefixed flags. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_super.c | 2 +- fs/xfs/quota/xfs_dquot.c | 6 ++-- fs/xfs/xfs_buf_item.c | 42 +++++++++++++++++++------------------- fs/xfs/xfs_buf_item.h | 14 ++++++------ fs/xfs/xfs_log_recover.c | 46 +++++++++++++++++++++--------------------- fs/xfs/xfs_log_recover.h | 2 +- fs/xfs/xfs_trans_buf.c | 28 ++++++++++++------------ 7 files changed, 70 insertions(+), 70 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index a43d09e..1e88c98 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1753,7 +1753,7 @@ xfs_init_zones(void) * but it is much faster. */ xfs_buf_item_zone = kmem_zone_init((sizeof(xfs_buf_log_item_t) + - (((XFS_MAX_BLOCKSIZE / XFS_BLI_CHUNK) / + (((XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK) / NBWORD) * sizeof(int))), "xfs_buf_item"); if (!xfs_buf_item_zone) goto out_destroy_trans_zone; diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index b89ec5d..585e763 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -344,9 +344,9 @@ xfs_qm_init_dquot_blk( for (i = 0; i < q->qi_dqperchunk; i++, d++, curid++) xfs_qm_dqinit_core(curid, type, d); xfs_trans_dquot_buf(tp, bp, - (type & XFS_DQ_USER ? XFS_BLI_UDQUOT_BUF : - ((type & XFS_DQ_PROJ) ? XFS_BLI_PDQUOT_BUF : - XFS_BLI_GDQUOT_BUF))); + (type & XFS_DQ_USER ? XFS_BLF_UDQUOT_BUF : + ((type & XFS_DQ_PROJ) ? XFS_BLF_PDQUOT_BUF : + XFS_BLF_GDQUOT_BUF))); xfs_trans_log_buf(tp, bp, 0, BBTOB(q->qi_dqchunklen) - 1); } diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 4cd5f61..bcbb661 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -64,7 +64,7 @@ xfs_buf_item_log_debug( nbytes = last - first + 1; bfset(bip->bli_logged, first, nbytes); for (x = 0; x < nbytes; x++) { - chunk_num = byte >> XFS_BLI_SHIFT; + chunk_num = byte >> XFS_BLF_SHIFT; word_num = chunk_num >> BIT_TO_WORD_SHIFT; bit_num = chunk_num & (NBWORD - 1); wordp = &(bip->bli_format.blf_data_map[word_num]); @@ -166,7 +166,7 @@ xfs_buf_item_size( * cancel flag in it. */ trace_xfs_buf_item_size_stale(bip); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); return 1; } @@ -197,9 +197,9 @@ xfs_buf_item_size( } else if (next_bit != last_bit + 1) { last_bit = next_bit; nvecs++; - } else if (xfs_buf_offset(bp, next_bit * XFS_BLI_CHUNK) != - (xfs_buf_offset(bp, last_bit * XFS_BLI_CHUNK) + - XFS_BLI_CHUNK)) { + } else if (xfs_buf_offset(bp, next_bit * XFS_BLF_CHUNK) != + (xfs_buf_offset(bp, last_bit * XFS_BLF_CHUNK) + + XFS_BLF_CHUNK)) { last_bit = next_bit; nvecs++; } else { @@ -261,7 +261,7 @@ xfs_buf_item_format( * cancel flag in it. */ trace_xfs_buf_item_format_stale(bip); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); bip->bli_format.blf_size = nvecs; return; } @@ -294,28 +294,28 @@ xfs_buf_item_format( * keep counting and scanning. */ if (next_bit == -1) { - buffer_offset = first_bit * XFS_BLI_CHUNK; + buffer_offset = first_bit * XFS_BLF_CHUNK; vecp->i_addr = xfs_buf_offset(bp, buffer_offset); - vecp->i_len = nbits * XFS_BLI_CHUNK; + vecp->i_len = nbits * XFS_BLF_CHUNK; vecp->i_type = XLOG_REG_TYPE_BCHUNK; nvecs++; break; } else if (next_bit != last_bit + 1) { - buffer_offset = first_bit * XFS_BLI_CHUNK; + buffer_offset = first_bit * XFS_BLF_CHUNK; vecp->i_addr = xfs_buf_offset(bp, buffer_offset); - vecp->i_len = nbits * XFS_BLI_CHUNK; + vecp->i_len = nbits * XFS_BLF_CHUNK; vecp->i_type = XLOG_REG_TYPE_BCHUNK; nvecs++; vecp++; first_bit = next_bit; last_bit = next_bit; nbits = 1; - } else if (xfs_buf_offset(bp, next_bit << XFS_BLI_SHIFT) != - (xfs_buf_offset(bp, last_bit << XFS_BLI_SHIFT) + - XFS_BLI_CHUNK)) { - buffer_offset = first_bit * XFS_BLI_CHUNK; + } else if (xfs_buf_offset(bp, next_bit << XFS_BLF_SHIFT) != + (xfs_buf_offset(bp, last_bit << XFS_BLF_SHIFT) + + XFS_BLF_CHUNK)) { + buffer_offset = first_bit * XFS_BLF_CHUNK; vecp->i_addr = xfs_buf_offset(bp, buffer_offset); - vecp->i_len = nbits * XFS_BLI_CHUNK; + vecp->i_len = nbits * XFS_BLF_CHUNK; vecp->i_type = XLOG_REG_TYPE_BCHUNK; /* You would think we need to bump the nvecs here too, but we do not * this number is used by recovery, and it gets confused by the boundary @@ -399,7 +399,7 @@ xfs_buf_item_unpin( ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); ASSERT(!(XFS_BUF_ISDELAYWRITE(bp))); ASSERT(XFS_BUF_ISSTALE(bp)); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); trace_xfs_buf_item_unpin_stale(bip); /* @@ -550,7 +550,7 @@ xfs_buf_item_unlock( */ if (bip->bli_flags & XFS_BLI_STALE) { trace_xfs_buf_item_unlock_stale(bip); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); if (!aborted) { atomic_dec(&bip->bli_refcount); return; @@ -707,12 +707,12 @@ xfs_buf_item_init( } /* - * chunks is the number of XFS_BLI_CHUNK size pieces + * chunks is the number of XFS_BLF_CHUNK size pieces * the buffer can be divided into. Make sure not to * truncate any pieces. map_size is the size of the * bitmap needed to describe the chunks of the buffer. */ - chunks = (int)((XFS_BUF_COUNT(bp) + (XFS_BLI_CHUNK - 1)) >> XFS_BLI_SHIFT); + chunks = (int)((XFS_BUF_COUNT(bp) + (XFS_BLF_CHUNK - 1)) >> XFS_BLF_SHIFT); map_size = (int)((chunks + NBWORD) >> BIT_TO_WORD_SHIFT); bip = (xfs_buf_log_item_t*)kmem_zone_zalloc(xfs_buf_item_zone, @@ -780,8 +780,8 @@ xfs_buf_item_log( /* * Convert byte offsets to bit numbers. */ - first_bit = first >> XFS_BLI_SHIFT; - last_bit = last >> XFS_BLI_SHIFT; + first_bit = first >> XFS_BLF_SHIFT; + last_bit = last >> XFS_BLF_SHIFT; /* * Calculate the total number of bits to be set. diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index df44545..8cbb82b 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -41,22 +41,22 @@ typedef struct xfs_buf_log_format { * This flag indicates that the buffer contains on disk inodes * and requires special recovery handling. */ -#define XFS_BLI_INODE_BUF 0x1 +#define XFS_BLF_INODE_BUF 0x1 /* * This flag indicates that the buffer should not be replayed * during recovery because its blocks are being freed. */ -#define XFS_BLI_CANCEL 0x2 +#define XFS_BLF_CANCEL 0x2 /* * This flag indicates that the buffer contains on disk * user or group dquots and may require special recovery handling. */ -#define XFS_BLI_UDQUOT_BUF 0x4 -#define XFS_BLI_PDQUOT_BUF 0x8 -#define XFS_BLI_GDQUOT_BUF 0x10 +#define XFS_BLF_UDQUOT_BUF 0x4 +#define XFS_BLF_PDQUOT_BUF 0x8 +#define XFS_BLF_GDQUOT_BUF 0x10 -#define XFS_BLI_CHUNK 128 -#define XFS_BLI_SHIFT 7 +#define XFS_BLF_CHUNK 128 +#define XFS_BLF_SHIFT 7 #define BIT_TO_WORD_SHIFT 5 #define NBWORD (NBBY * sizeof(unsigned int)) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 0de08e3..14a69ae 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1576,7 +1576,7 @@ xlog_recover_reorder_trans( switch (ITEM_TYPE(item)) { case XFS_LI_BUF: - if (!(buf_f->blf_flags & XFS_BLI_CANCEL)) { + if (!(buf_f->blf_flags & XFS_BLF_CANCEL)) { trace_xfs_log_recover_item_reorder_head(log, trans, item, pass); list_move(&item->ri_list, &trans->r_itemq); @@ -1638,7 +1638,7 @@ xlog_recover_do_buffer_pass1( /* * If this isn't a cancel buffer item, then just return. */ - if (!(flags & XFS_BLI_CANCEL)) { + if (!(flags & XFS_BLF_CANCEL)) { trace_xfs_log_recover_buf_not_cancel(log, buf_f); return; } @@ -1696,7 +1696,7 @@ xlog_recover_do_buffer_pass1( * Check to see whether the buffer being recovered has a corresponding * entry in the buffer cancel record table. If it does then return 1 * so that it will be cancelled, otherwise return 0. If the buffer is - * actually a buffer cancel item (XFS_BLI_CANCEL is set), then decrement + * actually a buffer cancel item (XFS_BLF_CANCEL is set), then decrement * the refcount on the entry in the table and remove it from the table * if this is the last reference. * @@ -1721,7 +1721,7 @@ xlog_check_buffer_cancelled( * There is nothing in the table built in pass one, * so this buffer must not be cancelled. */ - ASSERT(!(flags & XFS_BLI_CANCEL)); + ASSERT(!(flags & XFS_BLF_CANCEL)); return 0; } @@ -1733,7 +1733,7 @@ xlog_check_buffer_cancelled( * There is no corresponding entry in the table built * in pass one, so this buffer has not been cancelled. */ - ASSERT(!(flags & XFS_BLI_CANCEL)); + ASSERT(!(flags & XFS_BLF_CANCEL)); return 0; } @@ -1752,7 +1752,7 @@ xlog_check_buffer_cancelled( * one in the table and remove it if this is the * last reference. */ - if (flags & XFS_BLI_CANCEL) { + if (flags & XFS_BLF_CANCEL) { bcp->bc_refcount--; if (bcp->bc_refcount == 0) { if (prevp == NULL) { @@ -1772,7 +1772,7 @@ xlog_check_buffer_cancelled( * We didn't find a corresponding entry in the table, so * return 0 so that the buffer is NOT cancelled. */ - ASSERT(!(flags & XFS_BLI_CANCEL)); + ASSERT(!(flags & XFS_BLF_CANCEL)); return 0; } @@ -1874,8 +1874,8 @@ xlog_recover_do_inode_buffer( nbits = xfs_contig_bits(data_map, map_size, bit); ASSERT(nbits > 0); - reg_buf_offset = bit << XFS_BLI_SHIFT; - reg_buf_bytes = nbits << XFS_BLI_SHIFT; + reg_buf_offset = bit << XFS_BLF_SHIFT; + reg_buf_bytes = nbits << XFS_BLF_SHIFT; item_index++; } @@ -1889,7 +1889,7 @@ xlog_recover_do_inode_buffer( } ASSERT(item->ri_buf[item_index].i_addr != NULL); - ASSERT((item->ri_buf[item_index].i_len % XFS_BLI_CHUNK) == 0); + ASSERT((item->ri_buf[item_index].i_len % XFS_BLF_CHUNK) == 0); ASSERT((reg_buf_offset + reg_buf_bytes) <= XFS_BUF_COUNT(bp)); /* @@ -1955,9 +1955,9 @@ xlog_recover_do_reg_buffer( nbits = xfs_contig_bits(data_map, map_size, bit); ASSERT(nbits > 0); ASSERT(item->ri_buf[i].i_addr != NULL); - ASSERT(item->ri_buf[i].i_len % XFS_BLI_CHUNK == 0); + ASSERT(item->ri_buf[i].i_len % XFS_BLF_CHUNK == 0); ASSERT(XFS_BUF_COUNT(bp) >= - ((uint)bit << XFS_BLI_SHIFT)+(nbits<blf_flags & - (XFS_BLI_UDQUOT_BUF|XFS_BLI_PDQUOT_BUF|XFS_BLI_GDQUOT_BUF)) { + (XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) { if (item->ri_buf[i].i_addr == NULL) { cmn_err(CE_ALERT, "XFS: NULL dquot in %s.", __func__); @@ -1987,9 +1987,9 @@ xlog_recover_do_reg_buffer( } memcpy(xfs_buf_offset(bp, - (uint)bit << XFS_BLI_SHIFT), /* dest */ + (uint)bit << XFS_BLF_SHIFT), /* dest */ item->ri_buf[i].i_addr, /* source */ - nbits<blf_flags & XFS_BLI_UDQUOT_BUF) + if (buf_f->blf_flags & XFS_BLF_UDQUOT_BUF) type |= XFS_DQ_USER; - if (buf_f->blf_flags & XFS_BLI_PDQUOT_BUF) + if (buf_f->blf_flags & XFS_BLF_PDQUOT_BUF) type |= XFS_DQ_PROJ; - if (buf_f->blf_flags & XFS_BLI_GDQUOT_BUF) + if (buf_f->blf_flags & XFS_BLF_GDQUOT_BUF) type |= XFS_DQ_GROUP; /* * This type of quotas was turned off, so ignore this buffer @@ -2173,7 +2173,7 @@ xlog_recover_do_dquot_buffer( * here which overlaps that may be stale. * * When meta-data buffers are freed at run time we log a buffer item - * with the XFS_BLI_CANCEL bit set to indicate that previous copies + * with the XFS_BLF_CANCEL bit set to indicate that previous copies * of the buffer in the log should not be replayed at recovery time. * This is so that if the blocks covered by the buffer are reused for * file data before we crash we don't end up replaying old, freed @@ -2207,7 +2207,7 @@ xlog_recover_do_buffer_trans( if (pass == XLOG_RECOVER_PASS1) { /* * In this pass we're only looking for buf items - * with the XFS_BLI_CANCEL bit set. + * with the XFS_BLF_CANCEL bit set. */ xlog_recover_do_buffer_pass1(log, buf_f); return 0; @@ -2244,7 +2244,7 @@ xlog_recover_do_buffer_trans( mp = log->l_mp; buf_flags = XBF_LOCK; - if (!(flags & XFS_BLI_INODE_BUF)) + if (!(flags & XFS_BLF_INODE_BUF)) buf_flags |= XBF_MAPPED; bp = xfs_buf_read(mp->m_ddev_targp, blkno, len, buf_flags); @@ -2257,10 +2257,10 @@ xlog_recover_do_buffer_trans( } error = 0; - if (flags & XFS_BLI_INODE_BUF) { + if (flags & XFS_BLF_INODE_BUF) { error = xlog_recover_do_inode_buffer(mp, item, bp, buf_f); } else if (flags & - (XFS_BLI_UDQUOT_BUF|XFS_BLI_PDQUOT_BUF|XFS_BLI_GDQUOT_BUF)) { + (XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) { xlog_recover_do_dquot_buffer(mp, log, item, bp, buf_f); } else { xlog_recover_do_reg_buffer(mp, item, bp, buf_f); diff --git a/fs/xfs/xfs_log_recover.h b/fs/xfs/xfs_log_recover.h index 75d7492..1c55ccb 100644 --- a/fs/xfs/xfs_log_recover.h +++ b/fs/xfs/xfs_log_recover.h @@ -28,7 +28,7 @@ #define XLOG_RHASH(tid) \ ((((__uint32_t)tid)>>XLOG_RHASH_SHIFT) & (XLOG_RHASH_SIZE-1)) -#define XLOG_MAX_REGIONS_IN_ITEM (XFS_MAX_BLOCKSIZE / XFS_BLI_CHUNK / 2 + 1) +#define XLOG_MAX_REGIONS_IN_ITEM (XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK / 2 + 1) /* diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 9cd8090..3390c3e 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -114,7 +114,7 @@ _xfs_trans_bjoin( xfs_buf_item_init(bp, tp->t_mountp); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(!(bip->bli_flags & XFS_BLI_LOGGED)); if (reset_recur) bip->bli_recur = 0; @@ -511,7 +511,7 @@ xfs_trans_brelse(xfs_trans_t *tp, bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(bip->bli_item.li_type == XFS_LI_BUF); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(atomic_read(&bip->bli_refcount) > 0); /* @@ -619,7 +619,7 @@ xfs_trans_bhold(xfs_trans_t *tp, bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(atomic_read(&bip->bli_refcount) > 0); bip->bli_flags |= XFS_BLI_HOLD; trace_xfs_trans_bhold(bip); @@ -641,7 +641,7 @@ xfs_trans_bhold_release(xfs_trans_t *tp, bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT(bip->bli_flags & XFS_BLI_HOLD); bip->bli_flags &= ~XFS_BLI_HOLD; @@ -704,7 +704,7 @@ xfs_trans_log_buf(xfs_trans_t *tp, bip->bli_flags &= ~XFS_BLI_STALE; ASSERT(XFS_BUF_ISSTALE(bp)); XFS_BUF_UNSTALE(bp); - bip->bli_format.blf_flags &= ~XFS_BLI_CANCEL; + bip->bli_format.blf_flags &= ~XFS_BLF_CANCEL; } lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); @@ -762,8 +762,8 @@ xfs_trans_binval( ASSERT(!(XFS_BUF_ISDELAYWRITE(bp))); ASSERT(XFS_BUF_ISSTALE(bp)); ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_INODE_BUF)); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_INODE_BUF)); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); ASSERT(lidp->lid_flags & XFS_LID_DIRTY); ASSERT(tp->t_flags & XFS_TRANS_DIRTY); return; @@ -774,7 +774,7 @@ xfs_trans_binval( * in the buf log item. The STALE flag will be used in * xfs_buf_item_unpin() to determine if it should clean up * when the last reference to the buf item is given up. - * We set the XFS_BLI_CANCEL flag in the buf log format structure + * We set the XFS_BLF_CANCEL flag in the buf log format structure * and log the buf item. This will be used at recovery time * to determine that copies of the buffer in the log before * this should not be replayed. @@ -793,8 +793,8 @@ xfs_trans_binval( XFS_BUF_STALE(bp); bip->bli_flags |= XFS_BLI_STALE; bip->bli_flags &= ~(XFS_BLI_LOGGED | XFS_BLI_DIRTY); - bip->bli_format.blf_flags &= ~XFS_BLI_INODE_BUF; - bip->bli_format.blf_flags |= XFS_BLI_CANCEL; + bip->bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; + bip->bli_format.blf_flags |= XFS_BLF_CANCEL; memset((char *)(bip->bli_format.blf_data_map), 0, (bip->bli_format.blf_map_size * sizeof(uint))); lidp->lid_flags |= XFS_LID_DIRTY; @@ -826,7 +826,7 @@ xfs_trans_inode_buf( bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(atomic_read(&bip->bli_refcount) > 0); - bip->bli_format.blf_flags |= XFS_BLI_INODE_BUF; + bip->bli_format.blf_flags |= XFS_BLF_INODE_BUF; } /* @@ -908,9 +908,9 @@ xfs_trans_dquot_buf( ASSERT(XFS_BUF_ISBUSY(bp)); ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); - ASSERT(type == XFS_BLI_UDQUOT_BUF || - type == XFS_BLI_PDQUOT_BUF || - type == XFS_BLI_GDQUOT_BUF); + ASSERT(type == XFS_BLF_UDQUOT_BUF || + type == XFS_BLF_PDQUOT_BUF || + type == XFS_BLF_GDQUOT_BUF); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(atomic_read(&bip->bli_refcount) > 0); -- 1.5.6.5 From SRS0+V/pq+66+fromorbit.com=dave@internode.on.net Fri May 7 00:39:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o475dHsD148897 for ; Fri, 7 May 2010 00:39:17 -0500 X-ASG-Debug-ID: 1273210886-044e01830000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C1F68318A37 for ; Thu, 6 May 2010 22:41:26 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id aLgmHDpLBmAaJvjC for ; Thu, 06 May 2010 22:41:26 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11831201-1927428 for ; Fri, 07 May 2010 15:11:25 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OAGJE-0006rf-Me for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:12 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OAGJD-00066m-7i for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:11 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 11/12] xfs: enable background pushing of the CIL Subject: [PATCH 11/12] xfs: enable background pushing of the CIL Date: Fri, 7 May 2010 15:40:59 +1000 Message-Id: <1273210860-23414-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273210860-23414-1-git-send-email-david@fromorbit.com> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1273210887 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.2, rules version 3.2.2.29248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner If we let the CIL grow without bound, it will grow large enough to violate recovery constraints (must be at least one complete transaction in the log at all times) or take forever to write out through the log buffers. Hence we need a check during asynchronous transactions as to whether the CIL needs to be pushed. We track the amount of log space the CIL consumes, so it is relatively simple to limit it on a pure size basis. Make the limit the minimum of just under half the log size (recovery constraint) or 8MB of log space (which is an awful lot of metadata). Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_cil.c | 25 ++++++++++++++++++++++++- fs/xfs/xfs_log_priv.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletions(-) diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 3cb1957..806cf6b 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -339,6 +339,7 @@ xfs_log_commit_cil( { struct log *log = mp->m_log; int log_flags = 0; + int push = 0; if (flags & XFS_TRANS_RELEASE_LOG_RES) log_flags = XFS_LOG_REL_PERM_RESERV; @@ -368,13 +369,26 @@ xfs_log_commit_cil( xfs_log_done(mp, tp->t_ticket, NULL, log_flags); xfs_trans_unreserve_and_mod_sb(tp); - /* background commit is allowed again */ + /* check for background commit */ + if (log->l_cilp->xc_ctx->space_used > XLOG_CIL_SPACE_LIMIT(log)) + push = 1; + up_read(&log->l_cilp->xc_ctx_lock); current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); /* xfs_trans_free_items() unlocks them first */ xfs_trans_free_items(tp, *commit_lsn, 0); xfs_trans_free(tp); + + /* + * We need to push CIL every so often so we don't cache more than we + * can fit in the log. The limit really is that a checkpoint can't be + * more than half the log (the current checkpoint is not allowed to + * overwrite the previous checkpoint), but commit latency and memory + * usage limit this to a smaller size in most cases. + */ + if (push) + xlog_cil_push(log, 0); return 0; } @@ -453,6 +467,15 @@ xlog_cil_push( return 0; } + /* check for spurious background flush */ + if (!push_now && + log->l_cilp->xc_ctx->space_used < XLOG_CIL_SPACE_LIMIT(log)) { + up_write(&cil->xc_ctx_lock); + xfs_log_ticket_put(new_ctx->ticket); + kmem_free(new_ctx); + return 0; + } + /* * pull all the log vectors off the items in the CIL, and * remove the items from the CIL. We don't need the CIL lock diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index f9a0e64..fa1aaa5 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -425,6 +425,51 @@ struct xfs_cil { }; /* + * The amount of log space we should the CIL to aggregate is difficult to size. + * Whatever we chose we have to make we can get a reservation for the log space + * effectively, that it is large enough to capture sufficient relogging to + * reduce log buffer IO significantly, but it is not too large for the log or + * induces too much latency when writing out through the iclogs. We track both + * space consumed and the number of vectors in the checkpoint context, so we + * need to decide which to use for limiting. + * + * Every log buffer we write out during a push needs a header reserved, which + * is at least one sector and more for v2 logs. Hence we need a reservation of + * at least 512 bytes per 32k of log space just for the LR headers. That means + * 16KB of reservation per megabyte of delayed logging space we will consume, + * plus various headers. The number of headers will vary based on the num of + * io vectors, so limiting on a specific number of vectors is going to result + * in transactions of varying size. IOWs, it is more consistent to track and + * limit space consumed in the log rather than by the number of objects being + * logged in order to prevent checkpoint ticket overruns. + * + * Further, use of static reservations through the log grant mechanism is + * problematic. It introduces a lot of complexity (e.g. reserve grant vs write + * grant) and a significant deadlock potential because regranting write space + * can block on log pushes. Hence if we have to regrant log space during a log + * push, we can deadlock. + * + * However, we can avoid this by use of a dynamic "reservation stealing" + * technique during transaction commit whereby unused reservation space in the + * transaction ticket is transferred to the CIL ctx commit ticket to cover the + * space needed by the checkpoint transaction. This means that we never need to + * specifically reserve space for the CIL checkpoint transaction, nor do we + * need to regrant space once the checkpoint completes. This also means the + * checkpoint transaction ticket is specific to the checkpoint context, rather + * than the CIL itself. + * + * With dynamic reservations, we can basically make up arbitrary limits for the + * checkpoint size so long as they don't violate any other size rules. Hence + * the initial maximum size for the checkpoint transaction will be set to a + * quarter of the log or 8MB, which ever is smaller. 8MB is an arbitrary limit + * right now based on the latency of writing out a large amount of data through + * the circular iclog buffers. + */ + +#define XLOG_CIL_SPACE_LIMIT(log) \ + (min((log->l_logsize >> 2), (8 * 1024 * 1024))) + +/* * The reservation head lsn is not made up of a cycle number and block number. * Instead, it uses a cycle number and byte number. Logs don't expect to * overflow 31 bits worth of byte offset, so using a byte number will mean -- 1.5.6.5 From SRS0+V/pq+66+fromorbit.com=dave@internode.on.net Fri May 7 00:39:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o475dIQ9148905 for ; Fri, 7 May 2010 00:39:18 -0500 X-ASG-Debug-ID: 1273210886-045101860000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1987A318A38 for ; Thu, 6 May 2010 22:41:26 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id gtMjCLWSYf25lKZp for ; Thu, 06 May 2010 22:41:26 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11831200-1927428 for ; Fri, 07 May 2010 15:11:25 +0930 (CST) Received: from [192.168.1.9] (helo=disturbed) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OAGJO-0006rj-MM for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:22 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OAGJD-00066p-9a for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:11 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 12/12] xfs: Ensure inode allocation buffers are fully replayed Subject: [PATCH 12/12] xfs: Ensure inode allocation buffers are fully replayed Date: Fri, 7 May 2010 15:41:00 +1000 Message-Id: <1273210860-23414-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273210860-23414-1-git-send-email-david@fromorbit.com> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1273210888 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.2, rules version 3.2.2.29248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner With delayed logging, we can get inode allocation buffers in the same transaction inode unlink buffers. We don't currently mark inode allocation buffers in the log, so inode unlink buffers take precedence over allocation buffers. The result is that when they are combined into the same checkpoint, only the unlinked inode chain fields are replayed, resulting in uninitialised inode buffers being detected when the next inode modification is replayed. To fix this, we need to ensure that we do not set the inode buffer flag in the buffer log item format flags if the inode allocation has not already hit the log. To avoid requiring a change to log recovery, we really need to make this a modification that relies only on in-memory sate. We can do this by checking during buffer log formatting (while the CIL cannot be flushed) if we are still in the same sequence when we commit the unlink transaction as the inode allocation transaction. If we are, then we do not add the inode buffer flag to the buffer log format item flags. This means the entire buffer will be replayed, not just the unlinked fields. We do this while CIL flusheŃ• are locked out to ensure that we don't race with the sequence numbers changing and hence fail to put the inode buffer flag in the buffer format flags when we really need to. Also, move an assert in the buffer release path outside the hash spinlock so that if the assert is hit the system continues to run in a debuggable state. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_buf.c | 2 +- fs/xfs/xfs_buf_item.c | 14 ++++++++++++ fs/xfs/xfs_buf_item.h | 4 ++- fs/xfs/xfs_log.h | 1 + fs/xfs/xfs_log_cil.c | 48 ++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_trans.c | 16 +++++++++++-- fs/xfs/xfs_trans.h | 1 + fs/xfs/xfs_trans_buf.c | 20 +++++++++--------- 8 files changed, 89 insertions(+), 17 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 82678bf..e085eca 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -800,9 +800,9 @@ xfs_buf_rele( } else if (bp->b_flags & XBF_FS_MANAGED) { spin_unlock(&hash->bh_lock); } else { - ASSERT(!(bp->b_flags & (XBF_DELWRI|_XBF_DELWRI_Q))); list_del_init(&bp->b_hash_list); spin_unlock(&hash->bh_lock); + ASSERT(!(bp->b_flags & (XBF_DELWRI|_XBF_DELWRI_Q))); xfs_buf_free(bp); } } diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index bcbb661..02a8098 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -254,6 +254,20 @@ xfs_buf_item_format( vecp++; nvecs = 1; + /* + * If it is an inode buffer, transfer the in-memory state to the + * format flags and clear the in-memory state. We do not transfer + * this state if the inode buffer allocation has not yet been committed + * to the log as setting the XFS_BLI_INODE_BUF flag will prevent + * correct replay of the inode allocation. + */ + if (bip->bli_flags & XFS_BLI_INODE_BUF) { + if (!((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) && + xfs_log_item_in_current_chkpt(&bip->bli_item))) + bip->bli_format.blf_flags |= XFS_BLF_INODE_BUF; + bip->bli_flags &= ~XFS_BLI_INODE_BUF; + } + if (bip->bli_flags & XFS_BLI_STALE) { /* * The buffer is stale, so all we need to log diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 8cbb82b..f20bb47 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -69,6 +69,7 @@ typedef struct xfs_buf_log_format { #define XFS_BLI_LOGGED 0x08 #define XFS_BLI_INODE_ALLOC_BUF 0x10 #define XFS_BLI_STALE_INODE 0x20 +#define XFS_BLI_INODE_BUF 0x40 #define XFS_BLI_FLAGS \ { XFS_BLI_HOLD, "HOLD" }, \ @@ -76,7 +77,8 @@ typedef struct xfs_buf_log_format { { XFS_BLI_STALE, "STALE" }, \ { XFS_BLI_LOGGED, "LOGGED" }, \ { XFS_BLI_INODE_ALLOC_BUF, "INODE_ALLOC" }, \ - { XFS_BLI_STALE_INODE, "STALE_INODE" } + { XFS_BLI_STALE_INODE, "STALE_INODE" }, \ + { XFS_BLI_INODE_BUF, "INODE_BUF" } #ifdef __KERNEL__ diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 4a0c574..04c78e6 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -198,6 +198,7 @@ xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp); int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, struct xfs_log_vec *log_vector, xfs_lsn_t *commit_lsn, int flags); +bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); #endif diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 806cf6b..f6733eb 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -201,6 +201,15 @@ xlog_cil_insert( ctx->nvecs += diff_iovecs; /* + * If this is the first time the item is being committed to the CIL, + * store the sequence number on the log item so we can tell + * in future commits whether this is the first checkpoint the item is + * being committed into. + */ + if (!item->li_seq) + item->li_seq = ctx->sequence; + + /* * Now transfer enough transaction reservation to the context ticket * for the checkpoint. The context ticket is special - the unit * reservation has to grow as well as the current reservation as we @@ -328,6 +337,10 @@ xlog_cil_free_logvec( * For more specific information about the order of operations in * xfs_log_commit_cil() please refer to the comments in * xfs_trans_commit_iclog(). + * + * Called with the context lock already held in read mode to lock out + * background commit, returns without it held once background commits are + * allowed again. */ int xfs_log_commit_cil( @@ -346,11 +359,10 @@ xfs_log_commit_cil( if (XLOG_FORCED_SHUTDOWN(log)) { xlog_cil_free_logvec(log_vector); + up_read(&log->l_cilp->xc_ctx_lock); return XFS_ERROR(EIO); } - /* lock out background commit */ - down_read(&log->l_cilp->xc_ctx_lock); xlog_cil_format_items(log, log_vector, tp->t_ticket, commit_lsn); /* check we didn't blow the reservation */ @@ -687,3 +699,35 @@ restart: return commit_lsn; } +/* + * Check if the current log item was first committed in this sequence. + * We can't rely on just the log item being in the CIL, we have to check + * the recorded commit sequence number. + * + * Note: for this to be used in a non-racy manner, it has to be called with + * CIL flushing locked out. As a result, it should only be used during the + * transaction commit process when deciding what to format into the item. + */ +bool +xfs_log_item_in_current_chkpt( + struct xfs_log_item *lip) +{ + struct xfs_cil_ctx *ctx; + + if (!(lip->li_mountp->m_flags & XFS_MOUNT_DELAYLOG)) + return false; + if (list_empty(&lip->li_cil)) + return false; + + ctx = lip->li_mountp->m_log->l_cilp->xc_ctx; + + /* + * li_seq is written on the first commit of a log item to record the + * first checkpoint it is written to. Hence if it is different to the + * current sequence, we're in a new checkpoint. + */ + if (XFS_LSN_CMP(lip->li_seq, ctx->sequence) != 0) + return false; + return true; +} + diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 9bdb492..3e88c3f 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -45,6 +45,7 @@ #include "xfs_trans_space.h" #include "xfs_inode_item.h" #include "xfs_trace.h" +#include "xfs_log_priv.h" kmem_zone_t *xfs_trans_zone; @@ -1261,10 +1262,19 @@ xfs_trans_commit_cil( return ENOMEM; /* - * Fill in the log_vector and pin the logged items, and - * then write the transaction to the log. We have to lock - * out CIL flushes from this point as we are going to pin + * Now we need to fill in the log_vector and pin the logged items, and + * then write the transaction to the log. + * + * Important: We have to lock out CIL flushes from this point as + * transferring state from the in memory log items to the log item + * headers during formatting may require atomicity against log writes + * to ensure that state is transferred to the log without racing + * against flushes. + * + * xfs_log_commit_cil() will release the lock as part of the commit + * process. */ + down_read(&mp->m_log->l_cilp->xc_ctx_lock); xfs_trans_fill_log_vecs(tp, log_vector); return xfs_log_commit_cil(mp, tp, log_vector, commit_lsn, flags); diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index b1ea20c..8c69e78 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -835,6 +835,7 @@ typedef struct xfs_log_item { /* delayed logging */ struct list_head li_cil; /* CIL pointers */ struct xfs_log_vec *li_lv; /* active log vector */ + xfs_lsn_t li_seq; /* CIL commit seq */ } xfs_log_item_t; #define XFS_LI_IN_AIL 0x1 diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 3390c3e..63d81a2 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -792,7 +792,7 @@ xfs_trans_binval( XFS_BUF_UNDELAYWRITE(bp); XFS_BUF_STALE(bp); bip->bli_flags |= XFS_BLI_STALE; - bip->bli_flags &= ~(XFS_BLI_LOGGED | XFS_BLI_DIRTY); + bip->bli_flags &= ~(XFS_BLI_INODE_BUF | XFS_BLI_LOGGED | XFS_BLI_DIRTY); bip->bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; bip->bli_format.blf_flags |= XFS_BLF_CANCEL; memset((char *)(bip->bli_format.blf_data_map), 0, @@ -802,16 +802,16 @@ xfs_trans_binval( } /* - * This call is used to indicate that the buffer contains on-disk - * inodes which must be handled specially during recovery. They - * require special handling because only the di_next_unlinked from - * the inodes in the buffer should be recovered. The rest of the - * data in the buffer is logged via the inodes themselves. + * This call is used to indicate that the buffer contains on-disk inodes which + * must be handled specially during recovery. They require special handling + * because only the di_next_unlinked from the inodes in the buffer should be + * recovered. The rest of the data in the buffer is logged via the inodes + * themselves. * - * All we do is set the XFS_BLI_INODE_BUF flag in the buffer's log - * format structure so that we'll know what to do at recovery time. + * All we do is set the XFS_BLI_INODE_BUF flag in the items flags so it can be + * transferred to the buffer's log format structure so that we'll know what to + * do at recovery time. */ -/* ARGSUSED */ void xfs_trans_inode_buf( xfs_trans_t *tp, @@ -826,7 +826,7 @@ xfs_trans_inode_buf( bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(atomic_read(&bip->bli_refcount) > 0); - bip->bli_format.blf_flags |= XFS_BLF_INODE_BUF; + bip->bli_flags |= XFS_BLI_INODE_BUF; } /* -- 1.5.6.5 From SRS0+1K0y+66+fromorbit.com=dave@internode.on.net Fri May 7 00:39:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o475dKgR148915 for ; Fri, 7 May 2010 00:39:20 -0500 X-ASG-Debug-ID: 1273210889-0449018c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9E664318A3C for ; Thu, 6 May 2010 22:41:29 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id txuk9a9suEHNbWCz for ; Thu, 06 May 2010 22:41:29 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23556264-1927428 for ; Fri, 07 May 2010 15:11:28 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OAGJJ-0006rr-QY for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:17 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OAGJD-00066j-5y for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:11 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 10/12] xfs: forced unmounts need to push the CIL Subject: [PATCH 10/12] xfs: forced unmounts need to push the CIL Date: Fri, 7 May 2010 15:40:58 +1000 Message-Id: <1273210860-23414-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273210860-23414-1-git-send-email-david@fromorbit.com> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1273210890 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0026 1.0000 -2.0040 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.00 X-Barracuda-Spam-Status: No, SCORE=-2.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.2, rules version 3.2.2.29248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner If the filesystem is being shut down and the there is no log error, the current code forces out the current log buffers. This code now needs to push the CIL before it forces out the log buffers to acheive the same result. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 23f2a05..7144a9e 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -3691,6 +3691,11 @@ xlog_state_ioerror( * c. nothing new gets queued up after (a) and (b) are done. * d. if !logerror, flush the iclogs to disk, then seal them off * for business. + * + * Note: for delayed logging the !logerror case needs to flush the regions + * held in memory out to the iclogs before flushing them to disk. This needs + * to be done before the log is marked as shutdown, otherwise the flush to the + * iclogs will fail. */ int xfs_log_force_umount( @@ -3724,6 +3729,16 @@ xfs_log_force_umount( return 1; } retval = 0; + + /* + * Flush the in memory commit item list before marking the log as + * being shut down. We need to do it in this order to ensure all the + * completed transactions are flushed to disk with the xfs_log_force() + * call below. + */ + if (!logerror && (mp->m_flags & XFS_MOUNT_DELAYLOG)) + xlog_cil_push(log, 1); + /* * We must hold both the GRANT lock and the LOG lock, * before we mark the filesystem SHUTDOWN and wake -- 1.5.6.5 From SRS0+J6fy+66+fromorbit.com=dave@internode.on.net Fri May 7 00:39:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o475dLpY148934 for ; Fri, 7 May 2010 00:39:22 -0500 X-ASG-Debug-ID: 1273210864-045301780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 782B0318A2E for ; Thu, 6 May 2010 22:41:05 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id qCDbhUWBpw9QDd1U for ; Thu, 06 May 2010 22:41:05 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23267856-1927428 for ; Fri, 07 May 2010 15:11:03 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OAGJ4-0006rD-87 for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:02 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OAGJ2-00066K-Lh for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:00 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 03/12] xfs: modify buffer item reference counting Subject: [PATCH 03/12] xfs: modify buffer item reference counting Date: Fri, 7 May 2010 15:40:51 +1000 Message-Id: <1273210860-23414-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273210860-23414-1-git-send-email-david@fromorbit.com> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1273210866 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.2, rules version 3.2.2.29248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The buffer log item reference counts used to take referenceŃ• for every transaction, similar to the pin counting. This is symmetric (like the pin/unpin) with respect to transaction completion, but with dleayed logging becomes assymetric as the pinning becomes assymetric w.r.t. transaction completion. To make both cases the same, allow the buffer pinning to take a reference to the buffer log item and always drop the reference the transaction has on it when being unlocked. This is balanced correctly because the unpin operation always drops a reference to the log item. Hence reference counting becomes symmetric w.r.t. item pinning as well as w.r.t active transactions and as a result the reference counting model remain consistent between normal and delayed logging. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_buf_item.c | 110 ++++++++++++++++++++++-------------------------- 1 files changed, 50 insertions(+), 60 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 240340a..4cd5f61 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -341,10 +341,15 @@ xfs_buf_item_format( } /* - * This is called to pin the buffer associated with the buf log - * item in memory so it cannot be written out. Simply call bpin() - * on the buffer to do this. + * This is called to pin the buffer associated with the buf log item in memory + * so it cannot be written out. Simply call bpin() on the buffer to do this. + * + * We also always take a reference to the buffer log item here so that the bli + * is held while the item is pinned in memory. This means that we can + * unconditionally drop the reference count a transaction holds when the + * transaction is completed. */ + STATIC void xfs_buf_item_pin( xfs_buf_log_item_t *bip) @@ -356,6 +361,7 @@ xfs_buf_item_pin( ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT((bip->bli_flags & XFS_BLI_LOGGED) || (bip->bli_flags & XFS_BLI_STALE)); + atomic_inc(&bip->bli_refcount); trace_xfs_buf_item_pin(bip); xfs_bpin(bp); } @@ -489,20 +495,23 @@ xfs_buf_item_trylock( } /* - * Release the buffer associated with the buf log item. - * If there is no dirty logged data associated with the - * buffer recorded in the buf log item, then free the - * buf log item and remove the reference to it in the - * buffer. + * Release the buffer associated with the buf log item. If there is no dirty + * logged data associated with the buffer recorded in the buf log item, then + * free the buf log item and remove the reference to it in the buffer. * - * This call ignores the recursion count. It is only called - * when the buffer should REALLY be unlocked, regardless - * of the recursion count. + * This call ignores the recursion count. It is only called when the buffer + * should REALLY be unlocked, regardless of the recursion count. * - * If the XFS_BLI_HOLD flag is set in the buf log item, then - * free the log item if necessary but do not unlock the buffer. - * This is for support of xfs_trans_bhold(). Make sure the - * XFS_BLI_HOLD field is cleared if we don't free the item. + * We unconditionally drop the transaction's reference to the log item. If the + * item was logged, then another reference was taken when it was pinned, so we + * can safely drop the transaction reference now. This also allows us to avoid + * potential races with the unpin code freeing the bli by not referencing the + * bli after we've dropped the reference count. + * + * If the XFS_BLI_HOLD flag is set in the buf log item, then free the log item + * if necessary but do not unlock the buffer. This is for support of + * xfs_trans_bhold(). Make sure the XFS_BLI_HOLD field is cleared if we don't + * free the item. */ STATIC void xfs_buf_item_unlock( @@ -514,73 +523,54 @@ xfs_buf_item_unlock( bp = bip->bli_buf; - /* - * Clear the buffer's association with this transaction. - */ + /* Clear the buffer's association with this transaction. */ XFS_BUF_SET_FSPRIVATE2(bp, NULL); /* - * If this is a transaction abort, don't return early. - * Instead, allow the brelse to happen. - * Normally it would be done for stale (cancelled) buffers - * at unpin time, but we'll never go through the pin/unpin - * cycle if we abort inside commit. + * If this is a transaction abort, don't return early. Instead, allow + * the brelse to happen. Normally it would be done for stale + * (cancelled) buffers at unpin time, but we'll never go through the + * pin/unpin cycle if we abort inside commit. */ aborted = (bip->bli_item.li_flags & XFS_LI_ABORTED) != 0; /* - * If the buf item is marked stale, then don't do anything. - * We'll unlock the buffer and free the buf item when the - * buffer is unpinned for the last time. + * Before possibly freeing the buf item, determine if we should + * release the buffer at the end of this routine. + */ + hold = bip->bli_flags & XFS_BLI_HOLD; + + /* Clear the per transaction state. */ + bip->bli_flags &= ~(XFS_BLI_LOGGED | XFS_BLI_HOLD); + + /* + * If the buf item is marked stale, then don't do anything. We'll + * unlock the buffer and free the buf item when the buffer is unpinned + * for the last time. */ if (bip->bli_flags & XFS_BLI_STALE) { - bip->bli_flags &= ~XFS_BLI_LOGGED; trace_xfs_buf_item_unlock_stale(bip); ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); - if (!aborted) + if (!aborted) { + atomic_dec(&bip->bli_refcount); return; + } } - /* - * Drop the transaction's reference to the log item if - * it was not logged as part of the transaction. Otherwise - * we'll drop the reference in xfs_buf_item_unpin() when - * the transaction is really through with the buffer. - */ - if (!(bip->bli_flags & XFS_BLI_LOGGED)) { - atomic_dec(&bip->bli_refcount); - } else { - /* - * Clear the logged flag since this is per - * transaction state. - */ - bip->bli_flags &= ~XFS_BLI_LOGGED; - } - - /* - * Before possibly freeing the buf item, determine if we should - * release the buffer at the end of this routine. - */ - hold = bip->bli_flags & XFS_BLI_HOLD; trace_xfs_buf_item_unlock(bip); /* - * If the buf item isn't tracking any data, free it. - * Otherwise, if XFS_BLI_HOLD is set clear it. + * If the buf item isn't tracking any data, free it, otherwise drop the + * reference we hold to it. */ if (xfs_bitmap_empty(bip->bli_format.blf_data_map, - bip->bli_format.blf_map_size)) { + bip->bli_format.blf_map_size)) xfs_buf_item_relse(bp); - } else if (hold) { - bip->bli_flags &= ~XFS_BLI_HOLD; - } + else + atomic_dec(&bip->bli_refcount); - /* - * Release the buffer if XFS_BLI_HOLD was not set. - */ - if (!hold) { + if (!hold) xfs_buf_relse(bp); - } } /* -- 1.5.6.5 From SRS0+V/pq+66+fromorbit.com=dave@internode.on.net Fri May 7 00:39:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o475dLhM148929 for ; Fri, 7 May 2010 00:39:21 -0500 X-ASG-Debug-ID: 1273210888-63ee020b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1BA90963902 for ; Thu, 6 May 2010 22:41:29 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id aGk7jjK98smAGyfJ for ; Thu, 06 May 2010 22:41:29 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23402973-1927428 for ; Fri, 07 May 2010 15:11:24 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OAGJE-0006rX-Fl for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:12 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OAGJC-00066W-WE for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:11 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 07/12] xfs: Improve scalability of busy extent tracking Subject: [PATCH 07/12] xfs: Improve scalability of busy extent tracking Date: Fri, 7 May 2010 15:40:55 +1000 Message-Id: <1273210860-23414-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273210860-23414-1-git-send-email-david@fromorbit.com> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1273210891 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean When we free a metadata extent, we record it in the per-AG busy extent array so that it is not re-used before the freeing transaction hits the disk. This array is fixed size, so when it overflows we make further allocation transactions synchronous because we cannot track more freed extents until those transactions hit the disk and are completed. Under heavy mixed allocation and freeing workloads with large log buffers, we can overflow this array quite easily. Further, the array is sparsely populated, which means that inserts need to search for a free slot, and array searches often have to search many more slots that are actually used to check all the busy extents. Quite inefficient, really. To enable this aspect of extent freeing to scale better, we need a structure that can grow dynamically. While in other areas of XFS we have used radix trees, the extents being freed are at random locations on disk so are better suited to being indexed by an rbtree. So, use a per-AG rbtree indexed by block number to track busy extents. This incures a memory allocation when marking an extent busy, but should not occur too often in low memory situations. This should scale to an arbitrary number of extents so should not be a limitation for features such as in-memory aggregation of transactions. However, there are still situations where we can't avoid allocating busy extents (such as allocation from the AGFL). To minimise the overhead of such occurences, we need to avoid doing a synchronous log force while holding the AGF locked to ensure that the previous transactions are safely on disk before we use the extent. We can do this by marking the transaction doing the allocation as synchronous rather issuing a log force. Because of the locking involved and the ordering of transactions, the synchronous transaction provides the same guarantees as a synchronous log force because it ensures that all the prior transactions are already on disk when the synchronous transaction hits the disk. i.e. it preserves the free->allocate order of the extent correctly in recovery. By doing this, we avoid holding the AGF locked while log writes are in progress, hence reducing the length of time the lock is held and therefore we increase the rate at which we can allocate and free from the allocation group, thereby increasing overall throughput. The only problem with this approach is that when a metadata buffer is marked stale (e.g. a directory block is removed), then buffer remains pinned and locked until the log goes to disk. The issue here is that if that stale buffer is reallocated in a subsequent transaction, the attempt to lock that buffer in the transaction will hang waiting the log to go to disk to unlock and unpin the buffer. Hence if someone tries to lock a pinned, stale, locked buffer we need to push on the log to get it unlocked ASAP. Effectively we are trading off a guaranteed log force for a much less common trigger for log force to occur. Ideally we should not reallocate busy extents. That is a much more complex fix to the problem as it involves direct intervention in the allocation btree searches in many places. This is left to a future set of modifications. Finally, now that we track busy extents in allocated memory, we don't need the descriptors in the transaction structure to point to them. We can replace the complex busy chunk infrastructure with a simple linked list of busy extents. This allows us to remove a large chunk of code, making the overall change a net reduction in code size. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_buf.c | 9 + fs/xfs/linux-2.6/xfs_quotaops.c | 1 + fs/xfs/linux-2.6/xfs_trace.h | 83 ++++++--- fs/xfs/xfs_ag.h | 24 ++- fs/xfs/xfs_alloc.c | 364 ++++++++++++++++++++++++++++----------- fs/xfs/xfs_alloc.h | 7 +- fs/xfs/xfs_alloc_btree.c | 2 +- fs/xfs/xfs_log.h | 3 - fs/xfs/xfs_trans.c | 41 ++---- fs/xfs/xfs_trans.h | 35 +---- fs/xfs/xfs_trans_item.c | 109 ------------ fs/xfs/xfs_trans_priv.h | 4 - fs/xfs/xfs_types.h | 2 + 13 files changed, 361 insertions(+), 323 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 6873afc..82678bf 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -37,6 +37,7 @@ #include "xfs_sb.h" #include "xfs_inum.h" +#include "xfs_log.h" #include "xfs_ag.h" #include "xfs_dmapi.h" #include "xfs_mount.h" @@ -850,6 +851,12 @@ xfs_buf_lock_value( * Note that this in no way locks the underlying pages, so it is only * useful for synchronizing concurrent use of buffer objects, not for * synchronizing independent access to the underlying pages. + * + * If we come across a stale, pinned, locked buffer, we know that we + * are being asked to lock a buffer that has been reallocated. Because + * it is pinned, we know that the log has not been pushed to disk and + * hence it will still be locked. Rather than sleeping until someone + * else pushes the log, push it ourselves before trying to get the lock. */ void xfs_buf_lock( @@ -857,6 +864,8 @@ xfs_buf_lock( { trace_xfs_buf_lock(bp, _RET_IP_); + if (atomic_read(&bp->b_pin_count) && (bp->b_flags & XBF_STALE)) + xfs_log_force(bp->b_mount, 0); if (atomic_read(&bp->b_io_remaining)) blk_run_address_space(bp->b_target->bt_mapping); down(&bp->b_sema); diff --git a/fs/xfs/linux-2.6/xfs_quotaops.c b/fs/xfs/linux-2.6/xfs_quotaops.c index 1947514..2e73688 100644 --- a/fs/xfs/linux-2.6/xfs_quotaops.c +++ b/fs/xfs/linux-2.6/xfs_quotaops.c @@ -19,6 +19,7 @@ #include "xfs_dmapi.h" #include "xfs_sb.h" #include "xfs_inum.h" +#include "xfs_log.h" #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_quota.h" diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 8a319cf..ff6bc79 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -1059,83 +1059,112 @@ TRACE_EVENT(xfs_bunmap, ); +#define XFS_BUSY_SYNC \ + { 0, "async" }, \ + { 1, "sync" } + TRACE_EVENT(xfs_alloc_busy, - TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, - xfs_extlen_t len, int slot), - TP_ARGS(mp, agno, agbno, len, slot), + TP_PROTO(struct xfs_trans *trans, xfs_agnumber_t agno, + xfs_agblock_t agbno, xfs_extlen_t len, int sync), + TP_ARGS(trans, agno, agbno, len, sync), TP_STRUCT__entry( __field(dev_t, dev) + __field(struct xfs_trans *, tp) + __field(int, tid) __field(xfs_agnumber_t, agno) __field(xfs_agblock_t, agbno) __field(xfs_extlen_t, len) - __field(int, slot) + __field(int, sync) ), TP_fast_assign( - __entry->dev = mp->m_super->s_dev; + __entry->dev = trans->t_mountp->m_super->s_dev; + __entry->tp = trans; + __entry->tid = trans->t_ticket->t_tid; __entry->agno = agno; __entry->agbno = agbno; __entry->len = len; - __entry->slot = slot; + __entry->sync = sync; ), - TP_printk("dev %d:%d agno %u agbno %u len %u slot %d", + TP_printk("dev %d:%d trans 0x%p tid 0x%x agno %u agbno %u len %u %s", MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->tp, + __entry->tid, __entry->agno, __entry->agbno, __entry->len, - __entry->slot) + __print_symbolic(__entry->sync, XFS_BUSY_SYNC)) ); -#define XFS_BUSY_STATES \ - { 0, "found" }, \ - { 1, "missing" } - TRACE_EVENT(xfs_alloc_unbusy, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, - int slot, int found), - TP_ARGS(mp, agno, slot, found), + xfs_agblock_t agbno, xfs_extlen_t len), + TP_ARGS(mp, agno, agbno, len), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_agnumber_t, agno) - __field(int, slot) - __field(int, found) + __field(xfs_agblock_t, agbno) + __field(xfs_extlen_t, len) ), TP_fast_assign( __entry->dev = mp->m_super->s_dev; __entry->agno = agno; - __entry->slot = slot; - __entry->found = found; + __entry->agbno = agbno; + __entry->len = len; ), - TP_printk("dev %d:%d agno %u slot %d %s", + TP_printk("dev %d:%d agno %u agbno %u len %u", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, - __entry->slot, - __print_symbolic(__entry->found, XFS_BUSY_STATES)) + __entry->agbno, + __entry->len) ); +#define XFS_BUSY_STATES \ + { 0, "missing" }, \ + { 1, "found" } + TRACE_EVENT(xfs_alloc_busysearch, - TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, - xfs_extlen_t len, xfs_lsn_t lsn), - TP_ARGS(mp, agno, agbno, len, lsn), + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t agbno, xfs_extlen_t len, int found), + TP_ARGS(mp, agno, agbno, len, found), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_agnumber_t, agno) __field(xfs_agblock_t, agbno) __field(xfs_extlen_t, len) - __field(xfs_lsn_t, lsn) + __field(int, found) ), TP_fast_assign( __entry->dev = mp->m_super->s_dev; __entry->agno = agno; __entry->agbno = agbno; __entry->len = len; - __entry->lsn = lsn; + __entry->found = found; ), - TP_printk("dev %d:%d agno %u agbno %u len %u force lsn 0x%llx", + TP_printk("dev %d:%d agno %u agbno %u len %u %s", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, __entry->agbno, __entry->len, + __print_symbolic(__entry->found, XFS_BUSY_STATES)) +); + +TRACE_EVENT(xfs_trans_commit_lsn, + TP_PROTO(struct xfs_trans *trans), + TP_ARGS(trans), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(struct xfs_trans *, tp) + __field(xfs_lsn_t, lsn) + ), + TP_fast_assign( + __entry->dev = trans->t_mountp->m_super->s_dev; + __entry->tp = trans; + __entry->lsn = trans->t_commit_lsn; + ), + TP_printk("dev %d:%d trans 0x%p commit_lsn 0x%llx", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->tp, __entry->lsn) ); diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index abb8222..401f364 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -175,14 +175,20 @@ typedef struct xfs_agfl { } xfs_agfl_t; /* - * Busy block/extent entry. Used in perag to mark blocks that have been freed - * but whose transactions aren't committed to disk yet. + * Busy block/extent entry. Indexed by a rbtree in perag to mark blocks that + * have been freed but whose transactions aren't committed to disk yet. + * + * Note that we use the transaction ID to record the transaction, not the + * transaction structure itself. See xfs_alloc_busy_insert() for details. */ -typedef struct xfs_perag_busy { - xfs_agblock_t busy_start; - xfs_extlen_t busy_length; - struct xfs_trans *busy_tp; /* transaction that did the free */ -} xfs_perag_busy_t; +struct xfs_busy_extent { + struct rb_node rb_node; /* ag by-bno indexed search tree */ + struct list_head list; /* transaction busy extent list */ + xfs_agnumber_t agno; + xfs_agblock_t bno; + xfs_extlen_t length; + xlog_tid_t tid; /* transaction that created this */ +}; /* * Per-ag incore structure, copies of information in agf and agi, @@ -216,7 +222,8 @@ typedef struct xfs_perag { xfs_agino_t pagl_leftrec; xfs_agino_t pagl_rightrec; #ifdef __KERNEL__ - spinlock_t pagb_lock; /* lock for pagb_list */ + spinlock_t pagb_lock; /* lock for pagb_tree */ + struct rb_root pagb_tree; /* ordered tree of busy extents */ atomic_t pagf_fstrms; /* # of filestreams active in this AG */ @@ -226,7 +233,6 @@ typedef struct xfs_perag { int pag_ici_reclaimable; /* reclaimable inodes */ #endif int pagb_count; /* pagb slots in use */ - xfs_perag_busy_t pagb_list[XFS_PAGB_NUM_SLOTS]; /* unstable blocks */ } xfs_perag_t; /* diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 94cddbf..f8d592b 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -46,11 +46,9 @@ #define XFSA_FIXUP_BNO_OK 1 #define XFSA_FIXUP_CNT_OK 2 -STATIC void -xfs_alloc_search_busy(xfs_trans_t *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len); +static int +xfs_alloc_busy_search(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t bno, xfs_extlen_t len); /* * Prototypes for per-ag allocation routines @@ -540,9 +538,16 @@ xfs_alloc_ag_vextent( be32_to_cpu(agf->agf_length)); xfs_alloc_log_agf(args->tp, args->agbp, XFS_AGF_FREEBLKS); - /* search the busylist for these blocks */ - xfs_alloc_search_busy(args->tp, args->agno, - args->agbno, args->len); + /* + * Search the busylist for these blocks and mark the + * transaction as synchronous if blocks are found. This + * avoids the need to block in due to a synchronous log + * force to ensure correct ordering as the synchronous + * transaction will guarantee that for us. + */ + if (xfs_alloc_busy_search(args->mp, args->agno, + args->agbno, args->len)) + xfs_trans_set_sync(args->tp); } if (!args->isfl) xfs_trans_mod_sb(args->tp, @@ -1693,7 +1698,7 @@ xfs_free_ag_extent( * when the iclog commits to disk. If a busy block is allocated, * the iclog is pushed up to the LSN that freed the block. */ - xfs_alloc_mark_busy(tp, agno, bno, len); + xfs_alloc_busy_insert(tp, agno, bno, len); return 0; error0: @@ -1993,10 +1998,17 @@ xfs_alloc_get_freelist( * and remain there until the freeing transaction is committed to * disk. Now that we have allocated blocks, this list must be * searched to see if a block is being reused. If one is, then - * the freeing transaction must be pushed to disk NOW by forcing - * to disk all iclogs up that transaction's LSN. - */ - xfs_alloc_search_busy(tp, be32_to_cpu(agf->agf_seqno), bno, 1); + * the freeing transaction must be pushed to disk before this + * transaction. + * + * We do this by setting the current transaction + * to a sync transaction which guarantees that the freeing transaction + * is on disk before this transaction. This is done instead of a + * synchronous log force here so that we don't sit and wait with + * the AGF locked in the transaction during the log force. + */ + if (xfs_alloc_busy_search(mp, be32_to_cpu(agf->agf_seqno), bno, 1)) + xfs_trans_set_sync(tp); return 0; } @@ -2201,7 +2213,7 @@ xfs_alloc_read_agf( be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]); spin_lock_init(&pag->pagb_lock); pag->pagb_count = 0; - memset(pag->pagb_list, 0, sizeof(pag->pagb_list)); + pag->pagb_tree = RB_ROOT; pag->pagf_init = 1; } #ifdef DEBUG @@ -2479,127 +2491,273 @@ error0: * list is reused, the transaction that freed it must be forced to disk * before continuing to use the block. * - * xfs_alloc_mark_busy - add to the per-ag busy list - * xfs_alloc_clear_busy - remove an item from the per-ag busy list + * xfs_alloc_busy_insert - add to the per-ag busy list + * xfs_alloc_busy_clear - remove an item from the per-ag busy list + * xfs_alloc_busy_search - search for a busy extent + */ + +/* + * Insert a new extent into the busy tree. + * + * This is straight forward, except that we can get overlaps with existing busy + * extents, and even duplicate busy extents. There are two main cases we have + * to handle here. + * + * The first case is a transaction that triggers a "free - allocate - free" + * cycle. This can occur during btree manipulations as a btree block is freed + * to the freelist, then allocated from the free list, then freed again. In + * this case, the second extnet free is what triggers the duplicate and as such + * the transaction IDs should match. Because the extent was allocated in this + * transaction, the transaction must be marked as synchronous. This is true for + * all cases where the free/alloc/free occurs in the one transaction, hence the + * addition of the ASSERT(tp->t_flags & XFS_TRANS_SYNC) to this case. This + * serves to catch violations of the second case quite effectively. + * + * The second case is where the free/alloc/free occur in different + * transactions. In this case, we can't mark the extent busy immediately + * because it is already tracked in a transaction that may be committing. When + * the log commit completes, the busy extent will be removed from the tree. If + * we allow this busy insert to continue using that busy extent structure, it + * can be freed before this transaction is safely in the log. Hence our only + * option in this case is to force the log to remove the existing busy extent + * from the list before we insert the new one with the current transaction ID. + * + * The problem we are trying to avoid in the free-alloc-free in separate + * transactions is most easily described with a timeline: + * + * Thread 1 Thread 2 Thread 3 xfslogd + * xact alloc + * free X + * mark busy + * commit xact + * free xact + * xact alloc + * alloc X + * busy search + * mark xact sync + * commit xact + * free xact + * force log + * checkpoint starts + * .... + * xact alloc + * free X + * mark busy + * finds match + * *** KABOOM! *** + * .... + * log IO completes + * unbusy 1:91909 + * checkpoint completes + * + * By issuing a log force in thread 3 @ "KABOOM", the thread will block until + * the checkpoint completes, and the busy extent it matched will have been + * removed from the tree when it is woken. Hence it can then continue safely. + * + * However, to ensure this matching process is robust, we need to use the + * transaction ID for identifying transaction, as delayed logging results in + * the busy extent and transaction lifecycles being different. i.e. the busy + * extent is active for a lot longer than the transaction. Hence the + * transaction structure can be freed and reallocated, then mark the same + * extent busy again in the new transaction. In this case the new transaction + * will have a different tid but can have the same address, and hence we need + * to check against the tid. + * + * Future: for delayed logging, we could avoid the log force is the extent was + * first freed in the current checkpoint sequence. This, however, requires the + * ability to pin the current checkpoint in memory until this transaction + * commits to ensure that both the original free and the current one combine + * logically into the one checkpoint. If the checkpoint sequences are + * different, however, we still need to wait on a log force. */ void -xfs_alloc_mark_busy(xfs_trans_t *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len) +xfs_alloc_busy_insert( + struct xfs_trans *tp, + xfs_agnumber_t agno, + xfs_agblock_t bno, + xfs_extlen_t len) { - xfs_perag_busy_t *bsy; + struct xfs_busy_extent *new; + struct xfs_busy_extent *busyp; struct xfs_perag *pag; - int n; + struct rb_node **rbp; + struct rb_node *parent; + xfs_agblock_t uend, bend; + int match; - pag = xfs_perag_get(tp->t_mountp, agno); - spin_lock(&pag->pagb_lock); - /* search pagb_list for an open slot */ - for (bsy = pag->pagb_list, n = 0; - n < XFS_PAGB_NUM_SLOTS; - bsy++, n++) { - if (bsy->busy_tp == NULL) { - break; - } + new = kmem_zalloc(sizeof(struct xfs_busy_extent), KM_MAYFAIL); + if (!new) { + /* + * No Memory! Since it is now not possible to track the free + * block, make this a synchronous transaction to insure that + * the block is not reused before this transaction commits. + */ + trace_xfs_alloc_busy(tp, agno, bno, len, 1); + xfs_trans_set_sync(tp); + return; } - trace_xfs_alloc_busy(tp->t_mountp, agno, bno, len, n); + new->agno = agno; + new->bno = bno; + new->length = len; + new->tid = xfs_log_get_trans_ident(tp); - if (n < XFS_PAGB_NUM_SLOTS) { - bsy = &pag->pagb_list[n]; - pag->pagb_count++; - bsy->busy_start = bno; - bsy->busy_length = len; - bsy->busy_tp = tp; - xfs_trans_add_busy(tp, agno, n); - } else { + INIT_LIST_HEAD(&new->list); + + /* trace before insert to be able to see failed inserts */ + trace_xfs_alloc_busy(tp, agno, bno, len, 0); + + pag = xfs_perag_get(tp->t_mountp, new->agno); + uend = bno + len - 1; +restart: + spin_lock(&pag->pagb_lock); + rbp = &pag->pagb_tree.rb_node; + parent = NULL; + busyp = NULL; + match = 0; + while (*rbp) { + parent = *rbp; + busyp = rb_entry(parent, struct xfs_busy_extent, rb_node); + bend = busyp->bno + busyp->length - 1; + + if (new->bno < busyp->bno) { + /* may overlap, but exact start block is lower */ + rbp = &(*rbp)->rb_left; + if (uend >= busyp->bno) { + if (busyp->tid != new->tid) + match = -1; + else if (match >= 0) + match = 1; + } + } else if (new->bno > busyp->bno) { + /* may overlap, but exact start block is higher */ + rbp = &(*rbp)->rb_right; + if (bno <= bend) { + if (busyp->tid != new->tid) + match = -1; + else if (match >= 0) + match = 1; + } + } else { + if (busyp->tid != new->tid) + match = -1; + else if (match >= 0) + match = 1; + break; + } + busyp = NULL; + } + if (match < 0) { + /* overlap marked busy in different transaction */ + spin_unlock(&pag->pagb_lock); + xfs_log_force(tp->t_mountp, XFS_LOG_SYNC); + goto restart; + } + if (match > 0) { /* - * The busy list is full! Since it is now not possible to - * track the free block, make this a synchronous transaction - * to insure that the block is not reused before this - * transaction commits. + * overlap marked busy in same transaction. Update if exact + * start block match, otherwise combine the busy extents into + * a single range. */ - xfs_trans_set_sync(tp); + if (busyp->bno == new->bno) { + busyp->length = max(busyp->length, new->length); + spin_unlock(&pag->pagb_lock); + ASSERT(tp->t_flags & XFS_TRANS_SYNC); + xfs_perag_put(pag); + kmem_free(new); + return; + } + rb_erase(&busyp->rb_node, &pag->pagb_tree); + new->length = max(busyp->bno + busyp->length, + new->bno + new->length) - + min(busyp->bno, new->bno); + new->bno = min(busyp->bno, new->bno); } + rb_link_node(&new->rb_node, parent, rbp); + rb_insert_color(&new->rb_node, &pag->pagb_tree); + + list_add(&new->list, &tp->t_busy); spin_unlock(&pag->pagb_lock); xfs_perag_put(pag); + kmem_free(busyp); } -void -xfs_alloc_clear_busy(xfs_trans_t *tp, - xfs_agnumber_t agno, - int idx) +/* + * Search for a busy extent within the range of the extent we are about to + * allocate. You need to be holding the busy extent tree lock when calling + * xfs_alloc_busy_search(). This function returns 0 for no overlapping busy + * extent, -1 for an overlapping but not exact busy extent, and 1 for an exact + * match. This is done so that a non-zero return indicates an overlap that + * will require a synchronous transaction, but it can still be + * used to distinguish between a partial or exact match. + */ +static int +xfs_alloc_busy_search( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_agblock_t bno, + xfs_extlen_t len) { struct xfs_perag *pag; - xfs_perag_busy_t *list; + struct rb_node *rbp; + xfs_agblock_t uend, bend; + struct xfs_busy_extent *busyp; + int match = 0; - ASSERT(idx < XFS_PAGB_NUM_SLOTS); - pag = xfs_perag_get(tp->t_mountp, agno); + pag = xfs_perag_get(mp, agno); spin_lock(&pag->pagb_lock); - list = pag->pagb_list; - trace_xfs_alloc_unbusy(tp->t_mountp, agno, idx, list[idx].busy_tp == tp); - - if (list[idx].busy_tp == tp) { - list[idx].busy_tp = NULL; - pag->pagb_count--; + uend = bno + len - 1; + rbp = pag->pagb_tree.rb_node; + + /* find closest start bno overlap */ + while (rbp) { + busyp = rb_entry(rbp, struct xfs_busy_extent, rb_node); + bend = busyp->bno + busyp->length - 1; + if (bno < busyp->bno) { + /* may overlap, but exact start block is lower */ + if (uend >= busyp->bno) + match = -1; + rbp = rbp->rb_left; + } else if (bno > busyp->bno) { + /* may overlap, but exact start block is higher */ + if (bno <= bend) + match = -1; + rbp = rbp->rb_right; + } else { + /* bno matches busyp, length determines exact match */ + match = (busyp->length == len) ? 1 : -1; + break; + } } - spin_unlock(&pag->pagb_lock); + trace_xfs_alloc_busysearch(mp, agno, bno, len, !!match); xfs_perag_put(pag); + return match; } - -/* - * If we find the extent in the busy list, force the log out to get the - * extent out of the busy list so the caller can use it straight away. - */ -STATIC void -xfs_alloc_search_busy(xfs_trans_t *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len) +void +xfs_alloc_busy_clear( + struct xfs_mount *mp, + struct xfs_busy_extent *busyp) { struct xfs_perag *pag; - xfs_perag_busy_t *bsy; - xfs_agblock_t uend, bend; - xfs_lsn_t lsn = 0; - int cnt; - pag = xfs_perag_get(tp->t_mountp, agno); - spin_lock(&pag->pagb_lock); - cnt = pag->pagb_count; + trace_xfs_alloc_unbusy(mp, busyp->agno, busyp->bno, + busyp->length); - /* - * search pagb_list for this slot, skipping open slots. We have to - * search the entire array as there may be multiple overlaps and - * we have to get the most recent LSN for the log force to push out - * all the transactions that span the range. - */ - uend = bno + len - 1; - for (cnt = 0; cnt < pag->pagb_count; cnt++) { - bsy = &pag->pagb_list[cnt]; - if (!bsy->busy_tp) - continue; - - bend = bsy->busy_start + bsy->busy_length - 1; - if (bno > bend || uend < bsy->busy_start) - continue; - - /* (start1,length1) within (start2, length2) */ - if (XFS_LSN_CMP(bsy->busy_tp->t_commit_lsn, lsn) > 0) - lsn = bsy->busy_tp->t_commit_lsn; - } + ASSERT(xfs_alloc_busy_search(mp, busyp->agno, busyp->bno, + busyp->length) == 1); + + list_del_init(&busyp->list); + + pag = xfs_perag_get(mp, busyp->agno); + spin_lock(&pag->pagb_lock); + rb_erase(&busyp->rb_node, &pag->pagb_tree); spin_unlock(&pag->pagb_lock); xfs_perag_put(pag); - trace_xfs_alloc_busysearch(tp->t_mountp, agno, bno, len, lsn); - /* - * If a block was found, force the log through the LSN of the - * transaction that freed the block - */ - if (lsn) - xfs_log_force_lsn(tp->t_mountp, lsn, XFS_LOG_SYNC); + kmem_free(busyp); } diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h index 599bffa..6d05199 100644 --- a/fs/xfs/xfs_alloc.h +++ b/fs/xfs/xfs_alloc.h @@ -22,6 +22,7 @@ struct xfs_buf; struct xfs_mount; struct xfs_perag; struct xfs_trans; +struct xfs_busy_extent; /* * Freespace allocation types. Argument to xfs_alloc_[v]extent. @@ -119,15 +120,13 @@ xfs_alloc_longest_free_extent(struct xfs_mount *mp, #ifdef __KERNEL__ void -xfs_alloc_mark_busy(xfs_trans_t *tp, +xfs_alloc_busy_insert(xfs_trans_t *tp, xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len); void -xfs_alloc_clear_busy(xfs_trans_t *tp, - xfs_agnumber_t ag, - int idx); +xfs_alloc_busy_clear(struct xfs_mount *mp, struct xfs_busy_extent *busyp); #endif /* __KERNEL__ */ diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index b726e10..83f4942 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -134,7 +134,7 @@ xfs_allocbt_free_block( * disk. If a busy block is allocated, the iclog is pushed up to the * LSN that freed the block. */ - xfs_alloc_mark_busy(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); + xfs_alloc_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); xfs_trans_agbtree_delta(cur->bc_tp, -1); return 0; } diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 38af110..05f205a 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -18,9 +18,6 @@ #ifndef __XFS_LOG_H__ #define __XFS_LOG_H__ -/* transaction ID type */ -typedef __uint32_t xlog_tid_t; - /* get lsn fields */ #define CYCLE_LSN(lsn) ((uint)((lsn)>>32)) #define BLOCK_LSN(lsn) ((uint)(lsn)) diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index be578ec..40d9595 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -44,6 +44,7 @@ #include "xfs_trans_priv.h" #include "xfs_trans_space.h" #include "xfs_inode_item.h" +#include "xfs_trace.h" kmem_zone_t *xfs_trans_zone; @@ -243,9 +244,8 @@ _xfs_trans_alloc( tp->t_type = type; tp->t_mountp = mp; tp->t_items_free = XFS_LIC_NUM_SLOTS; - tp->t_busy_free = XFS_LBC_NUM_SLOTS; xfs_lic_init(&(tp->t_items)); - XFS_LBC_INIT(&(tp->t_busy)); + INIT_LIST_HEAD(&tp->t_busy); return tp; } @@ -255,8 +255,13 @@ _xfs_trans_alloc( */ STATIC void xfs_trans_free( - xfs_trans_t *tp) + struct xfs_trans *tp) { + struct xfs_busy_extent *busyp, *n; + + list_for_each_entry_safe(busyp, n, &tp->t_busy, list) + xfs_alloc_busy_clear(tp->t_mountp, busyp); + atomic_dec(&tp->t_mountp->m_active_trans); xfs_trans_free_dqinfo(tp); kmem_zone_free(xfs_trans_zone, tp); @@ -285,9 +290,8 @@ xfs_trans_dup( ntp->t_type = tp->t_type; ntp->t_mountp = tp->t_mountp; ntp->t_items_free = XFS_LIC_NUM_SLOTS; - ntp->t_busy_free = XFS_LBC_NUM_SLOTS; xfs_lic_init(&(ntp->t_items)); - XFS_LBC_INIT(&(ntp->t_busy)); + INIT_LIST_HEAD(&ntp->t_busy); ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); ASSERT(tp->t_ticket != NULL); @@ -423,7 +427,6 @@ undo_blocks: return error; } - /* * Record the indicated change to the given field for application * to the file system's superblock when the transaction commits. @@ -930,26 +933,6 @@ xfs_trans_item_committed( IOP_UNPIN(lip); } -/* Clear all the per-AG busy list items listed in this transaction */ -static void -xfs_trans_clear_busy_extents( - struct xfs_trans *tp) -{ - xfs_log_busy_chunk_t *lbcp; - xfs_log_busy_slot_t *lbsp; - int i; - - for (lbcp = &tp->t_busy; lbcp != NULL; lbcp = lbcp->lbc_next) { - i = 0; - for (lbsp = lbcp->lbc_busy; i < lbcp->lbc_unused; i++, lbsp++) { - if (XFS_LBC_ISFREE(lbcp, i)) - continue; - xfs_alloc_clear_busy(tp, lbsp->lbc_ag, lbsp->lbc_idx); - } - } - xfs_trans_free_busy(tp); -} - /* * This is typically called by the LM when a transaction has been fully * committed to disk. It needs to unpin the items which have @@ -984,7 +967,6 @@ xfs_trans_committed( kmem_free(licp); } - xfs_trans_clear_busy_extents(tp); xfs_trans_free(tp); } @@ -1013,7 +995,6 @@ xfs_trans_uncommit( xfs_trans_unreserve_and_mod_dquots(tp); xfs_trans_free_items(tp, flags); - xfs_trans_free_busy(tp); xfs_trans_free(tp); } @@ -1075,6 +1056,8 @@ xfs_trans_commit_iclog( *commit_lsn = xfs_log_done(mp, tp->t_ticket, &commit_iclog, log_flags); tp->t_commit_lsn = *commit_lsn; + trace_xfs_trans_commit_lsn(tp); + if (nvec > XFS_TRANS_LOGVEC_COUNT) kmem_free(log_vector); @@ -1260,7 +1243,6 @@ out_unreserve: } current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); xfs_trans_free_items(tp, error ? XFS_TRANS_ABORT : 0); - xfs_trans_free_busy(tp); xfs_trans_free(tp); XFS_STATS_INC(xs_trans_empty); @@ -1339,7 +1321,6 @@ xfs_trans_cancel( current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); xfs_trans_free_items(tp, flags); - xfs_trans_free_busy(tp); xfs_trans_free(tp); } diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index c62beee..ff7e9e6 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -813,6 +813,7 @@ struct xfs_log_item_desc; struct xfs_mount; struct xfs_trans; struct xfs_dquot_acct; +struct xfs_busy_extent; typedef struct xfs_log_item { struct list_head li_ail; /* AIL pointers */ @@ -872,34 +873,6 @@ typedef struct xfs_item_ops { #define XFS_ITEM_PUSHBUF 3 /* - * This structure is used to maintain a list of block ranges that have been - * freed in the transaction. The ranges are listed in the perag[] busy list - * between when they're freed and the transaction is committed to disk. - */ - -typedef struct xfs_log_busy_slot { - xfs_agnumber_t lbc_ag; - ushort lbc_idx; /* index in perag.busy[] */ -} xfs_log_busy_slot_t; - -#define XFS_LBC_NUM_SLOTS 31 -typedef struct xfs_log_busy_chunk { - struct xfs_log_busy_chunk *lbc_next; - uint lbc_free; /* free slots bitmask */ - ushort lbc_unused; /* first unused */ - xfs_log_busy_slot_t lbc_busy[XFS_LBC_NUM_SLOTS]; -} xfs_log_busy_chunk_t; - -#define XFS_LBC_MAX_SLOT (XFS_LBC_NUM_SLOTS - 1) -#define XFS_LBC_FREEMASK ((1U << XFS_LBC_NUM_SLOTS) - 1) - -#define XFS_LBC_INIT(cp) ((cp)->lbc_free = XFS_LBC_FREEMASK) -#define XFS_LBC_CLAIM(cp, slot) ((cp)->lbc_free &= ~(1 << (slot))) -#define XFS_LBC_SLOT(cp, slot) (&((cp)->lbc_busy[(slot)])) -#define XFS_LBC_VACANCY(cp) (((cp)->lbc_free) & XFS_LBC_FREEMASK) -#define XFS_LBC_ISFREE(cp, slot) ((cp)->lbc_free & (1 << (slot))) - -/* * This is the type of function which can be given to xfs_trans_callback() * to be called upon the transaction's commit to disk. */ @@ -950,8 +923,7 @@ typedef struct xfs_trans { unsigned int t_items_free; /* log item descs free */ xfs_log_item_chunk_t t_items; /* first log item desc chunk */ xfs_trans_header_t t_header; /* header for in-log trans */ - unsigned int t_busy_free; /* busy descs free */ - xfs_log_busy_chunk_t t_busy; /* busy/async free blocks */ + struct list_head t_busy; /* list of busy extents */ unsigned long t_pflags; /* saved process flags state */ } xfs_trans_t; @@ -1025,9 +997,6 @@ int _xfs_trans_commit(xfs_trans_t *, void xfs_trans_cancel(xfs_trans_t *, int); int xfs_trans_ail_init(struct xfs_mount *); void xfs_trans_ail_destroy(struct xfs_mount *); -xfs_log_busy_slot_t *xfs_trans_add_busy(xfs_trans_t *tp, - xfs_agnumber_t ag, - xfs_extlen_t idx); extern kmem_zone_t *xfs_trans_zone; diff --git a/fs/xfs/xfs_trans_item.c b/fs/xfs/xfs_trans_item.c index eb3fc57..2937a1e 100644 --- a/fs/xfs/xfs_trans_item.c +++ b/fs/xfs/xfs_trans_item.c @@ -438,112 +438,3 @@ xfs_trans_unlock_chunk( return freed; } - - -/* - * This is called to add the given busy item to the transaction's - * list of busy items. It must find a free busy item descriptor - * or allocate a new one and add the item to that descriptor. - * The function returns a pointer to busy descriptor used to point - * to the new busy entry. The log busy entry will now point to its new - * descriptor with its ???? field. - */ -xfs_log_busy_slot_t * -xfs_trans_add_busy(xfs_trans_t *tp, xfs_agnumber_t ag, xfs_extlen_t idx) -{ - xfs_log_busy_chunk_t *lbcp; - xfs_log_busy_slot_t *lbsp; - int i=0; - - /* - * If there are no free descriptors, allocate a new chunk - * of them and put it at the front of the chunk list. - */ - if (tp->t_busy_free == 0) { - lbcp = (xfs_log_busy_chunk_t*) - kmem_alloc(sizeof(xfs_log_busy_chunk_t), KM_SLEEP); - ASSERT(lbcp != NULL); - /* - * Initialize the chunk, and then - * claim the first slot in the newly allocated chunk. - */ - XFS_LBC_INIT(lbcp); - XFS_LBC_CLAIM(lbcp, 0); - lbcp->lbc_unused = 1; - lbsp = XFS_LBC_SLOT(lbcp, 0); - - /* - * Link in the new chunk and update the free count. - */ - lbcp->lbc_next = tp->t_busy.lbc_next; - tp->t_busy.lbc_next = lbcp; - tp->t_busy_free = XFS_LIC_NUM_SLOTS - 1; - - /* - * Initialize the descriptor and the generic portion - * of the log item. - * - * Point the new slot at this item and return it. - * Also point the log item at its currently active - * descriptor and set the item's mount pointer. - */ - lbsp->lbc_ag = ag; - lbsp->lbc_idx = idx; - return lbsp; - } - - /* - * Find the free descriptor. It is somewhere in the chunklist - * of descriptors. - */ - lbcp = &tp->t_busy; - while (lbcp != NULL) { - if (XFS_LBC_VACANCY(lbcp)) { - if (lbcp->lbc_unused <= XFS_LBC_MAX_SLOT) { - i = lbcp->lbc_unused; - break; - } else { - /* out-of-order vacancy */ - cmn_err(CE_DEBUG, "OOO vacancy lbcp 0x%p\n", lbcp); - ASSERT(0); - } - } - lbcp = lbcp->lbc_next; - } - ASSERT(lbcp != NULL); - /* - * If we find a free descriptor, claim it, - * initialize it, and return it. - */ - XFS_LBC_CLAIM(lbcp, i); - if (lbcp->lbc_unused <= i) { - lbcp->lbc_unused = i + 1; - } - lbsp = XFS_LBC_SLOT(lbcp, i); - tp->t_busy_free--; - lbsp->lbc_ag = ag; - lbsp->lbc_idx = idx; - return lbsp; -} - - -/* - * xfs_trans_free_busy - * Free all of the busy lists from a transaction - */ -void -xfs_trans_free_busy(xfs_trans_t *tp) -{ - xfs_log_busy_chunk_t *lbcp; - xfs_log_busy_chunk_t *lbcq; - - lbcp = tp->t_busy.lbc_next; - while (lbcp != NULL) { - lbcq = lbcp->lbc_next; - kmem_free(lbcp); - lbcp = lbcq; - } - - XFS_LBC_INIT(&tp->t_busy); - tp->t_busy.lbc_unused = 0; -} diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 73e2ad3..901dc0f 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -38,10 +38,6 @@ struct xfs_log_item_desc *xfs_trans_next_item(struct xfs_trans *, void xfs_trans_free_items(struct xfs_trans *, int); void xfs_trans_unlock_items(struct xfs_trans *, xfs_lsn_t); -void xfs_trans_free_busy(xfs_trans_t *tp); -xfs_log_busy_slot_t *xfs_trans_add_busy(xfs_trans_t *tp, - xfs_agnumber_t ag, - xfs_extlen_t idx); /* * AIL traversal cursor. diff --git a/fs/xfs/xfs_types.h b/fs/xfs/xfs_types.h index b099045..3207752 100644 --- a/fs/xfs/xfs_types.h +++ b/fs/xfs/xfs_types.h @@ -75,6 +75,8 @@ typedef __uint32_t xfs_dahash_t; /* dir/attr hash value */ typedef __uint16_t xfs_prid_t; /* prid_t truncated to 16bits in XFS */ +typedef __uint32_t xlog_tid_t; /* transaction ID type */ + /* * These types are 64 bits on disk but are either 32 or 64 bits in memory. * Disk based types: -- 1.5.6.5 From SRS0+V/pq+66+fromorbit.com=dave@internode.on.net Fri May 7 00:39:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=BAYES_00, TVD_PH_BODY_ACCOUNTS_PRE autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o475dLSA148932 for ; Fri, 7 May 2010 00:39:21 -0500 X-ASG-Debug-ID: 1273210887-038c019e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EA8FD318A39 for ; Thu, 6 May 2010 22:41:28 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id 8OFs8yUh6ZGRwTBV for ; Thu, 06 May 2010 22:41:28 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23359261-1927428 for ; Fri, 07 May 2010 15:11:24 +0930 (CST) Received: from [192.168.1.9] (helo=disturbed) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OAGJO-0006rY-F5 for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:22 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OAGJD-00066e-1v for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:11 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 08/12] xfs: Delayed logging design documentation Subject: [PATCH 08/12] xfs: Delayed logging design documentation Date: Fri, 7 May 2010 15:40:56 +1000 Message-Id: <1273210860-23414-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273210860-23414-1-git-send-email-david@fromorbit.com> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1273210889 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4873 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.2, rules version 3.2.2.29248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Document the design of the delayed logging implementation. This includes assumptions made, dead ends followed, the reasoning behind the structuring of the code, the layout of various structures, how things fit together, traps and pit-falls avoided, etc. This is all too much to document in the code itself, so do it in a separate file. Signed-off-by: Dave Chinner --- .../filesystems/xfs-delayed-logging-design.txt | 819 ++++++++++++++++++++ 1 files changed, 819 insertions(+), 0 deletions(-) create mode 100644 Documentation/filesystems/xfs-delayed-logging-design.txt diff --git a/Documentation/filesystems/xfs-delayed-logging-design.txt b/Documentation/filesystems/xfs-delayed-logging-design.txt new file mode 100644 index 0000000..2b7ff2e --- /dev/null +++ b/Documentation/filesystems/xfs-delayed-logging-design.txt @@ -0,0 +1,819 @@ +XFS Delayed Logging Design +-------------------------- + +Introduction to Re-logging in XFS +--------------------------------- + +XFS logging is a combination of logical and physical logging. Some objects, +such as inodes and dquots, are logged in logical format where the details +logged are made up of the changes to in-core structures rather than on-disk +structures. Other objects - typically buffers - have their physical changes +logged. The reason for these differences is to reduce the amount of log space +required for objects that are frequently logged. Some parts of inodes are more +frequently logged than others, and inodes are typically more frequently logged +than any other object (except maybe the superblock buffer) so keeping the +amount of metadata logged low is of prime importance. + +The reason that this is such a concern is that XFS allows multiple separate +modifications to a single object to be carried in the log at any given time. +This allows the log to avoid needing to flush each change to disk before +recording a new change to the object. XFS does this via a method called +"re-logging". Conceptually, this is quite simple - all it requires is that any +new change to the object is recorded with a *new copy* of all the existing +changes in the new transaction that is written to the log. + +That is, if we have a sequence of changes A through to F, and the object was +written to disk after change D, we would see in the log the following series +of transactions, their contents and the log sequence number (LSN) of the +transaction: + + Transaction Contents LSN + A A X + B A+B X+n + C A+B+C X+n+m + D A+B+C+D X+n+m+o + + E E Y (> X+n+m+o) + F E+F YŮŤ+p + +In other words, each time an object is relogged, the new transaction contains +the aggregation of all the previous changes currently held only in the log. + +This relogging technique also allows objects to be moved forward in the log so +that an object being relogged does not prevent the tail of the log from ever +moving forward. This can be seen in the table above by the changing +(increasing) LSN of each subsquent transaction - the LSN is effectively a +direct encoding of the location in the log of the transaction. + +This relogging is also used to implement long-running, multiple-commit +transactions. These transaction are known as rolling transactions, and require +a special log reservation known as a permanent transaction reservation. A +typical example of a rolling transaction is the removal of extents from an +inode which can only be done at a rate of two extents per transaction because +of reservation size limitations. Hence a rolling extent removal transaction +keeps relogging the inode and btree buffers as they get modified in each +removal operation. This keeps them moving forward in the log as the operation +progresses, ensuring that current operation never gets blocked by itself if the +log wraps around. + +Hence it can be seen that the relogging operation is fundamental to the correct +working of the XFS journalling subsystem. From the above description, most +people should be able to see why the XFS metadata operations writes so much to +the log - repeated operations to the same objects write the same changes to +the log over and over again. Worse is the fact that objects tend to get +dirtier as they get relogged, so each subsequent transaction is writing more +metadata into the log. + +Another feature of the XFS transaction subsystem is that most transactions are +asynchronous. That is, they don't commit to disk until either a log buffer is +filled (a log buffer can hold multiple transactions) or a synchronous operation +forces the log buffers holding the transactions to disk. This means that XFS is +doing aggregation of transactions in memory - batching them, if you like - to +minimise the impact of the log IO on transaction throughput. + +The limitation on asynchronous transaction throughput is the number and size of +log buffers made available by the log manager. By default there are 8 log +buffers available and the size of each is 32kB - the size can be increased up +to 256kB by use of a mount option. + +Effectively, this gives us the maximum bound of outstanding metadata changes +that can be made to the filesystem at any point in time - if all the log +buffers are full and under IO, then no more transactions can be committed until +the current batch completes. It is now common for a single current CPU core to +be to able to issue enough transactions to keep the log buffers full and under +IO permanently. Hence the XFS journalling subsystem can be considered to be IO +bound. + +Delayed Logging: Concepts +------------------------- + +The key thing to note about the asynchronous logging combined with the +relogging technique XFS uses is that we can be relogging changed objects +multiple times before they are committed to disk in the log buffers. If we +return to the previous relogging example, it is entirely possible that +transactions A through D are committed to disk in the same log buffer. + +That is, a single log buffer may contain multiple copies of the same object, +but only one of those copies needs to be there - the last one "D", as it +contains all the changes from the previous changes. In other words, we have one +necessary copy in the log buffer, and three stale copies that are simply +wasting space. When we are doing repeated operations on the same set of +objects, these "stale objects" can be over 90% of the space used in the log +buffers. It is clear that reducing the number of stale objects written to the +log would greatly reduce the amount of metadata we write to the log, and this +is the fundamental goal of delayed logging. + +From a conceptual point of view, XFS is already doing relogging in memory (where +memory == log buffer), only it is doing it extremely inefficiently. It is using +logical to physical formatting to do the relogging because there is no +infrastructure to keep track of logical changes in memory prior to physically +formatting the changes in a transaction to the log buffer. Hence we cannot avoid +accumulating stale objects in the log buffers. + +Delayed logging is the name we've given to keeping and tracking transactional +changes to objects in memory outside the log buffer infrastructure. Because of +the relogging concept fundamental to the XFS journalling subsystem, this is +actually relatively easy to do - all the changes to logged items are already +tracked in the current infrastructure. The big problem is how to accumulate +them and get them to the log in a consistent, recoverable manner. +Describing the problems and how they have been solved is the focus of this +document. + +One of the key changes that delayed logging makes to the operation of the +journalling subsystem is that it disassociates the amount of outstanding +metadata changes from the size and number of log buffers available. In other +words, instead of there only being a maximum of 2MB of transaction changes not +written to the log at any point in time, there may be a much greater amount +being accumulated in memory. Hence the potential for loss of metadata on a +crash is much greater than for the existing logging mechanism. + +It should be noted that this does not change the guarantee that log recovery +will result in a consistent filesystem. What it does mean is that as far as the +recovered filesystem is concerned, there may be many thousands of transactions +that simply did not occur as a result of the crash. This makes it even more +important that applications that care about their data use fsync() where they +need to ensure application level data integrity is maintained. + +It should be noted that delayed logging is not an innovative new concept that +warrants rigorous proofs to determine whether it is correct or not. The method +of accumulating changes in memory for some period before writing them to the +log is used effectively in many filesystems including ext3 and ext4. Hence +no time is spent in this document trying to convince the reader that the +concept is sound. Instead it is simply considered a "solved problem" and as +such implementing it in XFS is purely an exercise in software engineering. + +The fundamental requirements for delayed logging in XFS are simple: + + 1. Reduce the amount of metadata written to the log by at least + an order of magnitude. + 2. Supply sufficient statistics to validate Requirement #1. + 3. Supply sufficient new tracing infrastructure to be able to debug + problems with the new code. + 4. No on-disk format change (metadata or log format). + 5. Enable and disable with a mount option. + 6. No performance regressions for synchronous transaction workloads. + +Delayed Logging: Design +----------------------- + +Storing Changes + +The problem with accumulating changes at a logical level (i.e. just using the +existing log item dirty region tracking) is that when it comes to writing the +changes to the log buffers, we need to ensure that the object we are formatting +is not changing while we do this. This requires locking the object to prevent +concurrent modification. Hence flushing the logical changes to the log would +require us to lock every object, format them, and then unlock them again. + +This introduces lots of scope for deadlocks with transactions that are already +running. For example, a transaction has object A locked and modified, but needs +the delayed logging tracking lock to commit the transaction. However, the +flushing thread has the delayed logging tracking lock already held, and is +trying to get the lock on object A to flush it to the log buffer. This appears +to be an unsolvable deadlock condition, and it was solving this problem that +was the barrier to implementing delayed logging for so long. + +The solution is relatively simple - it just took a long time to recognise it. +Put simply, the current logging code formats the changes to each item into an +vector array that points to the changed regions in the item. The log write code +simply copies the memory these vectors point to into the log buffer during +transaction commit while the item is locked in the transaction. Instead of +using the log buffer as the destination of the formatting code, we can use an +allocated memory buffer big enough to fit the formatted vector. + +If we then copy the vector into the memory buffer and rewrite the vector to +point to the memory buffer rather than the object itself, we now have a copy of +the changes in a format that is compatible with the log buffer writing code. +that does not require us to lock the item to access. This formatting and +rewriting can all be done while the object is locked during transaction commit, +resulting in a vector that is transactionally consistent and can be accessed +without needing to lock the owning item. + +Hence we avoid the need to lock items when we need to flush outstanding +asynchronous transactions to the log. The differences between the existing +formatting method and the delayed logging formatting can be seen in the +diagram below. + +Current format log vector: + +Object +---------------------------------------------+ +Vector 1 +----+ +Vector 2 +----+ +Vector 3 +----------+ + +After formatting: + +Log Buffer +-V1-+-V2-+----V3----+ + +Delayed logging vector: + +Object +---------------------------------------------+ +Vector 1 +----+ +Vector 2 +----+ +Vector 3 +----------+ + +After formatting: + +Memory Buffer +-V1-+-V2-+----V3----+ +Vector 1 +----+ +Vector 2 +----+ +Vector 3 +----------+ + +The memory buffer and associated vector need to be passed as a single object, +but still need to be associated with the parent object so if the object is +relogged we can replace the current memory buffer with a new memory buffer that +contains the latest changes. + +The reason for keeping the vector around after we've formatted the memory +buffer is to support splitting vectors across log buffer boundaries correctly. +If we don't keep the vector around, we do not know where the region boundaries +are in the item, so we'd need a new encapsulation method for regions in the log +buffer writing (i.e. double encapsulation). This would be an on-disk format +change and as such is not desirable. It also means we'd have to write the log +region headers in the formatting stage, which is problematic as there is per +region state that needs to be placed into the headers during the log write. + +Hence we need to keep the vector, but by attaching the memory buffer to it and +rewriting the vector addresses to point at the memory buffer we end up with a +self-describing object that can be passed to the log buffer write code to be +handled in exactly the same manner as the existing log vectors are handled. +Hence we avoid needing a new on-disk format to handle items that have been +relogged in memory. + + +Tracking Changes + +Now that we can record transactional changes in memory in a form that allows +them to be used without limitations, we need to be able to track and accumulate +them so that they can be written to the log at some later point in time. The +log item is the natural place to store this vector and buffer, and also makes sense +to be the object that is used to track committed objects as it will always +exist once the object has been included in a transaction. + +The log item is already used to track the log items that have been written to +the log but not yet written to disk. Such log items are considered "active" +and as such are stored in the Active Item List (AIL) which is a LSN-ordered +double linked list. Items are inserted into this list during log buffer IO +completion, after which they are unpinned and can be written to disk. An object +that is in the AIL can be relogged, which causes the object to be pinned again +and then moved forward in the AIL when the log buffer IO completes for that +transaction. + +Essentially, this shows that an item that is in the AIL can still be modified +and relogged, so any tracking must be separate to the AIL infrastructure. As +such, we cannot reuse the AIL list pointers for tracking committed items, nor +can we store state in any field that is protected by the AIL lock. Hence the +committed item tracking needs it's own locks, lists and state fields in the log +item. + +Similar to the AIL, tracking of committed items is done through a new list +called the Committed Item List (CIL). The list tracks log items that have been +committed and have formatted memory buffers attached to them. It tracks objects +in transaction commit order, so when an object is relogged it is removed from +it's place in the list and re-inserted at the tail. This is entirely arbitrary +and done to make it easy for debugging - the last items in the list are the +ones that are most recently modified. Ordering of the CIL is not necessary for +transactional integrity (as discussed in the next section) so the ordering is +done for convenience/sanity of the developers. + + +Delayed Logging: Checkpoints + +When we have a log synchronisation event, commonly known as a "log force", +all the items in the CIL must be written into the log via the log buffers. +We need to write these items in the order that they exist in the CIL, and they +need to be written as an atomic transaction. The need for all the objects to be +written as an atomic transaction comes from the requirements of relogging and +log replay - all the changes in all the objects in a given transaction must +either be completely replayed during log recovery, or not replayed at all. If +a transaction is not replayed because it is not complete in the log, then +no later transactions should be replayed, either. + +To fulfill this requirement, we need to write the entire CIL in a single log +transaction. Fortunately, the XFS log code has no fixed limit on the size of a +transaction, nor does the log replay code. The only fundamental limit is that +the transaction cannot be larger than just under half the size of the log. The +reason for this limit is that to find the head and tail of the log, there must +be at least one complete transaction in the log at any given time. If a +transaction is larger than half the log, then there is the possibility that a +crash during the write of a such a transaction could partially overwrite the +only complete previous transaction in the log. This will result in a recovery +failure and an inconsistent filesystem and hence we must enforce the maximum +size of a checkpoint to be slightly less than a half the log. + +Apart from this size requirement, a checkpoint transaction looks no different +to any other transaction - it contains a transaction header, a series of +formatted log items and a commit record at the tail. From a recovery +perspective, the checkpoint transaction is also no different - just a lot +bigger with a lot more items in it. The worst case effect of this is that we +might need to tune the recovery transaction object hash size. + +Because the checkpoint is just another transaction and all the changes to log +items are stored as log vectors, we can use the existing log buffer writing +code to write the changes into the log. To do this efficiently, we need to +minimise the time we hold the CIL locked while writing the checkpoint +transaction. The current log write code enables us to do this easily with the +way it separates the writing of the transaction contents (the log vectors) from +the transaction commit record, but tracking this requires us to have a +per-checkpoint context that travels through the log write process through to +checkpoint completion. + +Hence a checkpoint has a context that tracks the state of the current +checkpoint from initiation to checkpoint completion. A new context is initiated +at the same time a checkpoint transaction is started. That is, when we remove +all the current items from the CIL during a checkpoint operation, we move all +those changes into the current checkpoint context. We then initialise a new +context and attach that to the CIL for aggregation of new transactions. + +This allows us to unlock the CIL immediately after transfer of all the +committed items and effectively allow new transactions to be issued while we +are formatting the checkpoint into the log. It also allows concurrent +checkpoints to be written into the log buffers in the case of log force heavy +workloads, just like the existing transaction commit code does. This, however, +requires that we strictly order the commit records in the log so that +checkpoint sequence order is maintained during log replay. + +To ensure that we can be writing an item into a checkpoint transaction at +the same time another transaction modifies the item and inserts the log item +into the new CIL, then checkpoint transaction commit code cannot use log items +to store the list of log vectors that need to be written into the transaction. +Hence log vectors need to be able to be chained together to allow them to be +detatched from the log items. That is, when the CIL is flushed the memory +buffer and log vector attached to each log item needs to be attached to the +checkpoint context so that the log item can be released. In diagrammatic form, +the CIL would look like this before the flush: + + CIL Head + | + V + Log Item <-> log vector 1 -> memory buffer + | -> vector array + V + Log Item <-> log vector 2 -> memory buffer + | -> vector array + V + ...... + | + V + Log Item <-> log vector N-1 -> memory buffer + | -> vector array + V + Log Item <-> log vector N -> memory buffer + -> vector array + +And after the flush the CIL head is empty, and the checkpoint context log +vector list would look like: + + Checkpoint Context + | + V + log vector 1 -> memory buffer + | -> vector array + | -> Log Item + V + log vector 2 -> memory buffer + | -> vector array + | -> Log Item + V + ...... + | + V + log vector N-1 -> memory buffer + | -> vector array + | -> Log Item + V + log vector N -> memory buffer + -> vector array + -> Log Item + +Once this transfer is done, the CIL can be unlocked and new transactions can +start, while the checkpoint flush code works over the log vector chain to +commit the checkpoint. + +Once the checkpoint is written into the log buffers, the checkpoint context is +attached to the log buffer that the commit record was written to along with a +completion callback. Log IO completion will call that callback, which can then +run transaction committed processing for the log items (i.e. insert into AIL +and unpin) in the log vector chain and then free the log vector chain and +checkpoint context. + +Discussion Point: I am uncertain as to whether the log item is the most +efficient way to track vectors, even though it seems like the natural way to do +it. The fact that we walk the log items (in the CIL) just to chain the log +vectors and break the link between the log item and the log vector means that +we take a cache line hit for the log item list modification, then another for +the log vector chaining. If we track by the log vectors, then we only need to +break the link between the log item and the log vector, which means we should +dirty only the log item cachelines. Normally I wouldn't be concerned about one +vs two dirty cachelines except for the fact I've seen upwards of 80,000 log +vectors in one checkpoint transaction. I'd guess this is a "measure and +compare" situation that can be done after a working and reviewed implementation +is in the dev tree.... + +Delayed Logging: Checkpoint Sequencing + +One of the key aspects of the XFS transaction subsystem is that it tags +committed transactions with the log sequence number of the transaction commit. +This allows transactions to be issued asynchronously even though there may be +future operations that cannot be completed until that transaction is fully +committed to the log. In the rare case that a dependent operation occurs (e.g. +re-using a freed metadata extent for a data extent), a special, optimised log +force can be issued to force the dependent transaction to disk immediately. + +To do this, transactions need to record the LSN of the commit record of the +transaction. This LSN comes directly from the log buffer the transaction is +written into. While this works just fine for the existing transaction +mechanism, it does not work for delayed logging because transactions are not +written directly into the log buffers. Hence some other method of sequencing +transactions is required. + +As discussed in the checkpoint section, delayed logging uses per-checkpoint +contexts, and as such it is simple to assign a sequence number to each +checkpoint. Because the switching of checkpoint contexts must be done +atomically, it is simple to ensure that each new context has a monotonically +increasing sequence number assigned to it without the need for an external +atomic counter - we can just take the current context sequence number and add +one to it for the new context. + +Then, instead of assigning a log buffer LSN to the transaction commit LSN +during the commit, we can assign the current checkpoint sequence. This allows +operations that track transactions that have not yet completed know what +checkpoint sequence needs to be committed before they can continue. As a +result, the code that forces the log to a specific LSN now needs to ensure that +the log forces to a specific checkpoint. + +To ensure that we can do this, we need to track all the checkpoint contexts +that are currently committing to the log. When we flush a checkpoint, the +context gets added to a "committing" list which can be searched. When a +checkpoint commit completes, it is removed from the committing list. Because +the checkpoint context records the LSN of the commit record for the checkpoint, +we can also wait on the log buffer that contains the commit record, thereby +using the existing log force mechanisms to execute synchronous forces. + +It should be noted that the synchronous forces may need to be extended with +mitigation algorithms similar to the current log buffer code to allow +aggregation of multiple synchronous transactions if there are already +synchronous transactions being flushed. Investigation of the performance of the +current design is needed before making any decisions here. + +The main concern with log forces is to ensure that all the previous checkpoints +are also committed to disk before the one we need to wait for. Therefore we +need to check that all the prior contexts in the committing list are also +complete before waiting on the one we need to complete. We do this +synchronisation in the log force code so that we don't need to wait anywhere +else for such serialisation - it only matters when we do a log force. + +The only remaining complexity is that a log force now also has to handle the +case where the forcing sequence number is the same as the current context. That +is, we need to flush the CIL and potentially wait for it to complete. This is a +simple addition to the existing log forcing code to check the sequence numbers +and push if required. Indeed, placing the current sequence checkpoint flush in +the log force code enables the current mechanism for issuing synchronous +transactions to remain untouched (i.e. commit an asynchronous transaction, then +force the log at the LSN of that transaction) and so the higher level code +behaves the same regardless of whether delayed logging is being used or not. + +Delayed Logging: Checkpoint Log Space Accounting + +The big issue for a checkpoint transaction is the log space reservation for the +transaction. We don't know how big a checkpoint transaction is going to be +ahead of time, nor how many log buffers it will take to write out, nor the +number of split log vector regions are going to be used. We can track the +amount of log space required as we add items to the commit item list, but we +still need to reserve the space in the log for the checkpoint. + +A typical transaction reserves enough space in the log for the worst case space +usage of the transaction. The reservation accounts for log record headers, +transaction and region headers, headers for split regions, buffer tail padding, +etc. as well as the actual space for all the changed metadata in the +transaction. While some of this is fixed overhead, much of it is dependent on +the size of the transaction and the number of regions being logged (the number +of log vectors in the transaction). + +An example of the differences would be logging directory changes versus logging +inode changes. If you modify lots of inode cores (e.g. chmod -R g+w *), then +there are lots of transactions that only contain an inode core and an inode log +format structure. That is, two vectors totaling roughly 150 bytes. If we modify +10,000 inodes, we have about 1.5MB of metadata to write in 20,000 vectors. Each +vector is 12 bytes, so the total to be logged is approximately 1.75MB. In +comparison, if we are logging full directory buffers, they are typically 4KB +each, so we in 1.5MB of directory buffers we'd have roughly 400 buffers and a +buffer format structure for each buffer - roughly 800 vectors or 1.51MB total +space. From this, it should be obvious that a static log space reservation is +not particularly flexible and is difficult to select the "optimal value" for +all workloads. + +Further, if we are going to use a static reservation, which bit of the entire +reservation does it cover? We account for space used by the transaction +reservation by tracking the space currently used by the object in the CIL and +then calculating the increase or decrease in space used as the object is +relogged. This allows for a checkpoint reservation to only have to account for +log buffer metadata used such as log header records. + +However, even using a static reservation for just the log metadata is +problematic. Typically log record headers use at least 16KB of log space per +1MB of log space consumed (512 bytes per 32k) and the reservation needs to be +large enough to handle arbitrary sized checkpoint transactions. This +reservation needs to be made before the checkpoint is started, and we need to +be able to reserve the space without sleeping. For a 8MB checkpoint, we need a +reservation of around 150KB, which is a non-trivial amount of space. + +A static reservation needs to manipulate the log grant counters - we can take a +permanent reservation on the space, but we still need to make sure we refresh +the write reservation (the actual space available to the transaction) after +every checkpoint transaction completion. Unfortunately, if this space is not +available when required, then the regrant code will sleep waiting for it. + +The problem with this is that it can lead to deadlocks as we may need to commit +checkpoints to be able to free up log space (refer back to the description of +rolling transactions for an example of this). Hence we *must* always have +space available in the log if we are to use static reservations, and that is +very difficult and complex to arrange. It is possible to do, but there is a +simpler way. + +The simpler way of doing this is tracking the entire log space used by the +items in the CIL and using this to dynamically calculate the amount of log +space required by the log metadata. If this log metadata space changes as a +result of a transaction commit inserting a new memory buffer into the CIL, then +the difference in space required is removed from the transaction that causes +the change. Transactions at this level will *always* have enough space +available in their reservation for this as they have already reserved the +maximal amount of log metadata space they require, and such a delta reservation +will always be less than or equal to the maximal amount in the reservation. + +Hence we can grow the checkpoint transaction reservation dynamically as items +are added to the CIL and avoid the need for reserving and regranting log space +up front. This avoids deadlocks and removes a blocking point from the +checkpoint flush code. + +As mentioned early, transactions can't grow to more than half the size of the +log. Hence as part of the reservation growing, we need to also check the size +of the reservation against the maximum allowed transaction size. If we reach +the maximum threshold, we need to push the CIL to the log. This is effectively +a "background flush" and is done on demand. This is identical to +a CIL push triggered by a log force, only that there is no waiting for the +checkpoint commit to complete. This background push is checked and executed by +transaction commit code. + +If the transaction subsystem goes idle while we still have items in the CIL, +they will be flushed by the periodic log force issued by the xfssyncd. This log +force will push the CIL to disk, and if the transaction subsystem stays idle, +allow the idle log to be covered (effectively marked clean) in exactly the same +manner that is done for the existing logging method. A discussion point is +whether this log force needs to be done more frequently than the current rate +which is once every 30s. + + +Delayed Logging: Log Item Pinning + +Currently log items are pinned during transaction commit while the items are +still locked. This happens just after the items are formatted, though it could +be done any time before the items are unlocked. The result of this mechanism is +that items get pinned once for every transaction that is committed to the log +buffers. Hence items that are relogged in the log buffers will have a pin count +for every outstanding transaction they were dirtied in. When each of these +transactions is completed, they will unpin the item once. As a result, the item +only becomes unpinned when all the transactions complete and there are no +pending transactions. Thus the pinning and unpinning of a log item is symmetric +as there is a 1:1 relationship with transaction commit and log item completion. + +For delayed logging, however, we have an assymetric transaction commit to +completion relationship. Every time an object is relogged in the CIL it goes +through the commit process without a corresponding completion being registered. +That is, we now have a many-to-one relationship between transaction commit and +log item completion. The result of this is that pinning and unpinning of the +log items becomes unbalanced if we retain the "pin on transaction commit, unpin +on transaction completion" model. + +To keep pin/unpin symmetry, the algorithm needs to change to a "pin on +insertion into the CIL, unpin on checkpoint completion". In other words, the +pinning and unpinning becomes symmetric around a checkpoint context. We have to +pin the object the first time it is inserted into the CIL - if it is already in +the CIL during a transaction commit, then we do not pin it again. Because there +can be multiple outstanding checkpoint contexts, we can still see elevated pin +counts, but as each checkpoint completes the pin count will retain the correct +value according to it's context. + +Just to make matters more slightly more complex, this checkpoint level context +for the pin count means that the pinning of an item must take place under the +CIL commit/flush lock. If we pin the object outside this lock, we cannot +guarantee which context the pin count is associated with. This is because of +the fact pinning the item is dependent on whether the item is present in the +current CIL or not. If we don't pin the CIL first before we check and pin the +object, we have a race with CIL being flushed between the check and the pin +(or not pinning, as the case may be). Hence we must hold the CIL flush/commit +lock to guarantee that we pin the items correctly. + +Delayed Logging: Concurrent Scalability + +A fundamental requirement for the CIL is that accesses through transaction +commits must scale to many concurrent commits. The current transaction commit +code does not break down even when there are transactions coming from 2048 +processors at once. The current transaction code does not go any faster than if +there was only one CPU using it, but it does not slow down either. + +As a result, the delayed logging transaction commit code needs to be designed +for concurrency from the ground up. It is obvious that there are serialisation +points in the design - the three important ones are: + + 1. Locking out new transaction commits while flushing the CIL + 2. Adding items to the CIL and updating item space accounting + 3. Checkpoint commit ordering + +Looking at the transaction commit and CIL flushing interactions, it is clear +that we have a many-to-one interaction here. That is, the only restriction on +the number of concurrent transactions that can be trying to commit at once is +the amount of space available in the log for their reservations. The practical +limit here is in the order of several hundred concurrent transactions for a +128MB log, which means that it is generally one per CPU in a machine. + +The amount of time a transaction commit needs to hold out a flush is a +relatively long period of time - the pinning of log items needs to be done +while we are holding out a CIL flush, so at the moment that means it is held +across the formatting of the objects into memory buffers (i.e. while memcpy()s +are in progress). Ultimately a two pass algorithm where the formatting is done +separately to the pinning of objects could be used to reduce the hold time of +the transaction commit side. + +Because of the number of potential transaction commit side holders, the lock +really needs to be a sleeping lock - if the CIL flush takes the lock, we do not +want every other CPU in the machine spinning on the CIL lock. Given that +flushing the CIL could involve walking a list of tens of thousands of log +items, it will get held for a significant time and so spin contention is a +significant concern. Preventing lots of CPUs spinning doing nothing is the +main reason for choosing a sleeping lock even though nothing in either the +transaction commit or CIL flush side sleeps with the lock held. + +It should also be noted that CIL flushing is also a relatively rare operation +compared to transaction commit for asynchronous transaction workloads - only +time will tell if using a read-write semaphore for exclusion will limit +transaction commit concurrency due to cache line bouncing of the lock on the +read side. + +The second serialisation point is on the transaction commit side where items +are inserted into the CIL. Because transactions can enter this code +concurrently, the CIL needs to be protected separately from the above +commit/flush exclusion. It also needs to be an exclusive lock but it is only +held for a very short time and so a spin lock is appropriate here. It is +possible that this lock will become a contention point, but given the short +hold time once per transaction I think that contention is unlikely. + +The final serialisation point is the checkpoint commit record ordering code +that is run as part of the checkpoint commit and log force sequencing. The code +path that triggers a CIL flush (i.e. whatever triggers the log force) will enter +an ordering loop after writing all the log vectors into the log buffers but +before writing the commit record. This loop walks the list of committing +checkpoints and needs to block waiting for checkpoints to complete their commit +record write. As a result it needs a lock and a wait variable. Log force +sequencing also requires the same lock, list walk, and blocking mechanism to +ensure completion of checkpoints. + +These two sequencing operations can use the mechanism even though the +events they are waiting for are different. The checkpoint commit record +sequencing needs to wait until checkpoint contexts contain a commit LSN +(obtained through completion of a commit record write) while log force +sequencing needs to wait until previous checkpoint contexts are removed from +the committing list (i.e. they've completed). A simple wait variable and +broadcast wakeups (thundering herds) has been used to implement these two +serialisation queues. They use the same lock as the CIL, too. If we see too +much contention on the CIL lock, or too many context switches as a result of +the broadcast wakeups these operations can be put under a new spinlock and +given separate wait lists to reduce lock contention and the number of processes +woken by the wrong event. + + +Lifecycle Changes + +The existing log item life cycle is as follows: + + 1. Transaction allocate + 2. Transaction reserve + 3. Lock item + 4. Join item to transaction + If not already attached, + Allocate log item + Attach log item to owner item + Attach log item to transaction + 5. Modify item + Record modifications in log item + 6. Transaction commit + Pin item in memory + Format item into log buffer + Write commit LSN into transaction + Unlock item + Attach transaction to log buffer + + + + + 7. Transaction completion + Mark log item committed + Insert log item into AIL + Write commit LSN into log item + Unpin log item + 8. AIL traversal + Lock item + Mark log item clean + Flush item to disk + + + + 9. Log item removed from AIL + Moves log tail + Item unlocked + +Essentially, steps 1-6 operate independently from step 7, which is also +independent of steps 8-9. An item can be locked in steps 1-6 or steps 8-9 +at the same time step 7 is occurring, but only steps 1-6 or 8-9 can occur +at the same time. If the log item is in the AIL or between steps 6 and 7 +and steps 1-6 are re-entered, then the item is relogged. Only when steps 8-9 +are entered and completed is the object considered clean. + +With delayed logging, there are new steps inserted into the life cycle: + + 1. Transaction allocate + 2. Transaction reserve + 3. Lock item + 4. Join item to transaction + If not already attached, + Allocate log item + Attach log item to owner item + Attach log item to transaction + 5. Modify item + Record modifications in log item + 6. Transaction commit + Pin item in memory if not pinned in CIL + Format item into log vector + buffer + Attach log vector and buffer to log item + Insert log item into CIL + Write CIL context sequence into transaction + Unlock item + + + + 7. CIL push + lock CIL flush + Chain log vectors and buffers together + Remove items from CIL + unlock CIL flush + write log vectors into log + sequence commit records + attach checkpoint context to log buffer + + + + + 8. Checkpoint completion + Mark log item committed + Insert item into AIL + Write commit LSN into log item + Unpin log item + 9. AIL traversal + Lock item + Mark log item clean + Flush item to disk + + 10. Log item removed from AIL + Moves log tail + Item unlocked + +From this, it can be seen that the only life cycle differences between the two +logging methods are in the middle of the life cycle - they still have the same +beginning and end and execution constraints. The only differences are in the +commiting of the log items to the log itself and the completion processing. +Hence delayed logging should not introduce any constraints on log item +behaviour, allocation or freeing that don't already exist. + +As a result of this zero-impact "insertion" of delayed logging infrastructure +and the design of the internal structures to avoid on disk format changes, we +can basically switch between delayed logging and the existing mechanism with a +mount option. Fundamentally, there is no reason why the log manager would not +be able to swap methods automatically and transparently depending on load +characteristics, but this should not be necessary if delayed logging works as +designed. + +Roadmap: + +2.6.35 Inclusion in mainline as an experimental mount option + => approximately 2-3 months to merge window + => needs to be in xfs-dev tree in 4-6 weeks + => code is nearing readiness for review + +2.6.37 Remove experimental tag from mount option + => should be roughly 6 months after initial merge + => enough time to: + => gain confidence and fix problems reported by early + adopters (a.k.a. guinea pigs) + => address worst performance regressions and undesired + behaviours + => start tuning/optimising code for parallelism + => start tuning/optimising algorithms consuming + excessive CPU time + +2.6.39 Switch default mount option to use delayed logging + => should be roughly 12 months after initial merge + => enough time to shake out remaining problems before next round of + enterprise distro kernel rebases + + + -- 1.5.6.5 From SRS0+KKyr+66+fromorbit.com=dave@internode.on.net Fri May 7 01:01:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_66,LOCAL_GNU_PATCH,TVD_PH_BODY_ACCOUNTS_PRE autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4761aG7150054 for ; Fri, 7 May 2010 01:01:37 -0500 X-ASG-Debug-ID: 1273210880-038e01a30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6D977318A34 for ; Thu, 6 May 2010 22:41:20 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id GHCnM7mujBzhSuMJ for ; Thu, 06 May 2010 22:41:20 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23442163-1927428 for ; Fri, 07 May 2010 15:11:18 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OAGJE-0006rZ-J3 for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:12 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OAGJD-00066g-4B for xfs@oss.sgi.com; Fri, 07 May 2010 15:41:11 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 09/12] xfs: Introduce delayed logging core code Subject: [PATCH 09/12] xfs: Introduce delayed logging core code Date: Fri, 7 May 2010 15:40:57 +1000 Message-Id: <1273210860-23414-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273210860-23414-1-git-send-email-david@fromorbit.com> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1273210882 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The delayed logging code only changes in-memory structures and as such can be enabled and disabled with a mount option. Add the mount option and emit a warning that this is an experimental feature that should not be used in production yet. We also need infrastructure to track committed items that have not yet been written to the log. This is what the Committed Item List (CIL) is for. The log item also needs to be extended to track the current log vector, the associated memory buffer and it's location in the Commit Item List. Extend the log item and log vector structures to enable this tracking. To maintain the current log format for transactions with delayed logging, we need to introduce a checkpoint transaction and a context for tracking each checkpoint from initiation to transaction completion. This includes adding a log ticket for tracking space log required/used by the context checkpoint. To track all the changes we need an io vector array per log item, rather than a single array for the entire transaction. Using the new log vector structure for this requires two passes - the first to allocate the log vector structures and chain them together, and the second to fill them out. This log vector chain can then be passed to the CIL for formatting, pinning and insertion into the CIL. Formatting of the log vector chain is relatively simple - it's just a loop over the iovecs on each log vector, but it is made slightly more complex because we re-write the iovec after the copy to point back at the memory buffer we just copied into. This code also needs to pin log items. If the log item is not already tracked in this checkpoint context, then it needs to be pinned. Otherwise it is already pinned and we don't need to pin it again. The only other complexity is calculating the amount of new log space the formatting has consumed. This needs to be accounted to the transaction in progress, and the accounting is made more complex becase we need also to steal space from it for log metadata in the checkpoint transaction. Calculate all this at insert time and update all the tickets, counters, etc correctly. Once we've formatted all the log items in the transaction, attach the busy extents to the checkpoint context so the busy extents live until checkpoint completion and can be processed at that point in time. Transactions can then be freed at this point in time. Now we need to issue checkpoints - we are tracking the amount of log space used by the items in the CIL, so we can trigger background checkpoints when the space usage gets to a certain threshold. Otherwise, checkpoints need ot be triggered when a log synchronisation point is reached - a log force event. Because the log write code already handles chained log vectors, writing the transaction is trivial, too. Construct a transaction header, add it to the head of the chain and write it into the log, then issue a commit record write. Then we can release the checkpoint log ticket and attach the context to the log buffer so it can be called during Io completion to complete the checkpoint. We also need to allow for synchronising multiple in-flight checkpoints. This is needed for two things - the first is to ensure that checkpoint commit records appear in the log in the correct sequence order (so they are replayed in the correct order). The second is so that xfs_log_force_lsn() operates correctly and only flushes and/or waits for the specific sequence it was provided with. To do this we need a wait variable and a list tracking the checkpoint commits in progress. We can walk this list and wait for the checkpoints to change state or complete easily, an this provides the necessary synchronisation for correct operation in both cases. Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_super.c | 10 + fs/xfs/xfs_log.c | 67 ++++- fs/xfs/xfs_log.h | 9 +- fs/xfs/xfs_log_cil.c | 666 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_log_priv.h | 71 +++++- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 144 +++++++++- fs/xfs/xfs_trans.h | 8 +- fs/xfs/xfs_trans_item.c | 5 +- fs/xfs/xfs_trans_priv.h | 12 +- 11 files changed, 963 insertions(+), 31 deletions(-) create mode 100644 fs/xfs/xfs_log_cil.c diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index b4769e4..c8fb13f 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -77,6 +77,7 @@ xfs-y += xfs_alloc.o \ xfs_itable.o \ xfs_dfrag.o \ xfs_log.o \ + xfs_log_cil.o \ xfs_log_recover.o \ xfs_mount.o \ xfs_mru_cache.o \ diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 1e88c98..6a7c8c9 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -118,6 +118,8 @@ mempool_t *xfs_ioend_pool; #define MNTOPT_DMAPI "dmapi" /* DMI enabled (DMAPI / XDSM) */ #define MNTOPT_XDSM "xdsm" /* DMI enabled (DMAPI / XDSM) */ #define MNTOPT_DMI "dmi" /* DMI enabled (DMAPI / XDSM) */ +#define MNTOPT_DELAYLOG "delaylog" /* Delayed loging enabled */ +#define MNTOPT_NODELAYLOG "nodelaylog" /* Delayed loging disabled */ /* * Table driven mount option parser. @@ -373,6 +375,13 @@ xfs_parseargs( mp->m_flags |= XFS_MOUNT_DMAPI; } else if (!strcmp(this_char, MNTOPT_DMI)) { mp->m_flags |= XFS_MOUNT_DMAPI; + } else if (!strcmp(this_char, MNTOPT_DELAYLOG)) { + mp->m_flags |= XFS_MOUNT_DELAYLOG; + cmn_err(CE_WARN, + "Enabling EXPERIMENTAL delayed logging feature " + "- use at your own risk.\n"); + } else if (!strcmp(this_char, MNTOPT_NODELAYLOG)) { + mp->m_flags &= ~XFS_MOUNT_DELAYLOG; } else if (!strcmp(this_char, "ihashsize")) { cmn_err(CE_WARN, "XFS: ihashsize no longer used, option is deprecated."); @@ -534,6 +543,7 @@ xfs_showargs( { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, { XFS_MOUNT_DMAPI, "," MNTOPT_DMAPI }, { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, + { XFS_MOUNT_DELAYLOG, "," MNTOPT_DELAYLOG }, { 0, NULL } }; static struct proc_xfs_info xfs_info_unset[] = { diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 19d0c5f..23f2a05 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -54,9 +54,6 @@ STATIC xlog_t * xlog_alloc_log(xfs_mount_t *mp, STATIC int xlog_space_left(xlog_t *log, int cycle, int bytes); STATIC int xlog_sync(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_dealloc_log(xlog_t *log); -STATIC int xlog_write(struct log *log, struct xfs_log_vec *log_vector, - struct xlog_ticket *tic, xfs_lsn_t *start_lsn, - xlog_in_core_t **commit_iclog, uint flags); /* local state machine functions */ STATIC void xlog_state_done_syncing(xlog_in_core_t *iclog, int); @@ -86,12 +83,6 @@ STATIC int xlog_regrant_write_log_space(xlog_t *log, STATIC void xlog_ungrant_log_space(xlog_t *log, xlog_ticket_t *ticket); - -/* local ticket functions */ -STATIC xlog_ticket_t *xlog_ticket_alloc(xlog_t *log, int unit_bytes, int count, - char clientid, uint flags, - int alloc_flags); - #if defined(DEBUG) STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr); STATIC void xlog_verify_grant_head(xlog_t *log, int equals); @@ -460,6 +451,16 @@ xfs_log_mount( /* Normal transactions can now occur */ mp->m_log->l_flags &= ~XLOG_ACTIVE_RECOVERY; + /* + * Now the log has been fully initialised and we know were our + * space grant counters are, we can initialise the permanent ticket + * needed for delayed logging to work. + */ + error = xlog_cil_init_post_recovery(mp->m_log); + if (error) { + ASSERT(0); + goto out_destroy_ail; + } return 0; out_destroy_ail: @@ -666,6 +667,10 @@ xfs_log_item_init( item->li_ailp = mp->m_ail; item->li_type = type; item->li_ops = ops; + item->li_lv = NULL; + + INIT_LIST_HEAD(&item->li_ail); + INIT_LIST_HEAD(&item->li_cil); } /* @@ -1176,6 +1181,9 @@ xlog_alloc_log(xfs_mount_t *mp, *iclogp = log->l_iclog; /* complete ring */ log->l_iclog->ic_prev = prev_iclog; /* re-write 1st prev ptr */ + error = xlog_cil_init(log); + if (error) + goto out_free_iclog; return log; out_free_iclog: @@ -1502,6 +1510,8 @@ xlog_dealloc_log(xlog_t *log) xlog_in_core_t *iclog, *next_iclog; int i; + xlog_cil_destroy(log); + iclog = log->l_iclog; for (i=0; il_iclog_bufs; i++) { sv_destroy(&iclog->ic_force_wait); @@ -1544,8 +1554,10 @@ xlog_state_finish_copy(xlog_t *log, * print out info relating to regions written which consume * the reservation */ -STATIC void -xlog_print_tic_res(xfs_mount_t *mp, xlog_ticket_t *ticket) +void +xlog_print_tic_res( + struct xfs_mount *mp, + struct xlog_ticket *ticket) { uint i; uint ophdr_spc = ticket->t_res_num_ophdrs * (uint)sizeof(xlog_op_header_t); @@ -1877,7 +1889,7 @@ xlog_write_copy_finish( * we don't update ic_offset until the end when we know exactly how many * bytes have been written out. */ -STATIC int +int xlog_write( struct log *log, struct xfs_log_vec *log_vector, @@ -1901,9 +1913,26 @@ xlog_write( *start_lsn = 0; len = xlog_write_calc_vec_length(ticket, log_vector); - if (ticket->t_curr_res < len) + if (log->l_cilp) { + /* + * Region headers and bytes are already accounted for. + * We only need to take into account start records and + * split regions in this function. + */ + if (ticket->t_flags & XLOG_TIC_INITED) + ticket->t_curr_res -= sizeof(xlog_op_header_t); + + /* + * Commit record headers need to be accounted for. These + * come in as separate writes so are easy to detect. + */ + if (flags & (XLOG_COMMIT_TRANS | XLOG_UNMOUNT_TRANS)) + ticket->t_curr_res -= sizeof(xlog_op_header_t); + } else + ticket->t_curr_res -= len; + + if (ticket->t_curr_res < 0) xlog_print_tic_res(log->l_mp, ticket); - ticket->t_curr_res -= len; index = 0; lv = log_vector; @@ -2999,6 +3028,8 @@ _xfs_log_force( XFS_STATS_INC(xs_log_force); + xlog_cil_push(log, 1); + spin_lock(&log->l_icloglock); iclog = log->l_iclog; @@ -3148,6 +3179,12 @@ _xfs_log_force_lsn( XFS_STATS_INC(xs_log_force); + if (log->l_cilp) { + lsn = xlog_cil_push_lsn(log, lsn); + if (lsn == NULLCOMMITLSN) + return 0; + } + try_again: spin_lock(&log->l_icloglock); iclog = log->l_iclog; @@ -3322,7 +3359,7 @@ xfs_log_get_trans_ident( /* * Allocate and initialise a new log ticket. */ -STATIC xlog_ticket_t * +xlog_ticket_t * xlog_ticket_alloc( struct log *log, int unit_bytes, diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 05f205a..4a0c574 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -113,6 +113,9 @@ struct xfs_log_vec { struct xfs_log_vec *lv_next; /* next lv in build list */ int lv_niovecs; /* number of iovecs in lv */ struct xfs_log_iovec *lv_iovecp; /* iovec array */ + struct xfs_log_item *lv_item; /* owner */ + char *lv_buf; /* formatted buffer */ + int lv_buf_len; /* size of formatted buffer */ }; /* @@ -187,11 +190,15 @@ int xfs_log_need_covered(struct xfs_mount *mp); void xlog_iodone(struct xfs_buf *); -struct xlog_ticket * xfs_log_ticket_get(struct xlog_ticket *ticket); +struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket); void xfs_log_ticket_put(struct xlog_ticket *ticket); xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp); +int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, + struct xfs_log_vec *log_vector, + xfs_lsn_t *commit_lsn, int flags); + #endif diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c new file mode 100644 index 0000000..3cb1957 --- /dev/null +++ b/fs/xfs/xfs_log_cil.c @@ -0,0 +1,666 @@ +/* + * Copyright (c) 2010 Redhat, 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_log.h" +#include "xfs_inum.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_log_priv.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_dir2.h" +#include "xfs_dmapi.h" +#include "xfs_mount.h" +#include "xfs_error.h" +#include "xfs_alloc.h" + +/* + * Perform initial CIL structure initialisation. If the CIL is not + * enabled in this filesystem, ensure the log->l_cilp is null so + * we can check this conditional to determine if we are doing delayed + * logging or not. + */ +int +xlog_cil_init( + struct log *log) +{ + struct xfs_cil *cil; + struct xfs_cil_ctx *ctx; + + log->l_cilp = NULL; + if (!(log->l_mp->m_flags & XFS_MOUNT_DELAYLOG)) + return 0; + + cil = kmem_zalloc(sizeof(*cil), KM_SLEEP|KM_MAYFAIL); + if (!cil) + return ENOMEM; + + ctx = kmem_zalloc(sizeof(*ctx), KM_SLEEP|KM_MAYFAIL); + if (!ctx) { + kmem_free(cil); + return ENOMEM; + } + + INIT_LIST_HEAD(&cil->xc_cil); + INIT_LIST_HEAD(&cil->xc_committing); + spin_lock_init(&cil->xc_cil_lock); + init_rwsem(&cil->xc_ctx_lock); + sv_init(&cil->xc_commit_wait, SV_DEFAULT, "cilwait"); + + INIT_LIST_HEAD(&ctx->committing); + INIT_LIST_HEAD(&ctx->busy_extents); + ctx->sequence = 1; + ctx->cil = cil; + cil->xc_ctx = ctx; + + cil->xc_log = log; + log->l_cilp = cil; + return 0; +} + +void +xlog_cil_destroy( + struct log *log) +{ + if (!log->l_cilp) + return; + + if (log->l_cilp->xc_ctx) { + if (log->l_cilp->xc_ctx->ticket) + xfs_log_ticket_put(log->l_cilp->xc_ctx->ticket); + kmem_free(log->l_cilp->xc_ctx); + } + + ASSERT(list_empty(&log->l_cilp->xc_cil)); + kmem_free(log->l_cilp); +} + +/* + * Allocate a new ticket. Failing to get a new ticket makes it really hard to + * recover, so we don't allow failure here. Also, we allocate in a context that + * we don't want to be issuing transactions from, so we need to tell the + * allocation code this as well. + * + * We don't reserve any space for the ticket - we are going to steal whatever + * space we require from transactions as they commit. To ensure we reserve all + * the space required, we need to set the current reservation of the ticket to + * zero so that we know to steal the initial transaction overhead from the + * first transaction commit. + */ +static struct xlog_ticket * +xlog_cil_ticket_alloc( + struct log *log) +{ + struct xlog_ticket *tic; + + tic = xlog_ticket_alloc(log, 0, 1, XFS_TRANSACTION, 0, + KM_SLEEP|KM_NOFS); + tic->t_trans_type = XFS_TRANS_CHECKPOINT; + + /* + * set the current reservation to zero so we know to steal the basic + * transaction overhead reservation from the first transaction commit. + */ + tic->t_curr_res = 0; + return tic; +} + +/* + * After the first stage of log recovery is done, we know where the head and + * tail of the log are. We need this log initialisation done before we can + * initialise the first CIL checkpoint context. + * + * Here we allocate a log ticket to track space usage during a CIL push. This + * ticket is passed to xlog_write() directly so that we don't slowly leak log + * space by failing to account for space used by log headers and additional + * region headers for split regions. + */ +int +xlog_cil_init_post_recovery( + struct log *log) +{ + if (!log->l_cilp) + return 0; + + log->l_cilp->xc_ctx->ticket = xlog_cil_ticket_alloc(log); + log->l_cilp->xc_ctx->sequence = 1; + log->l_cilp->xc_ctx->commit_lsn = xlog_assign_lsn(log->l_curr_cycle, + log->l_curr_block); + return 0; +} + +/* + * Insert the log item into the CIL and calculate the difference in space + * consumed by the item. Add the space to the checkpoint ticket and calculate + * if the change requires additional log metadata. If it does, take that space + * as well. Remove the amount of space we addded to the checkpoint ticket from + * the current transaction ticket so that the accounting works out correctly. + * + * If this is the first time the item is being placed into the CIL in this + * context, pin it so it can't be written to disk until the CIL is flushed to + * the iclog and the iclog written to disk. + */ +static void +xlog_cil_insert( + struct log *log, + struct xlog_ticket *ticket, + struct xfs_log_item *item, + struct xfs_log_vec *lv) +{ + struct xfs_cil *cil = log->l_cilp; + struct xfs_log_vec *old = lv->lv_item->li_lv; + struct xfs_cil_ctx *ctx = cil->xc_ctx; + int len; + int diff_iovecs; + int iclog_space; + + if (old) { + /* existing lv on log item, space used is a delta */ + ASSERT(!list_empty(&item->li_cil)); + ASSERT(old->lv_buf && old->lv_buf_len && old->lv_niovecs); + + len = lv->lv_buf_len - old->lv_buf_len; + diff_iovecs = lv->lv_niovecs - old->lv_niovecs; + kmem_free(old->lv_buf); + kmem_free(old); + } else { + /* new lv, must pin the log item */ + ASSERT(!lv->lv_item->li_lv); + ASSERT(list_empty(&item->li_cil)); + + len = lv->lv_buf_len; + diff_iovecs = lv->lv_niovecs; + IOP_PIN(lv->lv_item); + + } + len += diff_iovecs * sizeof(xlog_op_header_t); + + /* attach new log vector to log item */ + lv->lv_item->li_lv = lv; + + spin_lock(&cil->xc_cil_lock); + list_move_tail(&item->li_cil, &cil->xc_cil); + ctx->nvecs += diff_iovecs; + + /* + * Now transfer enough transaction reservation to the context ticket + * for the checkpoint. The context ticket is special - the unit + * reservation has to grow as well as the current reservation as we + * steal from tickets so we can correctly determine the space used + * during the transaction commit. + */ + if (ctx->ticket->t_curr_res == 0) { + /* first commit in checkpoint, steal the header reservation */ + ASSERT(ticket->t_curr_res >= ctx->ticket->t_unit_res + len); + ctx->ticket->t_curr_res = ctx->ticket->t_unit_res; + ticket->t_curr_res -= ctx->ticket->t_unit_res; + } + + /* do we need space for more log record headers? */ + iclog_space = log->l_iclog_size - log->l_iclog_hsize; + if (len > 0 && (ctx->space_used / iclog_space != + (ctx->space_used + len) / iclog_space)) { + int hdrs; + + hdrs = (len + iclog_space - 1) / iclog_space; + /* need to take into account split region headers, too */ + hdrs *= log->l_iclog_hsize + sizeof(struct xlog_op_header); + ctx->ticket->t_unit_res += hdrs; + ctx->ticket->t_curr_res += hdrs; + ticket->t_curr_res -= hdrs; + ASSERT(ticket->t_curr_res >= len); + } + ticket->t_curr_res -= len; + ctx->space_used += len; + + spin_unlock(&cil->xc_cil_lock); +} + +/* + * Format log item into a flat buffers + * + * For delayed logging, we need to hold a formatted buffer containing + * all the changes on the log item. This enables us to relog the item + * in memory and write it out asynchronously without needing to relock + * the object that was modified at the time it gets written into the + * iclog. + * + * This function works out the length of the buffer needed for each + * log item, allocates them and formats the the log vector for the item + * into the buffer. The buffer is then attached to the log item and the + * vector is formatted into the buffer. The log item and formatted log vector + * are then inserted into the Committed Item List for tracking until the + * next checkpoint is written out. + */ +static void +xlog_cil_format_items( + struct log *log, + struct xfs_log_vec *log_vector, + struct xlog_ticket *ticket, + xfs_lsn_t *start_lsn) +{ + struct xfs_log_vec *lv; + + if (start_lsn) + *start_lsn = log->l_cilp->xc_ctx->sequence; + + /* + * we don't set up region headers here; we simply copy the regions into + * the flat buffer. We can do this because we still have to do a + * formatting step to write the regions into the iclog buffer. Writing + * the ophdrs during the iclog write means that we can support + * splitting large regions across iclog boundares without needing a + * change in the format of the item/region encapsulation. + * + * Hence what we need to do now is change the vector buffer pointer to + * point to the copied region inside the buffer we just allocated. This + * allows us to format the regions into the iclog as though they are + * being formatted directly out of the objects themselves. + */ + ASSERT(log_vector); + for (lv = log_vector; lv; lv = lv->lv_next) { + void *ptr; + int index; + int offset = 0; + int len = 0; + + for (index = 0; index < lv->lv_niovecs; index++) + len += lv->lv_iovecp[index].i_len; + + lv->lv_buf_len = len; + lv->lv_buf = kmem_zalloc(lv->lv_buf_len, KM_SLEEP|KM_NOFS); + ptr = lv->lv_buf; + + for (index = 0; index < lv->lv_niovecs; index++) { + struct xfs_log_iovec *vec = &lv->lv_iovecp[index]; + + memcpy(ptr, vec->i_addr, vec->i_len); + vec->i_addr = ptr; + xlog_write_adv_cnt(&ptr, &len, &offset, vec->i_len); + } + ASSERT(len == 0); + + xlog_cil_insert(log, ticket, lv->lv_item, lv); + } +} + +static void +xlog_cil_free_logvec( + struct xfs_log_vec *log_vector) +{ + struct xfs_log_vec *lv; + + for (lv = log_vector; lv; ) { + struct xfs_log_vec *next = lv->lv_next; + kmem_free(lv->lv_buf); + kmem_free(lv); + lv = next; + } +} + +/* + * Commit a transaction with the given vector to the Committed Item List. + * + * To do this, we need to format the item, pin it in memory if required and + * account for the space used by the transaction. Once we have done that we + * need to release the unused reservation for the transaction, attach the + * transaction to the checkpoint context so we carry the busy extents through + * to checkpoint completion, and then unlock all the items in the transaction. + * + * For more specific information about the order of operations in + * xfs_log_commit_cil() please refer to the comments in + * xfs_trans_commit_iclog(). + */ +int +xfs_log_commit_cil( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_log_vec *log_vector, + xfs_lsn_t *commit_lsn, + int flags) +{ + struct log *log = mp->m_log; + int log_flags = 0; + + if (flags & XFS_TRANS_RELEASE_LOG_RES) + log_flags = XFS_LOG_REL_PERM_RESERV; + + if (XLOG_FORCED_SHUTDOWN(log)) { + xlog_cil_free_logvec(log_vector); + return XFS_ERROR(EIO); + } + + /* lock out background commit */ + down_read(&log->l_cilp->xc_ctx_lock); + xlog_cil_format_items(log, log_vector, tp->t_ticket, commit_lsn); + + /* check we didn't blow the reservation */ + if (tp->t_ticket->t_curr_res < 0) + xlog_print_tic_res(log->l_mp, tp->t_ticket); + + /* attach the transaction to the CIL if it has any busy extents */ + if (!list_empty(&tp->t_busy)) { + spin_lock(&log->l_cilp->xc_cil_lock); + list_splice_init(&tp->t_busy, + &log->l_cilp->xc_ctx->busy_extents); + spin_unlock(&log->l_cilp->xc_cil_lock); + } + + tp->t_commit_lsn = *commit_lsn; + xfs_log_done(mp, tp->t_ticket, NULL, log_flags); + xfs_trans_unreserve_and_mod_sb(tp); + + /* background commit is allowed again */ + up_read(&log->l_cilp->xc_ctx_lock); + current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + + /* xfs_trans_free_items() unlocks them first */ + xfs_trans_free_items(tp, *commit_lsn, 0); + xfs_trans_free(tp); + return 0; +} + +/* + * Mark all items committed and clear busy extents. We free the log vector + * chains in a separate pass so that we unpin the log items as quickly as + * possible. + */ +static void +xlog_cil_committed( + void *args, + int abort) +{ + struct xfs_cil_ctx *ctx = args; + struct xfs_log_vec *lv; + int abortflag = abort ? XFS_LI_ABORTED : 0; + struct xfs_busy_extent *busyp, *n; + + /* unpin all the log items */ + for (lv = ctx->lv_chain; lv; lv = lv->lv_next ) { + xfs_trans_item_committed(lv->lv_item, ctx->start_lsn, + abortflag); + } + + list_for_each_entry_safe(busyp, n, &ctx->busy_extents, list) + xfs_alloc_busy_clear(ctx->cil->xc_log->l_mp, busyp); + + spin_lock(&ctx->cil->xc_cil_lock); + list_del(&ctx->committing); + spin_unlock(&ctx->cil->xc_cil_lock); + + xlog_cil_free_logvec(ctx->lv_chain); + kmem_free(ctx); +} + +/* + * Push the Committed Item List to the log. If the push_now flag is not set, + * then it is a background flush and so we can chose to ignore it. + */ +int +xlog_cil_push( + struct log *log, + int push_now) +{ + struct xfs_cil *cil = log->l_cilp; + struct xfs_log_vec *lv; + struct xfs_cil_ctx *ctx; + struct xfs_cil_ctx *new_ctx; + struct xlog_in_core *commit_iclog; + struct xlog_ticket *tic; + int num_lv; + int num_iovecs; + int len; + int error = 0; + struct xfs_trans_header thdr; + struct xfs_log_iovec lhdr; + struct xfs_log_vec lvhdr = { NULL }; + xfs_lsn_t commit_lsn; + + if (!cil) + return 0; + + /* XXX: don't sleep for background? */ + new_ctx = kmem_zalloc(sizeof(*new_ctx), KM_SLEEP|KM_NOFS); + new_ctx->ticket = xlog_cil_ticket_alloc(log); + + /* lock out transaction commit */ + down_write(&cil->xc_ctx_lock); + ctx = cil->xc_ctx; + + /* check if we've anything to push */ + if (list_empty(&cil->xc_cil)) { + up_write(&cil->xc_ctx_lock); + xfs_log_ticket_put(new_ctx->ticket); + kmem_free(new_ctx); + return 0; + } + + /* + * pull all the log vectors off the items in the CIL, and + * remove the items from the CIL. We don't need the CIL lock + * here because it's only needed on the transaction commit + * side which is currently locked out by the flush lock. + */ + lv = NULL; + num_lv = 0; + num_iovecs = 0; + len = 0; + while (!list_empty(&cil->xc_cil)) { + struct xfs_log_item *item; + int i; + + item = list_first_entry(&cil->xc_cil, + struct xfs_log_item, li_cil); + list_del_init(&item->li_cil); + if (!ctx->lv_chain) + ctx->lv_chain = item->li_lv; + else + lv->lv_next = item->li_lv; + lv = item->li_lv; + item->li_lv = NULL; + + num_lv++; + num_iovecs += lv->lv_niovecs; + for (i = 0; i < lv->lv_niovecs; i++) + len += lv->lv_iovecp[i].i_len; + } + + /* + * initialise the new context and attach it to the CIL. Then attach + * the current context to the CIL committing lsit so it can be found + * during log forces to extract the commit lsn of the sequence that + * needs to be forced. + */ + INIT_LIST_HEAD(&new_ctx->committing); + INIT_LIST_HEAD(&new_ctx->busy_extents); + new_ctx->sequence = ctx->sequence + 1; + new_ctx->cil = cil; + cil->xc_ctx = new_ctx; + + /* + * The switch is now done, so we can drop the context lock and move out + * of a shared context. We can't just go straight to the commit record, + * though - we need to synchronise with previous and future commits so + * that the commit records are correctly ordered in the log to ensure + * that we process items during log IO completion in the correct order. + * + * For example, if we get an EFI in one checkpoint and the EFD in the + * next (e.g. due to log forces), we do not want the checkpoint with + * the EFD to be committed before the checkpoint with the EFI. Hence + * we must strictly order the commit records of the checkpoints so + * that: a) the checkpoint callbacks are attached to the iclogs in the + * correct order; and b) the checkpoints are replayed in correct order + * in log recovery. + * + * Hence we need to add this context to the committing context list so + * that higher sequences will wait for us to write out a commit record + * before they do. + */ + spin_lock(&cil->xc_cil_lock); + list_add(&ctx->committing, &cil->xc_committing); + spin_unlock(&cil->xc_cil_lock); + up_write(&cil->xc_ctx_lock); + + /* + * Build a checkpoint transaction header and write it to the log to + * begin the transaction. We need to account for the space used by the + * transaction header here as it is not accounted for in xlog_write(). + * + * The LSN we need to pass to the log items on transaction commit is + * the LSN reported by the first log vector write. If we use the commit + * record lsn then we can move the tail beyond the grant write head. + */ + tic = ctx->ticket; + thdr.th_magic = XFS_TRANS_HEADER_MAGIC; + thdr.th_type = XFS_TRANS_CHECKPOINT; + thdr.th_tid = tic->t_tid; + thdr.th_num_items = num_iovecs; + lhdr.i_addr = (xfs_caddr_t)&thdr; + lhdr.i_len = sizeof(xfs_trans_header_t); + lhdr.i_type = XLOG_REG_TYPE_TRANSHDR; + tic->t_curr_res -= lhdr.i_len + sizeof(xlog_op_header_t); + + lvhdr.lv_niovecs = 1; + lvhdr.lv_iovecp = &lhdr; + lvhdr.lv_next = ctx->lv_chain; + + error = xlog_write(log, &lvhdr, tic, &ctx->start_lsn, NULL, 0); + if (error) + goto out_abort; + + /* + * now that we've written the checkpoint into the log, strictly + * order the commit records so replay will get them in the right order. + */ +restart: + spin_lock(&cil->xc_cil_lock); + list_for_each_entry(new_ctx, &cil->xc_committing, committing) { + /* + * Higher sequences will wait for this one so skip them. + * Don't wait for own own sequence, either. + */ + if (new_ctx->sequence >= ctx->sequence) + continue; + if (!new_ctx->commit_lsn) { + /* + * It is still being pushed! Wait for the push to + * complete, then start again from the beginning. + */ + sv_wait(&cil->xc_commit_wait, 0, &cil->xc_cil_lock, 0); + goto restart; + } + } + spin_unlock(&cil->xc_cil_lock); + + commit_lsn = xfs_log_done(log->l_mp, tic, &commit_iclog, 0); + if (error || commit_lsn == -1) + goto out_abort; + + /* attach all the transactions w/ busy extents to iclog */ + ctx->log_cb.cb_func = xlog_cil_committed; + ctx->log_cb.cb_arg = ctx; + error = xfs_log_notify(log->l_mp, commit_iclog, &ctx->log_cb); + if (error) + goto out_abort; + + /* + * now the checkpoint commit is complete and we've attached the + * callbacks to the iclog we can assign the commit LSN to the context + * and wake up anyone who is waiting for the commit to complete. + */ + spin_lock(&cil->xc_cil_lock); + ctx->commit_lsn = commit_lsn; + sv_broadcast(&cil->xc_commit_wait); + spin_unlock(&cil->xc_cil_lock); + + /* release the hounds! */ + return xfs_log_release_iclog(log->l_mp, commit_iclog); + +out_abort: + xlog_cil_committed(ctx, XFS_LI_ABORTED); + return XFS_ERROR(EIO); +} + +/* + * Conditionally push the CIL based on the sequence passed in. + * + * We only need to push if we haven't already pushed the sequence + * number given. Hence the only time we will trigger a push here is + * if the push sequence is the same as the current context. + * + * We return the current commit lsn to allow the callers to determine if a + * iclog flush is necessary following this call. + * + * XXX: Initially, just push the CIL unconditionally and return whatever + * commit lsn is there. It'll be empty, so this is broken for now. + */ +xfs_lsn_t +xlog_cil_push_lsn( + struct log *log, + xfs_lsn_t push_seq) +{ + struct xfs_cil *cil = log->l_cilp; + struct xfs_cil_ctx *ctx; + xfs_lsn_t commit_lsn = NULLCOMMITLSN; + +restart: + down_write(&cil->xc_ctx_lock); + ASSERT(push_seq <= cil->xc_ctx->sequence); + + /* check to see if we need to force out the current context */ + if (push_seq == cil->xc_ctx->sequence) { + up_write(&cil->xc_ctx_lock); + xlog_cil_push(log, 1); + goto restart; + } + + /* + * See if we can find a previous sequence still committing. + * We can drop the flush lock as soon as we have the cil lock + * because we are now only comparing contexts protected by + * the cil lock. + * + * We need to wait for all previous sequence commits to complete + * before allowing the force of push_seq to go ahead. Hence block + * on commits for those as well. + */ + spin_lock(&cil->xc_cil_lock); + up_write(&cil->xc_ctx_lock); + list_for_each_entry(ctx, &cil->xc_committing, committing) { + if (ctx->sequence > push_seq) + continue; + if (!ctx->commit_lsn) { + /* + * It is still being pushed! Wait for the push to + * complete, then start again from the beginning. + */ + sv_wait(&cil->xc_commit_wait, 0, &cil->xc_cil_lock, 0); + goto restart; + } + if (ctx->sequence != push_seq) + continue; + /* found it! */ + commit_lsn = ctx->commit_lsn; + } + spin_unlock(&cil->xc_cil_lock); + return commit_lsn; +} + diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index ac97bdd..f9a0e64 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -377,6 +377,54 @@ typedef struct xlog_in_core { } xlog_in_core_t; /* + * The CIL context is used to aggregate per-transaction details as well be + * passed to the iclog for checkpoint post-commit processing. After being + * passed to the iclog, another context needs to be allocated for tracking the + * next set of transactions to be aggregated into a checkpoint. + */ +struct xfs_cil; + +struct xfs_cil_ctx { + struct xfs_cil *cil; + xfs_lsn_t sequence; /* chkpt sequence # */ + xfs_lsn_t start_lsn; /* first LSN of chkpt commit */ + xfs_lsn_t commit_lsn; /* chkpt commit record lsn */ + struct xlog_ticket *ticket; /* chkpt ticket */ + int nvecs; /* number of regions */ + int space_used; /* aggregate size of regions */ + struct list_head busy_extents; /* busy extents in chkpt */ + struct xfs_log_vec *lv_chain; /* logvecs being pushed */ + xfs_log_callback_t log_cb; /* completion callback hook. */ + struct list_head committing; /* ctx committing list */ +}; + +/* + * Committed Item List structure + * + * This structure is used to track log items that have been committed but not + * yet written into the log. It is used only when the delayed logging mount + * option is enabled. + * + * This structure tracks the list of committing checkpoint contexts so + * we can avoid the problem of having to hold out new transactions during a + * flush until we have a the commit record LSN of the checkpoint. We can + * traverse the list of committing contexts in xlog_cil_push_lsn() to find a + * sequence match and extract the commit LSN directly from there. If the + * checkpoint is still in the process of committing, we can block waiting for + * the commit LSN to be determined as well. This should make synchronous + * operations almost as efficient as the old logging methods. + */ +struct xfs_cil { + struct log *xc_log; + struct list_head xc_cil; + spinlock_t xc_cil_lock; + struct xfs_cil_ctx *xc_ctx; + struct rw_semaphore xc_ctx_lock; + struct list_head xc_committing; + sv_t xc_commit_wait; +}; + +/* * The reservation head lsn is not made up of a cycle number and block number. * Instead, it uses a cycle number and byte number. Logs don't expect to * overflow 31 bits worth of byte offset, so using a byte number will mean @@ -386,6 +434,7 @@ typedef struct log { /* The following fields don't need locking */ struct xfs_mount *l_mp; /* mount point */ struct xfs_ail *l_ailp; /* AIL log is working with */ + struct xfs_cil *l_cilp; /* CIL log is working with */ struct xfs_buf *l_xbuf; /* extra buffer for log * wrapping */ struct xfs_buftarg *l_targ; /* buftarg of log */ @@ -436,14 +485,17 @@ typedef struct log { #define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) - /* common routines */ extern xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); extern int xlog_recover(xlog_t *log); extern int xlog_recover_finish(xlog_t *log); extern void xlog_pack_data(xlog_t *log, xlog_in_core_t *iclog, int); -extern kmem_zone_t *xfs_log_ticket_zone; +extern kmem_zone_t *xfs_log_ticket_zone; +struct xlog_ticket *xlog_ticket_alloc(struct log *log, int unit_bytes, + int count, char client, uint xflags, + int alloc_flags); + static inline void xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes) @@ -453,6 +505,21 @@ xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes) *off += bytes; } +void xlog_print_tic_res(struct xfs_mount *mp, struct xlog_ticket *ticket); +int xlog_write(struct log *log, struct xfs_log_vec *log_vector, + struct xlog_ticket *tic, xfs_lsn_t *start_lsn, + xlog_in_core_t **commit_iclog, uint flags); + +/* + * Committed Item List interfaces + */ +int xlog_cil_init(struct log *log); +int xlog_cil_init_post_recovery(struct log *log); +void xlog_cil_destroy(struct log *log); + +int xlog_cil_push(struct log *log, int push_now); +xfs_lsn_t xlog_cil_push_lsn(struct log *log, xfs_lsn_t push_sequence); + /* * Unmount record type is used as a pseudo transaction type for the ticket. * It's value must be outside the range of XFS_TRANS_* values. diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 9ff48a1..1d2c7ee 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -268,6 +268,7 @@ typedef struct xfs_mount { #define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops must be synchronous except for space allocations */ +#define XFS_MOUNT_DELAYLOG (1ULL << 1) /* delayed logging is enabled */ #define XFS_MOUNT_DMAPI (1ULL << 2) /* dmapi is enabled */ #define XFS_MOUNT_WAS_CLEAN (1ULL << 3) #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 40d9595..9bdb492 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -253,7 +253,7 @@ _xfs_trans_alloc( * Free the transaction structure. If there is more clean up * to do when the structure is freed, add it here. */ -STATIC void +void xfs_trans_free( struct xfs_trans *tp) { @@ -655,7 +655,7 @@ xfs_trans_apply_sb_deltas( * XFS_TRANS_SB_DIRTY will not be set when the transaction is updated but we * still need to update the incore superblock with the changes. */ -STATIC void +void xfs_trans_unreserve_and_mod_sb( xfs_trans_t *tp) { @@ -883,7 +883,7 @@ xfs_trans_fill_vecs( * they could be immediately flushed and we'd have to race with the flusher * trying to pull the item from the AIL as we add it. */ -static void +void xfs_trans_item_committed( struct xfs_log_item *lip, xfs_lsn_t commit_lsn, @@ -994,7 +994,7 @@ xfs_trans_uncommit( xfs_trans_unreserve_and_mod_sb(tp); xfs_trans_unreserve_and_mod_dquots(tp); - xfs_trans_free_items(tp, flags); + xfs_trans_free_items(tp, NULLCOMMITLSN, flags); xfs_trans_free(tp); } @@ -1144,6 +1144,132 @@ xfs_trans_commit_iclog( return xfs_log_release_iclog(mp, commit_iclog); } +/* + * Walk the log items and allocate log vector structures for + * each item large enough to fit all the vectors they require. + * Note that this format differs from the old log vector format in + * that there is no transaction header in these log vectors. + */ +STATIC struct xfs_log_vec * +xfs_trans_alloc_log_vecs( + xfs_trans_t *tp) +{ + xfs_log_item_desc_t *lidp; + struct xfs_log_vec *lv = NULL; + struct xfs_log_vec *ret_lv = NULL; + + lidp = xfs_trans_first_item(tp); + + /* Bail out if we didn't find a log item. */ + if (!lidp) { + ASSERT(0); + return NULL; + } + + while (lidp != NULL) { + struct xfs_log_vec *new_lv; + + /* Skip items which aren't dirty in this transaction. */ + if (!(lidp->lid_flags & XFS_LID_DIRTY)) { + lidp = xfs_trans_next_item(tp, lidp); + continue; + } + + /* Skip items that do not have any vectors for writing */ + lidp->lid_size = IOP_SIZE(lidp->lid_item); + if (!lidp->lid_size) { + lidp = xfs_trans_next_item(tp, lidp); + continue; + } + + new_lv = kmem_zalloc(sizeof(*new_lv) + + lidp->lid_size * sizeof(struct xfs_log_iovec), + KM_SLEEP); + + /* The allocated iovec region lies beyond the log vector. */ + new_lv->lv_iovecp = (struct xfs_log_iovec *)&new_lv[1]; + if (!ret_lv) + ret_lv = new_lv; + else + lv->lv_next = new_lv; + lv = new_lv; + lidp = xfs_trans_next_item(tp, lidp); + } + + return ret_lv; +} + +/* + * Fill in the vector with pointers to data to be logged + * by this transaction. + * Each dirty item takes the + * number of vectors it indicated it needed in xfs_trans_alloc_log_vecs(). + * There is no transaction header in this format. + * + * We do not pin the items here as they are formatted, we leave that to + * the CIL commit. This is done because the pinning of the item is + * conditional on whether the item is already pinned in the CIL. Hence + * the check and pin must be done under the protection of the flush lock. + */ +STATIC void +xfs_trans_fill_log_vecs( + struct xfs_trans *tp, + struct xfs_log_vec *log_vector) +{ + xfs_log_item_desc_t *lidp; + struct xfs_log_vec *lv = log_vector; + + lidp = xfs_trans_first_item(tp); + ASSERT(lidp); + while (lidp) { + /* + * Skip items which aren't dirty in this transaction. + */ + if (!(lidp->lid_flags & XFS_LID_DIRTY)) { + lidp = xfs_trans_next_item(tp, lidp); + continue; + } + /* Skip items that do not have any vectors for writing */ + if (!lidp->lid_size) { + lidp = xfs_trans_next_item(tp, lidp); + continue; + } + IOP_FORMAT(lidp->lid_item, lv->lv_iovecp); + lv->lv_niovecs = lidp->lid_size; + lv->lv_item = lidp->lid_item; + + lidp = xfs_trans_next_item(tp, lidp); + lv = lv->lv_next; + } +} + +static int +xfs_trans_commit_cil( + struct xfs_mount *mp, + struct xfs_trans *tp, + xfs_lsn_t *commit_lsn, + int flags) +{ + struct xfs_log_vec *log_vector; + + /* + * Get each log item to allocate a vector structure for + * the log item to to pass to the log write code. + */ + log_vector = xfs_trans_alloc_log_vecs(tp); + if (!log_vector) + return ENOMEM; + + /* + * Fill in the log_vector and pin the logged items, and + * then write the transaction to the log. We have to lock + * out CIL flushes from this point as we are going to pin + */ + xfs_trans_fill_log_vecs(tp, log_vector); + + return xfs_log_commit_cil(mp, tp, log_vector, commit_lsn, flags); + +} /* * xfs_trans_commit @@ -1204,7 +1330,11 @@ _xfs_trans_commit( xfs_trans_apply_sb_deltas(tp); xfs_trans_apply_dquot_deltas(tp); - error = xfs_trans_commit_iclog(mp, tp, &commit_lsn, flags); + if (mp->m_flags & XFS_MOUNT_DELAYLOG) + error = xfs_trans_commit_cil(mp, tp, &commit_lsn, flags); + else + error = xfs_trans_commit_iclog(mp, tp, &commit_lsn, flags); + if (error == ENOMEM) { xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); error = XFS_ERROR(EIO); @@ -1242,7 +1372,7 @@ out_unreserve: error = XFS_ERROR(EIO); } current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); - xfs_trans_free_items(tp, error ? XFS_TRANS_ABORT : 0); + xfs_trans_free_items(tp, NULLCOMMITLSN, error ? XFS_TRANS_ABORT : 0); xfs_trans_free(tp); XFS_STATS_INC(xs_trans_empty); @@ -1320,7 +1450,7 @@ xfs_trans_cancel( /* mark this thread as no longer being in a transaction */ current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); - xfs_trans_free_items(tp, flags); + xfs_trans_free_items(tp, NULLCOMMITLSN, flags); xfs_trans_free(tp); } diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index ff7e9e6..b1ea20c 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -106,7 +106,8 @@ typedef struct xfs_trans_header { #define XFS_TRANS_GROWFSRT_FREE 39 #define XFS_TRANS_SWAPEXT 40 #define XFS_TRANS_SB_COUNT 41 -#define XFS_TRANS_TYPE_MAX 41 +#define XFS_TRANS_CHECKPOINT 42 +#define XFS_TRANS_TYPE_MAX 42 /* new transaction types need to be reflected in xfs_logprint(8) */ #define XFS_TRANS_TYPES \ @@ -148,6 +149,7 @@ typedef struct xfs_trans_header { { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ { XFS_TRANS_SB_COUNT, "SB_COUNT" }, \ + { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ { XFS_TRANS_DUMMY1, "DUMMY1" }, \ { XFS_TRANS_DUMMY2, "DUMMY2" }, \ { XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" } @@ -829,6 +831,10 @@ typedef struct xfs_log_item { /* buffer item iodone */ /* callback func */ struct xfs_item_ops *li_ops; /* function list */ + + /* delayed logging */ + struct list_head li_cil; /* CIL pointers */ + struct xfs_log_vec *li_lv; /* active log vector */ } xfs_log_item_t; #define XFS_LI_IN_AIL 0x1 diff --git a/fs/xfs/xfs_trans_item.c b/fs/xfs/xfs_trans_item.c index 2937a1e..f11d37d 100644 --- a/fs/xfs/xfs_trans_item.c +++ b/fs/xfs/xfs_trans_item.c @@ -299,6 +299,7 @@ xfs_trans_next_item(xfs_trans_t *tp, xfs_log_item_desc_t *lidp) void xfs_trans_free_items( xfs_trans_t *tp, + xfs_lsn_t commit_lsn, int flags) { xfs_log_item_chunk_t *licp; @@ -311,7 +312,7 @@ xfs_trans_free_items( * Special case the embedded chunk so we don't free it below. */ if (!xfs_lic_are_all_free(licp)) { - (void) xfs_trans_unlock_chunk(licp, 1, abort, NULLCOMMITLSN); + (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn); xfs_lic_all_free(licp); licp->lic_unused = 0; } @@ -322,7 +323,7 @@ xfs_trans_free_items( */ while (licp != NULL) { ASSERT(!xfs_lic_are_all_free(licp)); - (void) xfs_trans_unlock_chunk(licp, 1, abort, NULLCOMMITLSN); + (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn); next_licp = licp->lic_next; kmem_free(licp); licp = next_licp; diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 901dc0f..330fa5f 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -35,9 +35,15 @@ struct xfs_log_item_desc *xfs_trans_find_item(struct xfs_trans *, struct xfs_log_item_desc *xfs_trans_first_item(struct xfs_trans *); struct xfs_log_item_desc *xfs_trans_next_item(struct xfs_trans *, struct xfs_log_item_desc *); -void xfs_trans_free_items(struct xfs_trans *, int); -void xfs_trans_unlock_items(struct xfs_trans *, - xfs_lsn_t); + +void xfs_trans_unlock_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn); +void xfs_trans_free_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn, + int flags); + +void xfs_trans_item_committed(struct xfs_log_item *lip, + xfs_lsn_t commit_lsn, int aborted); +void xfs_trans_unreserve_and_mod_sb(struct xfs_trans *tp); +void xfs_trans_free(struct xfs_trans *tp); /* * AIL traversal cursor. -- 1.5.6.5 From kb@sysmikro.com.pl Fri May 7 03:21:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o478L9gU154608 for ; Fri, 7 May 2010 03:21:10 -0500 X-ASG-Debug-ID: 1273220597-571901c10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from v007470.home.net.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id DCEB2966B54 for ; Fri, 7 May 2010 01:23:17 -0700 (PDT) Received: from v007470.home.net.pl (v007470.home.net.pl [212.85.125.104]) by cuda.sgi.com with SMTP id 0nJcmxqblHY01vqH for ; Fri, 07 May 2010 01:23:17 -0700 (PDT) Received: from 217.8.165.66 [217.8.165.66] (HELO linux2g2g.site) by sysmikro.home.pl [212.85.125.104] with SMTP (IdeaSmtpServer v0.70) id c675c96eb20eba45; Fri, 7 May 2010 10:23:13 +0200 From: Krzysztof =?utf-8?q?B=C5=82aszkowski?= Organization: Systemy mikroprocesorowe To: xfs@oss.sgi.com X-ASG-Orig-Subj: posix_fallocate Subject: posix_fallocate Date: Fri, 7 May 2010 10:22:37 +0200 User-Agent: KMail/1.9.5 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <201005071022.37863.kb@sysmikro.com.pl> X-Barracuda-Connect: v007470.home.net.pl[212.85.125.104] X-Barracuda-Start-Time: 1273220600 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.2, rules version 3.2.2.29258 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello, I use this to preallocate large space but found an issue. Posix_fallocate works right with sizes like 100G, 1T and even 10T on some boxes (on some other can fail after e.g. 7T threshold) but if i tried e.g. 16T the user space process would be "R"unning forever and it is not interruptible. Furthermore some other not related processes like sshd, bash enter D state. There is nothing in kernel log. I made so far a few logs with ftrace facility for 1G, 100G, 1T and 10T sizes. I noticed that for 1st three sizes the log is as long as abt 1.5M (2M peak) while 10T generates 94M long log. I couldn't retrieve a log for 17T case because "cat /sys ... /trace" enters D. I would appreciate any help because i gave up with ftrace logs analysis. The xfs_vn_fallocate is covered in abt 11k lines for a 1.5M log case while there are abt 163k lines in 94M log. And all i could see is poss some relationship between time spent in xfs_vn_fallocate subfunctions vs requested space. Box details: 16 Hitachi 2TB drives (backplane connected), dm, 1 lvm lun of 25T size, kernel 2.6.31.5, more recent kernels neither xfs were not tested. Regards, Krzysztof Blaszkowski From stan@hardwarefreak.com Fri May 7 04:19:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o479JBOR156614 for ; Fri, 7 May 2010 04:19:12 -0500 X-ASG-Debug-ID: 1273224081-7c7200b30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 271BC1BD5AC9 for ; Fri, 7 May 2010 02:21:21 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id gtbSYdUG0x4szXtU for ; Fri, 07 May 2010 02:21:21 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id A56466C04C for ; Fri, 7 May 2010 04:21:20 -0500 (CDT) Message-ID: <4BE3DC2D.3000607@hardwarefreak.com> Date: Fri, 07 May 2010 04:23:57 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate References: <201005071022.37863.kb@sysmikro.com.pl> In-Reply-To: <201005071022.37863.kb@sysmikro.com.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1273224082 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29263 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Krzysztof BĹ‚aszkowski put forth on 5/7/2010 3:22 AM: > Hello, > > I use this to preallocate large space but found an issue. Posix_fallocate > works right with sizes like 100G, 1T and even 10T on some boxes (on some > other can fail after e.g. 7T threshold) but if i tried e.g. 16T the user > space process would be "R"unning forever and it is not interruptible. > Furthermore some other not related processes like sshd, bash enter D state. > There is nothing in kernel log. > > I made so far a few logs with ftrace facility for 1G, 100G, 1T and 10T sizes. > I noticed that for 1st three sizes the log is as long as abt 1.5M (2M peak) > while 10T generates 94M long log. I couldn't retrieve a log for 17T case > because "cat /sys ... /trace" enters D. > > I would appreciate any help because i gave up with ftrace logs analysis. The > xfs_vn_fallocate is covered in abt 11k lines for a 1.5M log case while there > are abt 163k lines in 94M log. And all i could see is poss some relationship > between time spent in xfs_vn_fallocate subfunctions vs requested space. > > Box details: > 16 Hitachi 2TB drives (backplane connected), dm, 1 lvm lun of 25T size, > kernel 2.6.31.5, more recent kernels neither xfs were not tested. 32 or 64 bit kernel? What is the size of the XFS filesystem on the 25TB LVM LUN against which you're running posix_fallocate? The reason I ask is that XFS has a 16TB per filesystem limitation on 32 bit kernels. I can only assume that your XFS filesystem is larger than 16TB since you're attempting to posix_fallocate 16TB. But, it's best to ask for confirmation rather than assume, especially given that your problem is appearing near that magical 16TB boundary. -- Stan From kb@sysmikro.com.pl Fri May 7 04:46:31 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o479kVQK157596 for ; Fri, 7 May 2010 04:46:31 -0500 X-ASG-Debug-ID: 1273225721-4c4700260000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from v007470.home.net.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id DDBC81493892 for ; Fri, 7 May 2010 02:48:42 -0700 (PDT) Received: from v007470.home.net.pl (v007470.home.net.pl [212.85.125.104]) by cuda.sgi.com with SMTP id 3VhUg3eIS7zpN4fi for ; Fri, 07 May 2010 02:48:42 -0700 (PDT) Received: from 217.8.165.66 [217.8.165.66] (HELO linux2g2g.site) by sysmikro.home.pl [212.85.125.104] with SMTP (IdeaSmtpServer v0.70) id 40d73203b5e3409d; Fri, 7 May 2010 11:48:39 +0200 From: Krzysztof =?utf-8?q?B=C5=82aszkowski?= Organization: Systemy mikroprocesorowe To: xfs@oss.sgi.com, Stan Hoeppner X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate Date: Fri, 7 May 2010 11:48:02 +0200 User-Agent: KMail/1.9.5 References: <201005071022.37863.kb@sysmikro.com.pl> <4BE3DC2D.3000607@hardwarefreak.com> In-Reply-To: <4BE3DC2D.3000607@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Message-Id: <201005071148.03012.kb@sysmikro.com.pl> X-Barracuda-Connect: v007470.home.net.pl[212.85.125.104] X-Barracuda-Start-Time: 1273225722 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.2, rules version 3.2.2.29264 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Friday 07 May 2010 11:23, Stan Hoeppner wrote: > Krzysztof B=C5=82aszkowski put forth on 5/7/2010 3:22 AM: > > Hello, > > > > I use this to preallocate large space but found an issue. Posix_falloca= te > > works right with sizes like 100G, 1T and even 10T on some boxes (on some > > other can fail after e.g. 7T threshold) but if i tried e.g. 16T the user > > space process would be "R"unning forever and it is not interruptible. > > Furthermore some other not related processes like sshd, bash enter D > > state. There is nothing in kernel log. > > > > I made so far a few logs with ftrace facility for 1G, 100G, 1T and 10T > > sizes. I noticed that for 1st three sizes the log is as long as abt 1.5M > > (2M peak) while 10T generates 94M long log. I couldn't retrieve a log f= or > > 17T case because "cat /sys ... /trace" enters D. > > > > I would appreciate any help because i gave up with ftrace logs analysis. > > The xfs_vn_fallocate is covered in abt 11k lines for a 1.5M log case > > while there are abt 163k lines in 94M log. And all i could see is poss > > some relationship between time spent in xfs_vn_fallocate subfunctions vs > > requested space. > > > > Box details: > > 16 Hitachi 2TB drives (backplane connected), dm, 1 lvm lun of 25T size, > > kernel 2.6.31.5, more recent kernels neither xfs were not tested. > > 32 or 64 bit kernel?=20 sorry, i meant 64 bit. > What is the size of the XFS filesystem on the 25TB=20 > LVM LUN against which you're running posix_fallocate? xfs occupies whole lun (ie 25TB) > The reason I ask is=20 > that XFS has a 16TB per filesystem limitation on 32 bit kernels. I can > only assume that your XFS filesystem is larger than 16TB since you're > attempting to posix_fallocate 16TB. But, it's best to ask for confirmati= on > rather than assume, especially given that your problem is appearing near > that magical 16TB boundary. sure, i see. I use 64 bit by default. Regards, Krzysztof From kb@sysmikro.com.pl Fri May 7 05:05:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o47A5XAN158090 for ; Fri, 7 May 2010 05:05:33 -0500 X-ASG-Debug-ID: 1273226864-5a7200390000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from v007470.home.net.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id D2163967BB6 for ; Fri, 7 May 2010 03:07:44 -0700 (PDT) Received: from v007470.home.net.pl (v007470.home.net.pl [212.85.125.104]) by cuda.sgi.com with SMTP id EOv2AF69pA5D327A for ; Fri, 07 May 2010 03:07:44 -0700 (PDT) Received: from 217.8.165.66 [217.8.165.66] (HELO linux2g2g.site) by sysmikro.home.pl [212.85.125.104] with SMTP (IdeaSmtpServer v0.70) id 5aee48a3ab6c632a; Fri, 7 May 2010 12:07:41 +0200 From: Krzysztof =?utf-8?q?B=C5=82aszkowski?= Organization: Systemy mikroprocesorowe To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate Date: Fri, 7 May 2010 12:07:07 +0200 User-Agent: KMail/1.9.5 Cc: Stan Hoeppner References: <201005071022.37863.kb@sysmikro.com.pl> <4BE3DC2D.3000607@hardwarefreak.com> In-Reply-To: <4BE3DC2D.3000607@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Message-Id: <201005071207.07745.kb@sysmikro.com.pl> X-Barracuda-Connect: v007470.home.net.pl[212.85.125.104] X-Barracuda-Start-Time: 1273226865 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.2, rules version 3.2.2.29266 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello Stan, It seems that your mail server blocks traffic from ".pl" domains so don't b= e=20 offended if you will not see my reply sent to your address. (Remote host said: 550 5.7.1 : Client= =20 host rejected: We do not accept mail from .pl domains) Krzysztof On Friday 07 May 2010 11:23, Stan Hoeppner wrote: > Krzysztof B=C5=82aszkowski put forth on 5/7/2010 3:22 AM: > > Hello, > > > > I use this to preallocate large space but found an issue. Posix_falloca= te > > works right with sizes like 100G, 1T and even 10T on some boxes (on some > > other can fail after e.g. 7T threshold) but if i tried e.g. 16T the user > > space process would be "R"unning forever and it is not interruptible. > > Furthermore some other not related processes like sshd, bash enter D > > state. There is nothing in kernel log. > > > > I made so far a few logs with ftrace facility for 1G, 100G, 1T and 10T > > sizes. I noticed that for 1st three sizes the log is as long as abt 1.5M > > (2M peak) while 10T generates 94M long log. I couldn't retrieve a log f= or > > 17T case because "cat /sys ... /trace" enters D. > > > > I would appreciate any help because i gave up with ftrace logs analysis. > > The xfs_vn_fallocate is covered in abt 11k lines for a 1.5M log case > > while there are abt 163k lines in 94M log. And all i could see is poss > > some relationship between time spent in xfs_vn_fallocate subfunctions vs > > requested space. > > > > Box details: > > 16 Hitachi 2TB drives (backplane connected), dm, 1 lvm lun of 25T size, > > kernel 2.6.31.5, more recent kernels neither xfs were not tested. > > 32 or 64 bit kernel? What is the size of the XFS filesystem on the 25TB > LVM LUN against which you're running posix_fallocate? The reason I ask is > that XFS has a 16TB per filesystem limitation on 32 bit kernels. I can > only assume that your XFS filesystem is larger than 16TB since you're > attempting to posix_fallocate 16TB. But, it's best to ask for confirmati= on > rather than assume, especially given that your problem is appearing near > that magical 16TB boundary. From stan@hardwarefreak.com Fri May 7 05:35:50 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=BAYES_20 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o47AZoqF158870 for ; Fri, 7 May 2010 05:35:50 -0500 X-ASG-Debug-ID: 1273228678-4f4a02bf0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F030A31955D for ; Fri, 7 May 2010 03:37:58 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id cDOP9pPgNLLxgXee for ; Fri, 07 May 2010 03:37:58 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 0F70C6C054 for ; Fri, 7 May 2010 05:37:58 -0500 (CDT) Message-ID: <4BE3EE86.5090103@hardwarefreak.com> Date: Fri, 07 May 2010 05:42:14 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate References: <201005071022.37863.kb@sysmikro.com.pl> <4BE3DC2D.3000607@hardwarefreak.com> <201005071207.07745.kb@sysmikro.com.pl> In-Reply-To: <201005071207.07745.kb@sysmikro.com.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1273228680 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0523 1.0000 -1.6855 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.09 X-Barracuda-Spam-Status: No, SCORE=-1.09 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29267 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Krzysztof BĹ‚aszkowski put forth on 5/7/2010 5:07 AM: > Hello Stan, > > It seems that your mail server blocks traffic from ".pl" domains so don't be > offended if you will not see my reply sent to your address. > > (Remote host said: 550 5.7.1 : Client > host rejected: We do not accept mail from .pl domains) Sorry about that. Due to the constant battle against spam I've implemented some pretty draconian countermeasures over time, including some ccTLD blocking of SMTP. All my "overseas" contacts are via public mailing lists, as in this case. Very rarely does a conversation need to go "off list", so I've not had much of a problem with this setup. If you'd like I can whitelist your address. -- Stan From kb@sysmikro.com.pl Fri May 7 05:54:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o47AsTK8159292 for ; Fri, 7 May 2010 05:54:34 -0500 X-ASG-Debug-ID: 1273229799-5eea01840000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from v007470.home.net.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 18E621493898 for ; Fri, 7 May 2010 03:56:39 -0700 (PDT) Received: from v007470.home.net.pl (v007470.home.net.pl [212.85.125.104]) by cuda.sgi.com with SMTP id N6jXjGAs1BbFMdX1 for ; Fri, 07 May 2010 03:56:39 -0700 (PDT) Received: from 217.8.165.66 [217.8.165.66] (HELO linux2g2g.site) by sysmikro.home.pl [212.85.125.104] with SMTP (IdeaSmtpServer v0.70) id 64767627cdb82ba2; Fri, 7 May 2010 12:56:35 +0200 From: Krzysztof =?utf-8?q?B=C5=82aszkowski?= Organization: Systemy mikroprocesorowe To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate Date: Fri, 7 May 2010 12:56:00 +0200 User-Agent: KMail/1.9.5 Cc: Stan Hoeppner References: <201005071022.37863.kb@sysmikro.com.pl> <201005071207.07745.kb@sysmikro.com.pl> <4BE3EE86.5090103@hardwarefreak.com> In-Reply-To: <4BE3EE86.5090103@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Message-Id: <201005071256.00744.kb@sysmikro.com.pl> X-Barracuda-Connect: v007470.home.net.pl[212.85.125.104] X-Barracuda-Start-Time: 1273229801 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.2, rules version 3.2.2.29268 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Friday 07 May 2010 12:42, Stan Hoeppner wrote: > Krzysztof B=C5=82aszkowski put forth on 5/7/2010 5:07 AM: > > Hello Stan, > > > > It seems that your mail server blocks traffic from ".pl" domains so don= 't > > be offended if you will not see my reply sent to your address. > > > > (Remote host said: 550 5.7.1 : > > Client host rejected: We do not accept mail from .pl domains) > > Sorry about that. Due to the constant battle against spam I've implement= ed > some pretty draconian countermeasures over time, including some ccTLD > blocking of SMTP. All my "overseas" contacts are via public mailing list= s, > as in this case. Very rarely does a conversation need to go "off list", = so > I've not had much of a problem with this setup. If you'd like I can > whitelist your address. you are welcome. if it is not a big hassle then go ahead. thanks, Krzysztof From polmail@gmail.com Fri May 7 06:34:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o47BYBGX160463 for ; Fri, 7 May 2010 06:34:11 -0500 X-ASG-Debug-ID: 1273232180-020603c20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-wy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9E1591DE64DA for ; Fri, 7 May 2010 04:36:20 -0700 (PDT) Received: from mail-wy0-f181.google.com (mail-wy0-f181.google.com [74.125.82.181]) by cuda.sgi.com with ESMTP id mwekYfDXDFXYpsrC for ; Fri, 07 May 2010 04:36:20 -0700 (PDT) Received: by wyb36 with SMTP id 36so556176wyb.26 for ; Fri, 07 May 2010 04:36:19 -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 :user-agent:mime-version:to:subject:content-type; bh=BIOGeVQXRP6c0PmGjx86zYRjnQk+ZTAeGzHJeUnDU2k=; b=eyfNcFgPz2yP95toDH/wrTU2BeqVfdYrJDcKNV97zr5cA0UTNjvNhkJjGm7x8+CDsv 4plVK1YUQWzLWZuBPWXhVqyc74QHPGHyVo8e4eG6m12QfzkN+JywTY1uLRVX8Sonyagr FP2jHYBsuDKM7o8W0ruPVn+RrBBgucmx90KO0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject :content-type; b=AUrTWjWKx4mck0Q5S0S2A2mHmL6kTY2PXwQiEmc506vLsUQk/qyw8y4Mg63iYiRN25 R6IimJgBvVsu4FYX5dQpIqeUZKt8xhYYWbY4ijZRKNFHl0PfPzlT5QVV1jIMoCFh4BdX TgL6Qy/6eo3RavBwaVzOiEkuab5Nc+8wST3No= Received: by 10.216.168.135 with SMTP id k7mr3710013wel.129.1273232179692; Fri, 07 May 2010 04:36:19 -0700 (PDT) Received: from [192.168.1.101] (25.Red-80-59-137.staticIP.rima-tde.net [80.59.137.25]) by mx.google.com with ESMTPS id l46sm928299wed.22.2010.05.07.04.36.18 (version=SSLv3 cipher=RC4-MD5); Fri, 07 May 2010 04:36:19 -0700 (PDT) Message-ID: <4BE3FB32.8030709@gmail.com> Date: Fri, 07 May 2010 13:36:18 +0200 From: Pol User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100423 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Please Help Subject: Please Help Content-Type: multipart/alternative; boundary="------------090901010707050403020108" X-Barracuda-Connect: mail-wy0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1273232181 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=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29270 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. --------------090901010707050403020108 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Good morning. I'm writing from Barcelona and English is not my born language, so I'd like to apologize in advance for any possible mistakes in my text. I'm a Windows user who has recently moved to Linux (Ubuntu 10.04), and I have a serious problem regarding my Hard Drives' File System. I have a desktop version of Ubuntu and I'm a complete regular user. I have two physical drives in my system: 1. 36GB: EXT4 partition for /, another EXT4 for /home and a SWAP one. 2. 1TB (for data) drive. I generate so much video and music data per month (AVI, MKV, MP3, WAV) because of my job, and need to copy it to external hard drives to ensure I don't lose any of it. My question is about the FS to use in these data drives. I currently have all of them in XFS fyle system. Every file I generate is saved in my internal XFS drive, and whenever the hd is almost full I copy the important files to External Hard Drives which are also formatted as XFS. My problem comes after reading a couple of posts from 2006 in some forums on the web. They said that XFS is very unsecure when a power failure happens and recommended EXT3 (EXT4 these days I guess). They said that after a power failure it's very common to see data loss (something that never happened to me in all my years using NTFS). As far as I know XFS is much more secure than NTFS so I don't really understand this issue. I assume these people were talking about systems which need to be continously writing to the disk, but my knowledge about this is very limited. Did I chose the correct FS for my drives? Thank you very much for your time. --------------090901010707050403020108 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Good morning.
I'm writing from Barcelona and English is not my born language, so I'd like to apologize in advance for any possible mistakes in my text.

I'm a Windows user who has recently moved to Linux (Ubuntu 10.04), and I have a serious problem regarding my Hard Drives' File System.
I have a desktop version of Ubuntu and I'm a complete regular user.

I have two physical drives in my system:
1. 36GB: EXT4 partition for /, another EXT4 for /home and a SWAP one.
2. 1TB (for data) drive.

I generate so much video and music data per month (AVI, MKV, MP3, WAV) because of my job, and need to copy it to external hard drives to ensure I don't lose any of it.

My question is about the FS to use in these data drives.
I currently have all of them in XFS fyle system. Every file I generate is saved in my internal XFS drive, and whenever the hd is almost full I copy the important files to External Hard Drives which are also formatted as XFS.

My problem comes after reading a couple of posts from 2006 in some forums on the web. They said that XFS is very unsecure when a power failure happens and recommended EXT3 (EXT4 these days I guess). They said that after a power failure it's very common to see data loss (something that never happened to me in all my years using NTFS).

As far as I know XFS is much more secure than NTFS so I don't really understand this issue. I assume these people were talking about systems which need to be continously writing to the disk, but my knowledge about this is very limited.

Did I chose the correct FS for my drives?


Thank you very much for your time.
--------------090901010707050403020108-- From BATV+6a614bba7c2810bad1d9+2448+infradead.org+hch@bombadil.srs.infradead.org Fri May 7 06:39:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o47BdMnu160578 for ; Fri, 7 May 2010 06:39:24 -0500 X-ASG-Debug-ID: 1273232492-020503df0000-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 1ED961DE652A for ; Fri, 7 May 2010 04:41:33 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id VuaqVjUV5deqSdLU for ; Fri, 07 May 2010 04:41:33 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OALvu-0006hW-Px; Fri, 07 May 2010 11:41:30 +0000 Date: Fri, 7 May 2010 07:41:30 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 06/12] xfs: make the log ticket ID available outside the log infrastructure Subject: Re: [PATCH 06/12] xfs: make the log ticket ID available outside the log infrastructure Message-ID: <20100507114130.GA25474@infradead.org> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> <1273210860-23414-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273210860-23414-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273232493 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 07, 2010 at 03:40:54PM +1000, Dave Chinner wrote: > From: Dave Chinner > > The ticket ID is needed to uniquely identify transactions when doing busy > extent matching. Delayed logging changes the lifecycle of busy extents with > respect to the transaction structure lifecycle. Hence we can no longer use > the transaction structure as a means of determining the owner of the busy > extent as it may be freed and reused while the busy extent is still active. > > This commit provides the infrastructure to access the xlog_tid_t held in the > ticket from a transaction handle. This avoids the need for callers to peek > into the transaction and log structures to find this out. No happy about exposing the tid, but given that we need it for now: Reviewed-by: Christoph Hellwig From sandeen@sandeen.net Fri May 7 11:24:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o47GOJkY167996 for ; Fri, 7 May 2010 11:24:19 -0500 X-ASG-Debug-ID: 1273249589-0ddd01390000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5A963137E390 for ; Fri, 7 May 2010 09:26:29 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id YM75OmmeHcfO46OK for ; Fri, 07 May 2010 09:26:29 -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 mail.sandeen.net (Postfix) with ESMTP id 4F90D944B89; Fri, 7 May 2010 11:26:28 -0500 (CDT) Message-ID: <4BE43F34.40309@sandeen.net> Date: Fri, 07 May 2010 11:26:28 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: =?UTF-8?B?S3J6eXN6dG9mIELFgmFzemtvd3NraQ==?= CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate References: <201005071022.37863.kb@sysmikro.com.pl> In-Reply-To: <201005071022.37863.kb@sysmikro.com.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1273249590 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29288 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Krzysztof BĹ‚aszkowski wrote: > Hello, > > I use this to preallocate large space but found an issue. Posix_fallocate > works right with sizes like 100G, 1T and even 10T on some boxes (on some > other can fail after e.g. 7T threshold) but if i tried e.g. 16T the user > space process would be "R"unning forever and it is not interruptible. > Furthermore some other not related processes like sshd, bash enter D state. > There is nothing in kernel log. > > I made so far a few logs with ftrace facility for 1G, 100G, 1T and 10T sizes. > I noticed that for 1st three sizes the log is as long as abt 1.5M (2M peak) > while 10T generates 94M long log. I couldn't retrieve a log for 17T case > because "cat /sys ... /trace" enters D. > > I would appreciate any help because i gave up with ftrace logs analysis. The > xfs_vn_fallocate is covered in abt 11k lines for a 1.5M log case while there > are abt 163k lines in 94M log. And all i could see is poss some relationship > between time spent in xfs_vn_fallocate subfunctions vs requested space. > > Box details: > 16 Hitachi 2TB drives (backplane connected), dm, 1 lvm lun of 25T size, > kernel 2.6.31.5, more recent kernels neither xfs were not tested. It'd be great if you could test a more recent kernel. sysrq-t would give us all the backtraces, except I suppose not for the running process... I can try to scrape up >16T to test on at some point ... -Eric From sandeen@sandeen.net Fri May 7 11:51:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o47GpHOc168600 for ; Fri, 7 May 2010 11:51:17 -0500 X-ASG-Debug-ID: 1273251207-09c1024a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1B03C1DE85D5 for ; Fri, 7 May 2010 09:53:27 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id PzflvdTHUEIJz1qj for ; Fri, 07 May 2010 09:53:27 -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 mail.sandeen.net (Postfix) with ESMTP id 682A7A745FD; Fri, 7 May 2010 11:53:27 -0500 (CDT) Message-ID: <4BE44587.6090603@sandeen.net> Date: Fri, 07 May 2010 11:53:27 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: =?UTF-8?B?S3J6eXN6dG9mIELFgmFzemtvd3NraQ==?= CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate References: <201005071022.37863.kb@sysmikro.com.pl> <4BE43F34.40309@sandeen.net> In-Reply-To: <4BE43F34.40309@sandeen.net> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1273251208 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29290 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Eric Sandeen wrote: > Krzysztof BĹ‚aszkowski wrote: >> Hello, >> >> I use this to preallocate large space but found an issue. Posix_fallocate >> works right with sizes like 100G, 1T and even 10T on some boxes (on some >> other can fail after e.g. 7T threshold) but if i tried e.g. 16T the user >> space process would be "R"unning forever and it is not interruptible. >> Furthermore some other not related processes like sshd, bash enter D state. >> There is nothing in kernel log. Oh, one thing you should know is that depending on your version of glibc, posix_fallocate may be writing 0s and not using preallocation calls. Do you know which yours is using? strace should tell you on a small file test. Anyway, I am seeing things get stuck around 8T it seems... # touch /mnt/test/bigfile # xfs_io -c "resvsp 0 16t" /mnt/test/bigfile ... wait ... in other window ... # du -hc /mnt/test/bigfile 8.0G /mnt/test/bigfile 8.0G total # echo t > /proc/sysrq-trigger # dmesg | grep -A20 xfs_io xfs_io R running task 3576 29444 29362 0x00000006 ffff8809cfbb4920 ffffffff81478d9f ffffffffa032d3c5 0000000000000246 ffff8809cfbb4920 ffffffff814788bc 0000000000000000 ffffffff81ba3510 ffff8809d3429a68 ffffffffa032b60f ffff8809d3429aa8 000000000000001e Call Trace: [] ? __mutex_lock_common+0x36d/0x392 [] ? xfs_icsb_modify_counters+0x17f/0x1ac [xfs] [] ? xfs_icsb_unlock_all_counters+0x4d/0x60 [xfs] [] ? xfs_icsb_disable_counter+0x8c/0x95 [xfs] [] ? mutex_lock_nested+0x3e/0x43 [] ? xfs_icsb_modify_counters+0x18d/0x1ac [xfs] [] ? xfs_mod_incore_sb+0x29/0x6e [xfs] [] ? _xfs_trans_alloc+0x27/0x61 [xfs] [] ? xfs_trans_reserve+0x6c/0x19e [xfs] [] ? up_write+0x2b/0x32 [] ? xfs_alloc_file_space+0x163/0x306 [xfs] [] ? sched_clock_cpu+0xc3/0xce [] ? xfs_change_file_space+0x12a/0x2b8 [xfs] [] ? down_write_nested+0x80/0x8b [] ? xfs_ilock+0x30/0xb4 [xfs] [] ? xfs_vn_fallocate+0x80/0xf4 [xfs] -- R xfs_io 29444 86014624.786617 162 120 86014624.786617 137655.161327 408.979977 / # uname -r 2.6.34-0.4.rc0.git2.fc14.x86_64 I'll look into it. -Eric From aelder@sgi.com Fri May 7 14:50:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o47JopUm172499 for ; Fri, 7 May 2010 14:50:52 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id 35FAA8F80AD for ; Fri, 7 May 2010 12:53:00 -0700 (PDT) Received: from [128.162.232.185] ([128.162.232.185]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 7 May 2010 14:52:14 -0500 Subject: [ANNOUNCE] xfsprogs v3.1.2 From: Alex Elder Reply-To: aelder@sgi.com To: XFS Mailing List Content-Type: text/plain; charset="UTF-8" Date: Fri, 07 May 2010 14:52:14 -0500 Message-ID: <1273261934.2971.30.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 07 May 2010 19:52:14.0865 (UTC) FILETIME=[CA94A810:01CAEE1E] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Version 3.1.2 of xfsprogs has been released. A gzipped-tar archive of the source code is available here: ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-3.1.2.tar.gz The source code can be accessed via git using this URL: git://oss.sgi.com/xfs/cmds/xfsprogs.git Below is a summary (from the doc/CHANGES file) of changes since release 3.1.1: xfsprogs-3.1.2 (6 May 2010) - Fix missing thread synchronization in xfs_repair duplicate extent tracking. - Fix handling of dynamic attribute fork roots in xfs_fsr. - Fix sb_bad_features2 manipulations when tweaking the lazy count flag. - Add support for building on Debian GNU/kFreeBSD, thanks to Petr Salinger. - Improvements to the mkfs.xfs manpage, thanks to Wengang Wang. - Various small blkid integration fixes in mkfs.xfs. - Fix build against stricter system headers. From SRS0+mjXB+66+fromorbit.com=david@internode.on.net Fri May 7 17:14:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o47MEknu174811 for ; Fri, 7 May 2010 17:14:46 -0500 X-ASG-Debug-ID: 1273270614-694a03540000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 21A5231C05D for ; Fri, 7 May 2010 15:16:54 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id 69uyySI7mBvSoyaC for ; Fri, 07 May 2010 15:16:54 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23517764-1927428 for multiple; Sat, 08 May 2010 07:46:53 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OAVqm-00080G-7e; Sat, 08 May 2010 08:16:52 +1000 Date: Sat, 8 May 2010 08:16:52 +1000 From: Dave Chinner To: Eric Sandeen Cc: Krzysztof =?utf-8?Q?B=C5=82aszkowski?= , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate Message-ID: <20100507221652.GB25419@dastard> References: <201005071022.37863.kb@sysmikro.com.pl> <4BE43F34.40309@sandeen.net> <4BE44587.6090603@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <4BE44587.6090603@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1273270616 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29306 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 07, 2010 at 11:53:27AM -0500, Eric Sandeen wrote: > Eric Sandeen wrote: > > Krzysztof BĹ‚aszkowski wrote: > >> Hello, > >> > >> I use this to preallocate large space but found an issue. Posix_fallocate > >> works right with sizes like 100G, 1T and even 10T on some boxes (on some > >> other can fail after e.g. 7T threshold) but if i tried e.g. 16T the user > >> space process would be "R"unning forever and it is not interruptible. > >> Furthermore some other not related processes like sshd, bash enter D state. > >> There is nothing in kernel log. > > Oh, one thing you should know is that depending on your version of glibc, > posix_fallocate may be writing 0s and not using preallocation calls. > > Do you know which yours is using? strace should tell you on a small > file test. > > Anyway, I am seeing things get stuck around 8T it seems... > > # touch /mnt/test/bigfile > # xfs_io -c "resvsp 0 16t" /mnt/test/bigfile > > ... wait ... in other window ... > > # du -hc /mnt/test/bigfile > 8.0G /mnt/test/bigfile > 8.0G total > > # echo t > /proc/sysrq-trigger > # dmesg | grep -A20 xfs_io > xfs_io R running task 3576 29444 29362 0x00000006 > ffff8809cfbb4920 ffffffff81478d9f ffffffffa032d3c5 0000000000000246 > ffff8809cfbb4920 ffffffff814788bc 0000000000000000 ffffffff81ba3510 > ffff8809d3429a68 ffffffffa032b60f ffff8809d3429aa8 000000000000001e > Call Trace: > [] ? __mutex_lock_common+0x36d/0x392 > [] ? xfs_icsb_modify_counters+0x17f/0x1ac [xfs] > [] ? xfs_icsb_unlock_all_counters+0x4d/0x60 [xfs] > [] ? xfs_icsb_disable_counter+0x8c/0x95 [xfs] > [] ? mutex_lock_nested+0x3e/0x43 > [] ? xfs_icsb_modify_counters+0x18d/0x1ac [xfs] > [] ? xfs_mod_incore_sb+0x29/0x6e [xfs] > [] ? _xfs_trans_alloc+0x27/0x61 [xfs] > [] ? xfs_trans_reserve+0x6c/0x19e [xfs] > [] ? up_write+0x2b/0x32 > [] ? xfs_alloc_file_space+0x163/0x306 [xfs] > [] ? sched_clock_cpu+0xc3/0xce > [] ? xfs_change_file_space+0x12a/0x2b8 [xfs] > [] ? down_write_nested+0x80/0x8b > [] ? xfs_ilock+0x30/0xb4 [xfs] > [] ? xfs_vn_fallocate+0x80/0xf4 [xfs] > -- > R xfs_io 29444 86014624.786617 162 120 86014624.786617 137655.161327 408.979977 / > > # uname -r > 2.6.34-0.4.rc0.git2.fc14.x86_64 > > I'll look into it. On my current delayed-logging branch on a 30GB filesystem: # xfs_io -f -c "resvsp 0 16t" /mnt/scratch/bigfile And in dmesg: [60173.119760] Assertion failed: tp->t_blk_res_used <= tp->t_blk_res, file: fs/xfs/xfs_trans.c, line: 475 [60173.121263] ------------[ cut here ]------------ [60173.121771] kernel BUG at fs/xfs/support/debug.c:109! [60173.121771] invalid opcode: 0000 [#1] SMP [60173.121771] last sysfs file: /sys/devices/virtio-pci/virtio2/block/vdb/removable [60173.121771] CPU 7 [60173.121771] Modules linked in: [last unloaded: scsi_wait_scan] [60173.121771] [60173.121771] Pid: 3596, comm: xfs_io Not tainted 2.6.34-rc1-dgc #138 /Bochs [60173.121771] RIP: 0010:[] [] assfail+0x1f/0x30 [60173.121771] RSP: 0018:ffff880112043808 EFLAGS: 00010292 [60173.121771] RAX: 000000000000006d RBX: ffff880105038da0 RCX: 0000000000000000 [60173.121771] RDX: ffff880003600000 RSI: 0000000000000000 RDI: 0000000000000246 [60173.121771] RBP: ffff880112043808 R08: 0000000000000002 R09: 0000000000000000 [60173.121771] R10: ffffffff81a70bb8 R11: 0000000000000000 R12: ffffffffffe20082 [60173.121771] R13: ffff88011cea5000 R14: 0000000000000001 R15: 0000000000000000 [60173.121771] FS: 00007f0311cda6f0(0000) GS:ffff880003600000(0000) knlGS:0000000000000000 [60173.121771] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [60173.121771] CR2: 00007f031164d750 CR3: 000000011bc59000 CR4: 00000000000006e0 [60173.121771] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [60173.121771] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 [60173.121771] Process xfs_io (pid: 3596, threadinfo ffff880112042000, task ffff88011629a740) [60173.121771] Stack: [60173.121771] ffff880112043838 ffffffff81342415 00000000001dff7e ffff880112043928 [60173.121771] <0> 00000000001dff7e 0000000000000004 ffff880112043858 ffffffff812e82ce [60173.121771] <0> ffff880112043928 ffff88011cea5000 ffff8801120438c8 ffffffff812e9008 [60173.121771] Call Trace: [60173.121771] [] xfs_trans_mod_sb+0x2f5/0x330 [60173.121771] [] xfs_alloc_ag_vextent+0x18e/0x2b0 [60173.121771] [] xfs_alloc_vextent+0x598/0x870 [60173.121771] [] xfs_bmap_btalloc+0x29f/0x7b0 [60173.121771] [] ? xfs_bmap_search_multi_extents+0x71/0x110 [60173.121771] [] xfs_bmap_alloc+0x21/0x40 [60173.121771] [] xfs_bmapi+0xf2c/0x1a90 [60173.121771] [] ? xlog_grant_log_space+0x35/0x640 [60173.121771] [] ? xfs_ilock+0x10b/0x190 [60173.121771] [] xfs_alloc_file_space+0x190/0x440 [60173.121771] [] ? trace_hardirqs_on+0xd/0x10 [60173.121771] [] xfs_change_file_space+0x2d4/0x380 [60173.121771] [] ? down_write_nested+0x9e/0xb0 [60173.121771] [] ? xfs_ilock+0xe8/0x190 [60173.121771] [] xfs_vn_fallocate+0x87/0x110 [60173.121771] [] ? __do_fault+0x12c/0x450 [60173.121771] [] ? might_fault+0x5c/0xb0 [60173.121771] [] ? __do_fault+0x399/0x450 [60173.121771] [] do_fallocate+0x103/0x110 [60173.121771] [] ioctl_preallocate+0x8c/0xb0 [60173.121771] [] do_vfs_ioctl+0x415/0x5b0 [60173.121771] [] ? up_read+0x23/0x40 [60173.121771] [] sys_ioctl+0x81/0xa0 [60173.121771] [] system_call_fastpath+0x16/0x1b So there's been a transaction overrun, which tends to imply we're allocating too much in a single transaction. I'd say there's an overflow happening somewhere in this path. Cheers, Dave. -- Dave Chinner david@fromorbit.com From helpdeskteam@mail2webmaster.com Fri May 7 20:05:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_99,FREEMAIL_FROM, T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4815w4e178965 for ; Fri, 7 May 2010 20:05:58 -0500 X-ASG-Debug-ID: 1273280893-0561025d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from viu.viu.edu (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7661396ECD2 for ; Fri, 7 May 2010 18:08:13 -0700 (PDT) Received: from viu.viu.edu (viu.viu.edu [74.55.51.90]) by cuda.sgi.com with ESMTP id dGJXzu2W8i1XWzra for ; Fri, 07 May 2010 18:08:13 -0700 (PDT) Received: from localhost ([127.0.0.1]:58716 helo=webmail.viu.edu) by viu.viu.edu with esmtpa (Exim 4.69) (envelope-from ) id 1OAVdj-0001LU-1x; Fri, 07 May 2010 18:03:23 -0400 Received: from 94.197.36.208 ([94.197.36.208]) (proxying for 94.197.36.208) (SquirrelMail authenticated user dominika@viu.edu) by webmail.viu.edu with HTTP; Fri, 7 May 2010 18:03:23 -0400 Message-ID: <6c57f50a5921aeb44fbd83564767dfb2.squirrel@webmail.viu.edu> Date: Fri, 7 May 2010 18:03:23 -0400 X-ASG-Orig-Subj: Webmail konto oppdatering Subject: Webmail konto oppdatering From: "Mail Administrator" Reply-To: helpdeskteam@mail2webmaster.com User-Agent: SquirrelMail/1.4.20 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - viu.viu.edu X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - mail2webmaster.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: viu.viu.edu[74.55.51.90] X-Barracuda-Start-Time: 1273280894 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2895 1.0000 -0.3935 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.19 X-Barracuda-Spam-Status: No, SCORE=1.19 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29318 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.58 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Kjćre Webmail bruker, Denne meldingen er fra Webmail IT Service meldingssentralen til alle abonnenter / webmail-brukere. Vi er nĺ oppgraderer vĺr database og e-post senter pĺ grunn av en uvanlig aktiviteter identifisert i e-postmeldingen systemet. Vi sletter alle ubrukte Webmail kontoer. Du mĺ bekrefte webmail-konto ved ĺ bekrefte din identitet Webmail. Dette vil hindre at Webmail-kontoen fra blitt lukket under denne řvelsen. For ĺ bekrefte at du Web-Mail identitet, skal du gi fřlgende data; Fornavn: Etternavn: Brukernavn / ID: Passord: Skriv inn passordet: E-postadresse: * Viktig * Vennligst oppgi alle disse opplysninger fullstendig og korrekt ellers pĺ grunn til sikkerhetsmessige grunner at vi mĺ avslutte kontoen midlertidig. Vi takker for raskt oppmerksom pĺ denne saken. Vćr oppmerksom pĺ at Dette er et sikkerhetstiltak som skal beskytte deg og din Webmail Konto. Vi beklager eventuelle ulemper dette medfřrer. Vennlig hilsen Webmail IT Service From christian.affolter@purplehaze.ch Sat May 8 07:32:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o48CWtW7192226 for ; Sat, 8 May 2010 07:32:56 -0500 X-ASG-Debug-ID: 1273322099-72de02320000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp.stepping-stone.ch (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 02E5631DA24 for ; Sat, 8 May 2010 05:35:00 -0700 (PDT) Received: from smtp.stepping-stone.ch (smtp.stepping-stone.ch [194.176.109.228]) by cuda.sgi.com with ESMTP id ISrQPXlexF69bwhM for ; Sat, 08 May 2010 05:35:00 -0700 (PDT) Received: from localhost (mail-scanner-01.int.stepping-stone.ch [10.17.98.47]) by smtp.stepping-stone.ch (Postfix) with ESMTP id 2005340021B; Sat, 8 May 2010 14:34:59 +0200 (CEST) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at stepping-stone.ch Received: from smtp.stepping-stone.ch ([10.17.98.46]) by localhost (mail-scanner-01.int.stepping-stone.ch [10.17.98.47]) (amavisd-new, port 10024) with LMTP id UgXI6hZTK9DK; Sat, 8 May 2010 14:34:46 +0200 (CEST) Received: from [192.168.1.4] (84-73-140-121.dclient.hispeed.ch [84.73.140.121]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client did not present a certificate) by smtp.stepping-stone.ch (Postfix) with ESMTPSA id C575B40042A; Sat, 8 May 2010 14:34:44 +0200 (CEST) Message-ID: <4BE55A63.8070203@purplehaze.ch> Date: Sat, 08 May 2010 14:34:43 +0200 From: Christian Affolter User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100420 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: failed to read root inode Subject: failed to read root inode Content-Type: multipart/mixed; boundary="------------040805010700020206070201" X-Barracuda-Connect: smtp.stepping-stone.ch[194.176.109.228] X-Barracuda-Start-Time: 1273322102 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.2, rules version 3.2.2.29358 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean This is a multi-part message in MIME format. --------------040805010700020206070201 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Hi After a disk crash within a hardware RAID-6 controller and kernel freeze, I'm unable to mount an XFS filesystem on top of an EVMS volume: Filesystem "dm-13": Disabling barriers, not supported by the underlying device XFS mounting filesystem dm-13 Starting XFS recovery on filesystem: dm-13 (logdev: internal) XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1599 of file fs/xfs/xfs_alloc.c. Caller 0xffffffff8035c58d Pid: 13473, comm: mount Not tainted 2.6.26-gentoo #1 Call Trace: [] xfs_free_extent+0xcd/0x110 [] xfs_free_ag_extent+0x4e3/0x740 [] xfs_free_extent+0xcd/0x110 [] xlog_recover_process_efi+0x18d/0x1d0 [] xlog_recover_process_efis+0x60/0xa0 [] xlog_recover_finish+0x23/0xf0 [] xfs_mountfs+0x4da/0x680 [] kmem_alloc+0x58/0x100 [] kmem_zalloc+0x2b/0x40 [] xfs_mount+0x36d/0x3a0 [] xfs_fs_fill_super+0xbd/0x220 [] get_sb_bdev+0x141/0x180 [] xfs_fs_fill_super+0x0/0x220 [] vfs_kern_mount+0x56/0xc0 [] do_kern_mount+0x53/0x110 [] do_new_mount+0x9b/0xe0 [] do_mount+0x1e6/0x220 [] __get_free_pages+0x15/0x60 [] sys_mount+0x9b/0x100 [] system_call_after_swapgs+0x7b/0x80 Filesystem "dm-13": XFS internal error xfs_trans_cancel at line 1163 of file fs/xfs/xfs_trans.c. Caller 0xffffffff80395eb1 Pid: 13473, comm: mount Not tainted 2.6.26-gentoo #1 Call Trace: [] xlog_recover_process_efi+0x1a1/0x1d0 [] xfs_trans_cancel+0x126/0x150 [] xlog_recover_process_efi+0x1a1/0x1d0 [] xlog_recover_process_efis+0x60/0xa0 [] xlog_recover_finish+0x23/0xf0 [] xfs_mountfs+0x4da/0x680 [] kmem_alloc+0x58/0x100 [] kmem_zalloc+0x2b/0x40 [] xfs_mount+0x36d/0x3a0 [] xfs_fs_fill_super+0xbd/0x220 [] get_sb_bdev+0x141/0x180 [] xfs_fs_fill_super+0x0/0x220 [] vfs_kern_mount+0x56/0xc0 [] do_kern_mount+0x53/0x110 [] do_new_mount+0x9b/0xe0 [] do_mount+0x1e6/0x220 [] __get_free_pages+0x15/0x60 [] sys_mount+0x9b/0x100 [] system_call_after_swapgs+0x7b/0x80 xfs_force_shutdown(dm-13,0x8) called from line 1164 of file fs/xfs/xfs_trans.c. Return address = 0xffffffff8039fd2f Filesystem "dm-13": Corruption of in-memory data detected. Shutting down filesystem: dm-13 Please umount the filesystem, and rectify the problem(s) Failed to recover EFIs on filesystem: dm-13 XFS: log mount finish failed I tried to repair the filesystem with the help of xfs_repair many times, without any luck: Filesystem "dm-13": Disabling barriers, not supported by the underlying device XFS mounting filesystem dm-13 XFS: failed to read root inode xfs_check output: cache_node_purge: refcount was 1, not zero (node=0x820010) xfs_check: cannot read root inode (117) cache_node_purge: refcount was 1, not zero (node=0x8226b0) xfs_check: cannot read realtime bitmap inode (117) block 0/8 expected type unknown got log block 0/9 expected type unknown got log block 0/10 expected type unknown got log block 0/11 expected type unknown got log bad magic number 0xfeed for inode 128 [...] Are there any other ways to fix the unreadable root inode or to restore the remaining data? Environment informations: Linux Kernel: 2.6.26-gentoo (x86_64) xfsprogs: 3.0.3 Attached you'll find the xfs_repair and xfs_check output. Thanks in advance and kind regards Christian --------------040805010700020206070201 Content-Type: text/plain; name="xfs_repair.log" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xfs_repair.log" Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - 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 bad magic number 0x0 on inode 128 bad version number 0x0 on inode 128 bad magic number 0x0 on inode 129 bad version number 0x0 on inode 129 bad magic number 0x0 on inode 130 bad version number 0x0 on inode 130 bad magic number 0x0 on inode 131 bad version number 0x0 on inode 131 bad magic number 0x0 on inode 132 bad version number 0x0 on inode 132 bad magic number 0x0 on inode 133 bad version number 0x0 on inode 133 bad magic number 0x0 on inode 134 bad version number 0x0 on inode 134 bad magic number 0x0 on inode 135 bad version number 0x0 on inode 135 bad magic number 0x0 on inode 136 bad version number 0x0 on inode 136 bad magic number 0x0 on inode 137 bad version number 0x0 on inode 137 bad magic number 0x0 on inode 138 bad version number 0x0 on inode 138 bad magic number 0x0 on inode 139 bad version number 0x0 on inode 139 bad magic number 0x0 on inode 140 bad version number 0x0 on inode 140 bad magic number 0x0 on inode 141 bad version number 0x0 on inode 141 bad magic number 0x0 on inode 142 bad version number 0x0 on inode 142 bad magic number 0x0 on inode 143 bad version number 0x0 on inode 143 bad magic number 0x0 on inode 144 bad version number 0x0 on inode 144 bad magic number 0x0 on inode 145 bad version number 0x0 on inode 145 bad magic number 0x0 on inode 146 bad version number 0x0 on inode 146 bad magic number 0x0 on inode 147 bad version number 0x0 on inode 147 bad magic number 0x0 on inode 148 bad version number 0x0 on inode 148 bad magic number 0x0 on inode 149 bad version number 0x0 on inode 149 bad magic number 0x0 on inode 150 bad version number 0x0 on inode 150 bad magic number 0x0 on inode 151 bad version number 0x0 on inode 151 bad magic number 0x0 on inode 152 bad version number 0x0 on inode 152 bad magic number 0x0 on inode 153 bad version number 0x0 on inode 153 bad magic number 0x0 on inode 154 bad version number 0x0 on inode 154 bad magic number 0x0 on inode 155 bad version number 0x0 on inode 155 bad magic number 0x0 on inode 156 bad version number 0x0 on inode 156 bad magic number 0x0 on inode 157 bad version number 0x0 on inode 157 bad magic number 0x0 on inode 158 bad version number 0x0 on inode 158 bad magic number 0x0 on inode 159 bad version number 0x0 on inode 159 bad magic number 0x0 on inode 160 bad version number 0x0 on inode 160 bad magic number 0x0 on inode 161 bad version number 0x0 on inode 161 bad magic number 0x0 on inode 162 bad version number 0x0 on inode 162 bad magic number 0x0 on inode 163 bad version number 0x0 on inode 163 bad magic number 0x0 on inode 164 bad version number 0x0 on inode 164 bad magic number 0x0 on inode 165 bad version number 0x0 on inode 165 bad magic number 0x0 on inode 166 bad version number 0x0 on inode 166 bad magic number 0x0 on inode 167 bad version number 0x0 on inode 167 bad magic number 0x0 on inode 168 bad version number 0x0 on inode 168 bad magic number 0x0 on inode 169 bad version number 0x0 on inode 169 bad magic number 0x0 on inode 170 bad version number 0x0 on inode 170 bad magic number 0x0 on inode 171 bad version number 0x0 on inode 171 bad magic number 0x0 on inode 172 bad version number 0x0 on inode 172 bad magic number 0x0 on inode 173 bad version number 0x0 on inode 173 bad magic number 0x0 on inode 174 bad version number 0x0 on inode 174 bad magic number 0x0 on inode 175 bad version number 0x0 on inode 175 bad magic number 0x0 on inode 176 bad version number 0x0 on inode 176 bad magic number 0x0 on inode 177 bad version number 0x0 on inode 177 bad magic number 0x0 on inode 178 bad version number 0x0 on inode 178 bad magic number 0x0 on inode 179 bad version number 0x0 on inode 179 bad magic number 0x0 on inode 180 bad version number 0x0 on inode 180 bad magic number 0x0 on inode 181 bad version number 0x0 on inode 181 bad magic number 0x0 on inode 182 bad version number 0x0 on inode 182 bad magic number 0x0 on inode 183 bad version number 0x0 on inode 183 bad magic number 0x0 on inode 184 bad version number 0x0 on inode 184 bad magic number 0x0 on inode 185 bad version number 0x0 on inode 185 bad magic number 0x0 on inode 186 bad version number 0x0 on inode 186 bad magic number 0x0 on inode 187 bad version number 0x0 on inode 187 bad magic number 0x0 on inode 188 bad version number 0x0 on inode 188 bad magic number 0x0 on inode 189 bad version number 0x0 on inode 189 bad magic number 0x0 on inode 190 bad version number 0x0 on inode 190 bad magic number 0x0 on inode 191 bad version number 0x0 on inode 191 bad magic number 0x0 on inode 128, resetting magic number bad version number 0x0 on inode 128, resetting version number imap claims a free inode 128 is in use, correcting imap and clearing inode cleared root inode 128 bad magic number 0x0 on inode 129, resetting magic number bad version number 0x0 on inode 129, resetting version number imap claims a free inode 129 is in use, correcting imap and clearing inode cleared realtime bitmap inode 129 bad magic number 0x0 on inode 130, resetting magic number bad version number 0x0 on inode 130, resetting version number imap claims a free inode 130 is in use, correcting imap and clearing inode cleared realtime summary inode 130 bad magic number 0x0 on inode 131, resetting magic number bad version number 0x0 on inode 131, resetting version number imap claims a free inode 131 is in use, correcting imap and clearing inode cleared inode 131 bad magic number 0x0 on inode 132, resetting magic number bad version number 0x0 on inode 132, resetting version number bad magic number 0x0 on inode 133, resetting magic number bad version number 0x0 on inode 133, resetting version number bad magic number 0x0 on inode 134, resetting magic number bad version number 0x0 on inode 134, resetting version number bad magic number 0x0 on inode 135, resetting magic number bad version number 0x0 on inode 135, resetting version number bad magic number 0x0 on inode 136, resetting magic number bad version number 0x0 on inode 136, resetting version number bad magic number 0x0 on inode 137, resetting magic number bad version number 0x0 on inode 137, resetting version number bad magic number 0x0 on inode 138, resetting magic number bad version number 0x0 on inode 138, resetting version number bad magic number 0x0 on inode 139, resetting magic number bad version number 0x0 on inode 139, resetting version number bad magic number 0x0 on inode 140, resetting magic number bad version number 0x0 on inode 140, resetting version number bad magic number 0x0 on inode 141, resetting magic number bad version number 0x0 on inode 141, resetting version number bad magic number 0x0 on inode 142, resetting magic number bad version number 0x0 on inode 142, resetting version number bad magic number 0x0 on inode 143, resetting magic number bad version number 0x0 on inode 143, resetting version number bad magic number 0x0 on inode 144, resetting magic number bad version number 0x0 on inode 144, resetting version number bad magic number 0x0 on inode 145, resetting magic number bad version number 0x0 on inode 145, resetting version number bad magic number 0x0 on inode 146, resetting magic number bad version number 0x0 on inode 146, resetting version number bad magic number 0x0 on inode 147, resetting magic number bad version number 0x0 on inode 147, resetting version number bad magic number 0x0 on inode 148, resetting magic number bad version number 0x0 on inode 148, resetting version number bad magic number 0x0 on inode 149, resetting magic number bad version number 0x0 on inode 149, resetting version number bad magic number 0x0 on inode 150, resetting magic number bad version number 0x0 on inode 150, resetting version number bad magic number 0x0 on inode 151, resetting magic number bad version number 0x0 on inode 151, resetting version number bad magic number 0x0 on inode 152, resetting magic number bad version number 0x0 on inode 152, resetting version number bad magic number 0x0 on inode 153, resetting magic number bad version number 0x0 on inode 153, resetting version number bad magic number 0x0 on inode 154, resetting magic number bad version number 0x0 on inode 154, resetting version number bad magic number 0x0 on inode 155, resetting magic number bad version number 0x0 on inode 155, resetting version number bad magic number 0x0 on inode 156, resetting magic number bad version number 0x0 on inode 156, resetting version number bad magic number 0x0 on inode 157, resetting magic number bad version number 0x0 on inode 157, resetting version number bad magic number 0x0 on inode 158, resetting magic number bad version number 0x0 on inode 158, resetting version number bad magic number 0x0 on inode 159, resetting magic number bad version number 0x0 on inode 159, resetting version number bad magic number 0x0 on inode 160, resetting magic number bad version number 0x0 on inode 160, resetting version number bad magic number 0x0 on inode 161, resetting magic number bad version number 0x0 on inode 161, resetting version number bad magic number 0x0 on inode 162, resetting magic number bad version number 0x0 on inode 162, resetting version number bad magic number 0x0 on inode 163, resetting magic number bad version number 0x0 on inode 163, resetting version number bad magic number 0x0 on inode 164, resetting magic number bad version number 0x0 on inode 164, resetting version number bad magic number 0x0 on inode 165, resetting magic number bad version number 0x0 on inode 165, resetting version number bad magic number 0x0 on inode 166, resetting magic number bad version number 0x0 on inode 166, resetting version number bad magic number 0x0 on inode 167, resetting magic number bad version number 0x0 on inode 167, resetting version number bad magic number 0x0 on inode 168, resetting magic number bad version number 0x0 on inode 168, resetting version number bad magic number 0x0 on inode 169, resetting magic number bad version number 0x0 on inode 169, resetting version number bad magic number 0x0 on inode 170, resetting magic number bad version number 0x0 on inode 170, resetting version number bad magic number 0x0 on inode 171, resetting magic number bad version number 0x0 on inode 171, resetting version number bad magic number 0x0 on inode 172, resetting magic number bad version number 0x0 on inode 172, resetting version number bad magic number 0x0 on inode 173, resetting magic number bad version number 0x0 on inode 173, resetting version number bad magic number 0x0 on inode 174, resetting magic number bad version number 0x0 on inode 174, resetting version number bad magic number 0x0 on inode 175, resetting magic number bad version number 0x0 on inode 175, resetting version number bad magic number 0x0 on inode 176, resetting magic number bad version number 0x0 on inode 176, resetting version number bad magic number 0x0 on inode 177, resetting magic number bad version number 0x0 on inode 177, resetting version number bad magic number 0x0 on inode 178, resetting magic number bad version number 0x0 on inode 178, resetting version number bad magic number 0x0 on inode 179, resetting magic number bad version number 0x0 on inode 179, resetting version number bad magic number 0x0 on inode 180, resetting magic number bad version number 0x0 on inode 180, resetting version number bad magic number 0x0 on inode 181, resetting magic number bad version number 0x0 on inode 181, resetting version number bad magic number 0x0 on inode 182, resetting magic number bad version number 0x0 on inode 182, resetting version number bad magic number 0x0 on inode 183, resetting magic number bad version number 0x0 on inode 183, resetting version number bad magic number 0x0 on inode 184, resetting magic number bad version number 0x0 on inode 184, resetting version number bad magic number 0x0 on inode 185, resetting magic number bad version number 0x0 on inode 185, resetting version number bad magic number 0x0 on inode 186, resetting magic number bad version number 0x0 on inode 186, resetting version number bad magic number 0x0 on inode 187, resetting magic number bad version number 0x0 on inode 187, resetting version number bad magic number 0x0 on inode 188, resetting magic number bad version number 0x0 on inode 188, resetting version number bad magic number 0x0 on inode 189, resetting magic number bad version number 0x0 on inode 189, resetting version number bad magic number 0x0 on inode 190, resetting magic number bad version number 0x0 on inode 190, resetting version number bad magic number 0x0 on inode 191, resetting magic number bad version number 0x0 on inode 191, resetting version number - agno = 1 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... root inode lost - check for inodes claiming duplicate blocks... - agno = 1 - agno = 0 inode block 8 multiply claimed, state was 4 inode block 9 multiply claimed, state was 4 inode block 10 multiply claimed, state was 4 inode block 11 multiply claimed, state was 4 entry ".." at block 0 offset 32 in directory inode 424256 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 424256 entry ".." at block 0 offset 32 in directory inode 1075051913 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075051913 entry ".." at block 0 offset 32 in directory inode 1075051915 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075051915 entry ".." at block 0 offset 32 in directory inode 1075051918 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075051918 entry ".." at block 0 offset 32 in directory inode 1075051920 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075051920 entry ".." at block 0 offset 32 in directory inode 1075051921 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075051921 entry ".." at block 0 offset 32 in directory inode 1075051923 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075051923 entry ".." at block 0 offset 32 in directory inode 1075051930 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075051930 entry ".." at block 0 offset 32 in directory inode 1075051931 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075051931 entry ".." at block 0 offset 32 in directory inode 1075051932 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075051932 entry ".." at block 0 offset 32 in directory inode 1075051934 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075051934 entry ".." at block 0 offset 32 in directory inode 1075117889 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075117889 entry ".." at block 0 offset 32 in directory inode 1075117896 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075117896 entry ".." at block 0 offset 32 in directory inode 1075117907 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075117907 entry ".." at block 0 offset 32 in directory inode 1075244397 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075244397 entry ".." at block 0 offset 32 in directory inode 1075244399 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075244399 entry ".." at block 0 offset 32 in directory inode 1075244401 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1075244401 entry ".." at block 0 offset 32 in directory inode 1076805266 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076805266 entry ".." at block 0 offset 32 in directory inode 1076811247 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076811247 entry ".." at block 0 offset 32 in directory inode 1076811248 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076811248 entry ".." at block 0 offset 32 in directory inode 1076811260 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076811260 entry ".." at block 0 offset 32 in directory inode 1076811261 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076811261 entry ".." at block 0 offset 32 in directory inode 1076811262 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076811262 entry ".." at block 0 offset 32 in directory inode 1076811263 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076811263 entry ".." at block 0 offset 32 in directory inode 1076818528 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818528 entry ".." at block 0 offset 32 in directory inode 1076818529 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818529 entry ".." at block 0 offset 32 in directory inode 1076818542 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818542 entry ".." at block 0 offset 32 in directory inode 1076818543 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818543 entry ".." at block 0 offset 32 in directory inode 1076818544 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818544 entry ".." at block 0 offset 32 in directory inode 1076818545 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818545 entry ".." at block 0 offset 32 in directory inode 1076818546 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818546 entry ".." at block 0 offset 32 in directory inode 1076818548 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818548 entry ".." at block 0 offset 32 in directory inode 1076818549 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818549 entry ".." at block 0 offset 32 in directory inode 1076818554 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818554 entry ".." at block 0 offset 32 in directory inode 1076818555 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818555 entry ".." at block 0 offset 32 in directory inode 1076818556 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818556 entry ".." at block 0 offset 32 in directory inode 1076818559 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818559 entry ".." at block 0 offset 32 in directory inode 1076818562 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818562 entry ".." at block 0 offset 32 in directory inode 1076818563 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818563 entry ".." at block 0 offset 32 in directory inode 1076818591 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076818591 entry ".." at block 0 offset 32 in directory inode 1076828546 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076828546 entry ".." at block 0 offset 32 in directory inode 1076828549 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076828549 entry ".." at block 0 offset 32 in directory inode 1076828554 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076828554 entry ".." at block 0 offset 32 in directory inode 1076828555 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076828555 entry ".." at block 0 offset 32 in directory inode 1076828571 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076828571 entry ".." at block 0 offset 32 in directory inode 1076828573 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076828573 entry ".." at block 0 offset 32 in directory inode 1076828594 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076828594 entry ".." at block 0 offset 32 in directory inode 1076828599 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076828599 entry ".." at block 0 offset 32 in directory inode 1076828607 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076828607 entry ".." at block 0 offset 32 in directory inode 1076839776 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839776 entry ".." at block 0 offset 32 in directory inode 1076839777 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839777 entry ".." at block 0 offset 32 in directory inode 1076839779 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839779 entry ".." at block 0 offset 32 in directory inode 1076839780 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839780 entry ".." at block 0 offset 32 in directory inode 1076839784 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839784 entry ".." at block 0 offset 32 in directory inode 1076839785 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839785 entry ".." at block 0 offset 32 in directory inode 1076839786 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839786 entry ".." at block 0 offset 32 in directory inode 1076839792 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839792 entry ".." at block 0 offset 32 in directory inode 1076839794 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839794 entry ".." at block 0 offset 32 in directory inode 1076839795 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839795 entry ".." at block 0 offset 32 in directory inode 1076839823 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839823 entry ".." at block 0 offset 32 in directory inode 1076839825 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839825 entry ".." at block 0 offset 32 in directory inode 1076839826 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839826 entry ".." at block 0 offset 32 in directory inode 1076839828 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839828 entry ".." at block 0 offset 32 in directory inode 1076839831 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839831 entry ".." at block 0 offset 32 in directory inode 1076839835 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839835 entry ".." at block 0 offset 32 in directory inode 1076839836 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839836 entry ".." at block 0 offset 32 in directory inode 1076839837 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839837 entry ".." at block 0 offset 32 in directory inode 1076839838 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076839838 entry ".." at block 0 offset 32 in directory inode 1076848162 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076848162 entry ".." at block 0 offset 32 in directory inode 1076848202 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076848202 entry ".." at block 0 offset 32 in directory inode 1076848204 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076848204 entry ".." at block 0 offset 32 in directory inode 1076848221 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076848221 entry ".." at block 0 offset 32 in directory inode 1076848222 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076848222 entry ".." at block 0 offset 32 in directory inode 1076853088 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076853088 entry ".." at block 0 offset 32 in directory inode 1076853089 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076853089 entry ".." at block 0 offset 32 in directory inode 1076853091 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076853091 entry ".." at block 0 offset 32 in directory inode 1076853114 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076853114 entry ".." at block 0 offset 32 in directory inode 1076853126 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076853126 entry ".." at block 0 offset 32 in directory inode 1076853127 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076853127 entry ".." at block 0 offset 32 in directory inode 1076853133 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076853133 entry ".." at block 0 offset 32 in directory inode 1076853134 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076853134 entry ".." at block 0 offset 32 in directory inode 1076853135 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076853135 entry ".." at block 0 offset 32 in directory inode 1076853136 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076853136 entry ".." at block 0 offset 32 in directory inode 1076853138 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076853138 entry ".." at block 0 offset 32 in directory inode 1076853139 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076853139 entry ".." at block 0 offset 32 in directory inode 1076854593 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076854593 entry ".." at block 0 offset 32 in directory inode 1076854603 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076854603 entry ".." at block 0 offset 32 in directory inode 1076854604 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076854604 entry ".." at block 0 offset 32 in directory inode 1076854610 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076854610 entry ".." at block 0 offset 32 in directory inode 1076854621 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076854621 entry ".." at block 0 offset 32 in directory inode 1076854628 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076854628 entry ".." at block 0 offset 32 in directory inode 1076854639 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076854639 entry ".." at block 0 offset 32 in directory inode 1076854640 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076854640 entry ".." at block 0 offset 32 in directory inode 1076854643 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076854643 entry ".." at block 0 offset 32 in directory inode 1076854644 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1076854644 entry ".." at block 0 offset 32 in directory inode 1077602230 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1077602230 entry ".." at block 0 offset 32 in directory inode 1077652948 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1077652948 entry ".." at block 0 offset 32 in directory inode 1098465511 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1098465511 entry ".." at block 0 offset 32 in directory inode 1098465515 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1098465515 entry ".." at block 0 offset 32 in directory inode 1098465519 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1098465519 entry ".." at block 0 offset 32 in directory inode 1098465523 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1098465523 entry ".." at block 0 offset 32 in directory inode 1098465524 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1098465524 entry ".." at block 0 offset 32 in directory inode 1098465528 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1098465528 entry ".." at block 0 offset 32 in directory inode 1098465529 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1098465529 entry ".." at block 0 offset 32 in directory inode 1098465537 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 1098465537 entry ".." at block 0 offset 32 in directory inode 125005222 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 125005222 entry ".." at block 0 offset 32 in directory inode 125005255 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 125005255 entry ".." at block 0 offset 32 in directory inode 125005256 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 125005256 entry ".." at block 0 offset 32 in directory inode 125005577 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 125005577 entry ".." at block 0 offset 32 in directory inode 125660420 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 125660420 entry ".." at block 0 offset 32 in directory inode 130503573 references free inode 131 clearing inode number in entry at offset 32... no .. entry for directory 130503573 Phase 5 - rebuild AG headers and trees... - reset superblock... Phase 6 - check inode connectivity... reinitializing root directory reinitializing realtime bitmap inode reinitializing realtime summary inode - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... bad hash table for directory inode 424256 (no data entry): rebuilding rebuilding directory inode 424256 bad hash table for directory inode 125005222 (no data entry): rebuilding rebuilding directory inode 125005222 bad hash table for directory inode 125005255 (no data entry): rebuilding rebuilding directory inode 125005255 bad hash table for directory inode 125005256 (no data entry): rebuilding rebuilding directory inode 125005256 bad hash table for directory inode 125005577 (no data entry): rebuilding rebuilding directory inode 125005577 bad hash table for directory inode 125660420 (no data entry): rebuilding rebuilding directory inode 125660420 bad hash table for directory inode 130503573 (no data entry): rebuilding rebuilding directory inode 130503573 bad hash table for directory inode 1075051913 (no data entry): rebuilding rebuilding directory inode 1075051913 bad hash table for directory inode 1075051915 (no data entry): rebuilding rebuilding directory inode 1075051915 bad hash table for directory inode 1075051918 (no data entry): rebuilding rebuilding directory inode 1075051918 bad hash table for directory inode 1075051920 (no data entry): rebuilding rebuilding directory inode 1075051920 bad hash table for directory inode 1075051921 (no data entry): rebuilding rebuilding directory inode 1075051921 bad hash table for directory inode 1075051923 (no data entry): rebuilding rebuilding directory inode 1075051923 bad hash table for directory inode 1075051930 (no data entry): rebuilding rebuilding directory inode 1075051930 bad hash table for directory inode 1075051931 (no data entry): rebuilding rebuilding directory inode 1075051931 bad hash table for directory inode 1075051932 (no data entry): rebuilding rebuilding directory inode 1075051932 bad hash table for directory inode 1075051934 (no data entry): rebuilding rebuilding directory inode 1075051934 bad hash table for directory inode 1075117889 (no data entry): rebuilding rebuilding directory inode 1075117889 bad hash table for directory inode 1075117896 (no data entry): rebuilding rebuilding directory inode 1075117896 bad hash table for directory inode 1075117907 (no data entry): rebuilding rebuilding directory inode 1075117907 bad hash table for directory inode 1075244397 (no data entry): rebuilding rebuilding directory inode 1075244397 bad hash table for directory inode 1075244399 (no data entry): rebuilding rebuilding directory inode 1075244399 bad hash table for directory inode 1075244401 (no data entry): rebuilding rebuilding directory inode 1075244401 bad hash table for directory inode 1076805266 (no data entry): rebuilding rebuilding directory inode 1076805266 bad hash table for directory inode 1076811247 (no data entry): rebuilding rebuilding directory inode 1076811247 bad hash table for directory inode 1076811248 (no data entry): rebuilding rebuilding directory inode 1076811248 bad hash table for directory inode 1076811260 (no data entry): rebuilding rebuilding directory inode 1076811260 bad hash table for directory inode 1076811261 (no data entry): rebuilding rebuilding directory inode 1076811261 bad hash table for directory inode 1076811262 (no data entry): rebuilding rebuilding directory inode 1076811262 bad hash table for directory inode 1076811263 (no data entry): rebuilding rebuilding directory inode 1076811263 bad hash table for directory inode 1076818528 (no data entry): rebuilding rebuilding directory inode 1076818528 bad hash table for directory inode 1076818529 (no data entry): rebuilding rebuilding directory inode 1076818529 bad hash table for directory inode 1076818542 (no data entry): rebuilding rebuilding directory inode 1076818542 bad hash table for directory inode 1076818543 (no data entry): rebuilding rebuilding directory inode 1076818543 bad hash table for directory inode 1076818544 (no data entry): rebuilding rebuilding directory inode 1076818544 bad hash table for directory inode 1076818545 (no data entry): rebuilding rebuilding directory inode 1076818545 bad hash table for directory inode 1076818546 (no data entry): rebuilding rebuilding directory inode 1076818546 bad hash table for directory inode 1076818548 (no data entry): rebuilding rebuilding directory inode 1076818548 bad hash table for directory inode 1076818549 (no data entry): rebuilding rebuilding directory inode 1076818549 bad hash table for directory inode 1076818554 (no data entry): rebuilding rebuilding directory inode 1076818554 bad hash table for directory inode 1076818555 (no data entry): rebuilding rebuilding directory inode 1076818555 bad hash table for directory inode 1076818556 (no data entry): rebuilding rebuilding directory inode 1076818556 bad hash table for directory inode 1076818559 (no data entry): rebuilding rebuilding directory inode 1076818559 bad hash table for directory inode 1076818562 (no data entry): rebuilding rebuilding directory inode 1076818562 bad hash table for directory inode 1076818563 (no data entry): rebuilding rebuilding directory inode 1076818563 bad hash table for directory inode 1076818591 (no data entry): rebuilding rebuilding directory inode 1076818591 bad hash table for directory inode 1076828546 (no data entry): rebuilding rebuilding directory inode 1076828546 bad hash table for directory inode 1076828549 (no data entry): rebuilding rebuilding directory inode 1076828549 bad hash table for directory inode 1076828554 (no data entry): rebuilding rebuilding directory inode 1076828554 bad hash table for directory inode 1076828555 (no data entry): rebuilding rebuilding directory inode 1076828555 bad hash table for directory inode 1076828571 (no data entry): rebuilding rebuilding directory inode 1076828571 bad hash table for directory inode 1076828573 (no data entry): rebuilding rebuilding directory inode 1076828573 bad hash table for directory inode 1076828594 (no data entry): rebuilding rebuilding directory inode 1076828594 bad hash table for directory inode 1076828599 (no data entry): rebuilding rebuilding directory inode 1076828599 bad hash table for directory inode 1076828607 (no data entry): rebuilding rebuilding directory inode 1076828607 bad hash table for directory inode 1076839776 (no data entry): rebuilding rebuilding directory inode 1076839776 bad hash table for directory inode 1076839777 (no data entry): rebuilding rebuilding directory inode 1076839777 bad hash table for directory inode 1076839779 (no data entry): rebuilding rebuilding directory inode 1076839779 bad hash table for directory inode 1076839780 (no data entry): rebuilding rebuilding directory inode 1076839780 bad hash table for directory inode 1076839784 (no data entry): rebuilding rebuilding directory inode 1076839784 bad hash table for directory inode 1076839785 (no data entry): rebuilding rebuilding directory inode 1076839785 bad hash table for directory inode 1076839786 (no data entry): rebuilding rebuilding directory inode 1076839786 bad hash table for directory inode 1076839792 (no data entry): rebuilding rebuilding directory inode 1076839792 bad hash table for directory inode 1076839794 (no data entry): rebuilding rebuilding directory inode 1076839794 bad hash table for directory inode 1076839795 (no data entry): rebuilding rebuilding directory inode 1076839795 bad hash table for directory inode 1076839823 (no data entry): rebuilding rebuilding directory inode 1076839823 bad hash table for directory inode 1076839825 (no data entry): rebuilding rebuilding directory inode 1076839825 bad hash table for directory inode 1076839826 (no data entry): rebuilding rebuilding directory inode 1076839826 bad hash table for directory inode 1076839828 (no data entry): rebuilding rebuilding directory inode 1076839828 bad hash table for directory inode 1076839831 (no data entry): rebuilding rebuilding directory inode 1076839831 bad hash table for directory inode 1076839835 (no data entry): rebuilding rebuilding directory inode 1076839835 bad hash table for directory inode 1076839836 (no data entry): rebuilding rebuilding directory inode 1076839836 bad hash table for directory inode 1076839837 (no data entry): rebuilding rebuilding directory inode 1076839837 bad hash table for directory inode 1076839838 (no data entry): rebuilding rebuilding directory inode 1076839838 bad hash table for directory inode 1076848162 (no data entry): rebuilding rebuilding directory inode 1076848162 bad hash table for directory inode 1076848202 (no data entry): rebuilding rebuilding directory inode 1076848202 bad hash table for directory inode 1076848204 (no data entry): rebuilding rebuilding directory inode 1076848204 bad hash table for directory inode 1076848221 (no data entry): rebuilding rebuilding directory inode 1076848221 bad hash table for directory inode 1076848222 (no data entry): rebuilding rebuilding directory inode 1076848222 bad hash table for directory inode 1076853088 (no data entry): rebuilding rebuilding directory inode 1076853088 bad hash table for directory inode 1076853089 (no data entry): rebuilding rebuilding directory inode 1076853089 bad hash table for directory inode 1076853091 (no data entry): rebuilding rebuilding directory inode 1076853091 bad hash table for directory inode 1076853114 (no data entry): rebuilding rebuilding directory inode 1076853114 bad hash table for directory inode 1076853126 (no data entry): rebuilding rebuilding directory inode 1076853126 bad hash table for directory inode 1076853127 (no data entry): rebuilding rebuilding directory inode 1076853127 bad hash table for directory inode 1076853133 (no data entry): rebuilding rebuilding directory inode 1076853133 bad hash table for directory inode 1076853134 (no data entry): rebuilding rebuilding directory inode 1076853134 bad hash table for directory inode 1076853135 (no data entry): rebuilding rebuilding directory inode 1076853135 bad hash table for directory inode 1076853136 (no data entry): rebuilding rebuilding directory inode 1076853136 bad hash table for directory inode 1076853138 (no data entry): rebuilding rebuilding directory inode 1076853138 bad hash table for directory inode 1076853139 (no data entry): rebuilding rebuilding directory inode 1076853139 bad hash table for directory inode 1076854593 (no data entry): rebuilding rebuilding directory inode 1076854593 bad hash table for directory inode 1076854603 (no data entry): rebuilding rebuilding directory inode 1076854603 bad hash table for directory inode 1076854604 (no data entry): rebuilding rebuilding directory inode 1076854604 bad hash table for directory inode 1076854610 (no data entry): rebuilding rebuilding directory inode 1076854610 bad hash table for directory inode 1076854621 (no data entry): rebuilding rebuilding directory inode 1076854621 bad hash table for directory inode 1076854628 (no data entry): rebuilding rebuilding directory inode 1076854628 bad hash table for directory inode 1076854639 (no data entry): rebuilding rebuilding directory inode 1076854639 bad hash table for directory inode 1076854640 (no data entry): rebuilding rebuilding directory inode 1076854640 bad hash table for directory inode 1076854643 (no data entry): rebuilding rebuilding directory inode 1076854643 bad hash table for directory inode 1076854644 (no data entry): rebuilding rebuilding directory inode 1076854644 bad hash table for directory inode 1077602230 (no data entry): rebuilding rebuilding directory inode 1077602230 bad hash table for directory inode 1077652948 (no data entry): rebuilding rebuilding directory inode 1077652948 bad hash table for directory inode 1098465511 (no data entry): rebuilding rebuilding directory inode 1098465511 bad hash table for directory inode 1098465515 (no data entry): rebuilding rebuilding directory inode 1098465515 bad hash table for directory inode 1098465519 (no data entry): rebuilding rebuilding directory inode 1098465519 bad hash table for directory inode 1098465523 (no data entry): rebuilding rebuilding directory inode 1098465523 bad hash table for directory inode 1098465524 (no data entry): rebuilding rebuilding directory inode 1098465524 bad hash table for directory inode 1098465528 (no data entry): rebuilding rebuilding directory inode 1098465528 bad hash table for directory inode 1098465529 (no data entry): rebuilding rebuilding directory inode 1098465529 bad hash table for directory inode 1098465537 (no data entry): rebuilding rebuilding directory inode 1098465537 - traversal finished ... - moving disconnected inodes to lost+found ... disconnected dir inode 424256, moving to lost+found disconnected inode 424257, moving to lost+found disconnected inode 424258, moving to lost+found disconnected inode 5667475, moving to lost+found disconnected dir inode 125005217, moving to lost+found disconnected dir inode 125005218, moving to lost+found disconnected dir inode 125005219, moving to lost+found disconnected dir inode 125005221, moving to lost+found disconnected dir inode 125005222, moving to lost+found disconnected dir inode 125005223, moving to lost+found disconnected dir inode 125005224, moving to lost+found disconnected dir inode 125005225, moving to lost+found disconnected dir inode 125005226, moving to lost+found disconnected dir inode 125005228, moving to lost+found disconnected dir inode 125005229, moving to lost+found disconnected dir inode 125005230, moving to lost+found disconnected dir inode 125005231, moving to lost+found disconnected dir inode 125005232, moving to lost+found disconnected dir inode 125005233, moving to lost+found disconnected dir inode 125005236, moving to lost+found disconnected dir inode 125005237, moving to lost+found disconnected dir inode 125005238, moving to lost+found disconnected dir inode 125005239, moving to lost+found disconnected dir inode 125005240, moving to lost+found disconnected dir inode 125005241, moving to lost+found disconnected dir inode 125005242, moving to lost+found disconnected dir inode 125005243, moving to lost+found disconnected dir inode 125005244, moving to lost+found disconnected dir inode 125005245, moving to lost+found disconnected dir inode 125005247, moving to lost+found disconnected dir inode 125005248, moving to lost+found disconnected dir inode 125005249, moving to lost+found disconnected dir inode 125005250, moving to lost+found disconnected dir inode 125005251, moving to lost+found disconnected dir inode 125005252, moving to lost+found disconnected dir inode 125005253, moving to lost+found disconnected dir inode 125005254, moving to lost+found disconnected dir inode 125005255, moving to lost+found disconnected dir inode 125005256, moving to lost+found disconnected dir inode 125005257, moving to lost+found disconnected dir inode 125005259, moving to lost+found disconnected dir inode 125005260, moving to lost+found disconnected dir inode 125005262, moving to lost+found disconnected dir inode 125005263, moving to lost+found disconnected dir inode 125005264, moving to lost+found disconnected dir inode 125005265, moving to lost+found disconnected dir inode 125005266, moving to lost+found disconnected dir inode 125005267, moving to lost+found disconnected dir inode 125005268, moving to lost+found disconnected dir inode 125005269, moving to lost+found disconnected dir inode 125005270, moving to lost+found disconnected dir inode 125005271, moving to lost+found disconnected dir inode 125005272, moving to lost+found disconnected dir inode 125005273, moving to lost+found disconnected dir inode 125005274, moving to lost+found disconnected dir inode 125005275, moving to lost+found disconnected dir inode 125005276, moving to lost+found disconnected dir inode 125005277, moving to lost+found disconnected dir inode 125005278, moving to lost+found disconnected dir inode 125005279, moving to lost+found disconnected dir inode 125005568, moving to lost+found disconnected dir inode 125005569, moving to lost+found disconnected dir inode 125005571, moving to lost+found disconnected dir inode 125005572, moving to lost+found disconnected dir inode 125005573, moving to lost+found disconnected dir inode 125005574, moving to lost+found disconnected dir inode 125005575, moving to lost+found disconnected dir inode 125005576, moving to lost+found disconnected dir inode 125005577, moving to lost+found disconnected dir inode 125016316, moving to lost+found disconnected dir inode 125660420, moving to lost+found disconnected dir inode 125685326, moving to lost+found disconnected dir inode 125685351, moving to lost+found disconnected inode 125908558, moving to lost+found disconnected inode 125908559, moving to lost+found disconnected inode 125908560, moving to lost+found disconnected dir inode 126090218, moving to lost+found disconnected dir inode 126090220, moving to lost+found disconnected dir inode 126090224, moving to lost+found disconnected dir inode 130503573, moving to lost+found disconnected dir inode 164462811, moving to lost+found disconnected dir inode 164462812, moving to lost+found disconnected dir inode 164462813, moving to lost+found disconnected dir inode 164462814, moving to lost+found disconnected dir inode 164462815, moving to lost+found disconnected dir inode 164462816, moving to lost+found disconnected dir inode 164462817, moving to lost+found disconnected dir inode 164462818, moving to lost+found disconnected dir inode 164462819, moving to lost+found disconnected dir inode 164462820, moving to lost+found disconnected dir inode 164462821, moving to lost+found disconnected dir inode 164462822, moving to lost+found disconnected dir inode 164462823, moving to lost+found disconnected dir inode 164462824, moving to lost+found disconnected dir inode 164462825, moving to lost+found disconnected dir inode 164462826, moving to lost+found disconnected dir inode 190881713, moving to lost+found disconnected dir inode 240441693, moving to lost+found disconnected dir inode 1075051900, moving to lost+found disconnected dir inode 1075051901, moving to lost+found disconnected dir inode 1075051902, moving to lost+found disconnected dir inode 1075051903, moving to lost+found disconnected dir inode 1075051908, moving to lost+found disconnected dir inode 1075051909, moving to lost+found disconnected dir inode 1075051910, moving to lost+found disconnected dir inode 1075051912, moving to lost+found disconnected dir inode 1075051913, moving to lost+found disconnected dir inode 1075051915, moving to lost+found disconnected dir inode 1075051916, moving to lost+found disconnected dir inode 1075051917, moving to lost+found disconnected dir inode 1075051918, moving to lost+found disconnected dir inode 1075051919, moving to lost+found disconnected dir inode 1075051920, moving to lost+found disconnected dir inode 1075051921, moving to lost+found disconnected dir inode 1075051922, moving to lost+found disconnected dir inode 1075051923, moving to lost+found disconnected dir inode 1075051930, moving to lost+found disconnected dir inode 1075051931, moving to lost+found disconnected dir inode 1075051932, moving to lost+found disconnected dir inode 1075051933, moving to lost+found disconnected dir inode 1075051934, moving to lost+found disconnected dir inode 1075117888, moving to lost+found disconnected dir inode 1075117889, moving to lost+found disconnected dir inode 1075117890, moving to lost+found disconnected dir inode 1075117891, moving to lost+found disconnected dir inode 1075117896, moving to lost+found disconnected dir inode 1075117897, moving to lost+found disconnected dir inode 1075117902, moving to lost+found disconnected dir inode 1075117903, moving to lost+found disconnected dir inode 1075117907, moving to lost+found disconnected dir inode 1075117908, moving to lost+found disconnected dir inode 1075117939, moving to lost+found disconnected dir inode 1075244397, moving to lost+found disconnected dir inode 1075244399, moving to lost+found disconnected dir inode 1075244400, moving to lost+found disconnected dir inode 1075244401, moving to lost+found disconnected dir inode 1075244402, moving to lost+found disconnected dir inode 1076383229, moving to lost+found disconnected dir inode 1076383230, moving to lost+found disconnected dir inode 1076797385, moving to lost+found disconnected dir inode 1076797389, moving to lost+found disconnected dir inode 1076797390, moving to lost+found disconnected dir inode 1076797391, moving to lost+found disconnected dir inode 1076797393, moving to lost+found disconnected dir inode 1076797395, moving to lost+found disconnected dir inode 1076797399, moving to lost+found disconnected dir inode 1076797407, moving to lost+found disconnected dir inode 1076797408, moving to lost+found disconnected dir inode 1076797410, moving to lost+found disconnected dir inode 1076797411, moving to lost+found disconnected dir inode 1076797412, moving to lost+found disconnected dir inode 1076797413, moving to lost+found disconnected dir inode 1076797417, moving to lost+found disconnected dir inode 1076797418, moving to lost+found disconnected dir inode 1076797420, moving to lost+found disconnected dir inode 1076797421, moving to lost+found disconnected dir inode 1076797422, moving to lost+found disconnected dir inode 1076797423, moving to lost+found disconnected dir inode 1076797424, moving to lost+found disconnected dir inode 1076797425, moving to lost+found disconnected dir inode 1076797426, moving to lost+found disconnected dir inode 1076797427, moving to lost+found disconnected dir inode 1076797428, moving to lost+found disconnected dir inode 1076797429, moving to lost+found disconnected dir inode 1076797433, moving to lost+found disconnected dir inode 1076797437, moving to lost+found disconnected dir inode 1076797438, moving to lost+found disconnected dir inode 1076797440, moving to lost+found disconnected dir inode 1076797442, moving to lost+found disconnected dir inode 1076797445, moving to lost+found disconnected dir inode 1076797446, moving to lost+found disconnected dir inode 1076797447, moving to lost+found disconnected dir inode 1076797451, moving to lost+found disconnected dir inode 1076797455, moving to lost+found disconnected dir inode 1076797459, moving to lost+found disconnected dir inode 1076797461, moving to lost+found disconnected dir inode 1076797462, moving to lost+found disconnected dir inode 1076797463, moving to lost+found disconnected dir inode 1076797464, moving to lost+found disconnected dir inode 1076797465, moving to lost+found disconnected dir inode 1076797466, moving to lost+found disconnected dir inode 1076797467, moving to lost+found disconnected dir inode 1076797468, moving to lost+found disconnected dir inode 1076797469, moving to lost+found disconnected dir inode 1076797470, moving to lost+found disconnected dir inode 1076797471, moving to lost+found disconnected dir inode 1076797472, moving to lost+found disconnected dir inode 1076797473, moving to lost+found disconnected dir inode 1076797474, moving to lost+found disconnected dir inode 1076797479, moving to lost+found disconnected dir inode 1076797481, moving to lost+found disconnected dir inode 1076797488, moving to lost+found disconnected dir inode 1076797490, moving to lost+found disconnected dir inode 1076797491, moving to lost+found disconnected dir inode 1076797492, moving to lost+found disconnected dir inode 1076797493, moving to lost+found disconnected dir inode 1076797494, moving to lost+found disconnected dir inode 1076797495, moving to lost+found disconnected dir inode 1076797496, moving to lost+found disconnected dir inode 1076797497, moving to lost+found disconnected dir inode 1076797498, moving to lost+found disconnected dir inode 1076797500, moving to lost+found disconnected dir inode 1076797502, moving to lost+found disconnected dir inode 1076797503, moving to lost+found disconnected dir inode 1076805248, moving to lost+found disconnected dir inode 1076805249, moving to lost+found disconnected dir inode 1076805254, moving to lost+found disconnected dir inode 1076805255, moving to lost+found disconnected dir inode 1076805256, moving to lost+found disconnected dir inode 1076805257, moving to lost+found disconnected dir inode 1076805259, moving to lost+found disconnected dir inode 1076805260, moving to lost+found disconnected dir inode 1076805261, moving to lost+found disconnected dir inode 1076805262, moving to lost+found disconnected dir inode 1076805263, moving to lost+found disconnected dir inode 1076805266, moving to lost+found disconnected dir inode 1076805267, moving to lost+found disconnected dir inode 1076805268, moving to lost+found disconnected dir inode 1076805269, moving to lost+found disconnected dir inode 1076805270, moving to lost+found disconnected dir inode 1076805272, moving to lost+found disconnected dir inode 1076805273, moving to lost+found disconnected dir inode 1076805274, moving to lost+found disconnected dir inode 1076805276, moving to lost+found disconnected dir inode 1076805277, moving to lost+found disconnected dir inode 1076805278, moving to lost+found disconnected dir inode 1076805279, moving to lost+found disconnected dir inode 1076805280, moving to lost+found disconnected dir inode 1076805281, moving to lost+found disconnected dir inode 1076805286, moving to lost+found disconnected dir inode 1076805288, moving to lost+found disconnected dir inode 1076805293, moving to lost+found disconnected dir inode 1076805294, moving to lost+found disconnected dir inode 1076805295, moving to lost+found disconnected dir inode 1076805296, moving to lost+found disconnected dir inode 1076805297, moving to lost+found disconnected dir inode 1076805298, moving to lost+found disconnected dir inode 1076805299, moving to lost+found disconnected dir inode 1076805300, moving to lost+found disconnected dir inode 1076805301, moving to lost+found disconnected dir inode 1076805307, moving to lost+found disconnected dir inode 1076805308, moving to lost+found disconnected dir inode 1076809126, moving to lost+found disconnected dir inode 1076809135, moving to lost+found disconnected dir inode 1076809136, moving to lost+found disconnected dir inode 1076809137, moving to lost+found disconnected dir inode 1076809141, moving to lost+found disconnected dir inode 1076809143, moving to lost+found disconnected dir inode 1076809144, moving to lost+found disconnected dir inode 1076809145, moving to lost+found disconnected dir inode 1076809146, moving to lost+found disconnected dir inode 1076809147, moving to lost+found disconnected dir inode 1076809148, moving to lost+found disconnected dir inode 1076809149, moving to lost+found disconnected dir inode 1076809150, moving to lost+found disconnected dir inode 1076809158, moving to lost+found disconnected dir inode 1076809162, moving to lost+found disconnected dir inode 1076809163, moving to lost+found disconnected dir inode 1076809164, moving to lost+found disconnected dir inode 1076809165, moving to lost+found disconnected dir inode 1076809166, moving to lost+found disconnected dir inode 1076809167, moving to lost+found disconnected dir inode 1076809168, moving to lost+found disconnected dir inode 1076809169, moving to lost+found disconnected dir inode 1076809170, moving to lost+found disconnected dir inode 1076809171, moving to lost+found disconnected dir inode 1076809172, moving to lost+found disconnected dir inode 1076809173, moving to lost+found disconnected dir inode 1076809174, moving to lost+found disconnected dir inode 1076809175, moving to lost+found disconnected dir inode 1076809176, moving to lost+found disconnected dir inode 1076809177, moving to lost+found disconnected dir inode 1076809178, moving to lost+found disconnected dir inode 1076809179, moving to lost+found disconnected dir inode 1076809180, moving to lost+found disconnected dir inode 1076809181, moving to lost+found disconnected dir inode 1076809182, moving to lost+found disconnected dir inode 1076809183, moving to lost+found disconnected dir inode 1076811200, moving to lost+found disconnected dir inode 1076811201, moving to lost+found disconnected dir inode 1076811202, moving to lost+found disconnected dir inode 1076811203, moving to lost+found disconnected dir inode 1076811204, moving to lost+found disconnected dir inode 1076811206, moving to lost+found disconnected dir inode 1076811210, moving to lost+found disconnected dir inode 1076811211, moving to lost+found disconnected dir inode 1076811212, moving to lost+found disconnected dir inode 1076811213, moving to lost+found disconnected dir inode 1076811214, moving to lost+found disconnected dir inode 1076811215, moving to lost+found disconnected dir inode 1076811216, moving to lost+found disconnected dir inode 1076811219, moving to lost+found disconnected dir inode 1076811220, moving to lost+found disconnected dir inode 1076811221, moving to lost+found disconnected dir inode 1076811224, moving to lost+found disconnected dir inode 1076811227, moving to lost+found disconnected dir inode 1076811228, moving to lost+found disconnected dir inode 1076811229, moving to lost+found disconnected dir inode 1076811233, moving to lost+found disconnected dir inode 1076811238, moving to lost+found disconnected dir inode 1076811239, moving to lost+found disconnected dir inode 1076811240, moving to lost+found disconnected dir inode 1076811242, moving to lost+found disconnected dir inode 1076811247, moving to lost+found disconnected dir inode 1076811248, moving to lost+found disconnected dir inode 1076811251, moving to lost+found disconnected dir inode 1076811252, moving to lost+found disconnected dir inode 1076811253, moving to lost+found disconnected dir inode 1076811254, moving to lost+found disconnected dir inode 1076811255, moving to lost+found disconnected dir inode 1076811256, moving to lost+found disconnected dir inode 1076811258, moving to lost+found disconnected dir inode 1076811259, moving to lost+found disconnected dir inode 1076811260, moving to lost+found disconnected dir inode 1076811261, moving to lost+found disconnected dir inode 1076811262, moving to lost+found disconnected dir inode 1076811263, moving to lost+found disconnected dir inode 1076818528, moving to lost+found disconnected dir inode 1076818529, moving to lost+found disconnected dir inode 1076818531, moving to lost+found disconnected dir inode 1076818532, moving to lost+found disconnected dir inode 1076818541, moving to lost+found disconnected dir inode 1076818542, moving to lost+found disconnected dir inode 1076818543, moving to lost+found disconnected dir inode 1076818544, moving to lost+found disconnected dir inode 1076818545, moving to lost+found disconnected dir inode 1076818546, moving to lost+found disconnected dir inode 1076818548, moving to lost+found disconnected dir inode 1076818549, moving to lost+found disconnected dir inode 1076818550, moving to lost+found disconnected dir inode 1076818554, moving to lost+found disconnected dir inode 1076818555, moving to lost+found disconnected dir inode 1076818556, moving to lost+found disconnected dir inode 1076818557, moving to lost+found disconnected dir inode 1076818558, moving to lost+found disconnected dir inode 1076818559, moving to lost+found disconnected dir inode 1076818561, moving to lost+found disconnected dir inode 1076818562, moving to lost+found disconnected dir inode 1076818563, moving to lost+found disconnected dir inode 1076818564, moving to lost+found disconnected dir inode 1076818565, moving to lost+found disconnected dir inode 1076818566, moving to lost+found disconnected dir inode 1076818567, moving to lost+found disconnected dir inode 1076818569, moving to lost+found disconnected dir inode 1076818570, moving to lost+found disconnected dir inode 1076818577, moving to lost+found disconnected dir inode 1076818578, moving to lost+found disconnected dir inode 1076818587, moving to lost+found disconnected dir inode 1076818588, moving to lost+found disconnected dir inode 1076818589, moving to lost+found disconnected dir inode 1076818590, moving to lost+found disconnected dir inode 1076818591, moving to lost+found disconnected dir inode 1076828510, moving to lost+found disconnected dir inode 1076828544, moving to lost+found disconnected dir inode 1076828545, moving to lost+found disconnected dir inode 1076828546, moving to lost+found disconnected dir inode 1076828547, moving to lost+found disconnected dir inode 1076828548, moving to lost+found disconnected dir inode 1076828549, moving to lost+found disconnected dir inode 1076828550, moving to lost+found disconnected dir inode 1076828551, moving to lost+found disconnected dir inode 1076828554, moving to lost+found disconnected dir inode 1076828555, moving to lost+found disconnected dir inode 1076828562, moving to lost+found disconnected dir inode 1076828563, moving to lost+found disconnected dir inode 1076828564, moving to lost+found disconnected dir inode 1076828565, moving to lost+found disconnected dir inode 1076828570, moving to lost+found disconnected dir inode 1076828571, moving to lost+found disconnected dir inode 1076828572, moving to lost+found disconnected dir inode 1076828573, moving to lost+found disconnected dir inode 1076828574, moving to lost+found disconnected dir inode 1076828575, moving to lost+found disconnected dir inode 1076828576, moving to lost+found disconnected dir inode 1076828577, moving to lost+found disconnected dir inode 1076828578, moving to lost+found disconnected dir inode 1076828579, moving to lost+found disconnected dir inode 1076828594, moving to lost+found disconnected dir inode 1076828595, moving to lost+found disconnected dir inode 1076828596, moving to lost+found disconnected dir inode 1076828597, moving to lost+found disconnected dir inode 1076828598, moving to lost+found disconnected dir inode 1076828599, moving to lost+found disconnected dir inode 1076828600, moving to lost+found disconnected dir inode 1076828601, moving to lost+found disconnected dir inode 1076828602, moving to lost+found disconnected dir inode 1076828603, moving to lost+found disconnected dir inode 1076828604, moving to lost+found disconnected dir inode 1076828605, moving to lost+found disconnected dir inode 1076828606, moving to lost+found disconnected dir inode 1076828607, moving to lost+found disconnected dir inode 1076839776, moving to lost+found disconnected dir inode 1076839777, moving to lost+found disconnected dir inode 1076839778, moving to lost+found disconnected dir inode 1076839779, moving to lost+found disconnected dir inode 1076839780, moving to lost+found disconnected dir inode 1076839782, moving to lost+found disconnected dir inode 1076839783, moving to lost+found disconnected dir inode 1076839784, moving to lost+found disconnected dir inode 1076839785, moving to lost+found disconnected dir inode 1076839786, moving to lost+found disconnected dir inode 1076839790, moving to lost+found disconnected dir inode 1076839791, moving to lost+found disconnected dir inode 1076839792, moving to lost+found disconnected dir inode 1076839793, moving to lost+found disconnected dir inode 1076839794, moving to lost+found disconnected dir inode 1076839795, moving to lost+found disconnected dir inode 1076839796, moving to lost+found disconnected dir inode 1076839797, moving to lost+found disconnected dir inode 1076839798, moving to lost+found disconnected dir inode 1076839799, moving to lost+found disconnected dir inode 1076839800, moving to lost+found disconnected dir inode 1076839801, moving to lost+found disconnected dir inode 1076839802, moving to lost+found disconnected dir inode 1076839803, moving to lost+found disconnected dir inode 1076839804, moving to lost+found disconnected dir inode 1076839805, moving to lost+found disconnected dir inode 1076839806, moving to lost+found disconnected dir inode 1076839807, moving to lost+found disconnected dir inode 1076839808, moving to lost+found disconnected dir inode 1076839809, moving to lost+found disconnected dir inode 1076839810, moving to lost+found disconnected dir inode 1076839812, moving to lost+found disconnected dir inode 1076839817, moving to lost+found disconnected dir inode 1076839818, moving to lost+found disconnected dir inode 1076839819, moving to lost+found disconnected dir inode 1076839823, moving to lost+found disconnected dir inode 1076839825, moving to lost+found disconnected dir inode 1076839826, moving to lost+found disconnected dir inode 1076839827, moving to lost+found disconnected dir inode 1076839828, moving to lost+found disconnected dir inode 1076839831, moving to lost+found disconnected dir inode 1076839833, moving to lost+found disconnected dir inode 1076839834, moving to lost+found disconnected dir inode 1076839835, moving to lost+found disconnected dir inode 1076839836, moving to lost+found disconnected dir inode 1076839837, moving to lost+found disconnected dir inode 1076839838, moving to lost+found disconnected dir inode 1076848162, moving to lost+found disconnected dir inode 1076848164, moving to lost+found disconnected dir inode 1076848169, moving to lost+found disconnected dir inode 1076848170, moving to lost+found disconnected dir inode 1076848171, moving to lost+found disconnected dir inode 1076848173, moving to lost+found disconnected dir inode 1076848174, moving to lost+found disconnected dir inode 1076848175, moving to lost+found disconnected dir inode 1076848176, moving to lost+found disconnected dir inode 1076848177, moving to lost+found disconnected dir inode 1076848178, moving to lost+found disconnected dir inode 1076848179, moving to lost+found disconnected dir inode 1076848182, moving to lost+found disconnected dir inode 1076848183, moving to lost+found disconnected dir inode 1076848184, moving to lost+found disconnected dir inode 1076848185, moving to lost+found disconnected dir inode 1076848186, moving to lost+found disconnected dir inode 1076848187, moving to lost+found disconnected dir inode 1076848194, moving to lost+found disconnected dir inode 1076848195, moving to lost+found disconnected dir inode 1076848196, moving to lost+found disconnected dir inode 1076848197, moving to lost+found disconnected dir inode 1076848198, moving to lost+found disconnected dir inode 1076848199, moving to lost+found disconnected dir inode 1076848200, moving to lost+found disconnected dir inode 1076848201, moving to lost+found disconnected dir inode 1076848202, moving to lost+found disconnected dir inode 1076848203, moving to lost+found disconnected dir inode 1076848204, moving to lost+found disconnected dir inode 1076848205, moving to lost+found disconnected dir inode 1076848206, moving to lost+found disconnected dir inode 1076848207, moving to lost+found disconnected dir inode 1076848208, moving to lost+found disconnected dir inode 1076848209, moving to lost+found disconnected dir inode 1076848210, moving to lost+found disconnected dir inode 1076848211, moving to lost+found disconnected dir inode 1076848212, moving to lost+found disconnected dir inode 1076848213, moving to lost+found disconnected dir inode 1076848214, moving to lost+found disconnected dir inode 1076848219, moving to lost+found disconnected dir inode 1076848221, moving to lost+found disconnected dir inode 1076848222, moving to lost+found disconnected dir inode 1076853088, moving to lost+found disconnected dir inode 1076853089, moving to lost+found disconnected dir inode 1076853091, moving to lost+found disconnected dir inode 1076853104, moving to lost+found disconnected dir inode 1076853105, moving to lost+found disconnected dir inode 1076853106, moving to lost+found disconnected dir inode 1076853107, moving to lost+found disconnected dir inode 1076853109, moving to lost+found disconnected dir inode 1076853110, moving to lost+found disconnected dir inode 1076853111, moving to lost+found disconnected dir inode 1076853114, moving to lost+found disconnected dir inode 1076853119, moving to lost+found disconnected dir inode 1076853126, moving to lost+found disconnected dir inode 1076853127, moving to lost+found disconnected dir inode 1076853128, moving to lost+found disconnected dir inode 1076853129, moving to lost+found disconnected dir inode 1076853130, moving to lost+found disconnected dir inode 1076853131, moving to lost+found disconnected dir inode 1076853132, moving to lost+found disconnected dir inode 1076853133, moving to lost+found disconnected dir inode 1076853134, moving to lost+found disconnected dir inode 1076853135, moving to lost+found disconnected dir inode 1076853136, moving to lost+found disconnected dir inode 1076853137, moving to lost+found disconnected dir inode 1076853138, moving to lost+found disconnected dir inode 1076853139, moving to lost+found disconnected dir inode 1076853140, moving to lost+found disconnected dir inode 1076853143, moving to lost+found disconnected dir inode 1076853144, moving to lost+found disconnected dir inode 1076853145, moving to lost+found disconnected dir inode 1076853146, moving to lost+found disconnected dir inode 1076853147, moving to lost+found disconnected dir inode 1076853148, moving to lost+found disconnected dir inode 1076853149, moving to lost+found disconnected dir inode 1076853150, moving to lost+found disconnected dir inode 1076853151, moving to lost+found disconnected dir inode 1076854592, moving to lost+found disconnected dir inode 1076854593, moving to lost+found disconnected dir inode 1076854594, moving to lost+found disconnected dir inode 1076854595, moving to lost+found disconnected dir inode 1076854596, moving to lost+found disconnected dir inode 1076854597, moving to lost+found disconnected dir inode 1076854598, moving to lost+found disconnected dir inode 1076854599, moving to lost+found disconnected dir inode 1076854600, moving to lost+found disconnected dir inode 1076854601, moving to lost+found disconnected dir inode 1076854602, moving to lost+found disconnected dir inode 1076854603, moving to lost+found disconnected dir inode 1076854604, moving to lost+found disconnected dir inode 1076854605, moving to lost+found disconnected dir inode 1076854606, moving to lost+found disconnected dir inode 1076854607, moving to lost+found disconnected dir inode 1076854608, moving to lost+found disconnected dir inode 1076854609, moving to lost+found disconnected dir inode 1076854610, moving to lost+found disconnected dir inode 1076854611, moving to lost+found disconnected dir inode 1076854612, moving to lost+found disconnected dir inode 1076854613, moving to lost+found disconnected dir inode 1076854614, moving to lost+found disconnected dir inode 1076854615, moving to lost+found disconnected dir inode 1076854616, moving to lost+found disconnected dir inode 1076854617, moving to lost+found disconnected dir inode 1076854619, moving to lost+found disconnected dir inode 1076854620, moving to lost+found disconnected dir inode 1076854621, moving to lost+found disconnected dir inode 1076854622, moving to lost+found disconnected dir inode 1076854623, moving to lost+found disconnected dir inode 1076854624, moving to lost+found disconnected dir inode 1076854625, moving to lost+found disconnected dir inode 1076854626, moving to lost+found disconnected dir inode 1076854627, moving to lost+found disconnected dir inode 1076854628, moving to lost+found disconnected dir inode 1076854630, moving to lost+found disconnected dir inode 1076854631, moving to lost+found disconnected dir inode 1076854632, moving to lost+found disconnected dir inode 1076854633, moving to lost+found disconnected dir inode 1076854634, moving to lost+found disconnected dir inode 1076854635, moving to lost+found disconnected dir inode 1076854636, moving to lost+found disconnected dir inode 1076854637, moving to lost+found disconnected dir inode 1076854638, moving to lost+found disconnected dir inode 1076854639, moving to lost+found disconnected dir inode 1076854640, moving to lost+found disconnected dir inode 1076854641, moving to lost+found disconnected dir inode 1076854642, moving to lost+found disconnected dir inode 1076854643, moving to lost+found disconnected dir inode 1076854644, moving to lost+found disconnected dir inode 1076854645, moving to lost+found disconnected dir inode 1076854646, moving to lost+found disconnected dir inode 1076854647, moving to lost+found disconnected dir inode 1076854648, moving to lost+found disconnected dir inode 1076854649, moving to lost+found disconnected dir inode 1076854650, moving to lost+found disconnected dir inode 1076854651, moving to lost+found disconnected dir inode 1076854652, moving to lost+found disconnected dir inode 1076854653, moving to lost+found disconnected dir inode 1076854654, moving to lost+found disconnected dir inode 1076854655, moving to lost+found disconnected dir inode 1076860256, moving to lost+found disconnected dir inode 1076860257, moving to lost+found disconnected dir inode 1076860258, moving to lost+found disconnected dir inode 1076860259, moving to lost+found disconnected dir inode 1076860260, moving to lost+found disconnected dir inode 1076860261, moving to lost+found disconnected dir inode 1076860262, moving to lost+found disconnected dir inode 1076860263, moving to lost+found disconnected dir inode 1076860264, moving to lost+found disconnected dir inode 1076860265, moving to lost+found disconnected dir inode 1076860266, moving to lost+found disconnected dir inode 1076860267, moving to lost+found disconnected dir inode 1076860268, moving to lost+found disconnected dir inode 1076860269, moving to lost+found disconnected dir inode 1076860270, moving to lost+found disconnected dir inode 1077602207, moving to lost+found disconnected dir inode 1077602228, moving to lost+found disconnected dir inode 1077602230, moving to lost+found disconnected dir inode 1077652948, moving to lost+found disconnected dir inode 1077652957, moving to lost+found disconnected dir inode 1077652960, moving to lost+found disconnected dir inode 1080545558, moving to lost+found disconnected dir inode 1092459354, moving to lost+found disconnected dir inode 1092503224, moving to lost+found disconnected dir inode 1092503243, moving to lost+found disconnected dir inode 1098129057, moving to lost+found disconnected dir inode 1098129058, moving to lost+found disconnected dir inode 1098129059, moving to lost+found disconnected dir inode 1098129060, moving to lost+found disconnected dir inode 1098129061, moving to lost+found disconnected dir inode 1098129062, moving to lost+found disconnected dir inode 1098129063, moving to lost+found disconnected dir inode 1098129064, moving to lost+found disconnected dir inode 1098129065, moving to lost+found disconnected dir inode 1098129066, moving to lost+found disconnected dir inode 1098129067, moving to lost+found disconnected dir inode 1098129068, moving to lost+found disconnected dir inode 1098129069, moving to lost+found disconnected dir inode 1098129070, moving to lost+found disconnected dir inode 1098129071, moving to lost+found disconnected dir inode 1098129072, moving to lost+found disconnected dir inode 1098465506, moving to lost+found disconnected dir inode 1098465507, moving to lost+found disconnected dir inode 1098465510, moving to lost+found disconnected dir inode 1098465511, moving to lost+found disconnected dir inode 1098465515, moving to lost+found disconnected dir inode 1098465519, moving to lost+found disconnected dir inode 1098465523, moving to lost+found disconnected dir inode 1098465524, moving to lost+found disconnected dir inode 1098465528, moving to lost+found disconnected dir inode 1098465529, moving to lost+found disconnected dir inode 1098465530, moving to lost+found disconnected dir inode 1098465536, moving to lost+found disconnected dir inode 1098465537, moving to lost+found disconnected dir inode 1098465543, moving to lost+found disconnected dir inode 1098465544, moving to lost+found disconnected dir inode 1098465545, moving to lost+found disconnected dir inode 1098465547, moving to lost+found disconnected dir inode 1098465548, moving to lost+found disconnected dir inode 1098465549, moving to lost+found disconnected dir inode 1098465550, moving to lost+found disconnected dir inode 1098465552, moving to lost+found disconnected dir inode 1147256007, moving to lost+found Phase 7 - verify and correct link counts... resetting inode 128 nlinks from 2 to 3 Note - quota info will be regenerated on next quota mount. done --------------040805010700020206070201 Content-Type: text/plain; name="xfs_check.log" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xfs_check.log" cache_node_purge: refcount was 1, not zero (node=0x820010) xfs_check: cannot read root inode (117) cache_node_purge: refcount was 1, not zero (node=0x8226b0) xfs_check: cannot read realtime bitmap inode (117) block 0/8 expected type unknown got log block 0/9 expected type unknown got log block 0/10 expected type unknown got log block 0/11 expected type unknown got log bad magic number 0xfeed for inode 128 bad magic number 0 for inode 129 bad magic number 0xfeed for inode 130 bad magic number 0 for inode 131 bad magic number 0xfeed for inode 132 bad magic number 0 for inode 133 bad magic number 0xfeed for inode 134 bad magic number 0 for inode 135 bad magic number 0xfeed for inode 136 bad magic number 0 for inode 137 bad magic number 0xfeed for inode 138 bad magic number 0 for inode 139 bad magic number 0xfeed for inode 140 bad magic number 0 for inode 141 bad magic number 0xfeed for inode 142 bad magic number 0 for inode 143 bad magic number 0xfeed for inode 144 bad magic number 0 for inode 145 bad magic number 0xfeed for inode 146 bad magic number 0 for inode 147 bad magic number 0xfeed for inode 148 bad magic number 0 for inode 149 bad magic number 0xfeed for inode 150 bad magic number 0 for inode 151 bad magic number 0xfeed for inode 152 bad magic number 0 for inode 153 bad magic number 0xfeed for inode 154 bad magic number 0 for inode 155 bad magic number 0xfeed for inode 156 bad magic number 0 for inode 157 bad magic number 0xfeed for inode 158 bad magic number 0 for inode 159 bad magic number 0xfeed for inode 160 bad magic number 0 for inode 161 bad magic number 0xfeed for inode 162 bad magic number 0 for inode 163 bad magic number 0xfeed for inode 164 bad magic number 0 for inode 165 bad magic number 0xfeed for inode 166 bad magic number 0 for inode 167 bad magic number 0xfeed for inode 168 bad magic number 0 for inode 169 bad magic number 0xfeed for inode 170 bad magic number 0 for inode 171 bad magic number 0xfeed for inode 172 bad magic number 0 for inode 173 bad magic number 0xfeed for inode 174 bad magic number 0 for inode 175 bad magic number 0xfeed for inode 176 bad magic number 0 for inode 177 bad magic number 0xfeed for inode 178 bad magic number 0 for inode 179 bad magic number 0xfeed for inode 180 bad magic number 0 for inode 181 bad magic number 0xfeed for inode 182 bad magic number 0 for inode 183 bad magic number 0xfeed for inode 184 bad magic number 0 for inode 185 bad magic number 0xfeed for inode 186 bad magic number 0 for inode 187 bad magic number 0xfeed for inode 188 bad magic number 0 for inode 189 bad magic number 0xfeed for inode 190 bad magic number 0 for inode 191 root inode 128 is not a directory block 0/389453 type unknown not expected block 0/389457 type unknown not expected block 0/389458 type unknown not expected block 0/481472 type unknown not expected block 0/8778188 type unknown not expected block 0/8778189 type unknown not expected block 0/8778190 type unknown not expected block 0/17162349 type unknown not expected allocated inode 128 has 0 link count allocated inode 129 has 0 link count allocated inode 130 has 0 link count link count mismatch for inode 131 (name ?), nlink 0, counted 635 link count mismatch for inode 190881713 (name ?), nlink 2, counted 1 disconnected inode 5667475, nlink 1 link count mismatch for inode 240441693 (name ?), nlink 2, counted 1 disconnected inode 125908558, nlink 1 disconnected inode 125908559, nlink 1 disconnected inode 125908560, nlink 1 link count mismatch for inode 125005217 (name ?), nlink 2, counted 1 link count mismatch for inode 125005218 (name ?), nlink 2, counted 1 link count mismatch for inode 125005219 (name ?), nlink 2, counted 1 link count mismatch for inode 125005221 (name ?), nlink 2, counted 1 link count mismatch for inode 125005222 (name ?), nlink 2, counted 1 link count mismatch for inode 125005223 (name ?), nlink 2, counted 1 link count mismatch for inode 125005224 (name ?), nlink 2, counted 1 link count mismatch for inode 125005225 (name ?), nlink 2, counted 1 link count mismatch for inode 125005226 (name ?), nlink 2, counted 1 link count mismatch for inode 125005228 (name ?), nlink 2, counted 1 link count mismatch for inode 125005229 (name ?), nlink 2, counted 1 link count mismatch for inode 125005230 (name ?), nlink 2, counted 1 link count mismatch for inode 125005231 (name ?), nlink 2, counted 1 link count mismatch for inode 125005232 (name ?), nlink 2, counted 1 link count mismatch for inode 125005233 (name ?), nlink 2, counted 1 link count mismatch for inode 125005236 (name ?), nlink 2, counted 1 link count mismatch for inode 125005237 (name ?), nlink 2, counted 1 link count mismatch for inode 125005238 (name ?), nlink 2, counted 1 link count mismatch for inode 125005239 (name ?), nlink 2, counted 1 link count mismatch for inode 125005240 (name ?), nlink 2, counted 1 link count mismatch for inode 125005241 (name ?), nlink 3, counted 2 link count mismatch for inode 125005242 (name ?), nlink 2, counted 1 link count mismatch for inode 125005243 (name ?), nlink 2, counted 1 link count mismatch for inode 125005244 (name ?), nlink 2, counted 1 link count mismatch for inode 125005245 (name ?), nlink 2, counted 1 link count mismatch for inode 125005247 (name ?), nlink 2, counted 1 link count mismatch for inode 125005248 (name ?), nlink 2, counted 1 link count mismatch for inode 125005249 (name ?), nlink 2, counted 1 link count mismatch for inode 125005250 (name ?), nlink 2, counted 1 link count mismatch for inode 125005251 (name ?), nlink 2, counted 1 link count mismatch for inode 125005252 (name ?), nlink 2, counted 1 link count mismatch for inode 125005253 (name ?), nlink 2, counted 1 link count mismatch for inode 125005254 (name ?), nlink 2, counted 1 link count mismatch for inode 125005255 (name ?), nlink 2, counted 1 link count mismatch for inode 125005256 (name ?), nlink 2, counted 1 link count mismatch for inode 125005257 (name ?), nlink 2, counted 1 link count mismatch for inode 125005259 (name ?), nlink 2, counted 1 link count mismatch for inode 125005260 (name ?), nlink 2, counted 1 link count mismatch for inode 125005262 (name ?), nlink 2, counted 1 link count mismatch for inode 125005263 (name ?), nlink 2, counted 1 link count mismatch for inode 125005264 (name ?), nlink 2, counted 1 link count mismatch for inode 125005265 (name ?), nlink 2, counted 1 link count mismatch for inode 125005266 (name ?), nlink 2, counted 1 link count mismatch for inode 125005267 (name ?), nlink 2, counted 1 link count mismatch for inode 125005268 (name ?), nlink 2, counted 1 link count mismatch for inode 125005269 (name ?), nlink 2, counted 1 link count mismatch for inode 125005270 (name ?), nlink 2, counted 1 link count mismatch for inode 125005271 (name ?), nlink 2, counted 1 link count mismatch for inode 125005272 (name ?), nlink 2, counted 1 link count mismatch for inode 125005273 (name ?), nlink 2, counted 1 link count mismatch for inode 125005274 (name ?), nlink 2, counted 1 link count mismatch for inode 125005275 (name ?), nlink 2, counted 1 link count mismatch for inode 125005276 (name ?), nlink 2, counted 1 link count mismatch for inode 125005277 (name ?), nlink 2, counted 1 link count mismatch for inode 125005278 (name ?), nlink 2, counted 1 link count mismatch for inode 125005279 (name ?), nlink 2, counted 1 link count mismatch for inode 125005568 (name ?), nlink 2, counted 1 link count mismatch for inode 125005569 (name ?), nlink 2, counted 1 link count mismatch for inode 125005571 (name ?), nlink 2, counted 1 link count mismatch for inode 125005572 (name ?), nlink 2, counted 1 link count mismatch for inode 125005573 (name ?), nlink 2, counted 1 link count mismatch for inode 125005574 (name ?), nlink 2, counted 1 link count mismatch for inode 125005575 (name ?), nlink 2, counted 1 link count mismatch for inode 125005576 (name ?), nlink 2, counted 1 link count mismatch for inode 125005577 (name ?), nlink 13, counted 12 link count mismatch for inode 125685326 (name ?), nlink 2, counted 1 link count mismatch for inode 125685351 (name ?), nlink 8, counted 7 link count mismatch for inode 424256 (name ?), nlink 21, counted 20 disconnected inode 424257, nlink 1 disconnected inode 424258, nlink 1 link count mismatch for inode 125016316 (name ?), nlink 6, counted 5 link count mismatch for inode 126090218 (name ?), nlink 2, counted 1 link count mismatch for inode 126090220 (name ?), nlink 4, counted 3 link count mismatch for inode 126090224 (name ?), nlink 3, counted 2 link count mismatch for inode 130503573 (name ?), nlink 5, counted 4 link count mismatch for inode 164462811 (name ?), nlink 2, counted 1 link count mismatch for inode 164462812 (name ?), nlink 3, counted 2 link count mismatch for inode 164462813 (name ?), nlink 2, counted 1 link count mismatch for inode 164462814 (name ?), nlink 2, counted 1 link count mismatch for inode 164462815 (name ?), nlink 2, counted 1 link count mismatch for inode 164462816 (name ?), nlink 2, counted 1 link count mismatch for inode 164462817 (name ?), nlink 2, counted 1 link count mismatch for inode 164462818 (name ?), nlink 5, counted 4 link count mismatch for inode 164462819 (name ?), nlink 2, counted 1 link count mismatch for inode 164462820 (name ?), nlink 2, counted 1 link count mismatch for inode 164462821 (name ?), nlink 2, counted 1 link count mismatch for inode 164462822 (name ?), nlink 2, counted 1 link count mismatch for inode 164462823 (name ?), nlink 2, counted 1 link count mismatch for inode 164462824 (name ?), nlink 2, counted 1 link count mismatch for inode 164462825 (name ?), nlink 2, counted 1 link count mismatch for inode 164462826 (name ?), nlink 2, counted 1 link count mismatch for inode 125660420 (name ?), nlink 2, counted 1 link count mismatch for inode 1092503224 (name ?), nlink 2, counted 1 link count mismatch for inode 1092503243 (name ?), nlink 5, counted 4 link count mismatch for inode 1147256007 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853088 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853089 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853091 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853104 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853105 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853106 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853107 (name ?), nlink 3, counted 2 link count mismatch for inode 1076853109 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853110 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853111 (name ?), nlink 3, counted 2 link count mismatch for inode 1076853114 (name ?), nlink 6, counted 5 link count mismatch for inode 1076853119 (name ?), nlink 8, counted 7 link count mismatch for inode 1076853126 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853127 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853128 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853129 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853130 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853131 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853132 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853133 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853134 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853135 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853136 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853137 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853138 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853139 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853140 (name ?), nlink 4, counted 3 link count mismatch for inode 1076853143 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853144 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853145 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853146 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853147 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853148 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853149 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853150 (name ?), nlink 2, counted 1 link count mismatch for inode 1076853151 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797385 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797389 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797390 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797391 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797393 (name ?), nlink 3, counted 2 link count mismatch for inode 1076797395 (name ?), nlink 5, counted 4 link count mismatch for inode 1076797399 (name ?), nlink 3, counted 2 link count mismatch for inode 1076797407 (name ?), nlink 5, counted 4 link count mismatch for inode 1076797408 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797410 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797411 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797412 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797413 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797417 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797418 (name ?), nlink 3, counted 2 link count mismatch for inode 1076797420 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797421 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797422 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797423 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797424 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797425 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797426 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797427 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797428 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797429 (name ?), nlink 5, counted 4 link count mismatch for inode 1076797433 (name ?), nlink 5, counted 4 link count mismatch for inode 1076797437 (name ?), nlink 3, counted 2 link count mismatch for inode 1076797438 (name ?), nlink 3, counted 2 link count mismatch for inode 1076797440 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797442 (name ?), nlink 4, counted 3 link count mismatch for inode 1076797445 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797446 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797447 (name ?), nlink 5, counted 4 link count mismatch for inode 1076797451 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797455 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797459 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797461 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797462 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797463 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797464 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797465 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797466 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797467 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797468 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797469 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797470 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797471 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797472 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797473 (name ?), nlink 6, counted 5 link count mismatch for inode 1076797474 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797479 (name ?), nlink 3, counted 2 link count mismatch for inode 1076797481 (name ?), nlink 7, counted 6 link count mismatch for inode 1076797488 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797490 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797491 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797492 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797493 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797494 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797495 (name ?), nlink 7, counted 6 link count mismatch for inode 1076797496 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797497 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797498 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797500 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797502 (name ?), nlink 2, counted 1 link count mismatch for inode 1076797503 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854592 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854593 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854594 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854595 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854596 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854597 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854598 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854599 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854600 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854601 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854602 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854603 (name ?), nlink 3, counted 2 link count mismatch for inode 1076854604 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854605 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854606 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854607 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854608 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854609 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854610 (name ?), nlink 3, counted 2 link count mismatch for inode 1076854611 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854612 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854613 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854614 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854615 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854616 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854617 (name ?), nlink 5, counted 4 link count mismatch for inode 1076854619 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854620 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854621 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854622 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854623 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854624 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854625 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854626 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854627 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854628 (name ?), nlink 4, counted 3 link count mismatch for inode 1076854630 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854631 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854632 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854633 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854634 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854635 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854636 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854637 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854638 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854639 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854640 (name ?), nlink 3, counted 2 link count mismatch for inode 1076854641 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854642 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854643 (name ?), nlink 3, counted 2 link count mismatch for inode 1076854644 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854645 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854646 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854647 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854648 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854649 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854650 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854651 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854652 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854653 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854654 (name ?), nlink 2, counted 1 link count mismatch for inode 1076854655 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051900 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051901 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051902 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051903 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051908 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051909 (name ?), nlink 3, counted 2 link count mismatch for inode 1075051910 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051912 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051913 (name ?), nlink 3, counted 2 link count mismatch for inode 1075051915 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051916 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051917 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051918 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051919 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051920 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051921 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051922 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051923 (name ?), nlink 14, counted 13 link count mismatch for inode 1075051930 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051931 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051932 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051933 (name ?), nlink 2, counted 1 link count mismatch for inode 1075051934 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860256 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860257 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860258 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860259 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860260 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860261 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860262 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860263 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860264 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860265 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860266 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860267 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860268 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860269 (name ?), nlink 2, counted 1 link count mismatch for inode 1076860270 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805248 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805249 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805254 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805255 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805256 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805257 (name ?), nlink 3, counted 2 link count mismatch for inode 1076805259 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805260 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805261 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805262 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805263 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805266 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805267 (name ?), nlink 3, counted 2 link count mismatch for inode 1076805268 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805269 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805270 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805272 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805273 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805274 (name ?), nlink 5, counted 4 link count mismatch for inode 1076805276 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805277 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805278 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805279 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805280 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805281 (name ?), nlink 5, counted 4 link count mismatch for inode 1076805286 (name ?), nlink 3, counted 2 link count mismatch for inode 1076805288 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805293 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805294 (name ?), nlink 6, counted 5 link count mismatch for inode 1076805295 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805296 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805297 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805298 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805299 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805300 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805301 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805307 (name ?), nlink 2, counted 1 link count mismatch for inode 1076805308 (name ?), nlink 2, counted 1 link count mismatch for inode 1077652948 (name ?), nlink 8, counted 7 link count mismatch for inode 1077652957 (name ?), nlink 3, counted 2 link count mismatch for inode 1077652960 (name ?), nlink 5, counted 4 link count mismatch for inode 1092459354 (name ?), nlink 4, counted 3 link count mismatch for inode 1076809126 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809135 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809136 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809137 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809141 (name ?), nlink 3, counted 2 link count mismatch for inode 1076809143 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809144 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809145 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809146 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809147 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809148 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809149 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809150 (name ?), nlink 9, counted 8 link count mismatch for inode 1076809158 (name ?), nlink 5, counted 4 link count mismatch for inode 1076809162 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809163 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809164 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809165 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809166 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809167 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809168 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809169 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809170 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809171 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809172 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809173 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809174 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809175 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809176 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809177 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809178 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809179 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809180 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809181 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809182 (name ?), nlink 2, counted 1 link count mismatch for inode 1076809183 (name ?), nlink 2, counted 1 link count mismatch for inode 1077602207 (name ?), nlink 10, counted 9 link count mismatch for inode 1077602228 (name ?), nlink 5, counted 4 link count mismatch for inode 1077602230 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811200 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811201 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811202 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811203 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811204 (name ?), nlink 6, counted 5 link count mismatch for inode 1076811206 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811210 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811211 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811212 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811213 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811214 (name ?), nlink 5, counted 4 link count mismatch for inode 1076811215 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811216 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811219 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811220 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811221 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811224 (name ?), nlink 4, counted 3 link count mismatch for inode 1076811227 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811228 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811229 (name ?), nlink 5, counted 4 link count mismatch for inode 1076811233 (name ?), nlink 6, counted 5 link count mismatch for inode 1076811238 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811239 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811240 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811242 (name ?), nlink 5, counted 4 link count mismatch for inode 1076811247 (name ?), nlink 10, counted 9 link count mismatch for inode 1076811248 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811251 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811252 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811253 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811254 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811255 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811256 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811258 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811259 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811260 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811261 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811262 (name ?), nlink 2, counted 1 link count mismatch for inode 1076811263 (name ?), nlink 2, counted 1 link count mismatch for inode 1075117888 (name ?), nlink 2, counted 1 link count mismatch for inode 1075117889 (name ?), nlink 2, counted 1 link count mismatch for inode 1075117890 (name ?), nlink 2, counted 1 link count mismatch for inode 1075117891 (name ?), nlink 5, counted 4 link count mismatch for inode 1075117896 (name ?), nlink 2, counted 1 link count mismatch for inode 1075117897 (name ?), nlink 2, counted 1 link count mismatch for inode 1075117902 (name ?), nlink 2, counted 1 link count mismatch for inode 1075117903 (name ?), nlink 4, counted 3 link count mismatch for inode 1075117907 (name ?), nlink 2, counted 1 link count mismatch for inode 1075117908 (name ?), nlink 2, counted 1 link count mismatch for inode 1075117939 (name ?), nlink 2, counted 1 link count mismatch for inode 1080545558 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818528 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818529 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818531 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818532 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818541 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818542 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818543 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818544 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818545 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818546 (name ?), nlink 7, counted 6 link count mismatch for inode 1076818548 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818549 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818550 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818554 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818555 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818556 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818557 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818558 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818559 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818561 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818562 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818563 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818564 (name ?), nlink 5, counted 4 link count mismatch for inode 1076818565 (name ?), nlink 4, counted 3 link count mismatch for inode 1076818566 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818567 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818569 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818570 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818577 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818578 (name ?), nlink 6, counted 5 link count mismatch for inode 1076818587 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818588 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818589 (name ?), nlink 3, counted 2 link count mismatch for inode 1076818590 (name ?), nlink 2, counted 1 link count mismatch for inode 1076818591 (name ?), nlink 2, counted 1 link count mismatch for inode 1098465506 (name ?), nlink 2, counted 1 link count mismatch for inode 1098465507 (name ?), nlink 4, counted 3 link count mismatch for inode 1098465510 (name ?), nlink 6, counted 5 link count mismatch for inode 1098465511 (name ?), nlink 5, counted 4 link count mismatch for inode 1098465515 (name ?), nlink 5, counted 4 link count mismatch for inode 1098465519 (name ?), nlink 5, counted 4 link count mismatch for inode 1098465523 (name ?), nlink 2, counted 1 link count mismatch for inode 1098465524 (name ?), nlink 5, counted 4 link count mismatch for inode 1098465528 (name ?), nlink 2, counted 1 link count mismatch for inode 1098465529 (name ?), nlink 5, counted 4 link count mismatch for inode 1098465530 (name ?), nlink 2, counted 1 link count mismatch for inode 1098465536 (name ?), nlink 2, counted 1 link count mismatch for inode 1098465537 (name ?), nlink 6, counted 5 link count mismatch for inode 1098465543 (name ?), nlink 2, counted 1 link count mismatch for inode 1098465544 (name ?), nlink 2, counted 1 link count mismatch for inode 1098465545 (name ?), nlink 2, counted 1 link count mismatch for inode 1098465547 (name ?), nlink 2, counted 1 link count mismatch for inode 1098465548 (name ?), nlink 2, counted 1 link count mismatch for inode 1098465549 (name ?), nlink 2, counted 1 link count mismatch for inode 1098465550 (name ?), nlink 2, counted 1 link count mismatch for inode 1098465552 (name ?), nlink 2, counted 1 link count mismatch for inode 1075244397 (name ?), nlink 3, counted 2 link count mismatch for inode 1075244399 (name ?), nlink 2, counted 1 link count mismatch for inode 1075244400 (name ?), nlink 2, counted 1 link count mismatch for inode 1075244401 (name ?), nlink 2, counted 1 link count mismatch for inode 1075244402 (name ?), nlink 2, counted 1 link count mismatch for inode 1098129057 (name ?), nlink 2, counted 1 link count mismatch for inode 1098129058 (name ?), nlink 3, counted 2 link count mismatch for inode 1098129059 (name ?), nlink 2, counted 1 link count mismatch for inode 1098129060 (name ?), nlink 2, counted 1 link count mismatch for inode 1098129061 (name ?), nlink 2, counted 1 link count mismatch for inode 1098129062 (name ?), nlink 2, counted 1 link count mismatch for inode 1098129063 (name ?), nlink 2, counted 1 link count mismatch for inode 1098129064 (name ?), nlink 2, counted 1 link count mismatch for inode 1098129065 (name ?), nlink 2, counted 1 link count mismatch for inode 1098129066 (name ?), nlink 3, counted 2 link count mismatch for inode 1098129067 (name ?), nlink 2, counted 1 link count mismatch for inode 1098129068 (name ?), nlink 2, counted 1 link count mismatch for inode 1098129069 (name ?), nlink 2, counted 1 link count mismatch for inode 1098129070 (name ?), nlink 3, counted 2 link count mismatch for inode 1098129071 (name ?), nlink 3, counted 2 link count mismatch for inode 1098129072 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828510 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828544 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828545 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828546 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828547 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828548 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828549 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828550 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828551 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828554 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828555 (name ?), nlink 8, counted 7 link count mismatch for inode 1076828562 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828563 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828564 (name ?), nlink 3, counted 2 link count mismatch for inode 1076828565 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828570 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828571 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828572 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828573 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828574 (name ?), nlink 3, counted 2 link count mismatch for inode 1076828575 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828576 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828577 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828578 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828579 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828594 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828595 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828596 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828597 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828598 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828599 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828600 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828601 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828602 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828603 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828604 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828605 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828606 (name ?), nlink 2, counted 1 link count mismatch for inode 1076828607 (name ?), nlink 2, counted 1 link count mismatch for inode 1076383229 (name ?), nlink 2, counted 1 link count mismatch for inode 1076383230 (name ?), nlink 6, counted 5 link count mismatch for inode 1076839776 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839777 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839778 (name ?), nlink 3, counted 2 link count mismatch for inode 1076839779 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839780 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839782 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839783 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839784 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839785 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839786 (name ?), nlink 5, counted 4 link count mismatch for inode 1076839790 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839791 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839792 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839793 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839794 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839795 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839796 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839797 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839798 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839799 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839800 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839801 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839802 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839803 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839804 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839805 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839806 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839807 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839808 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839809 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839810 (name ?), nlink 7, counted 6 link count mismatch for inode 1076839812 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839817 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839818 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839819 (name ?), nlink 5, counted 4 link count mismatch for inode 1076839823 (name ?), nlink 3, counted 2 link count mismatch for inode 1076839825 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839826 (name ?), nlink 5, counted 4 link count mismatch for inode 1076839827 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839828 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839831 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839833 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839834 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839835 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839836 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839837 (name ?), nlink 2, counted 1 link count mismatch for inode 1076839838 (name ?), nlink 5, counted 4 link count mismatch for inode 1076848162 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848164 (name ?), nlink 6, counted 5 link count mismatch for inode 1076848169 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848170 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848171 (name ?), nlink 3, counted 2 link count mismatch for inode 1076848173 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848174 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848175 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848176 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848177 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848178 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848179 (name ?), nlink 4, counted 3 link count mismatch for inode 1076848182 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848183 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848184 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848185 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848186 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848187 (name ?), nlink 7, counted 6 link count mismatch for inode 1076848194 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848195 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848196 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848197 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848198 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848199 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848200 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848201 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848202 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848203 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848204 (name ?), nlink 6, counted 5 link count mismatch for inode 1076848205 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848206 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848207 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848208 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848209 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848210 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848211 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848212 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848213 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848214 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848219 (name ?), nlink 6, counted 5 link count mismatch for inode 1076848221 (name ?), nlink 2, counted 1 link count mismatch for inode 1076848222 (name ?), nlink 3, counted 2 --------------040805010700020206070201-- From sandeen@sandeen.net Sat May 8 10:04:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_210 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o48F4kKX195212 for ; Sat, 8 May 2010 10:04:46 -0500 X-ASG-Debug-ID: 1273331224-70e200fc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0AB831286E40 for ; Sat, 8 May 2010 08:07:04 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id 6vKGyPcGu0r2BEkE for ; Sat, 08 May 2010 08:07:04 -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 mail.sandeen.net (Postfix) with ESMTP id AE046944B87; Sat, 8 May 2010 10:06:54 -0500 (CDT) Message-ID: <4BE57E0D.3020601@sandeen.net> Date: Sat, 08 May 2010 10:06:53 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Christian Affolter CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: failed to read root inode Subject: Re: failed to read root inode References: <4BE55A63.8070203@purplehaze.ch> In-Reply-To: <4BE55A63.8070203@purplehaze.ch> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1273331226 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29368 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christian Affolter wrote: > Hi > > After a disk crash within a hardware RAID-6 controller and kernel > freeze, I'm unable to mount an XFS filesystem on top of an EVMS volume: Are you sure the volume is reassembled correctly? It seems like the fs has a ton of damage ... One trick I often recommend is to make a metadata image of the fs with xfs_metadump / xfs_mdrestore and run repair on that to see what repair -would- do, but I guess you've already run it on the real fs. So if repair isn't making a mountable fs, first suggestion would be to re-try with the latest version of repair. > Filesystem "dm-13": Disabling barriers, not supported by the underlying > device Honestly, that could be part of the problem too, if a bunch of disks with write caches all lost them, in the array. > XFS mounting filesystem dm-13 > Starting XFS recovery on filesystem: dm-13 (logdev: internal) > XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1599 of file > fs/xfs/xfs_alloc.c. Caller 0xffffffff8035c58d > Pid: 13473, comm: mount Not tainted 2.6.26-gentoo #1 ... > XFS: log mount finish failed So recovery is failing, you could try mount -o ro,norecovery at this point to see what's still left on the fs... but: > I tried to repair the filesystem with the help of xfs_repair many times, > without any luck: > Filesystem "dm-13": Disabling barriers, not supported by the underlying > device > XFS mounting filesystem dm-13 > XFS: failed to read root inode ... > xfs_check output: > cache_node_purge: refcount was 1, not zero (node=0x820010) > xfs_check: cannot read root inode (117) That's a bit of an odd root inode number, I think, which makes me think maybe there are still serious problems. > Are there any other ways to fix the unreadable root inode or to restore > the remaining data? > > > Environment informations: > Linux Kernel: 2.6.26-gentoo (x86_64) > xfsprogs: 3.0.3 Those are both pretty old at this point, I can't say there is anything specific in newer xfsprogs, but I'd probably give that a shot first. -Eric From BATV+692f5aa75ba2cdc8b286+2449+infradead.org+hch@bombadil.srs.infradead.org Sat May 8 12:13:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o48HDZA2197447 for ; Sat, 8 May 2010 12:13:38 -0500 X-ASG-Debug-ID: 1273338955-381701e00000-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 184461078DCF for ; Sat, 8 May 2010 10:15:55 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id whVbNHPIOaAi99Lc for ; Sat, 08 May 2010 10:15:55 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OAncv-00005F-3P; Sat, 08 May 2010 17:15:45 +0000 Date: Sat, 8 May 2010 13:15:45 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 07/12] xfs: Improve scalability of busy extent tracking Subject: Re: [PATCH 07/12] xfs: Improve scalability of busy extent tracking Message-ID: <20100508171544.GA10971@infradead.org> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> <1273210860-23414-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273210860-23414-8-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273338956 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good, but a couple minor comments below: Reviewed-by: Christoph Hellwig > diff --git a/fs/xfs/linux-2.6/xfs_quotaops.c b/fs/xfs/linux-2.6/xfs_quotaops.c > index 1947514..2e73688 100644 > --- a/fs/xfs/linux-2.6/xfs_quotaops.c > +++ b/fs/xfs/linux-2.6/xfs_quotaops.c > @@ -19,6 +19,7 @@ > #include "xfs_dmapi.h" > #include "xfs_sb.h" > #include "xfs_inum.h" > +#include "xfs_log.h" > #include "xfs_ag.h" > #include "xfs_mount.h" > #include "xfs_quota.h" This hunk is not needed. > --- a/fs/xfs/xfs_log.h > +++ b/fs/xfs/xfs_log.h > @@ -18,9 +18,6 @@ > #ifndef __XFS_LOG_H__ > #define __XFS_LOG_H__ > > -/* transaction ID type */ > -typedef __uint32_t xlog_tid_t; > - > --- a/fs/xfs/xfs_types.h > +++ b/fs/xfs/xfs_types.h > @@ -75,6 +75,8 @@ typedef __uint32_t xfs_dahash_t; /* dir/attr hash value */ > > typedef __uint16_t xfs_prid_t; /* prid_t truncated to 16bits in XFS */ > > +typedef __uint32_t xlog_tid_t; /* transaction ID type */ This should be in the patch introducing xfs_log_get_trans_ident. From BATV+692f5aa75ba2cdc8b286+2449+infradead.org+hch@bombadil.srs.infradead.org Sat May 8 14:06:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o48J6WIv199772 for ; Sat, 8 May 2010 14:06:34 -0500 X-ASG-Debug-ID: 1273345723-62ce02fc0000-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 144A91DE8EDB for ; Sat, 8 May 2010 12:08:43 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id xfE5sDfgADFmQSp3 for ; Sat, 08 May 2010 12:08:43 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OApOF-0005Zz-3w; Sat, 08 May 2010 19:08:43 +0000 Date: Sat, 8 May 2010 15:08:43 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: XFS status update for April 2010 Subject: XFS status update for April 2010 Message-ID: <20100508190843.GA20445@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273345724 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean In April 2.6.34 still was in the release candidate phase, with a hand full of XFS fixes making it into mainline. Development for the 2.6.35 merge window went ahead full steam at the same time. While a fair amount of patches hit the development tree these were largely cleanups, with the real development activity happening on the mailing list. There was another round of patches and following discussion on the scalable busy extent tracking and delayed logging features mentioned last month. They are expected to be merged in May and queue up for the Linux 2.6.35 window. Last but not least April saw a large number of XFS fixes backported to the 2.6.32 and 2.6.33 -stable series. In user land xfsprogs has seen few but important updates, preparing for a new release next month. The xfs_repair tool saw a fix to correctly enable the lazy superblock counters on an existing filesystem, and xfs_fsr saw updates to better deal with dynamic attribute forks. Last but not a least a port to Debian GNU/kFreeBSD got merged. The xfstests test suite saw two new test cases and various smaller fixes. From stan@hardwarefreak.com Sat May 8 17:49:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o48Mnk5n204129 for ; Sat, 8 May 2010 17:49:46 -0500 X-ASG-Debug-ID: 1273359117-4f91002b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6AE4631FDE9 for ; Sat, 8 May 2010 15:51:57 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id 9Fu6EhN7nq3APVF5 for ; Sat, 08 May 2010 15:51:57 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 2CA876C074 for ; Sat, 8 May 2010 17:51:57 -0500 (CDT) Message-ID: <4BE5EB5D.5020702@hardwarefreak.com> Date: Sat, 08 May 2010 17:53:17 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: failed to read root inode Subject: Re: failed to read root inode References: <4BE55A63.8070203@purplehaze.ch> In-Reply-To: <4BE55A63.8070203@purplehaze.ch> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1273359118 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0207 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29395 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christian Affolter put forth on 5/8/2010 7:34 AM: > Hi > > After a disk crash within a hardware RAID-6 controller and kernel > freeze, I'm unable to mount an XFS filesystem on top of an EVMS volume: What storage management operation(s) were you performing when this crash occurred? Were you adding, deleting, shrinking, or growing an EVMS volume when the "crash" occurred, or was the system just sitting idle with no load when the crash occurred? Why did the "crash" of a single disk in a hardware RAID6 cause a kernel freeze? What is your definition of "disk crash"? A single physical disk failure should not have caused this under any circumstances. The RAID card should have handled a single disk failure transparently. Exactly which make/model is the RAID card? What is the status of each of the remaining disks attached to the card as reported by its BIOS? What is the status of the RAID6 volume as reported by the RAID card BIOS? What is the status of each of your EVMS volumes as reported by the EVMS UI? I'm asking all of these questions because it seems rather clear that the root cause of your problem lies at a layer well below the XFS filesystem. You have two layers of physical disk abstraction below XFS: a hardware RAID6 and a software logical volume manager. You've apparently suffered a storage system hardware failure, according to your description. You haven't given any details of the current status of the hardware RAID, or of the logical volumes, merely that XFS is having problems. I think a "Well duh!" is in order. Please provide _detailed_ information from the RAID card BIOS and the EVMS UI. Even if the problem isn't XFS related I for one would be glad to assist you in getting this fixed. Right now we don't have enough information. At least I don't. -- Stan From eflorac@intellique.com Sun May 9 08:26:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o49DQRCD226345 for ; Sun, 9 May 2010 08:26:28 -0500 X-ASG-Debug-ID: 1273411712-373b02fa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E733B178856F for ; Sun, 9 May 2010 06:28:36 -0700 (PDT) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id eCXiqKq69fo0A8Ff for ; Sun, 09 May 2010 06:28:36 -0700 (PDT) Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by smtp3-g21.free.fr (Postfix) with ESMTP id EBF0281807F; Sun, 9 May 2010 15:28:30 +0200 (CEST) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP; Sun, 9 May 2010 15:28:29 +0200 (CEST) Date: Sun, 9 May 2010 15:28:18 +0200 From: Emmanuel Florac To: Stan Hoeppner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: failed to read root inode Subject: Re: failed to read root inode Message-ID: <20100509152818.7481c1e1@galadriel.home> In-Reply-To: <4BE5EB5D.5020702@hardwarefreak.com> References: <4BE55A63.8070203@purplehaze.ch> <4BE5EB5D.5020702@hardwarefreak.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 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1273411718 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.2, rules version 3.2.2.29448 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Sat, 08 May 2010 17:53:17 -0500 vous =E9criviez: > Why did the "crash" of a single disk in a hardware RAID6 cause a > kernel freeze? What is your definition of "disk crash"? A single > physical disk failure should not have caused this under any > circumstances. The RAID card should have handled a single disk > failure transparently. The RAID array may go west if the disk isn't properly set up, particularly if it's a desktop-class drive.=20 --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From stan@hardwarefreak.com Sun May 9 09:49:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o49EnXqu228205 for ; Sun, 9 May 2010 09:49:33 -0500 X-ASG-Debug-ID: 1273416703-72e600520000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2BEEF3233F6 for ; Sun, 9 May 2010 07:51:43 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id PkQJmiMZewozlawf for ; Sun, 09 May 2010 07:51:43 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 9CC3D6C3D2 for ; Sun, 9 May 2010 09:51:43 -0500 (CDT) Message-ID: <4BE6CC83.5070305@hardwarefreak.com> Date: Sun, 09 May 2010 09:53:55 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: failed to read root inode Subject: Re: failed to read root inode References: <4BE55A63.8070203@purplehaze.ch> <4BE5EB5D.5020702@hardwarefreak.com> <20100509152818.7481c1e1@galadriel.home> In-Reply-To: <20100509152818.7481c1e1@galadriel.home> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1273416704 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29454 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Emmanuel Florac put forth on 5/9/2010 8:28 AM: > Le Sat, 08 May 2010 17:53:17 -0500 vous écriviez: > >> Why did the "crash" of a single disk in a hardware RAID6 cause a >> kernel freeze? What is your definition of "disk crash"? A single >> physical disk failure should not have caused this under any >> circumstances. The RAID card should have handled a single disk >> failure transparently. > > The RAID array may go west if the disk isn't properly set up, > particularly if it's a desktop-class drive. By design, a RAID6 pack should be able to handle two simultaneous drive failures before the array goes offline. According to the OP's post he lost one drive. Unless it's a really crappy RAID card or if he's using a bunch of dissimilar drives causing problems with the entire array, he shouldn't have had a problem. This is why I'm digging for more information. The information he presented here doesn't really make any sense. One physical disk failure _shouldn't_ have caused the problems he's experiencing. I don't think we got the full story. Oh, btw, when it comes to SATA drives, there is no difference between "desktop" and "enterprise" class drives. They're all the same. The ones sold as "enterprise" have merely been firmware matched and QC tested with a given vendor's SAN/NAS box and then certified for use with it. The vendor then sells only that one drive/firmware, maybe two certified drives so they have a second source in case of shortages or price gouging etc, in their arrays. According to the marketing droids, the only "true" "enterprise" drives currently on the market are SAS and fiber channel. The number of these drives actually shipping into the server/SAN/NAS storage marketplace is absolutely tiny compared to SATA drives. In total unit shipments, SATA is owning the datacenter as well as the desktop. Browse the various storage offerings across the big 3 and then 10 of the 2nd tier players and you'll find at least 8 out of 10 storage arrays are SATA, the remaining two being SAS and FC in the "high end" category, and usually over double the price of the SATA based arrays. This pricing of SAS/FC is what is driving SATA adoption. That and really large read/write caches on the SATA arrays boosting their performance for many workloads and negating the spindle speed advantage of the SAS and FC drives. -- Stan From christian.affolter@purplehaze.ch Sun May 9 09:50:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_210 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o49Eot61228251 for ; Sun, 9 May 2010 09:50:56 -0500 X-ASG-Debug-ID: 1273416786-732f005c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp.stepping-stone.ch (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 189363233FB for ; Sun, 9 May 2010 07:53:06 -0700 (PDT) Received: from smtp.stepping-stone.ch (smtp.stepping-stone.ch [194.176.109.228]) by cuda.sgi.com with ESMTP id 2cH1zbSjBCB7Lo1e for ; Sun, 09 May 2010 07:53:06 -0700 (PDT) Received: from localhost (mail-scanner-01.int.stepping-stone.ch [10.17.98.47]) by smtp.stepping-stone.ch (Postfix) with ESMTP id 281E6400389 for ; Sun, 9 May 2010 16:53:05 +0200 (CEST) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at stepping-stone.ch Received: from smtp.stepping-stone.ch ([10.17.98.46]) by localhost (mail-scanner-01.int.stepping-stone.ch [10.17.98.47]) (amavisd-new, port 10024) with LMTP id Liq8XIXoy+du for ; Sun, 9 May 2010 16:53:02 +0200 (CEST) Received: from [192.168.1.4] (84-73-140-121.dclient.hispeed.ch [84.73.140.121]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client did not present a certificate) by smtp.stepping-stone.ch (Postfix) with ESMTPSA id 27FE340018C for ; Sun, 9 May 2010 16:53:01 +0200 (CEST) Message-ID: <4BE6CC4C.3030501@purplehaze.ch> Date: Sun, 09 May 2010 16:53:00 +0200 From: Christian Affolter User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100420 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: failed to read root inode Subject: Re: failed to read root inode References: <4BE55A63.8070203@purplehaze.ch> <4BE57E0D.3020601@sandeen.net> In-Reply-To: <4BE57E0D.3020601@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtp.stepping-stone.ch[194.176.109.228] X-Barracuda-Start-Time: 1273416787 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.2, rules version 3.2.2.29454 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean Hi Eric Thanks for your answer. >> After a disk crash within a hardware RAID-6 controller and kernel >> freeze, I'm unable to mount an XFS filesystem on top of an EVMS volume: > > Are you sure the volume is reassembled correctly? It seems like the > fs has a ton of damage ... > > One trick I often recommend is to make a metadata image of the fs > with xfs_metadump / xfs_mdrestore and run repair on that to see > what repair -would- do, but I guess you've already run it on the > real fs. OK, I didn't know that. I actually cloned the faild volume using dd and run xfs_repair on the clone. > So if repair isn't making a mountable fs, first suggestion would > be to re-try with the latest version of repair. OK, I will try that. Unfortunately the latest upstream version isn't included within the distribution package repository, so I will have to compile it first. >> Filesystem "dm-13": Disabling barriers, not supported by the underlying >> device > > Honestly, that could be part of the problem too, if a bunch of > disks with write caches all lost them, in the array. > >> XFS mounting filesystem dm-13 >> Starting XFS recovery on filesystem: dm-13 (logdev: internal) >> XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1599 of file >> fs/xfs/xfs_alloc.c. Caller 0xffffffff8035c58d >> Pid: 13473, comm: mount Not tainted 2.6.26-gentoo #1 > ... > >> XFS: log mount finish failed > > So recovery is failing, you could try mount -o ro,norecovery at this > point to see what's still left on the fs... but: This didn't made any difference, I'm still getting the same error message. >> I tried to repair the filesystem with the help of xfs_repair many times, >> without any luck: >> Filesystem "dm-13": Disabling barriers, not supported by the underlying >> device >> XFS mounting filesystem dm-13 >> XFS: failed to read root inode > > ... > >> xfs_check output: >> cache_node_purge: refcount was 1, not zero (node=0x820010) >> xfs_check: cannot read root inode (117) > > That's a bit of an odd root inode number, I think, which > makes me think maybe there are still serious problems. > >> Are there any other ways to fix the unreadable root inode or to restore >> the remaining data? >> >> >> Environment informations: >> Linux Kernel: 2.6.26-gentoo (x86_64) >> xfsprogs: 3.0.3 > > Those are both pretty old at this point, I can't say there is anything > specific in newer xfsprogs, but I'd probably give that a shot first. Yes I'm going to try the latest version. Thanks Christian From eflorac@intellique.com Sun May 9 10:32:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o49FWHQM228970 for ; Sun, 9 May 2010 10:32:17 -0500 X-ASG-Debug-ID: 1273419263-018003160000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 84E121206652 for ; Sun, 9 May 2010 08:34:27 -0700 (PDT) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id UTRKqcHqKX0Tkx81 for ; Sun, 09 May 2010 08:34:27 -0700 (PDT) Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by smtp3-g21.free.fr (Postfix) with ESMTP id D9FF5818157; Sun, 9 May 2010 17:34:21 +0200 (CEST) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP; Sun, 9 May 2010 17:34:19 +0200 (CEST) Date: Sun, 9 May 2010 17:34:07 +0200 From: Emmanuel Florac To: Stan Hoeppner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: failed to read root inode Subject: Re: failed to read root inode Message-ID: <20100509173407.54467993@galadriel.home> In-Reply-To: <4BE6CC83.5070305@hardwarefreak.com> References: <4BE55A63.8070203@purplehaze.ch> <4BE5EB5D.5020702@hardwarefreak.com> <20100509152818.7481c1e1@galadriel.home> <4BE6CC83.5070305@hardwarefreak.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 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1273419269 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.2, rules version 3.2.2.29456 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Sun, 09 May 2010 09:53:55 -0500 vous =E9criviez: > Oh, btw, when it comes to SATA drives, there is no difference between > "desktop" and "enterprise" class drives. They're all the same.=20 Yes I know that, however there's an important difference : the default firmware setting of desktop drives makes them retry, retry, retry an retry on error, effectively freezing the array; while "enterprise drives" simply fails almost instantly at the slightest error (and work fine 5 minutes later usually). So a desktop drive failure in a raid array may actually block all IO for a very long time (like in minutes), and everything goes west if you then decide that the system must have crashed and pull the plug, if your RAID controller hasn't any backup battery. That's why you shouldn't ever use desktop drives in RAID arrays unless you know how to painfully configure them, one by one, with a friggin DOS utility ;) --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From christian.affolter@purplehaze.ch Sun May 9 10:33:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o49FXRsl229004 for ; Sun, 9 May 2010 10:33:27 -0500 X-ASG-Debug-ID: 1273419338-7d3603370000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp.stepping-stone.ch (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EC1EB1206662 for ; Sun, 9 May 2010 08:35:38 -0700 (PDT) Received: from smtp.stepping-stone.ch (smtp.stepping-stone.ch [194.176.109.228]) by cuda.sgi.com with ESMTP id DT0nneJ3aJUauj7V for ; Sun, 09 May 2010 08:35:38 -0700 (PDT) Received: from localhost (mail-scanner-01.int.stepping-stone.ch [10.17.98.47]) by smtp.stepping-stone.ch (Postfix) with ESMTP id CA70D4003CF for ; Sun, 9 May 2010 17:35:37 +0200 (CEST) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at stepping-stone.ch Received: from smtp.stepping-stone.ch ([10.17.98.46]) by localhost (mail-scanner-01.int.stepping-stone.ch [10.17.98.47]) (amavisd-new, port 10024) with LMTP id UTGyaxnZuxlH for ; Sun, 9 May 2010 17:35:34 +0200 (CEST) Received: from [192.168.1.4] (84-73-140-121.dclient.hispeed.ch [84.73.140.121]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client did not present a certificate) by smtp.stepping-stone.ch (Postfix) with ESMTPSA id AA2C24003D5 for ; Sun, 9 May 2010 17:35:34 +0200 (CEST) Message-ID: <4BE6D63F.3070404@purplehaze.ch> Date: Sun, 09 May 2010 17:35:27 +0200 From: Christian Affolter User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100420 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: failed to read root inode Subject: Re: failed to read root inode References: <4BE55A63.8070203@purplehaze.ch> <4BE5EB5D.5020702@hardwarefreak.com> In-Reply-To: <4BE5EB5D.5020702@hardwarefreak.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtp.stepping-stone.ch[194.176.109.228] X-Barracuda-Start-Time: 1273419338 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.2, rules version 3.2.2.29456 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean Hi >> After a disk crash within a hardware RAID-6 controller and kernel >> freeze, I'm unable to mount an XFS filesystem on top of an EVMS volume: > > What storage management operation(s) were you performing when this crash > occurred? Were you adding, deleting, shrinking, or growing an EVMS volume > when the "crash" occurred, or was the system just sitting idle with no load > when the crash occurred? No, there were no storage management operations in progress while the system crashed. It's a NFS file server with random read and write operations. > Why did the "crash" of a single disk in a hardware RAID6 cause a kernel > freeze? What is your definition of "disk crash"? A single physical disk > failure should not have caused this under any circumstances. The RAID card > should have handled a single disk failure transparently. That's a good question ;) Honestly I don't know how this could happen, all I saw were a bunch of errors from the RAID controller driver. In the past two other disks failed and the controller reported each failure correctly and started to rebuild the array automatically by using the hot-spare disk. So it did its job two times correctly. [...] kernel: arcmsr0: abort device command of scsi id = 1 lun = 0 kernel: arcmsr0: abort device command of scsi id = 4 lun = 0 kernel: arcmsr0: abort device command of scsi id = 4 lun = 0 kernel: arcmsr0: abort device command of scsi id = 4 lun = 0 kernel: arcmsr0: abort device command of scsi id = 4 lun = 0 kernel: arcmsr0: abort device command of scsi id = 2 lun = 0 kernel: arcmsr0: ccb ='0xffff8100bf819080' isr got aborted command kernel: arcmsr0: isr get an illegal ccb command done acb = '0xffff81013ec245c8'ccb = '0xffff8100bf819080' ccbacb = '0xffff81013ec245c8' startdone = 0x0 ccboutstandingcount = 0 kernel: arcmsr0: abort device command of scsi id = 2 lun = 0 kernel: arcmsr0: abort device command of scsi id = 4 lun = 0 kernel: arcmsr0: ccb ='0xffff8100bf814640' isr got aborted command kernel: arcmsr0: isr get an illegal ccb command done acb = '0xffff81013ec245c8'ccb = '0xffff8100bf814640' ccbacb = '0xffff81013ec245c8' startdone = 0x0 ccboutstandingcount = 13 kernel: sd 0:0:4:0: [sdd] Result: hostbyte=DID_ABORT driverbyte=DRIVER_OK,SUGGEST_OK kernel: end_request: I/O error, dev sdd, sector 1897479440 kernel: Device dm-79, XFS metadata write error block 0x1813c0 in dm-79 kernel: Device dm-65, XFS metadata write error block 0x2c1a0 in dm-65 kernel: xfs_force_shutdown(dm-65,0x1) called from line 1093 of file fs/xfs/xfs_buf_item.c. Return address = 0xffffffff80374359 kernel: Filesystem "dm-65": I/O Error Detected. Shutting down filesystem: dm-65 kernel: Please umount the filesystem, and rectify the problem(s) kernel: xfs_force_shutdown(dm-65,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803a9529 [...] Afterwards most of the volumes where shutdown and after a couple of hours the kernel freezes with a kernel panic (which I can't remember as I had no serial console attached). > Exactly which make/model is the RAID card? Areca Technology Corp. ARC-1160 16-Port PCI-X to SATA RAID Controller Firmware Version : V1.42 2006-10-13 > What is the status of each of the remaining disks attached to the card as reported by its BIOS? After the hard reset, one disk was reported as 'faild' and the rebuild started. > What is the status of the RAID6 volume as reported by the RAID card BIOS? By now, the rebuild finished, therefor the volume is in normal non-degraded state. > What is the status of each of your EVMS volumes as reported by the EVMS UI? They're all active. Do you need more informations here? There are approximately 45 active volumes on this server. > I'm asking all of these questions because it seems rather clear that the > root cause of your problem lies at a layer well below the XFS filesystem. Yes, I never blamed XFS for being the cause of the problem. > You have two layers of physical disk abstraction below XFS: a hardware > RAID6 and a software logical volume manager. You've apparently suffered a > storage system hardware failure, according to your description. You haven't > given any details of the current status of the hardware RAID, or of the > logical volumes, merely that XFS is having problems. I think a "Well duh!" > is in order. > > Please provide _detailed_ information from the RAID card BIOS and the EVMS > UI. Even if the problem isn't XFS related I for one would be glad to assist > you in getting this fixed. Right now we don't have enough information. At > least I don't. Thanks for your help Christian From eflorac@intellique.com Sun May 9 10:57:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o49FvcRv229577 for ; Sun, 9 May 2010 10:57:39 -0500 X-ASG-Debug-ID: 1273420785-45b100420000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AC0E51395674 for ; Sun, 9 May 2010 08:59:48 -0700 (PDT) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id gMhJV32WBStDBm9A for ; Sun, 09 May 2010 08:59:48 -0700 (PDT) Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by smtp3-g21.free.fr (Postfix) with ESMTP id 742D881810A; Sun, 9 May 2010 17:59:43 +0200 (CEST) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP; Sun, 9 May 2010 17:59:41 +0200 (CEST) Date: Sun, 9 May 2010 17:59:35 +0200 From: Emmanuel Florac To: Christian Affolter Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: failed to read root inode Subject: Re: failed to read root inode Message-ID: <20100509175935.15b6374e@galadriel.home> In-Reply-To: <4BE6D63F.3070404@purplehaze.ch> References: <4BE55A63.8070203@purplehaze.ch> <4BE5EB5D.5020702@hardwarefreak.com> <4BE6D63F.3070404@purplehaze.ch> 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 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1273420790 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.2, rules version 3.2.2.29458 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Sun, 09 May 2010 17:35:27 +0200 vous =E9criviez: > kernel: arcmsr0: abort device command of scsi id =3D 1 lun =3D 0 > kernel: arcmsr0: abort device command of scsi id =3D 4 lun =3D 0 > kernel: arcmsr0: abort device command of scsi id =3D 4 lun =3D 0 > kernel: arcmsr0: abort device command of scsi id =3D 4 lun =3D 0 > kernel: arcmsr0: abort device command of scsi id =3D 4 lun =3D 0 > kernel: arcmsr0: abort device command of scsi id =3D 2 lun =3D 0 > kernel: arcmsr0: ccb =3D'0xffff8100bf819080' Looks like disks 1, 2 and 4 timed out there. What model are those disks? --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From stan@hardwarefreak.com Sun May 9 12:29:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o49HTZ35231388 for ; Sun, 9 May 2010 12:29:36 -0500 X-ASG-Debug-ID: 1273426321-187002250000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CC1F41287E71 for ; Sun, 9 May 2010 10:32:01 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id 799963EXAcfKOdgB for ; Sun, 09 May 2010 10:32:01 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 31E976C32E for ; Sun, 9 May 2010 12:31:46 -0500 (CDT) Message-ID: <4BE6F22F.5090603@hardwarefreak.com> Date: Sun, 09 May 2010 12:34:39 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: failed to read root inode Subject: Re: failed to read root inode References: <4BE55A63.8070203@purplehaze.ch> <4BE5EB5D.5020702@hardwarefreak.com> <4BE6D63F.3070404@purplehaze.ch> In-Reply-To: <4BE6D63F.3070404@purplehaze.ch> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1273426321 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29463 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christian Affolter put forth on 5/9/2010 10:35 AM: > That's a good question ;) Honestly I don't know how this could happen, > all I saw were a bunch of errors from the RAID controller driver. In the > past two other disks failed and the controller reported each failure > correctly and started to rebuild the array automatically by using the > hot-spare disk. So it did its job two times correctly. > [...] > > kernel: arcmsr0: abort device command of scsi id = 1 lun = 0 > kernel: arcmsr0: abort device command of scsi id = 4 lun = 0 > kernel: arcmsr0: abort device command of scsi id = 4 lun = 0 > kernel: arcmsr0: abort device command of scsi id = 4 lun = 0 > kernel: arcmsr0: abort device command of scsi id = 4 lun = 0 > kernel: arcmsr0: abort device command of scsi id = 2 lun = 0 > kernel: arcmsr0: ccb ='0xffff8100bf819080' Ok, that's not good. Looks like the Areca driver is showing communication failure with 3 physical drives simultaneously. Can't be a drive problem. I just read through about 20 Google hits, and it seems this Areca issue is pretty common. One OP said he had a defective card. The rest all report the same or similar errors, across many Areca models, using many different drives, under moderate to high I/O load, under multiple *nix OSes, usually lots of small file copies is the trigger. I've read plenty of less than flattering things about Areca RAID cards in the past. This is just more of the same. >From everything I've read on this, the problem is either: A. A defective Areca card B. Firmware issue (card and/or drives) C. Driver issue D. More than one of the above > Areca Technology Corp. ARC-1160 16-Port PCI-X to SATA RAID Controller > Firmware Version : V1.42 2006-10-13 That's a 16 port card. How many total drives do you have connected? Are they all the same model/firmware rev? If different models, do you at least have identical models in each RAID pack? Mixing different brands/models/firmware revs within a RAID pack is always a very bad idea. In fact, using anything but identical drives/firmware on a single controller card is a bad idea. Some cards are more finicky than others, but almost all of them will have problems of one kind or another with a mixed bag 'o drives. They can have problems with all identical drives if the drive firmware isn't to the card firmware's liking (see below). > After the hard reset, one disk was reported as 'faild' and the rebuild > started. Unfortunately the errors reported weren't indicative of a bad drive, but multiple bad drives. None of the drives are bad. The controller/firmware/driver have a problem, or have a problem with the drive(s) firmware. The Areca firmware marked one drive as bad because the logic says something besides the card/firmware/driver _must_ be bad. So, it marked one of the drives as bad and started rebuilding it. Back in the late '90s I had Mylex DAC960 cards doing exactly the same thing due to a problem with firmware on the Seagate ST118202 Cheetah drives. The DAC960 would just kick a drive offline willy nilly. This was with 8 identical firmware drives in RAID5 arrays on a single SCSI channel. Was really annoying. I was at customer sites twice weekly replacing and rebuilding drives until Seagate finally admitted the firmware bug and advance shipped us 50 new 3 series Cheetah drives. That was really fun replacing drives one by one and rebuilding the arrays after each drive swap. We lost a lot of labor $$ over that and had some less than happy customers. Once all the drives were replaced with the 3 series, we never had another problem with any of those arrays. I'm still surprised I was able to rebuild the arrays without issues after adding each new drive, which was a slightly different size with a different firmware. I was just sure the rebuilds would puke. I got lucky. These systems were in production, thus the reason we didn't restore from tape, which would have saved a lot of time. >> What is the status of the RAID6 volume as reported by the RAID card BIOS? > > By now, the rebuild finished, therefor the volume is in normal > non-degraded state. That's good. >> What is the status of each of your EVMS volumes as reported by the EVMS UI? > > They're all active. Do you need more informations here? There are > approximately 45 active volumes on this server. No. Just wanted to know if they're all reported as healthy. >> I'm asking all of these questions because it seems rather clear that the >> root cause of your problem lies at a layer well below the XFS filesystem. > > Yes, I never blamed XFS for being the cause of the problem. I should have worded that differently. I didn't mean to imply that you were blaming XFS. I meant that I wanted to help you figure out the root cause which wasn't XFS. >> You have two layers of physical disk abstraction below XFS: a hardware >> RAID6 and a software logical volume manager. You've apparently suffered a >> storage system hardware failure, according to your description. You haven't >> given any details of the current status of the hardware RAID, or of the >> logical volumes, merely that XFS is having problems. I think a "Well duh!" >> is in order. >> >> Please provide _detailed_ information from the RAID card BIOS and the EVMS >> UI. Even if the problem isn't XFS related I for one would be glad to assist >> you in getting this fixed. Right now we don't have enough information. At >> least I don't. On second read, this looks rather preachy and antagonistic. I truly did not intend that tone. Please accept my apology if this came across that way. I think I was starting to get frustrated because I wanted to troubleshoot this further but didn't feel I had enough info. Again, this was less than professional, and I apologize. -- Stan From BATV+7e82a9e4c1b177193ee4+2450+infradead.org+hch@bombadil.srs.infradead.org Sun May 9 12:48:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o49Hmb9C231767 for ; Sun, 9 May 2010 12:48:38 -0500 X-ASG-Debug-ID: 1273427463-188302770000-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 0D1468FB1B5 for ; Sun, 9 May 2010 10:51:03 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id mHKBod0nkVTuvSCp for ; Sun, 09 May 2010 10:51:03 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OBAeO-0000cP-CF for xfs@oss.sgi.com; Sun, 09 May 2010 17:50:48 +0000 Date: Sun, 9 May 2010 13:50:48 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: add discard support (at transaction commit) Subject: [PATCH] xfs: add discard support (at transaction commit) Message-ID: <20100509175048.GA1435@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273427464 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Now that we have reliably tracking of deleted extents in a transaction we can easily implement "online" discard support which calls blkdev_issue_discard once a transaction commits. We simply have to walk the list of busy extents after transaction commit, but before deleting it from the rbtree tracking these busy extents. This does not replace by background discard support patch which is probably better for thin provisioned arrays - I will updated it to apply ontop of this patch when I'm ready to re-submit it. [Note: this patch needs Dave's delayed-logging series any patch titled "xfs: simplify log item descriptor tracking" applied] Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2010-05-09 19:08:34.544262404 +0200 +++ xfs/fs/xfs/xfs_alloc.c 2010-05-09 19:09:24.975032203 +0200 @@ -2761,3 +2761,25 @@ xfs_alloc_busy_clear( kmem_free(busyp); } + +int +xfs_discard_extent( + struct xfs_mount *mp, + struct xfs_busy_extent *busyp) +{ + int error = 0; + xfs_daddr_t bno; + __int64_t len; + + if ((mp->m_flags & XFS_MOUNT_DISCARD) == 0) + return 0; + + bno = XFS_AGB_TO_DADDR(mp, busyp->agno, busyp->bno); + len = XFS_FSB_TO_BB(mp, busyp->length); + + error = -blkdev_issue_discard(mp->m_ddev_targp->bt_bdev, bno, len, + GFP_NOFS, DISCARD_FL_BARRIER); + if (error && error != EOPNOTSUPP) + xfs_fs_cmn_err(CE_NOTE, mp, "discard failed, error %d", error); + return error; +} Index: xfs/fs/xfs/xfs_alloc.h =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.h 2010-05-09 19:08:34.551265756 +0200 +++ xfs/fs/xfs/xfs_alloc.h 2010-05-09 19:09:16.213023263 +0200 @@ -128,6 +128,9 @@ xfs_alloc_busy_insert(xfs_trans_t *tp, void xfs_alloc_busy_clear(struct xfs_mount *mp, struct xfs_busy_extent *busyp); +int +xfs_discard_extent(struct xfs_mount *mp, struct xfs_busy_extent *busyp); + #endif /* __KERNEL__ */ /* Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2010-05-09 19:08:34.562254302 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-05-09 19:09:16.223693748 +0200 @@ -120,6 +120,8 @@ mempool_t *xfs_ioend_pool; #define MNTOPT_DMI "dmi" /* DMI enabled (DMAPI / XDSM) */ #define MNTOPT_DELAYLOG "delaylog" /* Delayed loging enabled */ #define MNTOPT_NODELAYLOG "nodelaylog" /* Delayed loging disabled */ +#define MNTOPT_DISCARD "discard" /* Discard unused blocks */ +#define MNTOPT_NODISCARD "nodiscard" /* Do not discard unused blocks */ /* * Table driven mount option parser. @@ -382,6 +384,10 @@ xfs_parseargs( "- use at your own risk.\n"); } else if (!strcmp(this_char, MNTOPT_NODELAYLOG)) { mp->m_flags &= ~XFS_MOUNT_DELAYLOG; + } else if (!strcmp(this_char, MNTOPT_DISCARD)) { + mp->m_flags |= XFS_MOUNT_DISCARD; + } else if (!strcmp(this_char, MNTOPT_NODISCARD)) { + mp->m_flags &= ~XFS_MOUNT_DISCARD; } else if (!strcmp(this_char, "ihashsize")) { cmn_err(CE_WARN, "XFS: ihashsize no longer used, option is deprecated."); Index: xfs/fs/xfs/xfs_mount.h =================================================================== --- xfs.orig/fs/xfs/xfs_mount.h 2010-05-09 19:08:34.571254232 +0200 +++ xfs/fs/xfs/xfs_mount.h 2010-05-09 19:09:16.231005734 +0200 @@ -274,6 +274,7 @@ typedef struct xfs_mount { #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem operations, typically for disk errors in metadata */ +#define XFS_MOUNT_DISCARD (1ULL << 5) /* discard unused blocks */ #define XFS_MOUNT_RETERR (1ULL << 6) /* return alignment errors to user */ #define XFS_MOUNT_NOALIGN (1ULL << 7) /* turn off stripe alignment Index: xfs/fs/xfs/xfs_log_cil.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_cil.c 2010-05-09 19:08:34.580004407 +0200 +++ xfs/fs/xfs/xfs_log_cil.c 2010-05-09 19:09:16.241255699 +0200 @@ -415,6 +415,7 @@ xlog_cil_committed( int abort) { struct xfs_cil_ctx *ctx = args; + struct xfs_mount *mp = ctx->cil->xc_log->l_mp; struct xfs_log_vec *lv; int abortflag = abort ? XFS_LI_ABORTED : 0; struct xfs_busy_extent *busyp, *n; @@ -425,8 +426,10 @@ xlog_cil_committed( abortflag); } - list_for_each_entry_safe(busyp, n, &ctx->busy_extents, list) - xfs_alloc_busy_clear(ctx->cil->xc_log->l_mp, busyp); + list_for_each_entry_safe(busyp, n, &ctx->busy_extents, list) { + xfs_discard_extent(mp, busyp); + xfs_alloc_busy_clear(mp, busyp); + } spin_lock(&ctx->cil->xc_cil_lock); list_del(&ctx->committing); Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-09 19:08:34.596025010 +0200 +++ xfs/fs/xfs/xfs_trans.c 2010-05-09 19:09:16.252005804 +0200 @@ -1398,6 +1398,7 @@ xfs_trans_committed( int abortflag) { struct xfs_log_item_desc *lidp, *next; + struct xfs_busy_extent *busyp; /* Call the transaction's completion callback if there is one. */ if (tp->t_callback != NULL) @@ -1408,6 +1409,9 @@ xfs_trans_committed( xfs_trans_free_item_desc(lidp); } + list_for_each_entry(busyp, &tp->t_busy, list) + xfs_discard_extent(tp->t_mountp, busyp); + xfs_trans_free(tp); } From roger@filmlight.ltd.uk Sun May 9 13:01:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o49I1jYp231964 for ; Sun, 9 May 2010 13:01:45 -0500 X-ASG-Debug-ID: 1273428235-331c02160000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from b.mx.filmlight.ltd.uk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id C3734323B11 for ; Sun, 9 May 2010 11:03:55 -0700 (PDT) Received: from b.mx.filmlight.ltd.uk (bongo.filmlight.ltd.uk [77.107.81.251]) by cuda.sgi.com with SMTP id XB1sxCk9Y6w8qwyB for ; Sun, 09 May 2010 11:03:55 -0700 (PDT) Received: (dqd 12711 invoked from network); 9 May 2010 18:03:53 -0000 Received: from centprod.demon.co.uk (HELO ?192.168.1.102?) (roger@62.49.60.134) by b.mx.filmlight.ltd.uk with SMTP; 9 May 2010 18:03:53 -0000 Cc: xfs@oss.sgi.com Message-Id: From: Roger Willcocks To: Christian Affolter In-Reply-To: <4BE55A63.8070203@purplehaze.ch> Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v936) X-ASG-Orig-Subj: Re: failed to read root inode Subject: Re: failed to read root inode Date: Sun, 9 May 2010 19:03:52 +0100 References: <4BE55A63.8070203@purplehaze.ch> X-Mailer: Apple Mail (2.936) X-Barracuda-Connect: bongo.filmlight.ltd.uk[77.107.81.251] X-Barracuda-Start-Time: 1273428236 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.2, rules version 3.2.2.29466 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The original xfs_repair log looks reasonably sane, and suggests that the block(s) containing inodes 128-191 had been zeroed out. xfs_repair claims to have fixed all that up, and rebuilt the root directory amongst others. However xfs_check still complains, and correspondence off-list shows that xfs_repair -n detects the same 'bad magic number 0xfeed' on alternating inodes as xfs_check: bad magic number 0xfeed on inode 128 bad version number 0x0 on inode 128 bad magic number 0x0 on inode 129 bad version number 0x0 on inode 129 bad (negative) size -8161755683656211562 on inode 129 bad magic number 0xfeed on inode 130 bad version number 0x0 on inode 130 bad magic number 0x0 on inode 131 bad version number 0x0 on inode 131 bad (negative) size -8161755683656211562 on inode 131 This pattern corresponds to the corruption described in http://oss.sgi.com/archives/xfs/2008-01/msg00696.html xfs_check also says: block 0/8 expected type unknown got log block 0/9 expected type unknown got log block 0/10 expected type unknown got log block 0/11 expected type unknown got log Could xfs_repair (or remounting the disk) have written log data over those blocks? -- Roger On 8 May 2010, at 13:34, Christian Affolter wrote: > Hi > > After a disk crash within a hardware RAID-6 controller and kernel > freeze, I'm unable to mount an XFS filesystem on top of an EVMS > volume: > > Filesystem "dm-13": Disabling barriers, not supported by the > underlying > device > XFS mounting filesystem dm-13 > Starting XFS recovery on filesystem: dm-13 (logdev: internal) > XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1599 of file > fs/xfs/xfs_alloc.c. Caller 0xffffffff8035c58d > Pid: 13473, comm: mount Not tainted 2.6.26-gentoo #1 > > Call Trace: > [] xfs_free_extent+0xcd/0x110 > [] xfs_free_ag_extent+0x4e3/0x740 > [] xfs_free_extent+0xcd/0x110 > [] xlog_recover_process_efi+0x18d/0x1d0 > [] xlog_recover_process_efis+0x60/0xa0 > [] xlog_recover_finish+0x23/0xf0 > [] xfs_mountfs+0x4da/0x680 > [] kmem_alloc+0x58/0x100 > [] kmem_zalloc+0x2b/0x40 > [] xfs_mount+0x36d/0x3a0 > [] xfs_fs_fill_super+0xbd/0x220 > [] get_sb_bdev+0x141/0x180 > [] xfs_fs_fill_super+0x0/0x220 > [] vfs_kern_mount+0x56/0xc0 > [] do_kern_mount+0x53/0x110 > [] do_new_mount+0x9b/0xe0 > [] do_mount+0x1e6/0x220 > [] __get_free_pages+0x15/0x60 > [] sys_mount+0x9b/0x100 > [] system_call_after_swapgs+0x7b/0x80 > > Filesystem "dm-13": XFS internal error xfs_trans_cancel at line 1163 > of > file fs/xfs/xfs_trans.c. Caller 0xffffffff80395eb1 > Pid: 13473, comm: mount Not tainted 2.6.26-gentoo #1 > > Call Trace: > [] xlog_recover_process_efi+0x1a1/0x1d0 > [] xfs_trans_cancel+0x126/0x150 > [] xlog_recover_process_efi+0x1a1/0x1d0 > [] xlog_recover_process_efis+0x60/0xa0 > [] xlog_recover_finish+0x23/0xf0 > [] xfs_mountfs+0x4da/0x680 > [] kmem_alloc+0x58/0x100 > [] kmem_zalloc+0x2b/0x40 > [] xfs_mount+0x36d/0x3a0 > [] xfs_fs_fill_super+0xbd/0x220 > [] get_sb_bdev+0x141/0x180 > [] xfs_fs_fill_super+0x0/0x220 > [] vfs_kern_mount+0x56/0xc0 > [] do_kern_mount+0x53/0x110 > [] do_new_mount+0x9b/0xe0 > [] do_mount+0x1e6/0x220 > [] __get_free_pages+0x15/0x60 > [] sys_mount+0x9b/0x100 > [] system_call_after_swapgs+0x7b/0x80 > > xfs_force_shutdown(dm-13,0x8) called from line 1164 of file > fs/xfs/xfs_trans.c. Return address = 0xffffffff8039fd2f > Filesystem "dm-13": Corruption of in-memory data detected. Shutting > down filesystem: dm-13 > Please umount the filesystem, and rectify the problem(s) > Failed to recover EFIs on filesystem: dm-13 > XFS: log mount finish failed > > > I tried to repair the filesystem with the help of xfs_repair many > times, > without any luck: > Filesystem "dm-13": Disabling barriers, not supported by the > underlying > device > XFS mounting filesystem dm-13 > XFS: failed to read root inode > > xfs_check output: > cache_node_purge: refcount was 1, not zero (node=0x820010) > xfs_check: cannot read root inode (117) > cache_node_purge: refcount was 1, not zero (node=0x8226b0) > xfs_check: cannot read realtime bitmap inode (117) > block 0/8 expected type unknown got log > block 0/9 expected type unknown got log > block 0/10 expected type unknown got log > block 0/11 expected type unknown got log > bad magic number 0xfeed for inode 128 > [...] > > Are there any other ways to fix the unreadable root inode or to > restore > the remaining data? > > > Environment informations: > Linux Kernel: 2.6.26-gentoo (x86_64) > xfsprogs: 3.0.3 > > Attached you'll find the xfs_repair and xfs_check output. > > > Thanks in advance and kind regards > Christian > < > xfs_repair > .log>_______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From rfu@kaneda.iguw.tuwien.ac.at Sun May 9 13:45:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o49IjpTJ232811 for ; Sun, 9 May 2010 13:45:52 -0500 X-ASG-Debug-ID: 1273430881-4b3601fe0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx02.kabsi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 06A28323FD0 for ; Sun, 9 May 2010 11:48:01 -0700 (PDT) Received: from mx02.kabsi.at (mx02.kabsi.at [62.40.128.130]) by cuda.sgi.com with ESMTP id MDJGXOt21pGPcL10 for ; Sun, 09 May 2010 11:48:01 -0700 (PDT) Received: from 192.168.5.201 (h081217058120.dyn.cm.kabsi.at [81.217.58.120]) by mx02.kabsi.at (8.13.6/8.13.6) with ESMTP id o49Ilw9F013564; Sun, 9 May 2010 20:48:00 +0200 Date: Sun, 9 May 2010 20:48:00 +0200 From: Rainer Fuegenstein X-Mailer: The Bat! (v1.62r) Business Reply-To: Rainer Fuegenstein Organization: Vienna University of Technology X-Priority: 3 (Normal) Message-ID: <1816344475.20100509204800@kaneda.iguw.tuwien.ac.at> To: xfs@oss.sgi.com CC: linux-raid@vger.kernel.org X-ASG-Orig-Subj: xfs and raid5 - "Structure needs cleaning for directory open" Subject: xfs and raid5 - "Structure needs cleaning for directory open" MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mx02.kabsi.at[62.40.128.130] X-Barracuda-Start-Time: 1273430883 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean today in the morning some daemon processes terminated because of errors in the xfs file system on top of a software raid5, consisting of 4*1.5TB WD caviar green SATA disks. current OS is centos 5.4, kernel is: Linux alfred 2.6.18-164.15.1.el5xen #1 SMP Wed Mar 17 12:04:23 EDT 2010 x86= _64 x86_64 x86_64 GNU/Linux the history: this raid was originally created on an ASUS M2N-X plus mainboard with all 4 drives connected to the on-board controller. (centos 5.4, current i386 kernel). it worked fine first, but after some months problems occured when copying files via SMB, in these situations dmesg showed a stack trace, starting with an interrupt problem deep in the kernel and reaching up to the xfs filesystem code. a few months ago the weekly raid check (/etc/cron.weekly/99-raid-check) started a re-sync of the raid which (on the M2N-X board) took about 2.5 to 3 days to complete. to overcome the interrupt problems, I recently bought an intel D510 atom mainboard and a "Promise Technology, Inc. PDC40718 (SATA 300 TX4) (rev 02))" sata controller, reinstalled centos 5.4 from scratch (x86_64 version) and attached the 4 sata disks which worked fine until this sunday night the 99-raid-check started again at 4:00 in the morning and lasted until just now (19:00 o'clock). around 12:00 noon (resync at about 50%) I noticed the first problems, namely "Structure needs cleaning for directory open" messages. at this time, a "du -sh *" revealed that around 50% of the data stored on the xfs was lost (due to directories that couldn't be read because of the "needs cleaning ..." error. a daring xfs_repair on the unmounted, but still syncing filesystem revealed & fixed no errors (see output below). after painfully waiting 7 hours for the resync to complete, it looks like the filesystem is OK and back to normal again: du shows the expected 3.5TB usage, there are no more "needs cleaning ..." errors and a quick check into the previously lost directories seems to show that the files contained within seem to be OK. I wonder what caused this behaviour (and how to prevent it in the future): 1) damages done to the xfs filesystem on the old board=3F shouldn't xfs_repair find & repair them=3F 2) does a re-syncing raid deliver bad/corrupt data to the filesystem layer above=3F 3) may this be a hardware/memory problem since xfs reports "Corruption of in-memory data detected". =3F 4) is the Promise SATA controller to blame =3F here's some output that may help. please let me know if you need more: *** this is where it started: May 9 04:22:01 alfred kernel: md: syncing RAID array md0 May 9 04:22:01 alfred kernel: md: minimum _guaranteed_ reconstruction spee= d: 1000 KB/sec/disc. May 9 04:22:01 alfred kernel: md: using maximum available idle IO bandwidt= h (but not more than 200000 KB/sec) for reconstructio n. May 9 04:22:01 alfred kernel: md: using 128k window, over a total of 14651= 35936 blocks. May 9 04:24:06 alfred kernel: XFS internal error XFS_WANT_CORRUPTED_GOTO a= t line 4565 of file fs/xfs/xfs_bmap.c. Caller 0xffff ffff8835dba8 May 9 04:24:06 alfred kernel: May 9 04:24:06 alfred kernel: Call Trace: May 9 04:24:06 alfred kernel: [] :xfs:xfs_bmap_read_ext= ents+0x361/0x384 May 9 04:24:06 alfred kernel: [] :xfs:xfs_iread_extents= +0xac/0xc8 May 9 04:24:06 alfred kernel: [] :xfs:xfs_bmapi+0x226/0= xe79 May 9 04:24:06 alfred kernel: [] generic_make_request+0= x211/0x228 May 9 04:24:06 alfred kernel: [] :raid456:handle_stripe= +0x20a6/0x21ff May 9 04:24:06 alfred kernel: [] :xfs:xfs_iomap+0x144/0= x2a5 May 9 04:24:06 alfred kernel: [] :xfs:__xfs_get_blocks+= 0x7a/0x1bf May 9 04:24:06 alfred kernel: [] :raid456:make_request+= 0x4ba/0x4f4 May 9 04:24:06 alfred kernel: [] autoremove_wake_functi= on+0x0/0x2e May 9 04:24:06 alfred kernel: [] do_mpage_readpage+0x16= 7/0x474 May 9 04:24:06 alfred kernel: [] :xfs:xfs_get_blocks+0x= 0/0xe May 9 04:24:06 alfred kernel: [] :xfs:xfs_get_blocks+0x= 0/0xe May 9 04:24:06 alfred kernel: [] add_to_page_cache+0xb9= /0xc5 May 9 04:24:06 alfred kernel: [] :xfs:xfs_get_blocks+0x= 0/0xe May 9 04:24:06 alfred kernel: [] mpage_readpages+0x91/0= xd9 May 9 04:24:06 alfred kernel: [] :xfs:xfs_get_blocks+0x= 0/0xe May 9 04:24:06 alfred kernel: [] __alloc_pages+0x65/0x2= ce May 9 04:24:06 alfred kernel: [] __do_page_cache_readah= ead+0x130/0x1ab May 9 04:24:06 alfred kernel: [] blockable_page_cache_r= eadahead+0x53/0xb2 May 9 04:24:06 alfred kernel: [] page_cache_readahead+0= xd6/0x1af May 9 04:24:06 alfred kernel: [] do_generic_mapping_rea= d+0xc6/0x38a May 9 04:24:06 alfred kernel: [] file_read_actor+0x0/0x= 101 May 9 04:24:06 alfred kernel: [] __generic_file_aio_rea= d+0x14c/0x198 May 9 04:24:06 alfred kernel: [] :xfs:xfs_read+0x187/0x= 209 May 9 04:24:06 alfred kernel: [] :xfs:xfs_file_aio_read= +0x63/0x6b May 9 04:24:06 alfred kernel: [] do_sync_read+0xc7/0x104 May 9 04:24:06 alfred kernel: [] __dentry_open+0x101/0x= 1dc May 9 04:24:06 alfred kernel: [] autoremove_wake_functi= on+0x0/0x2e May 9 04:24:06 alfred kernel: [] do_filp_open+0x2a/0x38 May 9 04:24:06 alfred kernel: [] vfs_read+0xcb/0x171 May 9 04:24:06 alfred kernel: [] sys_read+0x45/0x6e May 9 04:24:06 alfred kernel: [] ia32_sysret+0x0/0x5 May 9 04:24:06 alfred kernel: May 9 04:24:06 alfred kernel: XFS internal error XFS_WANT_CORRUPTED_GOTO a= t line 4565 of file fs/xfs/xfs_bmap.c. Caller 0xffff ffff8835dba8 *** (many, many more) May 9 06:19:16 alfred kernel: Filesystem "md0": corrupt dinode 1610637790,= (btree extents). Unmount and run xfs_repair. May 9 06:19:16 alfred kernel: Filesystem "md0": XFS internal error xfs_bma= p_read_extents(1) at line 4560 of file fs/xfs/xfs_bma p.c. Caller 0xffffffff8835dba8 May 9 06:19:16 alfred kernel: May 9 06:19:16 alfred kernel: Call Trace: May 9 06:19:16 alfred kernel: [] :xfs:xfs_bmap_read_ext= ents+0x361/0x384 May 9 06:19:16 alfred kernel: [] :xfs:xfs_iread_extents= +0xac/0xc8 May 9 06:19:16 alfred kernel: [] :xfs:xfs_bmapi+0x226/0= xe79 May 9 06:19:16 alfred kernel: [] :ip_conntrack:tcp_pkt_= to_tuple+0x0/0x61 May 9 06:19:16 alfred kernel: [] :ip_conntrack:__ip_con= ntrack_find+0xd/0xb7 May 9 06:19:16 alfred kernel: [] lock_timer_base+0x1b/0= x3c May 9 06:19:16 alfred kernel: [] __mod_timer+0xb0/0xbe May 9 06:19:16 alfred kernel: [] :ip_conntrack:__ip_ct_= refresh_acct+0x10f/0x152 May 9 06:19:16 alfred kernel: [] :ip_conntrack:tcp_pack= et+0xa5f/0xa9f May 9 06:19:16 alfred kernel: [] :xfs:xfs_iomap+0x144/0= x2a5 May 9 06:19:16 alfred kernel: [] :xfs:__xfs_get_blocks+= 0x7a/0x1bf May 9 06:19:16 alfred kernel: [] alloc_buffer_head+0x31= /0x36 May 9 06:19:16 alfred kernel: [] alloc_page_buffers+0x8= 1/0xd3 May 9 06:19:16 alfred kernel: [] __block_prepare_write+= 0x1ad/0x375 May 9 06:19:16 alfred kernel: [] :xfs:xfs_get_blocks+0x= 0/0xe May 9 06:19:16 alfred kernel: [] add_to_page_cache_lru+= 0x1c/0x22 May 9 06:19:16 alfred kernel: [] block_write_begin+0x80= /0xcf May 9 06:19:16 alfred kernel: [] :xfs:xfs_vm_write_begi= n+0x19/0x1e May 9 06:19:16 alfred kernel: [] :xfs:xfs_get_blocks+0x= 0/0xe May 9 06:19:16 alfred kernel: [] generic_file_buffered_= write+0x14b/0x60c May 9 06:19:16 alfred kernel: [] __d_lookup+0xb0/0xff May 9 06:19:16 alfred kernel: [] _spin_lock_irqsave+0x9= /0x14 May 9 06:19:16 alfred kernel: [] :xfs:xfs_write+0x49e/0= x69e May 9 06:19:16 alfred kernel: [] mntput_no_expire+0x19/= 0x89 May 9 06:19:16 alfred kernel: [] link_path_walk+0xa6/0x= b2 May 9 06:19:16 alfred kernel: [] :xfs:xfs_file_aio_writ= e+0x65/0x6a May 9 06:19:16 alfred kernel: [] do_sync_write+0xc7/0x1= 04 May 9 06:19:16 alfred kernel: [] __dentry_open+0x101/0x= 1dc May 9 06:19:16 alfred kernel: [] autoremove_wake_functi= on+0x0/0x2e May 9 06:19:16 alfred kernel: [] do_filp_open+0x2a/0x38 May 9 06:19:16 alfred kernel: [] vfs_write+0xce/0x174 May 9 06:19:16 alfred kernel: [] sys_write+0x45/0x6e May 9 06:19:16 alfred kernel: [] ia32_sysret+0x0/0x5 *** also many, many more, always the same dinode May 9 12:53:32 alfred kernel: Filesystem "md0": XFS internal error xfs_btr= ee_check_sblock at line 307 of file fs/xfs/xfs_btree. c. Caller 0xffffffff88358eb7 May 9 12:53:32 alfred kernel: May 9 12:53:32 alfred kernel: Call Trace: May 9 12:53:32 alfred kernel: [] :xfs:xfs_btree_check_s= block+0xaf/0xbe May 9 12:53:32 alfred kernel: [] :xfs:xfs_inobt_increme= nt+0x156/0x17e May 9 12:53:32 alfred kernel: [] :xfs:xfs_dialloc+0x4d0= /0x80c May 9 12:53:32 alfred kernel: [] find_or_create_page+0x= 3f/0xab May 9 12:53:32 alfred kernel: [] :xfs:xfs_ialloc+0x5f/0= x57f May 9 12:53:32 alfred kernel: [] :ext3:ext3_get_acl+0x6= 3/0x310 May 9 12:53:32 alfred kernel: [] kmem_cache_alloc+0x62/= 0x6d May 9 12:53:32 alfred kernel: [] :xfs:xfs_dir_ialloc+0x= 86/0x2b7 May 9 12:53:32 alfred kernel: [] :xfs:xlog_grant_log_sp= ace+0x204/0x25c May 9 12:53:32 alfred kernel: [] :xfs:xfs_create+0x237/= 0x45c May 9 12:53:32 alfred kernel: [] :xfs:xfs_attr_get+0x8e= /0x9f May 9 12:53:32 alfred kernel: [] :xfs:xfs_vn_mknod+0x14= 4/0x215 May 9 12:53:32 alfred kernel: [] vfs_create+0xe6/0x158 May 9 12:53:32 alfred kernel: [] open_namei+0x1a1/0x6ed May 9 12:53:32 alfred kernel: [] do_filp_open+0x1c/0x38 May 9 12:53:32 alfred kernel: [] do_sys_open+0x44/0xbe May 9 12:53:32 alfred kernel: [] ia32_sysret+0x0/0x5 May 9 12:53:32 alfred kernel: *** also many, many more May 9 13:44:35 alfred kernel: 00000000: ff ff ff ff ff ff ff ff 00 00 00 0= 0 00 00 00 00 =FF=FF=FF=FF=FF=FF=FF=FF........ May 9 13:44:35 alfred kernel: Filesystem "md0": XFS internal error xfs_da_= do_buf(2) at line 2112 of file fs/xfs/xfs_da_btree.c. Caller 0xffffffff8834b82e May 9 13:44:35 alfred kernel: May 9 13:44:35 alfred kernel: Call Trace: May 9 13:44:35 alfred kernel: [] :xfs:xfs_da_do_buf+0x5= 03/0x5b1 May 9 13:44:35 alfred kernel: [] :xfs:xfs_da_read_buf+0= x16/0x1b May 9 13:44:35 alfred kernel: [] _atomic_dec_and_lock+0= x39/0x57 May 9 13:44:35 alfred kernel: [] :xfs:xfs_da_read_buf+0= x16/0x1b May 9 13:44:35 alfred kernel: [] :xfs:xfs_dir2_leaf_get= dents+0x354/0x5ec May 9 13:44:35 alfred kernel: [] :xfs:xfs_dir2_leaf_get= dents+0x354/0x5ec May 9 13:44:35 alfred kernel: [] :xfs:xfs_hack_filldir+= 0x0/0x5b May 9 13:44:35 alfred kernel: [] :xfs:xfs_hack_filldir+= 0x0/0x5b May 9 13:44:35 alfred kernel: [] :xfs:xfs_readdir+0xa7/= 0xb6 May 9 13:44:35 alfred kernel: [] :xfs:xfs_file_readdir+= 0xff/0x14c May 9 13:44:35 alfred kernel: [] filldir+0x0/0xb7 May 9 13:44:35 alfred kernel: [] filldir+0x0/0xb7 May 9 13:44:35 alfred kernel: [] vfs_readdir+0x77/0xa9 May 9 13:44:35 alfred kernel: [] sys_getdents+0x75/0xbd May 9 13:44:35 alfred kernel: [] tracesys+0x47/0xb6 May 9 13:44:35 alfred kernel: [] tracesys+0xab/0xb6 May 9 13:44:35 alfred kernel: May 9 13:51:24 alfred kernel: Filesystem "md0": Disabling barriers, trial = barrier write failed May 9 13:51:24 alfred kernel: XFS mounting filesystem md0 *** these xfs_da_do_buf errors appear at a rate of about 5 per second until 14:40 o'clock, then stop. file system was still mounted, maybe one daemon was still accessing it. *** xfs_repair performed when raid was at 50% resync and filesystem was corrupted: [root@alfred ~]# xfs_repair /dev/md0 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - 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 =3D 0 - agno =3D 1 - agno =3D 2 - agno =3D 3 - agno =3D 4 - agno =3D 5 - agno =3D 6 - agno =3D 7 [...] - agno =3D 62 - agno =3D 63 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno =3D 0 - agno =3D 1 - agno =3D 2 - agno =3D 3 [...] - agno =3D 61 - agno =3D 62 - agno =3D 63 Phase 5 - rebuild AG headers and trees... - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... done raid output after sync was finished: [root@alfred md]# cat /sys/block/md0/md/array_state clean [root@alfred md]# cat /sys/block/md0/md/mismatch_cnt 0 tnx & cu From rfu@kaneda.iguw.tuwien.ac.at Sun May 9 14:05:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o49J55R0233142 for ; Sun, 9 May 2010 14:05:05 -0500 X-ASG-Debug-ID: 1273432036-585a03790000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx02.kabsi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DAAB213957BB for ; Sun, 9 May 2010 12:07:16 -0700 (PDT) Received: from mx02.kabsi.at (mx02.kabsi.at [62.40.128.130]) by cuda.sgi.com with ESMTP id B3upRdCDNJR3fPnx for ; Sun, 09 May 2010 12:07:16 -0700 (PDT) Received: from 192.168.5.201 (h081217058120.dyn.cm.kabsi.at [81.217.58.120]) by mx02.kabsi.at (8.13.6/8.13.6) with ESMTP id o49J798r025155 for ; Sun, 9 May 2010 21:07:10 +0200 Date: Sun, 9 May 2010 21:07:10 +0200 From: Rainer Fuegenstein X-Mailer: The Bat! (v1.62r) Business Reply-To: Rainer Fuegenstein Organization: Vienna University of Technology X-Priority: 3 (Normal) Message-ID: <462402327.20100509210710@kaneda.iguw.tuwien.ac.at> To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs and raid5 - "Structure needs cleaning for directory open" Subject: Re: xfs and raid5 - "Structure needs cleaning for directory open" In-Reply-To: <1816344475.20100509204800@kaneda.iguw.tuwien.ac.at> References: <1816344475.20100509204800@kaneda.iguw.tuwien.ac.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mx02.kabsi.at[62.40.128.130] X-Barracuda-Start-Time: 1273432037 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0199 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.2, rules version 3.2.2.29469 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean addendum - xfsprogs is of version: xfsprogs-2.9.4-1.el5.centos RF> today in the morning some daemon processes terminated because of RF> errors in the xfs file system on top of a software raid5, consisting RF> of 4*1.5TB WD caviar green SATA disks. [...] From SRS0+xPli+68+fromorbit.com=david@internode.on.net Sun May 9 16:57:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o49LvbwT236157 for ; Sun, 9 May 2010 16:57:38 -0500 X-ASG-Debug-ID: 1273442402-28b603410000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 06E0697ED36 for ; Sun, 9 May 2010 15:00:03 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id E7uPCgbbx6EMBlny for ; Sun, 09 May 2010 15:00:03 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23482711-1927428 for multiple; Mon, 10 May 2010 07:29:45 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OBEXI-0001kM-7J; Mon, 10 May 2010 07:59:44 +1000 Date: Mon, 10 May 2010 07:59:44 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: add discard support (at transaction commit) Subject: Re: [PATCH] xfs: add discard support (at transaction commit) Message-ID: <20100509215944.GF25419@dastard> References: <20100509175048.GA1435@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100509175048.GA1435@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1273442405 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.2, rules version 3.2.2.29478 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, May 09, 2010 at 01:50:48PM -0400, Christoph Hellwig wrote: > Now that we have reliably tracking of deleted extents in a transaction > we can easily implement "online" discard support which calls > blkdev_issue_discard once a transaction commits. We simply have to > walk the list of busy extents after transaction commit, but before deleting > it from the rbtree tracking these busy extents. > > This does not replace by background discard support patch which is probably > better for thin provisioned arrays - I will updated it to apply ontop of > this patch when I'm ready to re-submit it. I think this can be made to work, but I don't really like it that much, especially the barrier flush part. Is there any particular reason we need to issue discards at this level apart from "other filesystems are doing it" rather than doing it lazily in a non-performance critical piece of code? Regardless of this, some questions about the patch come to mind: 1. is it safe to block the xfslogd in the block layer in, say, get_request()? i.e. should we be issuing IO from an IO completion handler? That raises red flags in my head... 2. issuing discards will block xfslogd and potentially stall the log if there are lots of discards to issue. 3. DISCARD_FL_BARRIER appears to be used to allow async issuing of the discard to ensure any followup write has the discard processed first. What happens if the device does not support barriers or barriers are turned off? To me it appears that a lack of barriers could result in a write being reordered in front of the discard. e.g. delalloc results in btree block freed, marked busy. New delalloc occurs, allocates block, marked sync, forces log, issues async discard, completes transaction and then writes data async. Which operation does the drive see and complete first - the discard or the data write? 4. A barrier IO on every discard? In a word: Ouch. Cheers, Dave. -- Dave Chinner david@fromorbit.com From rfu@kaneda.iguw.tuwien.ac.at Sun May 9 18:33:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o49NXCnf239450 for ; Sun, 9 May 2010 18:33:13 -0500 X-ASG-Debug-ID: 1273448123-058d01140000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx05.kabsi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 77CB312CFD0C for ; Sun, 9 May 2010 16:35:23 -0700 (PDT) Received: from mx05.kabsi.at (mx05.kabsi.at [195.202.128.131]) by cuda.sgi.com with ESMTP id kuqLNikG77dPr77h for ; Sun, 09 May 2010 16:35:23 -0700 (PDT) Received: from 192.168.5.201 (h081217058120.dyn.cm.kabsi.at [81.217.58.120]) by mx05.kabsi.at (8.13.8/8.13.8) with ESMTP id o49NZLsv002587 for ; Mon, 10 May 2010 01:35:22 +0200 Date: Mon, 10 May 2010 01:35:11 +0200 From: Rainer Fuegenstein X-Mailer: The Bat! (v1.62r) Business Reply-To: Rainer Fuegenstein Organization: Vienna University of Technology X-Priority: 3 (Normal) Message-ID: <1743435018.20100510013511@kaneda.iguw.tuwien.ac.at> To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs and raid5 - "Structure needs cleaning for directory open" Subject: Re: xfs and raid5 - "Structure needs cleaning for directory open" In-Reply-To: <1816344475.20100509204800@kaneda.iguw.tuwien.ac.at> References: <1816344475.20100509204800@kaneda.iguw.tuwien.ac.at> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mx05.kabsi.at[195.202.128.131] X-Barracuda-Start-Time: 1273448124 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29484 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean not sure if my original post made it to the list members since it never arrived here, but it is already listed in the archive: http://oss.sgi.com/pipermail/xfs/2010-May/045303.html another update: I restarted the server several times, always with the raid intact (no syncing) and started to backup as much data as possible. in the last hours the file system was heavily used (both read and write, about 2TB copied to another SATA disk); during this time the error occured a few times: since raid is stable I suspect it is entirely an XFS (or hardware) problem= =3F find: ./Hana: Structure needs cleaning 00000000: aa b9 6a 52 fa 62 8c 36 17 19 b8 75 0f 2a 92 f5 =AA=B9jR=FAb.6..= =B8u.*.=F5 Filesystem "md0": XFS internal error xfs_da_do_buf(2) at line 2112 of file = fs/xfs/xfs_da_btree.c. Caller 0xffffffff8834482e Call Trace: [] :xfs:xfs_da_do_buf+0x503/0x5b1 [] :xfs:xfs_da_read_buf+0x16/0x1b [] _atomic_dec_and_lock+0x39/0x57 [] :xfs:xfs_da_read_buf+0x16/0x1b [] :xfs:xfs_dir2_leaf_getdents+0x354/0x5ec [] :xfs:xfs_dir2_leaf_getdents+0x354/0x5ec [] :xfs:xfs_hack_filldir+0x0/0x5b [] :xfs:xfs_hack_filldir+0x0/0x5b [] :xfs:xfs_readdir+0xa7/0xb6 [] :xfs:xfs_file_readdir+0xff/0x14c [] filldir+0x0/0xb7 [] filldir+0x0/0xb7 [] vfs_readdir+0x77/0xa9 [] sys_getdents+0x75/0xbd [] tracesys+0x47/0xb6 [] tracesys+0xab/0xb6 00000000: ea 4c ea e1 7a f1 2f 88 13 f9 a5 24 08 38 31 4e =EAL=EA=E1z=F1/.= .=F9=A5$.81N Filesystem "md0": XFS internal error xfs_da_do_buf(2) at line 2112 of file = fs/xfs/xfs_da_btree.c. Caller 0xffffffff8834482e Call Trace: [] :xfs:xfs_da_do_buf+0x503/0x5b1 [] :xfs:xfs_da_read_buf+0x16/0x1b [] _atomic_dec_and_lock+0x39/0x57 [] :xfs:xfs_da_read_buf+0x16/0x1b [] :xfs:xfs_dir2_leaf_getdents+0x354/0x5ec [] :xfs:xfs_dir2_leaf_getdents+0x354/0x5ec [] :xfs:xfs_hack_filldir+0x0/0x5b [] :xfs:xfs_hack_filldir+0x0/0x5b [] :xfs:xfs_readdir+0xa7/0xb6 [] :xfs:xfs_file_readdir+0xff/0x14c [] filldir+0x0/0xb7 [] filldir+0x0/0xb7 [] vfs_readdir+0x77/0xa9 [] sys_getdents+0x75/0xbd [] tracesys+0x47/0xb6 [] tracesys+0xab/0xb6 00000000: ea 4c ea e1 7a f1 2f 88 13 f9 a5 24 08 38 31 4e =EAL=EA=E1z=F1/.= .=F9=A5$.81N Filesystem "md0": XFS internal error xfs_da_do_buf(2) at line 2112 of file = fs/xfs/xfs_da_btree.c. Caller 0xffffffff8834482e Call Trace: [] :xfs:xfs_da_do_buf+0x503/0x5b1 [] :xfs:xfs_da_read_buf+0x16/0x1b [] _atomic_dec_and_lock+0x39/0x57 [] :xfs:xfs_da_read_buf+0x16/0x1b [] :xfs:xfs_dir2_leaf_getdents+0x354/0x5ec [] :xfs:xfs_dir2_leaf_getdents+0x354/0x5ec [] :xfs:xfs_hack_filldir+0x0/0x5b [] :xfs:xfs_hack_filldir+0x0/0x5b [] :xfs:xfs_readdir+0xa7/0xb6 [] :xfs:xfs_file_readdir+0xff/0x14c [] filldir+0x0/0xb7 [] filldir+0x0/0xb7 [] vfs_readdir+0x77/0xa9 [] sys_getdents+0x75/0xbd [] tracesys+0x47/0xb6 [] tracesys+0xab/0xb6 00000000: ea 4c ea e1 7a f1 2f 88 13 f9 a5 24 08 38 31 4e =EAL=EA=E1z=F1/.= .=F9=A5$.81N Filesystem "md0": XFS internal error xfs_da_do_buf(2) at line 2112 of file = fs/xfs/xfs_da_btree.c. Caller 0xffffffff8834482e Call Trace: [] :xfs:xfs_da_do_buf+0x503/0x5b1 [] :xfs:xfs_da_read_buf+0x16/0x1b [] _atomic_dec_and_lock+0x39/0x57 [] :xfs:xfs_da_read_buf+0x16/0x1b [] :xfs:xfs_dir2_leaf_getdents+0x354/0x5ec [] :xfs:xfs_dir2_leaf_getdents+0x354/0x5ec [] :xfs:xfs_hack_filldir+0x0/0x5b [] :xfs:xfs_hack_filldir+0x0/0x5b [] :xfs:xfs_readdir+0xa7/0xb6 [] :xfs:xfs_file_readdir+0xff/0x14c [] filldir+0x0/0xb7 [] filldir+0x0/0xb7 [] vfs_readdir+0x77/0xa9 [] sys_getdents+0x75/0xbd [] tracesys+0x47/0xb6 [] tracesys+0xab/0xb6 please advise. tnx. From sandeen@sandeen.net Sun May 9 20:07:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4A177Od241774 for ; Sun, 9 May 2010 20:07:08 -0500 X-ASG-Debug-ID: 1273453758-14e800650000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BFC8D325836 for ; Sun, 9 May 2010 18:09:19 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id MgM5jsxlbWQGmSON for ; Sun, 09 May 2010 18:09:19 -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 mail.sandeen.net (Postfix) with ESMTP id 9D82BA7B615; Sun, 9 May 2010 20:09:18 -0500 (CDT) Message-ID: <4BE75CBC.2000600@sandeen.net> Date: Sun, 09 May 2010 20:09:16 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Stan Hoeppner CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: failed to read root inode Subject: Re: failed to read root inode References: <4BE55A63.8070203@purplehaze.ch> <4BE5EB5D.5020702@hardwarefreak.com> <20100509152818.7481c1e1@galadriel.home> <4BE6CC83.5070305@hardwarefreak.com> In-Reply-To: <4BE6CC83.5070305@hardwarefreak.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1273453759 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29490 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Stan Hoeppner wrote: > Emmanuel Florac put forth on 5/9/2010 8:28 AM: >> Le Sat, 08 May 2010 17:53:17 -0500 vous écriviez: >> >>> Why did the "crash" of a single disk in a hardware RAID6 cause a >>> kernel freeze? What is your definition of "disk crash"? A single >>> physical disk failure should not have caused this under any >>> circumstances. The RAID card should have handled a single disk >>> failure transparently. >> The RAID array may go west if the disk isn't properly set up, >> particularly if it's a desktop-class drive. > > By design, a RAID6 pack should be able to handle two simultaneous drive > failures before the array goes offline. According to the OP's post he lost > one drive. Unless it's a really crappy RAID card or if he's using a bunch > of dissimilar drives causing problems with the entire array, he shouldn't > have had a problem. > > This is why I'm digging for more information. The information he presented > here doesn't really make any sense. One physical disk failure _shouldn't_ > have caused the problems he's experiencing. I don't think we got the full > story. I tend to agree, something is missing here, which means my suggestions for repair will be unlikely to be terribly successful; I think more is wrong than we know... -Eric From SRS0+4l5F+69+fromorbit.com=david@internode.on.net Sun May 9 21:18:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=BAYES_00,FAKE_REPLY_C autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4A2ISRk243329 for ; Sun, 9 May 2010 21:18:29 -0500 X-ASG-Debug-ID: 1273458039-748201ab0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C4936139AFBF for ; Sun, 9 May 2010 19:20:39 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id cwIPGakiJVTvwfFx for ; Sun, 09 May 2010 19:20:39 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23540668-1927428 for multiple; Mon, 10 May 2010 11:50:35 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OBIbi-00021a-0K; Mon, 10 May 2010 12:20:34 +1000 Date: Mon, 10 May 2010 12:20:33 +1000 From: Dave Chinner To: Rainer Fuegenstein Cc: xfs@oss.sgi.com, linux-raid@vger.kernel.org X-ASG-Orig-Subj: Re: xfs and raid5 - "Structure needs cleaning for directory open" Subject: Re: xfs and raid5 - "Structure needs cleaning for directory open" Message-ID: <20100510022033.GB7165@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1743435018.20100510013511@kaneda.iguw.tuwien.ac.at> <462402327.20100509210710@kaneda.iguw.tuwien.ac.at> <1816344475.20100509204800@kaneda.iguw.tuwien.ac.at> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1273458040 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.2, rules version 3.2.2.29496 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, May 09, 2010 at 08:48:00PM +0200, Rainer Fuegenstein wrote: > > today in the morning some daemon processes terminated because of > errors in the xfs file system on top of a software raid5, consisting > of 4*1.5TB WD caviar green SATA disks. Reminds me of a recent(-ish) md/dm readahead cancellation fix - that would fit the symptoms of (btree corruption showing up under heavy IO load but no corruption on disk. However, I can't seem to find any references to it at the moment (can't remember the bug title), but perhaps your distro doesn't have the fix in it? Cheers, Dave. -- Dave Chinner david@fromorbit.com From goodwinos@gmail.com Mon May 10 01:51:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4A6plnp252709 for ; Mon, 10 May 2010 01:51:47 -0500 X-ASG-Debug-ID: 1273474455-5bf700590000-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 93ACE97E7CA for ; Sun, 9 May 2010 23:54:16 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id heFQw9eDfrPRgMHg for ; Sun, 09 May 2010 23:54:16 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o4A6rvCr026731 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 10 May 2010 02:53:58 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o4A6rvK9019897 for ; Mon, 10 May 2010 02:53:57 -0400 Received: from [10.64.48.185] (vpn1-48-185.bne.redhat.com [10.64.48.185]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id o4A6rtBq010916 for ; Mon, 10 May 2010 02:53:56 -0400 Message-ID: <4BE7AD82.90300@gmail.com> Date: Mon, 10 May 2010 16:53:54 +1000 From: Mark Goodwin User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100301 Fedora/3.0.3-1.fc12 Thunderbird/3.0.3 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs and raid5 - "Structure needs cleaning for directory open" Subject: Re: xfs and raid5 - "Structure needs cleaning for directory open" References: <20100510022033.GB7165@dastard> In-Reply-To: <20100510022033.GB7165@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.17 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1273474457 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 05/10/2010 12:20 PM, Dave Chinner wrote: > On Sun, May 09, 2010 at 08:48:00PM +0200, Rainer Fuegenstein wrote: >> >> today in the morning some daemon processes terminated because of >> errors in the xfs file system on top of a software raid5, consisting >> of 4*1.5TB WD caviar green SATA disks. > > Reminds me of a recent(-ish) md/dm readahead cancellation fix - that > would fit the symptoms of (btree corruption showing up under heavy IO > load but no corruption on disk. However, I can't seem to find any > references to it at the moment (can't remember the bug title), but > perhaps your distro doesn't have the fix in it? If it's the bug that Dave's thinking of, it's an issue with md error handling and the BIO_UPTODATE flag, see : http://www.mail-archive.com/linux-raid@vger.kernel.org/msg06628.html For RHEL, this is addressed in Red Hat BZ 512552 https://bugzilla.redhat.com/show_bug.cgi?id=512552 upstream commit c2b00852fbae4f8c45c2651530ded3bd01bde814 Cheers -- Mark From kb@sysmikro.com.pl Mon May 10 02:09:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4A79sth253109 for ; Mon, 10 May 2010 02:09:55 -0500 X-ASG-Debug-ID: 1273475525-034400a80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from v007470.home.net.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 58035139BD1F for ; Mon, 10 May 2010 00:12:05 -0700 (PDT) Received: from v007470.home.net.pl (v007470.home.net.pl [212.85.125.104]) by cuda.sgi.com with SMTP id GTQQX9oGsijPrwHD for ; Mon, 10 May 2010 00:12:05 -0700 (PDT) Received: from chello089072102205.chello.pl [89.72.102.205] (HELO linux2g2g.site) by sysmikro.home.pl [212.85.125.104] with SMTP (IdeaSmtpServer v0.70) id 2d4dc24a52072b1d; Mon, 10 May 2010 09:12:03 +0200 From: Krzysztof =?utf-8?q?B=C5=82aszkowski?= Organization: Systemy mikroprocesorowe To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate Date: Mon, 10 May 2010 09:11:52 +0200 User-Agent: KMail/1.9.5 Cc: Eric Sandeen References: <201005071022.37863.kb@sysmikro.com.pl> <4BE43F34.40309@sandeen.net> <4BE44587.6090603@sandeen.net> In-Reply-To: <4BE44587.6090603@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Message-Id: <201005100911.52491.kb@sysmikro.com.pl> X-Barracuda-Connect: v007470.home.net.pl[212.85.125.104] X-Barracuda-Start-Time: 1273475526 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.2, rules version 3.2.2.29512 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Friday 07 May 2010 18:53, Eric Sandeen wrote: > Eric Sandeen wrote: > > Krzysztof B=C5=82aszkowski wrote: > >> Hello, > >> > >> I use this to preallocate large space but found an issue. > >> Posix_fallocate works right with sizes like 100G, 1T and even 10T on > >> some boxes (on some other can fail after e.g. 7T threshold) but if i > >> tried e.g. 16T the user space process would be "R"unning forever and it > >> is not interruptible. Furthermore some other not related processes like > >> sshd, bash enter D state. There is nothing in kernel log. > > Oh, one thing you should know is that depending on your version of glibc, > posix_fallocate may be writing 0s and not using preallocation calls. I am absolutely sure that recent libc doesn't emulate this syscall=20 > > Do you know which yours is using? syscall (libc 2.9) > strace should tell you on a small=20 > file test. > > Anyway, I am seeing things get stuck around 8T it seems... yes, i noticed that sometimes the threshold point is higher. > > # touch /mnt/test/bigfile > # xfs_io -c "resvsp 0 16t" /mnt/test/bigfile > > ... wait ... in other window ... > > # du -hc /mnt/test/bigfile > 8.0G /mnt/test/bigfile > 8.0G total > > # echo t > /proc/sysrq-trigger It was good idea to use sysrq. I didn't think about this but rather focused= on=20 ftrace and how to analyse these megs of data > # dmesg | grep -A20 xfs_io > xfs_io R running task 3576 29444 29362 0x00000006 > ffff8809cfbb4920 ffffffff81478d9f ffffffffa032d3c5 0000000000000246 > ffff8809cfbb4920 ffffffff814788bc 0000000000000000 ffffffff81ba3510 > ffff8809d3429a68 ffffffffa032b60f ffff8809d3429aa8 000000000000001e > Call Trace: > [] ? __mutex_lock_common+0x36d/0x392 > [] ? xfs_icsb_modify_counters+0x17f/0x1ac [xfs] > [] ? xfs_icsb_unlock_all_counters+0x4d/0x60 [xfs] > [] ? xfs_icsb_disable_counter+0x8c/0x95 [xfs] > [] ? mutex_lock_nested+0x3e/0x43 > [] ? xfs_icsb_modify_counters+0x18d/0x1ac [xfs] > [] ? xfs_mod_incore_sb+0x29/0x6e [xfs] > [] ? _xfs_trans_alloc+0x27/0x61 [xfs] > [] ? xfs_trans_reserve+0x6c/0x19e [xfs] > [] ? up_write+0x2b/0x32 > [] ? xfs_alloc_file_space+0x163/0x306 [xfs] > [] ? sched_clock_cpu+0xc3/0xce > [] ? xfs_change_file_space+0x12a/0x2b8 [xfs] > [] ? down_write_nested+0x80/0x8b > [] ? xfs_ilock+0x30/0xb4 [xfs] > [] ? xfs_vn_fallocate+0x80/0xf4 [xfs] > -- > R xfs_io 29444 86014624.786617 162 120 86014624.786617 = =20 > 137655.161327 408.979977 / > > # uname -r > 2.6.34-0.4.rc0.git2.fc14.x86_64 > > I'll look into it. We stick with 2.6.31.5 which seems to be good for us. We do not change kern= els=20 easily, as soon as higher revision arrives because it doesn't make sense fr= om=20 stability point of view. We have seen too many times regression bugs so if = we=20 are confident with some revision then there is no point to change this. Krzysztof B=C5=82aszkowski > > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From rfu@kaneda.iguw.tuwien.ac.at Mon May 10 05:19:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AAJtZn257018 for ; Mon, 10 May 2010 05:19:55 -0500 X-ASG-Debug-ID: 1273486925-2f64029d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx03.kabsi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 04740327D0F for ; Mon, 10 May 2010 03:22:05 -0700 (PDT) Received: from mx03.kabsi.at (mx03.kabsi.at [195.202.128.130]) by cuda.sgi.com with ESMTP id 3DTmcBhVldyyL8XV for ; Mon, 10 May 2010 03:22:05 -0700 (PDT) Received: from 192.168.5.201 (h081217058120.dyn.cm.kabsi.at [81.217.58.120]) by mx03.kabsi.at (8.13.8/8.13.8) with ESMTP id o4AAM2Ew001600; Mon, 10 May 2010 12:22:03 +0200 Date: Mon, 10 May 2010 12:22:03 +0200 From: Rainer Fuegenstein X-Mailer: The Bat! (v1.62r) Business Reply-To: Rainer Fuegenstein Organization: Vienna University of Technology X-Priority: 3 (Normal) Message-ID: <23944308.20100510122203@kaneda.iguw.tuwien.ac.at> To: Mark Goodwin CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re[2]: xfs and raid5 - "Structure needs cleaning for directory open" Subject: Re[2]: xfs and raid5 - "Structure needs cleaning for directory open" In-Reply-To: <4BE7AD82.90300@gmail.com> References: <20100510022033.GB7165@dastard> <4BE7AD82.90300@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mx03.kabsi.at[195.202.128.130] X-Barracuda-Start-Time: 1273486927 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.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=BSF_SC0_SA085b X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29524 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.40 BSF_SC0_SA085b Custom Rule SA085b X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean mark, yes, thank you, that looks very much like it. CentOS is still at 5.4, version 5.5 is long overdue :-( tnx & cu MG> On 05/10/2010 12:20 PM, Dave Chinner wrote: >> On Sun, May 09, 2010 at 08:48:00PM +0200, Rainer Fuegenstein wrote: >>> >>> today in the morning some daemon processes terminated because of >>> errors in the xfs file system on top of a software raid5, consisting >>> of 4*1.5TB WD caviar green SATA disks. >> >> Reminds me of a recent(-ish) md/dm readahead cancellation fix - that >> would fit the symptoms of (btree corruption showing up under heavy IO >> load but no corruption on disk. However, I can't seem to find any >> references to it at the moment (can't remember the bug title), but >> perhaps your distro doesn't have the fix in it? MG> If it's the bug that Dave's thinking of, it's an issue with md MG> error handling and the BIO_UPTODATE flag, see : MG> http://www.mail-archive.com/linux-raid@vger.kernel.org/msg06628.html MG> For RHEL, this is addressed in Red Hat BZ 512552 MG> https://bugzilla.redhat.com/show_bug.cgi?id=512552 MG> upstream commit c2b00852fbae4f8c45c2651530ded3bd01bde814 MG> Cheers MG> -- Mark MG> _______________________________________________ MG> xfs mailing list MG> xfs@oss.sgi.com MG> http://oss.sgi.com/mailman/listinfo/xfs ------------------------------------------------------------------------------ Unix gives you just enough rope to hang yourself -- and then a couple of more feet, just to be sure. (Eric Allman) ------------------------------------------------------------------------------ From BATV+c30e087d29709dd2b847+2451+infradead.org+hch@bombadil.srs.infradead.org Mon May 10 06:42:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4ABgOiL258900 for ; Mon, 10 May 2010 06:42:25 -0500 X-ASG-Debug-ID: 1273491895-7f5b00840000-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 32512983416 for ; Mon, 10 May 2010 04:44:56 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id f2KOfdkhLXGFHtw1 for ; Mon, 10 May 2010 04:44:56 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OBRPX-0002jp-J2; Mon, 10 May 2010 11:44:35 +0000 Date: Mon, 10 May 2010 07:44:35 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/12] xfs: Introduce delayed logging core code Subject: Re: [PATCH 09/12] xfs: Introduce delayed logging core code Message-ID: <20100510114435.GA27624@infradead.org> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> <1273210860-23414-10-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273210860-23414-10-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273491896 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good to me, Reviewed-by: Christoph Hellwig A couple comments below anyway: > +int > +xlog_cil_init_post_recovery( > + struct log *log) > +{ > + if (!log->l_cilp) > + return 0; > + > + log->l_cilp->xc_ctx->ticket = xlog_cil_ticket_alloc(log); > + log->l_cilp->xc_ctx->sequence = 1; > + log->l_cilp->xc_ctx->commit_lsn = xlog_assign_lsn(log->l_curr_cycle, > + log->l_curr_block); > + return 0; > +} This should return void. > +static void > +xlog_cil_insert( > + struct log *log, > + struct xlog_ticket *ticket, > + struct xfs_log_item *item, > + struct xfs_log_vec *lv) > +{ > + struct xfs_cil *cil = log->l_cilp; > + struct xfs_log_vec *old = lv->lv_item->li_lv; > + struct xfs_cil_ctx *ctx = cil->xc_ctx; > + int len; > + int diff_iovecs; > + int iclog_space; > + > + if (old) { > + /* existing lv on log item, space used is a delta */ > + ASSERT(!list_empty(&item->li_cil)); > + ASSERT(old->lv_buf && old->lv_buf_len && old->lv_niovecs); > + > + len = lv->lv_buf_len - old->lv_buf_len; > + diff_iovecs = lv->lv_niovecs - old->lv_niovecs; Add asserts that len and diff_iovecs aren't negative here? > + for (lv = log_vector; lv; lv = lv->lv_next) { > + void *ptr; > + int index; > + int offset = 0; > + int len = 0; > + > + for (index = 0; index < lv->lv_niovecs; index++) > + len += lv->lv_iovecp[index].i_len; > + > + lv->lv_buf_len = len; > + lv->lv_buf = kmem_zalloc(lv->lv_buf_len, KM_SLEEP|KM_NOFS); > + ptr = lv->lv_buf; > + > + for (index = 0; index < lv->lv_niovecs; index++) { > + struct xfs_log_iovec *vec = &lv->lv_iovecp[index]; > + > + memcpy(ptr, vec->i_addr, vec->i_len); > + vec->i_addr = ptr; > + xlog_write_adv_cnt(&ptr, &len, &offset, vec->i_len); > + } > + ASSERT(len == 0); > + > + xlog_cil_insert(log, ticket, lv->lv_item, lv); The use of xlog_write_adv_cnt doesn't seem quite optimal to me. The offset variable is entirely unused, and len is only used for an asswer that could easily be reformulated as ASSERT(ptr == lv->lv_buf + len); if we replace the xlog_write_adv_cnt with a simple ptr += vec->i_len; > +/* > + * Push the Committed Item List to the log. If the push_now flag is not set, > + * then it is a background flush and so we can chose to ignore it. > + */ > +int > +xlog_cil_push( > + struct log *log, > + int push_now) > +{ > + struct xfs_cil *cil = log->l_cilp; The variables don't line up here. There's another instance of that in xlog_cil_insert, btw. > + /* check if we've anything to push */ > + if (list_empty(&cil->xc_cil)) { > + up_write(&cil->xc_ctx_lock); > + xfs_log_ticket_put(new_ctx->ticket); > + kmem_free(new_ctx); > + return 0; > + } Please add a out_skip label for this cleanup code, as it would be duplicated by the background flushing check added in a later patch. > + new_lv = kmem_zalloc(sizeof(*new_lv) + > + lidp->lid_size * sizeof(struct xfs_log_iovec), > + KM_SLEEP); > + > + /* The allocated iovec region lies beyond the log vector. */ > + new_lv->lv_iovecp = (struct xfs_log_iovec *)&new_lv[1]; > + if (!ret_lv) > + ret_lv = new_lv; > + else > + lv->lv_next = new_lv; > + lv = new_lv; I'd suggest already setting up lv->lv_niovecs and lv->lv_item here instead of in xfs_trans_fill_log_vecs. That way xfs_trans_fill_log_vecs can be simplified to: STATIC void xfs_trans_fill_log_vecs( struct xfs_trans *tp, struct xfs_log_vec *log_vector) { struct xfs_log_vec *lv; for (lv = log_vector; lv = lv->lv_next; lv) IOP_FORMAT(lidp->lid_item, lv->lv_iovecp); } Or just inlined into the caller or even xfs_log_commit_cil given how simple it is now. Moving it to xfs_log_commit_cil would also help avoiding the locking imbalance where xfs_log_commit_cil is called with xc_ctx_lock held but returns without it after the last patch in the series. That again might allow merging the IOP_FORMAT loop into xlog_cil_format_items. Btw, I wonder if xfs_log_commit_cil should simply move to xfs_trans.c? That would avoid having to export xfs_trans_unreserve_and_mod_sb, xfs_trans_free_items and xfs_trans_free from there, and only require exporting xlog_cil_format_items (if we didn't move that one as well, then xlog_cil_insert), while keeping things a lot more symmetric with the traditional commit path. From BATV+c30e087d29709dd2b847+2451+infradead.org+hch@bombadil.srs.infradead.org Mon May 10 06:42:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4ABglaw258917 for ; Mon, 10 May 2010 06:42:48 -0500 X-ASG-Debug-ID: 1273491911-35e302a60000-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 5316E97CD24 for ; Mon, 10 May 2010 04:45:12 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id q6RUllitjLyziCDm for ; Mon, 10 May 2010 04:45:12 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OBRPp-0002kO-3C; Mon, 10 May 2010 11:44:53 +0000 Date: Mon, 10 May 2010 07:44:53 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 10/12] xfs: forced unmounts need to push the CIL Subject: Re: [PATCH 10/12] xfs: forced unmounts need to push the CIL Message-ID: <20100510114453.GB27624@infradead.org> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> <1273210860-23414-11-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273210860-23414-11-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273491912 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 07, 2010 at 03:40:58PM +1000, Dave Chinner wrote: > From: Dave Chinner > > If the filesystem is being shut down and the there is no log error, > the current code forces out the current log buffers. This code now needs > to push the CIL before it forces out the log buffers to acheive the same > result. Looks good, Reviewed-by: Christoph Hellwig From BATV+c30e087d29709dd2b847+2451+infradead.org+hch@bombadil.srs.infradead.org Mon May 10 06:43:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4ABhjWe258989 for ; Mon, 10 May 2010 06:43:45 -0500 X-ASG-Debug-ID: 1273491976-7f6500890000-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 CB92E97CD39 for ; Mon, 10 May 2010 04:46:16 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id lVwlGuxR7LkxLAkX for ; Mon, 10 May 2010 04:46:16 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OBRQr-0003KX-Iw; Mon, 10 May 2010 11:45:57 +0000 Date: Mon, 10 May 2010 07:45:57 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 11/12] xfs: enable background pushing of the CIL Subject: Re: [PATCH 11/12] xfs: enable background pushing of the CIL Message-ID: <20100510114557.GC27624@infradead.org> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> <1273210860-23414-12-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273210860-23414-12-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273491976 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 07, 2010 at 03:40:59PM +1000, Dave Chinner wrote: > From: Dave Chinner > > If we let the CIL grow without bound, it will grow large enough to violate > recovery constraints (must be at least one complete transaction in the log at > all times) or take forever to write out through the log buffers. Hence we need > a check during asynchronous transactions as to whether the CIL needs to be > pushed. > > We track the amount of log space the CIL consumes, so it is relatively simple > to limit it on a pure size basis. Make the limit the minimum of just under half > the log size (recovery constraint) or 8MB of log space (which is an awful lot > of metadata). Looks good except for the use of a cleanup label in xlog_cil_push mention in the review of the main patch. Reviewed-by: Christoph Hellwig From SRS0+vHgI+69+fromorbit.com=david@internode.on.net Mon May 10 07:14:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4ACEMi8260162 for ; Mon, 10 May 2010 07:14:22 -0500 X-ASG-Debug-ID: 1273493791-307201150000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0F34B1DE9E0C for ; Mon, 10 May 2010 05:16:32 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id 0H0c6QlW5nM5uLA6 for ; Mon, 10 May 2010 05:16:32 -0700 (PDT) Received: from dastard (unverified [121.45.169.108]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23756651-1927428 for multiple; Mon, 10 May 2010 21:46:31 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OBRuP-0002c5-0s; Mon, 10 May 2010 22:16:29 +1000 Date: Mon, 10 May 2010 22:16:28 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/12] xfs: Introduce delayed logging core code Subject: Re: [PATCH 09/12] xfs: Introduce delayed logging core code Message-ID: <20100510121628.GD7165@dastard> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> <1273210860-23414-10-git-send-email-david@fromorbit.com> <20100510114435.GA27624@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100510114435.GA27624@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1273493794 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.2, rules version 3.2.2.29529 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 10, 2010 at 07:44:35AM -0400, Christoph Hellwig wrote: > Looks good to me, > > > Reviewed-by: Christoph Hellwig > > A couple comments below anyway: > > > +int > > +xlog_cil_init_post_recovery( > > + struct log *log) > > +{ > > + if (!log->l_cilp) > > + return 0; > > + > > + log->l_cilp->xc_ctx->ticket = xlog_cil_ticket_alloc(log); > > + log->l_cilp->xc_ctx->sequence = 1; > > + log->l_cilp->xc_ctx->commit_lsn = xlog_assign_lsn(log->l_curr_cycle, > > + log->l_curr_block); > > + return 0; > > +} > > This should return void. OK. > > +static void > > +xlog_cil_insert( > > + struct log *log, > > + struct xlog_ticket *ticket, > > + struct xfs_log_item *item, > > + struct xfs_log_vec *lv) > > +{ > > + struct xfs_cil *cil = log->l_cilp; > > + struct xfs_log_vec *old = lv->lv_item->li_lv; > > + struct xfs_cil_ctx *ctx = cil->xc_ctx; > > + int len; > > + int diff_iovecs; > > + int iclog_space; > > + > > + if (old) { > > + /* existing lv on log item, space used is a delta */ > > + ASSERT(!list_empty(&item->li_cil)); > > + ASSERT(old->lv_buf && old->lv_buf_len && old->lv_niovecs); > > + > > + len = lv->lv_buf_len - old->lv_buf_len; > > + diff_iovecs = lv->lv_niovecs - old->lv_niovecs; > > Add asserts that len and diff_iovecs aren't negative here? Actually, they can be negative here - a previously logged buffer that is now stale will go from ((N dirty regions * 128 bytes) + format header) to (zero dirty regions + format header), and effectively free up space as what was previously logged is now ignored due to the XFS_BLI_CANCEL flag in the format header. > > + for (lv = log_vector; lv; lv = lv->lv_next) { > > + void *ptr; > > + int index; > > + int offset = 0; > > + int len = 0; > > + > > + for (index = 0; index < lv->lv_niovecs; index++) > > + len += lv->lv_iovecp[index].i_len; > > + > > + lv->lv_buf_len = len; > > + lv->lv_buf = kmem_zalloc(lv->lv_buf_len, KM_SLEEP|KM_NOFS); > > + ptr = lv->lv_buf; > > + > > + for (index = 0; index < lv->lv_niovecs; index++) { > > + struct xfs_log_iovec *vec = &lv->lv_iovecp[index]; > > + > > + memcpy(ptr, vec->i_addr, vec->i_len); > > + vec->i_addr = ptr; > > + xlog_write_adv_cnt(&ptr, &len, &offset, vec->i_len); > > + } > > + ASSERT(len == 0); > > + > > + xlog_cil_insert(log, ticket, lv->lv_item, lv); > > The use of xlog_write_adv_cnt doesn't seem quite optimal to me. The > offset variable is entirely unused, and len is only used for an asswer > that could easily be reformulated as > > ASSERT(ptr == lv->lv_buf + len); > > if we replace the xlog_write_adv_cnt with a simple > > ptr += vec->i_len; Good idea - xlog_write_adv_cnt() was left over from the original code that was copied from the log code. > > > +/* > > + * Push the Committed Item List to the log. If the push_now flag is not set, > > + * then it is a background flush and so we can chose to ignore it. > > + */ > > +int > > +xlog_cil_push( > > + struct log *log, > > + int push_now) > > +{ > > + struct xfs_cil *cil = log->l_cilp; > > The variables don't line up here. There's another instance of that > in xlog_cil_insert, btw. Ok, will fix. > > > + /* check if we've anything to push */ > > + if (list_empty(&cil->xc_cil)) { > > + up_write(&cil->xc_ctx_lock); > > + xfs_log_ticket_put(new_ctx->ticket); > > + kmem_free(new_ctx); > > + return 0; > > + } > > Please add a out_skip label for this cleanup code, as it would be > duplicated by the background flushing check added in a later patch. OK. > > + new_lv = kmem_zalloc(sizeof(*new_lv) + > > + lidp->lid_size * sizeof(struct xfs_log_iovec), > > + KM_SLEEP); > > + > > + /* The allocated iovec region lies beyond the log vector. */ > > + new_lv->lv_iovecp = (struct xfs_log_iovec *)&new_lv[1]; > > + if (!ret_lv) > > + ret_lv = new_lv; > > + else > > + lv->lv_next = new_lv; > > + lv = new_lv; > > I'd suggest already setting up lv->lv_niovecs and lv->lv_item here > instead of in xfs_trans_fill_log_vecs. That way xfs_trans_fill_log_vecs > can be simplified to: > > STATIC void > xfs_trans_fill_log_vecs( > struct xfs_trans *tp, > struct xfs_log_vec *log_vector) > { > struct xfs_log_vec *lv; > > for (lv = log_vector; lv = lv->lv_next; lv) > IOP_FORMAT(lidp->lid_item, lv->lv_iovecp); > } > > Or just inlined into the caller or even xfs_log_commit_cil given how simple > it is now. Moving it to xfs_log_commit_cil would also help avoiding the > locking imbalance where xfs_log_commit_cil is called with xc_ctx_lock > held but returns without it after the last patch in the series. That > again might allow merging the IOP_FORMAT loop into xlog_cil_format_items. > > Btw, I wonder if xfs_log_commit_cil should simply move to xfs_trans.c? > That would avoid having to export xfs_trans_unreserve_and_mod_sb, > xfs_trans_free_items and xfs_trans_free from there, and only require > exporting xlog_cil_format_items (if we didn't move that one as well, > then xlog_cil_insert), while keeping things a lot more symmetric with > the traditional commit path. I did find it a bit hard trying to draw the line between the trans subsystem and the logging subsystem because of the interactions and the way they changed as I developed the code and fixed bugs. I'll have a closer look at what you are suggesting (it seems reasonable just from a quick scan) and see how much it cleans up. Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Mon May 10 09:04:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AE47oa004985 for ; Mon, 10 May 2010 09:04:07 -0500 X-ASG-Debug-ID: 1273500379-4d1d004e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 97E5D1DEA155 for ; Mon, 10 May 2010 07:06:19 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id lyFs2uyQ7BXQskFa for ; Mon, 10 May 2010 07:06:19 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id CD2AA6C24B for ; Mon, 10 May 2010 09:06:18 -0500 (CDT) Message-ID: <4BE81368.4030209@hardwarefreak.com> Date: Mon, 10 May 2010 09:08:40 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs and raid5 - "Structure needs cleaning for directory open" Subject: Re: xfs and raid5 - "Structure needs cleaning for directory open" References: <20100510022033.GB7165@dastard> <4BE7AD82.90300@gmail.com> <23944308.20100510122203@kaneda.iguw.tuwien.ac.at> In-Reply-To: <23944308.20100510122203@kaneda.iguw.tuwien.ac.at> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1273500379 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29537 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Rainer Fuegenstein put forth on 5/10/2010 5:22 AM: > mark, > > yes, thank you, that looks very much like it. CentOS is still at 5.4, > version 5.5 is long overdue :-( Hi Rainer, You don't have to wait for the next CentOS release. Just grab the source for the latest stable kernel from kernel.org and roll your own. I've been doing so for years with Debian stable in order to avoid problems such as this one you've run into (that and security holes being plugged). I'm running xfsprogs 2.9.8-1lenny1 that shipped with kernel 2.6.26 on top of kernel 2.6.32.9 and haven't had any problems. At least, none so far with mkfs.xfs, mount, xfs_db, or xfs_fsr. I've not had a need for xfs_check, xfs_repair, or other xfs utils. My point being that older xfs tools seem to work fine atop newer kernels. -- Stan From BATV+c30e087d29709dd2b847+2451+infradead.org+hch@bombadil.srs.infradead.org Mon May 10 09:06:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_22, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AE6CLc005138 for ; Mon, 10 May 2010 09:06:15 -0500 X-ASG-Debug-ID: 1273500523-769a00ae0000-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 A567BC7CDEB for ; Mon, 10 May 2010 07:08:43 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id rIKxfopqJkU0PNNN for ; Mon, 10 May 2010 07:08:43 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OBTeh-0004Jg-Ve for xfs@oss.sgi.com; Mon, 10 May 2010 14:08:24 +0000 Date: Mon, 10 May 2010 10:08:23 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/2] xfs: drop dmapi hooks Subject: [PATCH 1/2] xfs: drop dmapi hooks Message-ID: <20100510140823.GA16540@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273500524 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dmapi support was never merged upstream, but we still have a lot of hooks bloating XFS for it, all over the fast pathes of the filesystem. This patch drops over 700 lines of dmapi overhead. If we'll ever get HSM support in mainline at least the namespace events can be done much saner in the VFS instead of the individual filesystem, so it's not like this is much help for future work. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_file.c 2010-05-06 22:40:46.199253324 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-05-10 15:34:12.994263312 +0200 @@ -24,7 +24,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_trans.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" @@ -275,20 +274,6 @@ xfs_file_aio_read( mutex_lock(&inode->i_mutex); xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { - int dmflags = FILP_DELAY_FLAG(file) | DM_SEM_FLAG_RD(ioflags); - int iolock = XFS_IOLOCK_SHARED; - - ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, ip, iocb->ki_pos, size, - dmflags, &iolock); - if (ret) { - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - if (unlikely(ioflags & IO_ISDIRECT)) - mutex_unlock(&inode->i_mutex); - return ret; - } - } - if (unlikely(ioflags & IO_ISDIRECT)) { if (inode->i_mapping->nrpages) { ret = -xfs_flushinval_pages(ip, @@ -321,7 +306,6 @@ xfs_file_splice_read( unsigned int flags) { struct xfs_inode *ip = XFS_I(infilp->f_mapping->host); - struct xfs_mount *mp = ip->i_mount; int ioflags = 0; ssize_t ret; @@ -335,18 +319,6 @@ xfs_file_splice_read( xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { - int iolock = XFS_IOLOCK_SHARED; - int error; - - error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, *ppos, count, - FILP_DELAY_FLAG(infilp), &iolock); - if (error) { - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - return -error; - } - } - trace_xfs_file_splice_read(ip, count, *ppos, ioflags); ret = generic_file_splice_read(infilp, ppos, pipe, count, flags); @@ -367,7 +339,6 @@ xfs_file_splice_write( { struct inode *inode = outfilp->f_mapping->host; struct xfs_inode *ip = XFS_I(inode); - struct xfs_mount *mp = ip->i_mount; xfs_fsize_t isize, new_size; int ioflags = 0; ssize_t ret; @@ -382,18 +353,6 @@ xfs_file_splice_write( xfs_ilock(ip, XFS_IOLOCK_EXCL); - if (DM_EVENT_ENABLED(ip, DM_EVENT_WRITE) && !(ioflags & IO_INVIS)) { - int iolock = XFS_IOLOCK_EXCL; - int error; - - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, *ppos, count, - FILP_DELAY_FLAG(outfilp), &iolock); - if (error) { - xfs_iunlock(ip, XFS_IOLOCK_EXCL); - return -error; - } - } - new_size = *ppos + count; xfs_ilock(ip, XFS_ILOCK_EXCL); @@ -627,7 +586,6 @@ xfs_file_aio_write( int ioflags = 0; xfs_fsize_t isize, new_size; int iolock; - int eventsent = 0; size_t ocount = 0, count; int need_i_mutex; @@ -673,33 +631,6 @@ start: goto out_unlock_mutex; } - if ((DM_EVENT_ENABLED(ip, DM_EVENT_WRITE) && - !(ioflags & IO_INVIS) && !eventsent)) { - int dmflags = FILP_DELAY_FLAG(file); - - if (need_i_mutex) - dmflags |= DM_FLAGS_IMUX; - - xfs_iunlock(ip, XFS_ILOCK_EXCL); - error = XFS_SEND_DATA(ip->i_mount, DM_EVENT_WRITE, ip, - pos, count, dmflags, &iolock); - if (error) { - goto out_unlock_internal; - } - xfs_ilock(ip, XFS_ILOCK_EXCL); - eventsent = 1; - - /* - * The iolock was dropped and reacquired in XFS_SEND_DATA - * so we have to recheck the size when appending. - * We will only "goto start;" once, since having sent the - * event prevents another call to XFS_SEND_DATA, which is - * what allows the size to change in the first place. - */ - if ((file->f_flags & O_APPEND) && pos != ip->i_size) - goto start; - } - if (ioflags & IO_ISDIRECT) { xfs_buftarg_t *target = XFS_IS_REALTIME_INODE(ip) ? @@ -830,22 +761,6 @@ write_retry: xfs_iunlock(ip, XFS_ILOCK_EXCL); } - if (ret == -ENOSPC && - DM_EVENT_ENABLED(ip, DM_EVENT_NOSPACE) && !(ioflags & IO_INVIS)) { - xfs_iunlock(ip, iolock); - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); - error = XFS_SEND_NAMESP(ip->i_mount, DM_EVENT_NOSPACE, ip, - DM_RIGHT_NULL, ip, DM_RIGHT_NULL, NULL, NULL, - 0, 0, 0); /* Delay flag intentionally unused */ - if (need_i_mutex) - mutex_lock(&inode->i_mutex); - xfs_ilock(ip, iolock); - if (error) - goto out_unlock_internal; - goto start; - } - error = -ret; if (ret <= 0) goto out_unlock_internal; Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-10 15:34:13.003253883 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" @@ -1116,16 +1115,7 @@ xfs_ioctl_setattr( xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); - if (code) - return code; - - if (DM_EVENT_ENABLED(ip, DM_EVENT_ATTRIBUTE)) { - XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL, - NULL, DM_RIGHT_NULL, NULL, NULL, 0, 0, - (mask & FSX_NONBLOCK) ? DM_FLAGS_NDELAY : 0); - } - - return 0; + return code; error_return: xfs_qm_dqrele(udqp); Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2010-05-10 15:32:31.849003430 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-05-10 15:34:13.033254372 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" @@ -169,8 +168,7 @@ suffix_strtoul(char *s, char **endp, uns STATIC int xfs_parseargs( struct xfs_mount *mp, - char *options, - char **mtpt) + char *options) { struct super_block *sb = mp->m_super; char *this_char, *value, *eov; @@ -240,15 +238,10 @@ xfs_parseargs( if (!mp->m_logname) return ENOMEM; } else if (!strcmp(this_char, MNTOPT_MTPT)) { - if (!value || !*value) { - cmn_err(CE_WARN, - "XFS: %s option requires an argument", - this_char); - return EINVAL; - } - *mtpt = kstrndup(value, MAXNAMELEN, GFP_KERNEL); - if (!*mtpt) - return ENOMEM; + cmn_err(CE_WARN, + "XFS: %s option not allowed on this system", + this_char); + return EINVAL; } else if (!strcmp(this_char, MNTOPT_RTDEV)) { if (!value || !*value) { cmn_err(CE_WARN, @@ -420,12 +413,6 @@ xfs_parseargs( return EINVAL; } - if ((mp->m_flags & XFS_MOUNT_DMAPI) && (!*mtpt || *mtpt[0] == '\0')) { - printk("XFS: %s option needs the mount point option as well\n", - MNTOPT_DMAPI); - return EINVAL; - } - if ((dsunit && !dswidth) || (!dsunit && dswidth)) { cmn_err(CE_WARN, "XFS: sunit and swidth must be specified together"); @@ -1195,8 +1182,6 @@ xfs_fs_put_super( xfs_sync_attr(mp, 0); } - XFS_SEND_PREUNMOUNT(mp); - /* * Blow away any referenced inode in the filestreams cache. * This can and will cause log traffic as inodes go inactive @@ -1206,14 +1191,11 @@ xfs_fs_put_super( XFS_bflush(mp->m_ddev_targp); - XFS_SEND_UNMOUNT(mp); - xfs_unmountfs(mp); xfs_freesb(mp); xfs_inode_shrinker_unregister(mp); xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); - xfs_dmops_put(mp); xfs_free_fsname(mp); kfree(mp); } @@ -1531,7 +1513,6 @@ xfs_fs_fill_super( struct inode *root; struct xfs_mount *mp = NULL; int flags = 0, error = ENOMEM; - char *mtpt = NULL; mp = kzalloc(sizeof(struct xfs_mount), GFP_KERNEL); if (!mp) @@ -1547,7 +1528,7 @@ xfs_fs_fill_super( mp->m_super = sb; sb->s_fs_info = mp; - error = xfs_parseargs(mp, (char *)data, &mtpt); + error = xfs_parseargs(mp, (char *)data); if (error) goto out_free_fsname; @@ -1559,16 +1540,12 @@ xfs_fs_fill_super( #endif sb->s_op = &xfs_super_operations; - error = xfs_dmops_get(mp); - if (error) - goto out_free_fsname; - if (silent) flags |= XFS_MFSI_QUIET; error = xfs_open_devices(mp); if (error) - goto out_put_dmops; + goto out_free_fsname; if (xfs_icsb_init_counters(mp)) mp->m_flags |= XFS_MOUNT_NO_PERCPU_SB; @@ -1596,8 +1573,6 @@ xfs_fs_fill_super( if (error) goto out_filestream_unmount; - XFS_SEND_MOUNT(mp, DM_RIGHT_NULL, mtpt, mp->m_fsname); - sb->s_magic = XFS_SB_MAGIC; sb->s_blocksize = mp->m_sb.sb_blocksize; sb->s_blocksize_bits = ffs(sb->s_blocksize) - 1; @@ -1626,7 +1601,6 @@ xfs_fs_fill_super( xfs_inode_shrinker_register(mp); - kfree(mtpt); return 0; out_filestream_unmount: @@ -1636,11 +1610,8 @@ xfs_fs_fill_super( out_destroy_counters: xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); - out_put_dmops: - xfs_dmops_put(mp); out_free_fsname: xfs_free_fsname(mp); - kfree(mtpt); kfree(mp); out: return -error; Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-05-10 13:47:55.000000000 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2010-05-10 15:34:13.398004616 +0200 @@ -34,7 +34,6 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_ialloc.h" #include "xfs_itable.h" @@ -5605,28 +5604,6 @@ xfs_getbmap( prealloced = 0; fixlen = 1LL << 32; } else { - /* - * If the BMV_IF_NO_DMAPI_READ interface bit specified, do - * not generate a DMAPI read event. Otherwise, if the - * DM_EVENT_READ bit is set for the file, generate a read - * event in order that the DMAPI application may do its thing - * before we return the extents. Usually this means restoring - * user file data to regions of the file that look like holes. - * - * The "old behavior" (from XFS_IOC_GETBMAP) is to not specify - * BMV_IF_NO_DMAPI_READ so that read events are generated. - * If this were not true, callers of ioctl(XFS_IOC_GETBMAP) - * could misinterpret holes in a DMAPI file as true holes, - * when in fact they may represent offline user data. - */ - if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && - !(iflags & BMV_IF_NO_DMAPI_READ)) { - error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, - 0, 0, 0, NULL); - if (error) - return XFS_ERROR(error); - } - if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS && ip->i_d.di_format != XFS_DINODE_FMT_BTREE && ip->i_d.di_format != XFS_DINODE_FMT_LOCAL) Index: xfs/fs/xfs/xfs_rename.c =================================================================== --- xfs.orig/fs/xfs/xfs_rename.c 2010-05-06 22:40:46.374253953 +0200 +++ xfs/fs/xfs/xfs_rename.c 2010-05-10 15:34:13.319011950 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" @@ -119,18 +118,6 @@ xfs_rename( xfs_itrace_entry(src_dp); xfs_itrace_entry(target_dp); - if (DM_EVENT_ENABLED(src_dp, DM_EVENT_RENAME) || - DM_EVENT_ENABLED(target_dp, DM_EVENT_RENAME)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_RENAME, - src_dp, DM_RIGHT_NULL, - target_dp, DM_RIGHT_NULL, - src_name->name, target_name->name, - 0, 0, 0); - if (error) - return error; - } - /* Return through std_return after this point. */ - new_parent = (src_dp != target_dp); src_is_directory = ((src_ip->i_d.di_mode & S_IFMT) == S_IFDIR); @@ -369,26 +356,13 @@ xfs_rename( * trans_commit will unlock src_ip, target_ip & decrement * the vnode references. */ - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - - /* Fall through to std_return with error = 0 or errno from - * xfs_trans_commit */ -std_return: - if (DM_EVENT_ENABLED(src_dp, DM_EVENT_POSTRENAME) || - DM_EVENT_ENABLED(target_dp, DM_EVENT_POSTRENAME)) { - (void) XFS_SEND_NAMESP (mp, DM_EVENT_POSTRENAME, - src_dp, DM_RIGHT_NULL, - target_dp, DM_RIGHT_NULL, - src_name->name, target_name->name, - 0, error, 0); - } - return error; + return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); abort_return: cancel_flags |= XFS_TRANS_ABORT; - /* FALLTHROUGH */ error_return: xfs_bmap_cancel(&free_list); xfs_trans_cancel(tp, cancel_flags); - goto std_return; + std_return: + return error; } Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c 2010-05-06 22:40:46.394254232 +0200 +++ xfs/fs/xfs/xfs_vnodeops.c 2010-05-10 15:34:13.389003988 +0200 @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" @@ -143,16 +142,6 @@ xfs_setattr( goto error_return; } } else { - if (DM_EVENT_ENABLED(ip, DM_EVENT_TRUNCATE) && - !(flags & XFS_ATTR_DMI)) { - int dmflags = AT_DELAY_FLAG(flags) | DM_SEM_FLAG_WR; - code = XFS_SEND_DATA(mp, DM_EVENT_TRUNCATE, ip, - iattr->ia_size, 0, dmflags, NULL); - if (code) { - lock_flags = 0; - goto error_return; - } - } if (need_iolock) lock_flags |= XFS_IOLOCK_EXCL; } @@ -470,17 +459,10 @@ xfs_setattr( return XFS_ERROR(code); } - if (DM_EVENT_ENABLED(ip, DM_EVENT_ATTRIBUTE) && - !(flags & XFS_ATTR_DMI)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL, - NULL, DM_RIGHT_NULL, NULL, NULL, - 0, 0, AT_DELAY_FLAG(flags)); - } return 0; abort_return: commit_flags |= XFS_TRANS_ABORT; - /* FALLTHROUGH */ error_return: xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); @@ -1060,9 +1042,6 @@ xfs_inactive( mp = ip->i_mount; - if (ip->i_d.di_nlink == 0 && DM_EVENT_ENABLED(ip, DM_EVENT_DESTROY)) - XFS_SEND_DESTROY(mp, ip, DM_RIGHT_NULL); - error = 0; /* If this is a read-only mount, don't do this (would generate I/O) */ @@ -1314,16 +1293,6 @@ xfs_create( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - if (DM_EVENT_ENABLED(dp, DM_EVENT_CREATE)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE, - dp, DM_RIGHT_NULL, NULL, - DM_RIGHT_NULL, name->name, NULL, - mode, 0, 0); - - if (error) - return error; - } - if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) prid = dp->i_d.di_projid; else @@ -1487,16 +1456,7 @@ xfs_create( xfs_qm_dqrele(gdqp); *ipp = ip; - - /* Fallthrough to std_return with error = 0 */ - std_return: - if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTCREATE)) { - XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE, dp, DM_RIGHT_NULL, - ip, DM_RIGHT_NULL, name->name, NULL, mode, - error, 0); - } - - return error; + return 0; out_bmap_cancel: xfs_bmap_cancel(&free_list); @@ -1510,8 +1470,8 @@ xfs_create( if (unlock_dp_on_error) xfs_iunlock(dp, XFS_ILOCK_EXCL); - - goto std_return; + std_return: + return error; out_abort_rele: /* @@ -1732,14 +1692,6 @@ xfs_remove( 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, - ip->i_d.di_mode, 0, 0); - if (error) - return error; - } - error = xfs_qm_dqattach(dp, 0); if (error) goto std_return; @@ -1877,21 +1829,15 @@ xfs_remove( if (!is_dir && link_zero && xfs_inode_is_filestream(ip)) xfs_filestream_deassociate(ip); - std_return: - if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTREMOVE)) { - 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; + return 0; 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; + std_return: + return error; } int @@ -1917,17 +1863,6 @@ xfs_link( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - if (DM_EVENT_ENABLED(tdp, DM_EVENT_LINK)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_LINK, - tdp, DM_RIGHT_NULL, - sip, DM_RIGHT_NULL, - target_name->name, NULL, 0, 0, 0); - if (error) - return error; - } - - /* Return through std_return after this point. */ - error = xfs_qm_dqattach(sip, 0); if (error) goto std_return; @@ -2014,27 +1949,14 @@ xfs_link( goto abort_return; } - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - if (error) - goto std_return; - - /* Fall through to std_return with error = 0. */ -std_return: - if (DM_EVENT_ENABLED(sip, DM_EVENT_POSTLINK)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTLINK, - tdp, DM_RIGHT_NULL, - sip, DM_RIGHT_NULL, - target_name->name, NULL, 0, error, 0); - } - return error; + return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); abort_return: cancel_flags |= XFS_TRANS_ABORT; - /* FALLTHROUGH */ - error_return: xfs_trans_cancel(tp, cancel_flags); - goto std_return; + std_return: + return error; } int @@ -2086,17 +2008,6 @@ xfs_symlink( if (pathlen >= MAXPATHLEN) /* total string too long */ return XFS_ERROR(ENAMETOOLONG); - if (DM_EVENT_ENABLED(dp, DM_EVENT_SYMLINK)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_SYMLINK, dp, - DM_RIGHT_NULL, NULL, DM_RIGHT_NULL, - link_name->name, - (unsigned char *)target_path, 0, 0, 0); - if (error) - return error; - } - - /* Return through std_return after this point. */ - udqp = gdqp = NULL; if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) prid = dp->i_d.di_projid; @@ -2278,21 +2189,8 @@ xfs_symlink( xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); - /* Fall through to std_return with error = 0 or errno from - * xfs_trans_commit */ -std_return: - if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTSYMLINK)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTSYMLINK, - dp, DM_RIGHT_NULL, - error ? NULL : ip, - DM_RIGHT_NULL, link_name->name, - (unsigned char *)target_path, - 0, error, 0); - } - - if (!error) - *ipp = ip; - return error; + *ipp = ip; + return 0; error2: IRELE(ip); @@ -2306,8 +2204,8 @@ std_return: if (unlock_dp_on_error) xfs_iunlock(dp, XFS_ILOCK_EXCL); - - goto std_return; + std_return: + return error; } int @@ -2412,25 +2310,9 @@ xfs_alloc_file_space( startoffset_fsb = XFS_B_TO_FSBT(mp, offset); allocatesize_fsb = XFS_B_TO_FSB(mp, count); - /* Generate a DMAPI event if needed. */ - if (alloc_type != 0 && offset < ip->i_size && - (attr_flags & XFS_ATTR_DMI) == 0 && - DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) { - xfs_off_t end_dmi_offset; - - end_dmi_offset = offset+len; - if (end_dmi_offset > ip->i_size) - end_dmi_offset = ip->i_size; - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, offset, - end_dmi_offset - offset, 0, NULL); - if (error) - return error; - } - /* * Allocate file space until done or until there is an error */ -retry: while (allocatesize_fsb && !error) { xfs_fileoff_t s, e; @@ -2527,17 +2409,6 @@ retry: startoffset_fsb += allocated_fsb; allocatesize_fsb -= allocated_fsb; } -dmapi_enospc_check: - if (error == ENOSPC && (attr_flags & XFS_ATTR_DMI) == 0 && - DM_EVENT_ENABLED(ip, DM_EVENT_NOSPACE)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_NOSPACE, - ip, DM_RIGHT_NULL, - ip, DM_RIGHT_NULL, - NULL, NULL, 0, 0, 0); /* Delay flag intentionally unused */ - if (error == 0) - goto retry; /* Maybe DMAPI app. has made space */ - /* else fall through with error from XFS_SEND_DATA */ - } return error; @@ -2548,7 +2419,7 @@ error0: /* Cancel bmap, unlock inode, un error1: /* Just cancel transaction */ xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); xfs_iunlock(ip, XFS_ILOCK_EXCL); - goto dmapi_enospc_check; + return error; } /* @@ -2661,7 +2532,6 @@ xfs_free_file_space( { int committed; int done; - xfs_off_t end_dmi_offset; xfs_fileoff_t endoffset_fsb; int error; xfs_fsblock_t firstfsb; @@ -2691,19 +2561,7 @@ xfs_free_file_space( return error; rt = XFS_IS_REALTIME_INODE(ip); startoffset_fsb = XFS_B_TO_FSB(mp, offset); - end_dmi_offset = offset + len; - endoffset_fsb = XFS_B_TO_FSBT(mp, end_dmi_offset); - - if (offset < ip->i_size && (attr_flags & XFS_ATTR_DMI) == 0 && - DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) { - if (end_dmi_offset > ip->i_size) - end_dmi_offset = ip->i_size; - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, - offset, end_dmi_offset - offset, - AT_DELAY_FLAG(attr_flags), NULL); - if (error) - return error; - } + endoffset_fsb = XFS_B_TO_FSBT(mp, offset + len); if (attr_flags & XFS_ATTR_NOLOCK) need_iolock = 0; Index: xfs/fs/xfs/Makefile =================================================================== --- xfs.orig/fs/xfs/Makefile 2010-05-10 15:32:31.000000000 +0200 +++ xfs/fs/xfs/Makefile 2010-05-10 15:33:07.823033810 +0200 @@ -89,8 +89,7 @@ xfs-y += xfs_alloc.o \ xfs_trans_item.o \ xfs_utils.o \ xfs_vnodeops.o \ - xfs_rw.o \ - xfs_dmops.o + xfs_rw.o xfs-$(CONFIG_XFS_TRACE) += xfs_btree_trace.o Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-05-07 11:52:53.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-05-10 15:34:12.985261845 +0200 @@ -23,7 +23,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_trans.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.c 2010-05-10 15:32:31.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_buf.c 2010-05-10 15:33:07.836006432 +0200 @@ -38,7 +38,6 @@ #include "xfs_sb.h" #include "xfs_inum.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trace.h" Index: xfs/fs/xfs/linux-2.6/xfs_export.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_export.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_export.c 2010-05-10 15:33:07.844255280 +0200 @@ -23,7 +23,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_export.h" #include "xfs_vnodeops.h" Index: xfs/fs/xfs/linux-2.6/xfs_fs_subr.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_fs_subr.c 2010-05-06 22:40:46.201254372 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_fs_subr.c 2010-05-10 15:33:07.850003569 +0200 @@ -21,10 +21,6 @@ #include "xfs_inode.h" #include "xfs_trace.h" -int fs_noerr(void) { return 0; } -int fs_nosys(void) { return ENOSYS; } -void fs_noval(void) { return; } - /* * note: all filemap functions return negative error codes. These * need to be inverted before returning to the xfs core functions. Index: xfs/fs/xfs/linux-2.6/xfs_fs_subr.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_fs_subr.h 2010-05-06 22:40:46.000000000 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2000,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 - */ -#ifndef __XFS_FS_SUBR_H__ -#define __XFS_FS_SUBR_H__ - -extern int fs_noerr(void); -extern int fs_nosys(void); -extern void fs_noval(void); - -#endif /* __XFS_FS_SUBR_H__ */ Index: xfs/fs/xfs/linux-2.6/xfs_ioctl32.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-05-10 15:34:13.016254162 +0200 @@ -28,7 +28,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_attr_sf.h" Index: xfs/fs/xfs/linux-2.6/xfs_iops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_iops.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_iops.c 2010-05-10 15:34:13.025254372 +0200 @@ -26,7 +26,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/linux-2.6/xfs_linux.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_linux.h 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_linux.h 2010-05-10 15:33:07.864275255 +0200 @@ -87,7 +87,6 @@ #include #include #include -#include #include /* Index: xfs/fs/xfs/linux-2.6/xfs_quotaops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_quotaops.c 2010-05-10 15:32:31.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_quotaops.c 2010-05-10 15:33:07.868003709 +0200 @@ -16,7 +16,6 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" -#include "xfs_dmapi.h" #include "xfs_sb.h" #include "xfs_inum.h" #include "xfs_ag.h" Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2010-05-10 15:34:13.044026407 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/linux-2.6/xfs_trace.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_trace.c 2010-05-10 15:34:13.056004337 +0200 @@ -34,7 +34,6 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_ialloc.h" #include "xfs_itable.h" Index: xfs/fs/xfs/quota/xfs_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot.c 2010-05-10 15:32:31.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_dquot.c 2010-05-10 15:34:13.064004267 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_dquot_item.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot_item.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_dquot_item.c 2010-05-10 15:34:13.072261147 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_qm.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm.c 2010-05-10 15:34:13.080253813 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_qm_bhv.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_bhv.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm_bhv.c 2010-05-10 15:34:13.089254931 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_qm_stats.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_stats.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm_stats.c 2010-05-10 15:34:13.097253883 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_qm_syscalls.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_syscalls.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm_syscalls.c 2010-05-10 15:34:13.109253743 +0200 @@ -28,7 +28,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_trans_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c 2010-05-10 13:47:55.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_trans_dquot.c 2010-05-10 15:34:13.120254232 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/support/debug.c =================================================================== --- xfs.orig/fs/xfs/support/debug.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/support/debug.c 2010-05-10 15:33:07.953282867 +0200 @@ -22,7 +22,6 @@ #include "xfs_sb.h" #include "xfs_inum.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2010-05-10 15:32:31.000000000 +0200 +++ xfs/fs/xfs/xfs_alloc.c 2010-05-10 15:34:13.129004686 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_alloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc_btree.c 2010-05-10 15:32:31.000000000 +0200 +++ xfs/fs/xfs/xfs_alloc_btree.c 2010-05-10 15:34:13.138004267 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_attr.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_attr.c 2010-05-10 15:34:13.149004616 +0200 @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_attr_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr_leaf.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_attr_leaf.c 2010-05-10 15:34:13.157024382 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_bmap_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap_btree.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_bmap_btree.c 2010-05-10 15:34:13.169004267 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_btree.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_btree.c 2010-05-10 15:34:13.183024941 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2010-05-10 15:32:31.000000000 +0200 +++ xfs/fs/xfs/xfs_buf_item.c 2010-05-10 15:33:07.984253603 +0200 @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" Index: xfs/fs/xfs/xfs_da_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_da_btree.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_da_btree.c 2010-05-10 15:34:13.406003988 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dfrag.c =================================================================== --- xfs.orig/fs/xfs/xfs_dfrag.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_dfrag.c 2010-05-10 15:34:13.192003988 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_dir2.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2.c 2010-05-10 15:34:13.414004197 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_block.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_block.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_block.c 2010-05-10 15:34:13.428254372 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_data.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_data.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_data.c 2010-05-10 15:34:13.437276302 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_leaf.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_leaf.c 2010-05-10 15:34:13.446254302 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_node.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_node.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_node.c 2010-05-10 15:34:13.454275534 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_sf.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_sf.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_sf.c 2010-05-10 15:34:13.463025569 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dmapi.h =================================================================== --- xfs.orig/fs/xfs/xfs_dmapi.h 2010-05-06 22:40:46.000000000 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2000-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 - */ -#ifndef __XFS_DMAPI_H__ -#define __XFS_DMAPI_H__ - -/* Values used to define the on-disk version of dm_attrname_t. All - * on-disk attribute names start with the 8-byte string "SGI_DMI_". - * - * In the on-disk inode, DMAPI attribute names consist of the user-provided - * name with the DMATTR_PREFIXSTRING pre-pended. This string must NEVER be - * changed. - */ - -#define DMATTR_PREFIXLEN 8 -#define DMATTR_PREFIXSTRING "SGI_DMI_" - -typedef enum { - DM_EVENT_INVALID = -1, - DM_EVENT_CANCEL = 0, /* not supported */ - DM_EVENT_MOUNT = 1, - DM_EVENT_PREUNMOUNT = 2, - DM_EVENT_UNMOUNT = 3, - DM_EVENT_DEBUT = 4, /* not supported */ - DM_EVENT_CREATE = 5, - DM_EVENT_CLOSE = 6, /* not supported */ - DM_EVENT_POSTCREATE = 7, - DM_EVENT_REMOVE = 8, - DM_EVENT_POSTREMOVE = 9, - DM_EVENT_RENAME = 10, - DM_EVENT_POSTRENAME = 11, - DM_EVENT_LINK = 12, - DM_EVENT_POSTLINK = 13, - DM_EVENT_SYMLINK = 14, - DM_EVENT_POSTSYMLINK = 15, - DM_EVENT_READ = 16, - DM_EVENT_WRITE = 17, - DM_EVENT_TRUNCATE = 18, - DM_EVENT_ATTRIBUTE = 19, - DM_EVENT_DESTROY = 20, - DM_EVENT_NOSPACE = 21, - DM_EVENT_USER = 22, - DM_EVENT_MAX = 23 -} dm_eventtype_t; -#define HAVE_DM_EVENTTYPE_T - -typedef enum { - DM_RIGHT_NULL, - DM_RIGHT_SHARED, - DM_RIGHT_EXCL -} dm_right_t; -#define HAVE_DM_RIGHT_T - -/* Defines for determining if an event message should be sent. */ -#ifdef HAVE_DMAPI -#define DM_EVENT_ENABLED(ip, event) ( \ - unlikely ((ip)->i_mount->m_flags & XFS_MOUNT_DMAPI) && \ - ( ((ip)->i_d.di_dmevmask & (1 << event)) || \ - ((ip)->i_mount->m_dmevmask & (1 << event)) ) \ - ) -#else -#define DM_EVENT_ENABLED(ip, event) (0) -#endif - -#define DM_XFS_VALID_FS_EVENTS ( \ - (1 << DM_EVENT_PREUNMOUNT) | \ - (1 << DM_EVENT_UNMOUNT) | \ - (1 << DM_EVENT_NOSPACE) | \ - (1 << DM_EVENT_DEBUT) | \ - (1 << DM_EVENT_CREATE) | \ - (1 << DM_EVENT_POSTCREATE) | \ - (1 << DM_EVENT_REMOVE) | \ - (1 << DM_EVENT_POSTREMOVE) | \ - (1 << DM_EVENT_RENAME) | \ - (1 << DM_EVENT_POSTRENAME) | \ - (1 << DM_EVENT_LINK) | \ - (1 << DM_EVENT_POSTLINK) | \ - (1 << DM_EVENT_SYMLINK) | \ - (1 << DM_EVENT_POSTSYMLINK) | \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - -/* Events valid in dm_set_eventlist() when called with a file handle for - a regular file or a symlink. These events are persistent. -*/ - -#define DM_XFS_VALID_FILE_EVENTS ( \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - -/* Events valid in dm_set_eventlist() when called with a file handle for - a directory. These events are persistent. -*/ - -#define DM_XFS_VALID_DIRECTORY_EVENTS ( \ - (1 << DM_EVENT_CREATE) | \ - (1 << DM_EVENT_POSTCREATE) | \ - (1 << DM_EVENT_REMOVE) | \ - (1 << DM_EVENT_POSTREMOVE) | \ - (1 << DM_EVENT_RENAME) | \ - (1 << DM_EVENT_POSTRENAME) | \ - (1 << DM_EVENT_LINK) | \ - (1 << DM_EVENT_POSTLINK) | \ - (1 << DM_EVENT_SYMLINK) | \ - (1 << DM_EVENT_POSTSYMLINK) | \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - -/* Events supported by the XFS filesystem. */ -#define DM_XFS_SUPPORTED_EVENTS ( \ - (1 << DM_EVENT_MOUNT) | \ - (1 << DM_EVENT_PREUNMOUNT) | \ - (1 << DM_EVENT_UNMOUNT) | \ - (1 << DM_EVENT_NOSPACE) | \ - (1 << DM_EVENT_CREATE) | \ - (1 << DM_EVENT_POSTCREATE) | \ - (1 << DM_EVENT_REMOVE) | \ - (1 << DM_EVENT_POSTREMOVE) | \ - (1 << DM_EVENT_RENAME) | \ - (1 << DM_EVENT_POSTRENAME) | \ - (1 << DM_EVENT_LINK) | \ - (1 << DM_EVENT_POSTLINK) | \ - (1 << DM_EVENT_SYMLINK) | \ - (1 << DM_EVENT_POSTSYMLINK) | \ - (1 << DM_EVENT_READ) | \ - (1 << DM_EVENT_WRITE) | \ - (1 << DM_EVENT_TRUNCATE) | \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - - -/* - * Definitions used for the flags field on dm_send_*_event(). - */ - -#define DM_FLAGS_NDELAY 0x001 /* return EAGAIN after dm_pending() */ -#define DM_FLAGS_UNWANTED 0x002 /* event not in fsys dm_eventset_t */ -#define DM_FLAGS_IMUX 0x004 /* thread holds i_mutex */ -#define DM_FLAGS_IALLOCSEM_RD 0x010 /* thread holds i_alloc_sem rd */ -#define DM_FLAGS_IALLOCSEM_WR 0x020 /* thread holds i_alloc_sem wr */ - -/* - * Pull in platform specific event flags defines - */ -#include "xfs_dmapi_priv.h" - -/* - * Macros to turn caller specified delay/block flags into - * dm_send_xxxx_event flag DM_FLAGS_NDELAY. - */ - -#define FILP_DELAY_FLAG(filp) ((filp->f_flags&(O_NDELAY|O_NONBLOCK)) ? \ - DM_FLAGS_NDELAY : 0) -#define AT_DELAY_FLAG(f) ((f & XFS_ATTR_NONBLOCK) ? DM_FLAGS_NDELAY : 0) - -#endif /* __XFS_DMAPI_H__ */ Index: xfs/fs/xfs/xfs_dmops.c =================================================================== --- xfs.orig/fs/xfs/xfs_dmops.c 2010-05-06 22:40:46.000000000 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2000-2003,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_log.h" -#include "xfs_trans.h" -#include "xfs_sb.h" -#include "xfs_dmapi.h" -#include "xfs_inum.h" -#include "xfs_ag.h" -#include "xfs_mount.h" - - -static struct xfs_dmops xfs_dmcore_stub = { - .xfs_send_data = (xfs_send_data_t)fs_nosys, - .xfs_send_mmap = (xfs_send_mmap_t)fs_noerr, - .xfs_send_destroy = (xfs_send_destroy_t)fs_nosys, - .xfs_send_namesp = (xfs_send_namesp_t)fs_nosys, - .xfs_send_mount = (xfs_send_mount_t)fs_nosys, - .xfs_send_unmount = (xfs_send_unmount_t)fs_noerr, -}; - -int -xfs_dmops_get(struct xfs_mount *mp) -{ - if (mp->m_flags & XFS_MOUNT_DMAPI) { - cmn_err(CE_WARN, - "XFS: dmapi support not available in this kernel."); - return EINVAL; - } - - mp->m_dm_ops = &xfs_dmcore_stub; - return 0; -} - -void -xfs_dmops_put(struct xfs_mount *mp) -{ -} Index: xfs/fs/xfs/xfs_error.c =================================================================== --- xfs.orig/fs/xfs/xfs_error.c 2010-05-10 15:32:31.000000000 +0200 +++ xfs/fs/xfs/xfs_error.c 2010-05-10 15:34:13.199003848 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" Index: xfs/fs/xfs/xfs_extfree_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_extfree_item.c 2010-05-10 13:47:55.000000000 +0200 +++ xfs/fs/xfs/xfs_extfree_item.c 2010-05-10 15:33:08.027255558 +0200 @@ -24,7 +24,6 @@ #include "xfs_buf_item.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_extfree_item.h" Index: xfs/fs/xfs/xfs_filestream.c =================================================================== --- xfs.orig/fs/xfs/xfs_filestream.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_filestream.c 2010-05-10 15:34:13.205004616 +0200 @@ -24,7 +24,6 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" Index: xfs/fs/xfs/xfs_fsops.c =================================================================== --- xfs.orig/fs/xfs/xfs_fsops.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_fsops.c 2010-05-10 15:34:13.216253953 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_ialloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_ialloc.c 2010-05-10 15:34:13.227254302 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_ialloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc_btree.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_ialloc_btree.c 2010-05-10 15:34:13.236254372 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-05-10 15:34:13.251275115 +0200 @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_inode.c 2010-05-10 15:34:13.260253464 +0200 @@ -28,7 +28,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_inode_item.c 2010-05-10 15:34:13.267254093 +0200 @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c 2010-05-07 11:52:53.000000000 +0200 +++ xfs/fs/xfs/xfs_iomap.c 2010-05-10 15:34:13.276003848 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_itable.c =================================================================== --- xfs.orig/fs/xfs/xfs_itable.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_itable.c 2010-05-10 15:34:13.282003778 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_log.c =================================================================== --- xfs.orig/fs/xfs/xfs_log.c 2010-05-10 15:32:31.000000000 +0200 +++ xfs/fs/xfs/xfs_log.c 2010-05-10 15:34:13.290004058 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_log_priv.h" Index: xfs/fs/xfs/xfs_log_recover.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_recover.c 2010-05-10 15:32:31.000000000 +0200 +++ xfs/fs/xfs/xfs_log_recover.c 2010-05-10 15:34:13.303027245 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_mount.c =================================================================== --- xfs.orig/fs/xfs/xfs_mount.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_mount.c 2010-05-10 15:34:13.311007270 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_mount.h =================================================================== --- xfs.orig/fs/xfs/xfs_mount.h 2010-05-10 15:32:31.856003989 +0200 +++ xfs/fs/xfs/xfs_mount.h 2010-05-10 15:33:08.077252765 +0200 @@ -66,65 +66,6 @@ struct xfs_nameops; struct xfs_ail; struct xfs_quotainfo; - -/* - * Prototypes and functions for the Data Migration subsystem. - */ - -typedef int (*xfs_send_data_t)(int, struct xfs_inode *, - xfs_off_t, size_t, int, int *); -typedef int (*xfs_send_mmap_t)(struct vm_area_struct *, uint); -typedef int (*xfs_send_destroy_t)(struct xfs_inode *, dm_right_t); -typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct xfs_mount *, - struct xfs_inode *, dm_right_t, - struct xfs_inode *, dm_right_t, - const unsigned char *, const unsigned char *, - mode_t, int, int); -typedef int (*xfs_send_mount_t)(struct xfs_mount *, dm_right_t, - char *, char *); -typedef void (*xfs_send_unmount_t)(struct xfs_mount *, struct xfs_inode *, - dm_right_t, mode_t, int, int); - -typedef struct xfs_dmops { - xfs_send_data_t xfs_send_data; - xfs_send_mmap_t xfs_send_mmap; - xfs_send_destroy_t xfs_send_destroy; - xfs_send_namesp_t xfs_send_namesp; - xfs_send_mount_t xfs_send_mount; - xfs_send_unmount_t xfs_send_unmount; -} xfs_dmops_t; - -#define XFS_DMAPI_UNMOUNT_FLAGS(mp) \ - (((mp)->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? 0 : DM_FLAGS_UNWANTED) - -#define XFS_SEND_DATA(mp, ev,ip,off,len,fl,lock) \ - (*(mp)->m_dm_ops->xfs_send_data)(ev,ip,off,len,fl,lock) -#define XFS_SEND_MMAP(mp, vma,fl) \ - (*(mp)->m_dm_ops->xfs_send_mmap)(vma,fl) -#define XFS_SEND_DESTROY(mp, ip,right) \ - (*(mp)->m_dm_ops->xfs_send_destroy)(ip,right) -#define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ - (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) -#define XFS_SEND_MOUNT(mp,right,path,name) \ - (*(mp)->m_dm_ops->xfs_send_mount)(mp,right,path,name) -#define XFS_SEND_PREUNMOUNT(mp) \ -do { \ - if (mp->m_flags & XFS_MOUNT_DMAPI) { \ - (*(mp)->m_dm_ops->xfs_send_namesp)(DM_EVENT_PREUNMOUNT, mp, \ - (mp)->m_rootip, DM_RIGHT_NULL, \ - (mp)->m_rootip, DM_RIGHT_NULL, \ - NULL, NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ - } \ -} while (0) -#define XFS_SEND_UNMOUNT(mp) \ -do { \ - if (mp->m_flags & XFS_MOUNT_DMAPI) { \ - (*(mp)->m_dm_ops->xfs_send_unmount)(mp, (mp)->m_rootip, \ - DM_RIGHT_NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ - } \ -} while (0) - - #ifdef HAVE_PERCPU_SB /* @@ -241,8 +182,6 @@ typedef struct xfs_mount { uint m_chsize; /* size of next field */ struct xfs_chash *m_chash; /* fs private inode per-cluster * hash table */ - struct xfs_dmops *m_dm_ops; /* vector of DMI ops */ - struct xfs_qmops *m_qm_ops; /* vector of XQM ops */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB xfs_icsb_cnts_t __percpu *m_sb_cnts; /* per-cpu superblock counters */ @@ -439,11 +378,6 @@ extern int xfs_sb_validate_fsb_count(str extern int xfs_dev_is_read_only(struct xfs_mount *, char *); -extern int xfs_dmops_get(struct xfs_mount *); -extern void xfs_dmops_put(struct xfs_mount *); - -extern struct xfs_dmops xfs_dmcore_xfs; - #endif /* __KERNEL__ */ extern void xfs_mod_sb(struct xfs_trans *, __int64_t); Index: xfs/fs/xfs/xfs_rtalloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_rtalloc.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_rtalloc.c 2010-05-10 15:34:13.329004337 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_rw.c =================================================================== --- xfs.orig/fs/xfs/xfs_rw.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_rw.c 2010-05-10 15:34:13.337254302 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-10 15:32:31.000000000 +0200 +++ xfs/fs/xfs/xfs_trans.c 2010-05-10 15:34:13.345274277 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_da_btree.h" Index: xfs/fs/xfs/xfs_trans_ail.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_ail.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_ail.c 2010-05-10 15:33:08.092272530 +0200 @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_error.h" Index: xfs/fs/xfs/xfs_trans_buf.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_buf.c 2010-05-10 15:32:31.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_buf.c 2010-05-10 15:34:13.355254093 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_trans_extfree.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_extfree.c 2010-05-10 13:47:55.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_extfree.c 2010-05-10 15:33:08.103005733 +0200 @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_extfree_item.h" Index: xfs/fs/xfs/xfs_trans_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_inode.c 2010-05-10 13:47:55.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_inode.c 2010-05-10 15:34:13.369004267 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_utils.c =================================================================== --- xfs.orig/fs/xfs/xfs_utils.c 2010-05-06 22:40:46.000000000 +0200 +++ xfs/fs/xfs/xfs_utils.c 2010-05-10 15:34:13.377012020 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" Index: xfs/fs/xfs/xfs_trans_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_item.c 2010-05-10 15:34:14.401255698 +0200 +++ xfs/fs/xfs/xfs_trans_item.c 2010-05-10 15:34:17.939005663 +0200 @@ -28,7 +28,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" STATIC int xfs_trans_unlock_chunk(xfs_log_item_chunk_t *, From BATV+c30e087d29709dd2b847+2451+infradead.org+hch@bombadil.srs.infradead.org Mon May 10 09:06:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AE6XB9005172 for ; Mon, 10 May 2010 09:06:33 -0500 X-ASG-Debug-ID: 1273500544-76c100b00000-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 61448C83699 for ; Mon, 10 May 2010 07:09:04 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id F1skBG3IsmliEl5q for ; Mon, 10 May 2010 07:09:04 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OBTf3-0004Kh-BO for xfs@oss.sgi.com; Mon, 10 May 2010 14:08:45 +0000 Date: Mon, 10 May 2010 10:08:45 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/2] xfs: remove unneeded #include statements Subject: [PATCH 2/2] xfs: remove unneeded #include statements Message-ID: <20100510140845.GB16540@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273500545 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-05-10 15:34:12.985261845 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-05-10 15:35:10.422023683 +0200 @@ -21,18 +21,12 @@ #include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_trans.h" #include "xfs_mount.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_alloc.h" -#include "xfs_btree.h" #include "xfs_error.h" #include "xfs_rw.h" #include "xfs_iomap.h" Index: xfs/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_file.c 2010-05-10 15:34:12.994263312 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-05-10 15:35:10.423022775 +0200 @@ -22,22 +22,15 @@ #include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_trans.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" #include "xfs_alloc.h" -#include "xfs_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_vnodeops.h" #include "xfs_da_btree.h" #include "xfs_ioctl.h" Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-10 15:34:13.003253883 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-10 15:35:10.426003639 +0200 @@ -23,23 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_ioctl.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" #include "xfs_rtalloc.h" #include "xfs_itable.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_bmap.h" #include "xfs_buf_item.h" Index: xfs/fs/xfs/linux-2.6/xfs_ioctl32.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-05-10 15:34:13.016254162 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-05-10 15:35:10.429003848 +0200 @@ -27,11 +27,8 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dir2_sf.h" #include "xfs_vnode.h" #include "xfs_dinode.h" #include "xfs_inode.h" Index: xfs/fs/xfs/linux-2.6/xfs_iops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_iops.c 2010-05-10 15:34:13.025254372 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_iops.c 2010-05-10 15:35:10.433044217 +0200 @@ -24,20 +24,13 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_bmap.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_itable.h" Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2010-05-10 15:34:13.033254372 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-05-10 15:35:10.439005455 +0200 @@ -30,8 +30,6 @@ #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" @@ -42,7 +40,6 @@ #include "xfs_error.h" #include "xfs_itable.h" #include "xfs_fsops.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_utils.h" Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2010-05-10 15:34:13.044026407 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2010-05-10 15:35:10.444033810 +0200 @@ -24,24 +24,14 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_inode.h" #include "xfs_dinode.h" #include "xfs_error.h" -#include "xfs_mru_cache.h" #include "xfs_filestream.h" #include "xfs_vnodeops.h" -#include "xfs_utils.h" -#include "xfs_buf_item.h" #include "xfs_inode_item.h" -#include "xfs_rw.h" #include "xfs_quota.h" #include "xfs_trace.h" Index: xfs/fs/xfs/linux-2.6/xfs_trace.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.c 2010-05-10 15:34:13.056004337 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_trace.c 2010-05-10 15:35:10.451255839 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_da_btree.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" Index: xfs/fs/xfs/quota/xfs_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot.c 2010-05-10 15:34:13.064004267 +0200 +++ xfs/fs/xfs/quota/xfs_dquot.c 2010-05-10 15:35:10.458255978 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_itable.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_space.h" Index: xfs/fs/xfs/quota/xfs_dquot_item.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot_item.c 2010-05-10 15:34:13.072261147 +0200 +++ xfs/fs/xfs/quota/xfs_dquot_item.c 2010-05-10 15:35:10.464284334 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_bmap.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_itable.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" Index: xfs/fs/xfs/quota/xfs_qm.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm.c 2010-05-10 15:34:13.080253813 +0200 +++ xfs/fs/xfs/quota/xfs_qm.c 2010-05-10 15:35:10.474255489 +0200 @@ -23,24 +23,18 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_itable.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_bmap.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_space.h" Index: xfs/fs/xfs/quota/xfs_qm_bhv.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_bhv.c 2010-05-10 15:34:13.089254931 +0200 +++ xfs/fs/xfs/quota/xfs_qm_bhv.c 2010-05-10 15:35:10.479255699 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_itable.h" -#include "xfs_btree.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_qm.h" Index: xfs/fs/xfs/quota/xfs_qm_stats.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_stats.c 2010-05-10 15:34:13.097253883 +0200 +++ xfs/fs/xfs/quota/xfs_qm_stats.c 2010-05-10 15:35:10.484285661 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_itable.h" #include "xfs_bmap.h" -#include "xfs_btree.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_qm.h" Index: xfs/fs/xfs/quota/xfs_qm_syscalls.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_syscalls.c 2010-05-10 15:34:13.109253743 +0200 +++ xfs/fs/xfs/quota/xfs_qm_syscalls.c 2010-05-10 15:35:10.491283985 +0200 @@ -26,24 +26,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_itable.h" #include "xfs_bmap.h" -#include "xfs_btree.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_utils.h" Index: xfs/fs/xfs/quota/xfs_trans_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c 2010-05-10 15:34:13.120254232 +0200 +++ xfs/fs/xfs/quota/xfs_trans_dquot.c 2010-05-10 15:35:10.497255769 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dir2_sf.h" -#include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_ialloc.h" #include "xfs_itable.h" -#include "xfs_btree.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2010-05-10 15:34:13.129004686 +0200 +++ xfs/fs/xfs/xfs_alloc.c 2010-05-10 15:35:10.502278048 +0200 @@ -24,17 +24,13 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_ialloc.h" #include "xfs_alloc.h" #include "xfs_error.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_alloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc_btree.c 2010-05-10 15:34:13.138004267 +0200 +++ xfs/fs/xfs/xfs_alloc_btree.c 2010-05-10 15:35:10.507255210 +0200 @@ -24,18 +24,14 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_btree_trace.h" -#include "xfs_ialloc.h" #include "xfs_alloc.h" #include "xfs_error.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_attr.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr.c 2010-05-10 15:34:13.149004616 +0200 +++ xfs/fs/xfs/xfs_attr.c 2010-05-10 15:35:10.513255070 +0200 @@ -25,18 +25,13 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_da_btree.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_alloc.h" -#include "xfs_btree.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_attr.h" Index: xfs/fs/xfs/xfs_attr_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr_leaf.c 2010-05-10 15:34:13.157024382 +0200 +++ xfs/fs/xfs/xfs_attr_leaf.c 2010-05-10 15:35:10.520005245 +0200 @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" @@ -32,7 +31,6 @@ #include "xfs_ialloc_btree.h" #include "xfs_alloc.h" #include "xfs_btree.h" -#include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" Index: xfs/fs/xfs/xfs_bmap_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap_btree.c 2010-05-10 15:34:13.169004267 +0200 +++ xfs/fs/xfs/xfs_bmap_btree.c 2010-05-10 15:35:10.525034439 +0200 @@ -24,20 +24,16 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" #include "xfs_alloc.h" #include "xfs_btree.h" #include "xfs_btree_trace.h" -#include "xfs_ialloc.h" #include "xfs_itable.h" #include "xfs_bmap.h" #include "xfs_error.h" Index: xfs/fs/xfs/xfs_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_btree.c 2010-05-10 15:34:13.183024941 +0200 +++ xfs/fs/xfs/xfs_btree.c 2010-05-10 15:35:10.534255489 +0200 @@ -24,19 +24,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" #include "xfs_btree.h" #include "xfs_btree_trace.h" -#include "xfs_ialloc.h" #include "xfs_error.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_dfrag.c =================================================================== --- xfs.orig/fs/xfs/xfs_dfrag.c 2010-05-10 15:34:13.192003988 +0200 +++ xfs/fs/xfs/xfs_dfrag.c 2010-05-10 15:35:10.540286848 +0200 @@ -24,23 +24,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" #include "xfs_bmap.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" #include "xfs_itable.h" #include "xfs_dfrag.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_vnodeops.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_error.c =================================================================== --- xfs.orig/fs/xfs/xfs_error.c 2010-05-10 15:34:13.199003848 +0200 +++ xfs/fs/xfs/xfs_error.c 2010-05-10 15:35:10.547255489 +0200 @@ -23,11 +23,8 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_utils.h" Index: xfs/fs/xfs/xfs_filestream.c =================================================================== --- xfs.orig/fs/xfs/xfs_filestream.c 2010-05-10 15:34:13.205004616 +0200 +++ xfs/fs/xfs/xfs_filestream.c 2010-05-10 15:35:10.552031995 +0200 @@ -18,9 +18,6 @@ #include "xfs.h" #include "xfs_bmap_btree.h" #include "xfs_inum.h" -#include "xfs_dir2.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_ag.h" Index: xfs/fs/xfs/xfs_fsops.c =================================================================== --- xfs.orig/fs/xfs/xfs_fsops.c 2010-05-10 15:34:13.216253953 +0200 +++ xfs/fs/xfs/xfs_fsops.c 2010-05-10 15:35:10.557005524 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" Index: xfs/fs/xfs/xfs_ialloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc.c 2010-05-10 15:34:13.227254302 +0200 +++ xfs/fs/xfs/xfs_ialloc.c 2010-05-10 15:35:10.563005315 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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" Index: xfs/fs/xfs/xfs_ialloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc_btree.c 2010-05-10 15:34:13.236254372 +0200 +++ xfs/fs/xfs/xfs_ialloc_btree.c 2010-05-10 15:35:10.567067544 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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" Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-05-10 15:34:13.251275115 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-05-10 15:35:10.572005664 +0200 @@ -25,13 +25,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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" Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-05-10 15:34:13.260253464 +0200 +++ xfs/fs/xfs/xfs_inode.c 2010-05-10 15:35:10.578005524 +0200 @@ -27,12 +27,10 @@ #include "xfs_trans_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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" @@ -43,7 +41,6 @@ #include "xfs_alloc.h" #include "xfs_ialloc.h" #include "xfs_bmap.h" -#include "xfs_rw.h" #include "xfs_error.h" #include "xfs_utils.h" #include "xfs_quota.h" Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-05-10 15:34:13.267254093 +0200 +++ xfs/fs/xfs/xfs_inode_item.c 2010-05-10 15:35:10.583005734 +0200 @@ -22,23 +22,14 @@ #include "xfs_log.h" #include "xfs_inum.h" #include "xfs_trans.h" -#include "xfs_buf_item.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_trans_priv.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_inode_item.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" -#include "xfs_rw.h" #include "xfs_error.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c 2010-05-10 15:34:13.276003848 +0200 +++ xfs/fs/xfs/xfs_iomap.c 2010-05-10 15:35:10.588017607 +0200 @@ -23,18 +23,14 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_btree.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" Index: xfs/fs/xfs/xfs_itable.c =================================================================== --- xfs.orig/fs/xfs/xfs_itable.c 2010-05-10 15:34:13.282003778 +0200 +++ xfs/fs/xfs/xfs_itable.c 2010-05-10 15:35:10.595282239 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_ialloc.h" Index: xfs/fs/xfs/xfs_log.c =================================================================== --- xfs.orig/fs/xfs/xfs_log.c 2010-05-10 15:34:13.290004058 +0200 +++ xfs/fs/xfs/xfs_log.c 2010-05-10 15:35:10.603005663 +0200 @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_log_priv.h" @@ -34,8 +33,6 @@ #include "xfs_ialloc_btree.h" #include "xfs_log_recover.h" #include "xfs_trans_priv.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_rw.h" Index: xfs/fs/xfs/xfs_log_recover.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_recover.c 2010-05-10 15:34:13.303027245 +0200 +++ xfs/fs/xfs/xfs_log_recover.c 2010-05-10 15:35:10.610008038 +0200 @@ -24,14 +24,11 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_error.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_inode_item.h" Index: xfs/fs/xfs/xfs_mount.c =================================================================== --- xfs.orig/fs/xfs/xfs_mount.c 2010-05-10 15:34:13.311007270 +0200 +++ xfs/fs/xfs/xfs_mount.c 2010-05-10 15:35:10.618005244 +0200 @@ -29,8 +29,6 @@ #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" Index: xfs/fs/xfs/xfs_rename.c =================================================================== --- xfs.orig/fs/xfs/xfs_rename.c 2010-05-10 15:34:13.319011950 +0200 +++ xfs/fs/xfs/xfs_rename.c 2010-05-10 15:35:10.621005524 +0200 @@ -27,8 +27,6 @@ #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_rtalloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_rtalloc.c 2010-05-10 15:34:13.329004337 +0200 +++ xfs/fs/xfs/xfs_rtalloc.c 2010-05-10 15:35:10.627266244 +0200 @@ -27,14 +27,8 @@ #include "xfs_dir2.h" #include "xfs_mount.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_ialloc.h" #include "xfs_alloc.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" Index: xfs/fs/xfs/xfs_rw.c =================================================================== --- xfs.orig/fs/xfs/xfs_rw.c 2010-05-10 15:34:13.337254302 +0200 +++ xfs/fs/xfs/xfs_rw.c 2010-05-10 15:35:10.632255628 +0200 @@ -24,26 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" -#include "xfs_itable.h" -#include "xfs_btree.h" -#include "xfs_alloc.h" -#include "xfs_ialloc.h" -#include "xfs_attr.h" -#include "xfs_bmap.h" #include "xfs_error.h" -#include "xfs_buf_item.h" #include "xfs_rw.h" -#include "xfs_trace.h" /* * Force a shutdown of the filesystem instantly while keeping Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-10 15:34:13.345274277 +0200 +++ xfs/fs/xfs/xfs_trans.c 2010-05-10 15:35:10.635255768 +0200 @@ -24,15 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_da_btree.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" Index: xfs/fs/xfs/xfs_trans_buf.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_buf.c 2010-05-10 15:34:13.355254093 +0200 +++ xfs/fs/xfs/xfs_trans_buf.c 2010-05-10 15:35:10.643317299 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_buf_item.h" Index: xfs/fs/xfs/xfs_trans_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_inode.c 2010-05-10 15:34:13.369004267 +0200 +++ xfs/fs/xfs/xfs_trans_inode.c 2010-05-10 15:35:10.649255768 +0200 @@ -24,17 +24,13 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_ialloc.h" #include "xfs_trans_priv.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_utils.c =================================================================== --- xfs.orig/fs/xfs/xfs_utils.c 2010-05-10 15:34:13.377012020 +0200 +++ xfs/fs/xfs/xfs_utils.c 2010-05-10 15:35:10.655255349 +0200 @@ -27,15 +27,12 @@ #include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_error.h" #include "xfs_quota.h" -#include "xfs_rw.h" #include "xfs_itable.h" #include "xfs_utils.h" Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c 2010-05-10 15:34:13.389003988 +0200 +++ xfs/fs/xfs/xfs_vnodeops.c 2010-05-10 15:35:10.661255558 +0200 @@ -29,15 +29,11 @@ #include "xfs_mount.h" #include "xfs_da_btree.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_inode_item.h" #include "xfs_itable.h" -#include "xfs_btree.h" #include "xfs_ialloc.h" #include "xfs_alloc.h" #include "xfs_bmap.h" Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-05-10 15:34:13.398004616 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2010-05-10 15:35:10.672005663 +0200 @@ -30,12 +30,10 @@ #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_mount.h" -#include "xfs_ialloc.h" #include "xfs_itable.h" #include "xfs_dir2_data.h" #include "xfs_dir2_leaf.h" Index: xfs/fs/xfs/xfs_da_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_da_btree.c 2010-05-10 15:34:13.406003988 +0200 +++ xfs/fs/xfs/xfs_da_btree.c 2010-05-10 15:35:10.680254930 +0200 @@ -28,15 +28,11 @@ #include "xfs_mount.h" #include "xfs_da_btree.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_inode_item.h" #include "xfs_alloc.h" -#include "xfs_btree.h" #include "xfs_bmap.h" #include "xfs_attr.h" #include "xfs_attr_leaf.h" Index: xfs/fs/xfs/xfs_dir2.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2.c 2010-05-10 15:34:13.414004197 +0200 +++ xfs/fs/xfs/xfs_dir2.c 2010-05-10 15:35:10.682255209 +0200 @@ -30,7 +30,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_dir2_block.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_block.c 2010-05-10 15:34:13.428254372 +0200 +++ xfs/fs/xfs/xfs_dir2_block.c 2010-05-10 15:35:10.687292295 +0200 @@ -28,7 +28,6 @@ #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_dir2_data.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_data.c 2010-05-10 15:34:13.437276302 +0200 +++ xfs/fs/xfs/xfs_dir2_data.c 2010-05-10 15:35:10.692280352 +0200 @@ -28,7 +28,6 @@ #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_dir2_data.h" Index: xfs/fs/xfs/xfs_dir2_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_leaf.c 2010-05-10 15:34:13.446254302 +0200 +++ xfs/fs/xfs/xfs_dir2_leaf.c 2010-05-10 15:35:10.695255628 +0200 @@ -28,7 +28,6 @@ #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_attr_sf.h" #include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" Index: xfs/fs/xfs/xfs_dir2_node.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_node.c 2010-05-10 15:34:13.454275534 +0200 +++ xfs/fs/xfs/xfs_dir2_node.c 2010-05-10 15:35:10.703255349 +0200 @@ -28,7 +28,6 @@ #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_bmap.h" Index: xfs/fs/xfs/xfs_dir2_sf.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_sf.c 2010-05-10 15:34:13.463025569 +0200 +++ xfs/fs/xfs/xfs_dir2_sf.c 2010-05-10 15:35:10.709005593 +0200 @@ -28,7 +28,6 @@ #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" From sandeen@sandeen.net Mon May 10 09:37:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AEbbpZ007254 for ; Mon, 10 May 2010 09:37:38 -0500 X-ASG-Debug-ID: 1273502389-3e1b01880000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4C8931DEA616 for ; Mon, 10 May 2010 07:39:49 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id qf47CFJeEZSQ1wG4 for ; Mon, 10 May 2010 07:39:49 -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 mail.sandeen.net (Postfix) with ESMTP id 4E5159E988B; Mon, 10 May 2010 09:39:49 -0500 (CDT) Message-ID: <4BE81AB4.7000600@sandeen.net> Date: Mon, 10 May 2010 09:39:48 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: =?UTF-8?B?S3J6eXN6dG9mIELFgmFzemtvd3NraQ==?= CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate References: <201005071022.37863.kb@sysmikro.com.pl> <4BE43F34.40309@sandeen.net> <4BE44587.6090603@sandeen.net> <201005100911.52491.kb@sysmikro.com.pl> In-Reply-To: <201005100911.52491.kb@sysmikro.com.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1273502390 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29538 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Krzysztof BĹ‚aszkowski wrote: > On Friday 07 May 2010 18:53, Eric Sandeen wrote: >> Eric Sandeen wrote: >>> Krzysztof BĹ‚aszkowski wrote: >>>> Hello, >>>> >>>> I use this to preallocate large space but found an issue. >>>> Posix_fallocate works right with sizes like 100G, 1T and even 10T on >>>> some boxes (on some other can fail after e.g. 7T threshold) but if i >>>> tried e.g. 16T the user space process would be "R"unning forever and it >>>> is not interruptible. Furthermore some other not related processes like >>>> sshd, bash enter D state. There is nothing in kernel log. >> Oh, one thing you should know is that depending on your version of glibc, >> posix_fallocate may be writing 0s and not using preallocation calls. > > I am absolutely sure that recent libc doesn't emulate this syscall right, recent glibc does not (unless the underlying fs doesn't support it) ... > We stick with 2.6.31.5 which seems to be good for us. We do not change kernels > easily, as soon as higher revision arrives because it doesn't make sense from > stability point of view. We have seen too many times regression bugs so if we > are confident with some revision then there is no point to change this. It was just a testing suggestion, but I already tested upstream and the problem persists, now just need to find the time to dig into it. -Eric From lists@nabble.com Mon May 10 09:51:50 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.1 required=5.0 tests=BAYES_00,FORGED_YAHOO_RCVD, FREEMAIL_FROM,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AEpnw3008158 for ; Mon, 10 May 2010 09:51:50 -0500 X-ASG-Debug-ID: 1273503241-74e500ea0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kuber.nabble.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2201B3291F4 for ; Mon, 10 May 2010 07:54:01 -0700 (PDT) Received: from kuber.nabble.com (kuber.nabble.com [216.139.236.158]) by cuda.sgi.com with ESMTP id G6WGz4EFDLvqIAYX for ; Mon, 10 May 2010 07:54:01 -0700 (PDT) Received: from isper.nabble.com ([192.168.236.156]) by kuber.nabble.com with esmtp (Exim 4.63) (envelope-from ) id 1OBUMq-0005Il-Tv for xfs@oss.sgi.com; Mon, 10 May 2010 07:54:00 -0700 Message-ID: <28512276.post@talk.nabble.com> Date: Mon, 10 May 2010 07:54:00 -0700 (PDT) From: stress_buster To: xfs@oss.sgi.com X-ASG-Orig-Subj: bad primary superblock - bad magic number !!! Subject: bad primary superblock - bad magic number !!! MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Nabble-From: leo1783@yahoo.com X-Barracuda-Connect: kuber.nabble.com[216.139.236.158] X-Barracuda-Start-Time: 1273503242 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: 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=BSF_RULE7568M, BSF_RULE_7582B, FORGED_YAHOO_RCVD, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29540 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.41 FORGED_YAHOO_RCVD 'From' yahoo.com does not match 'Received' headers 0.46 PLING_PLING Subject has lots of exclamation marks 0.50 BSF_RULE7568M Custom Rule 7568M 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean my hp proliant DL185 server hangs/crashes and sometimes do not boot correctly... [root@localhost dev]# xfs_repair -n /dev/cciss/c0d0p1 Phase 1 - find and verify superblock... bad primary superblock - bad magic number !!! attempting to find secondary superblock... .....................................................................................Sorry, could not find valid secondary superblock Exiting now. [root@localhost dev]# xfs_repair -n /dev/cciss/c0d2 Phase 1 - find and verify superblock... superblock read failed, offset 0, size 524288, ag 0, rval -1 fatal error -- Input/output error [root@localhost dev]# xfs_db /dev/cciss/c0d0p1 xfs_db: /dev/cciss/c0d0p1 is not a valid XFS filesystem (unexpected SB magic number 0x00000000) The next time, server didnt even boot up alright i've managed to capture the msgs & traces dumped to console. See below end_request: I/O error, dev cciss/c0d2, sector 0 end_request: I/O error, dev cciss/c0d2, sector 0 end_request: I/O error, dev cciss/c0d2, sector 1 Quote: ciss: cmd f6c00000 has CHECK CONDITION sense key = 0x4 end_request: I/O error, dev cciss/c0d3, sector 0 cciss: cmd f6c00000 has CHECK CONDITION sense key = 0x4 end_request: I/O error, dev cciss/c0d3, sector 0 backtrace from SysRq -w SysRq : Show Blocked State f7ad1e40 00203082 f7853b90 e54af7f0 e54af948 cba30e00 00000001 00000020 e5ad2250 00000000 000000ff e5ad2250 00000000 00000000 00000000 7fffffff e55afe00 e55afd44 e55afe04 c05ab1c5 256e2000 00000000 e56e2000 00000000 Call Trace: [] schedule_timeout+0x13/0x86 [] wait_for_common+0xb9/0x103 [] default_wake_function+0x0/0x8 [] cciss_ioctl+0x6fb/0xd1e [] read_tsc+0x6/0x22 [] getnstimeofday+0x4a/0xca [] tick_dev_program_event+0x1e/0x8c [] dput+0x31/0xf7 [] __link_path_walk+0x9fd/0xb2b [] blkdev_driver_ioctl+0x4b/0x5b [] igmp_rcv+0x38f/0x496 [] blkdev_ioctl+0x697/0x6e5 [] igmp_rcv+0x38f/0x496 [] igmp_rcv+0x38f/0x496 [] do_open+0x1d9/0x258 [] blkdev_open+0x0/0x4d [] blkdev_open+0x25/0x4d [] __dentry_open+0x13b/0x212 [] nameidata_to_filp+0x1c/0x2c [] do_filp_open+0x350/0x64d [] do_futex+0x8a/0x6ee [] handle_mm_fault+0x4e0/0x4ea [] igmp_rcv+0x38f/0x496 [] block_ioctl+0x13/0x16 [] block_ioctl+0x0/0x16 [] vfs_ioctl+0x1c/0x5d [] do_vfs_ioctl+0x239/0x247 [] do_sys_open+0xae/0xb6 [] sys_ioctl+0x41/0x58 [] sysenter_do_call+0x12/0x25 [] igmp_rcv+0x38f/0x496 Plz help..... Thanks in advance, David ub007 is offline Click here to find out more! -- View this message in context: http://old.nabble.com/bad-primary-superblock---bad-magic-number-%21%21%21-tp28512276p28512276.html Sent from the Xfs - General mailing list archive at Nabble.com. From sandeen@sandeen.net Mon May 10 10:40:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AFe1Pi011133 for ; Mon, 10 May 2010 10:40:01 -0500 X-ASG-Debug-ID: 1273506133-676800ed0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1A7C5139D0D1 for ; Mon, 10 May 2010 08:42:13 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id QeOzplpOvpHwvH87 for ; Mon, 10 May 2010 08:42:13 -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 mail.sandeen.net (Postfix) with ESMTP id 5FA40A745FE; Mon, 10 May 2010 10:42:13 -0500 (CDT) Message-ID: <4BE82955.2080009@sandeen.net> Date: Mon, 10 May 2010 10:42:13 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: stress_buster CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: bad primary superblock - bad magic number !!! Subject: Re: bad primary superblock - bad magic number !!! References: <28512276.post@talk.nabble.com> In-Reply-To: <28512276.post@talk.nabble.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1273506134 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: -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=BSF_RULE7568M, PLING_PLING, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29542 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.46 PLING_PLING Subject has lots of exclamation marks 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean stress_buster wrote: > my hp proliant DL185 server hangs/crashes and sometimes do not boot > correctly... > > [root@localhost dev]# xfs_repair -n /dev/cciss/c0d0p1 > Phase 1 - find and verify superblock... > bad primary superblock - bad magic number !!! > > attempting to find secondary superblock... > .....................................................................................Sorry, > could not find valid secondary superblock > Exiting now. > > [root@localhost dev]# xfs_repair -n /dev/cciss/c0d2 > Phase 1 - find and verify superblock... > superblock read failed, offset 0, size 524288, ag 0, rval -1 > > fatal error -- Input/output error > > > [root@localhost dev]# xfs_db /dev/cciss/c0d0p1 > xfs_db: /dev/cciss/c0d0p1 is not a valid XFS filesystem (unexpected SB magic > number 0x00000000) > > The next time, server didnt even boot up alright > > i've managed to capture the msgs & traces dumped to console. See below > > > end_request: I/O error, dev cciss/c0d2, sector 0 > end_request: I/O error, dev cciss/c0d2, sector 0 > end_request: I/O error, dev cciss/c0d2, sector 1 > Quote: > ciss: cmd f6c00000 has CHECK CONDITION sense key = 0x4 > end_request: I/O error, dev cciss/c0d3, sector 0 > cciss: cmd f6c00000 has CHECK CONDITION sense key = 0x4 > end_request: I/O error, dev cciss/c0d3, sector 0 You seem to have serious storage problems that are not XFS related. You'll need to get that resolved. -Eric From BATV+c30e087d29709dd2b847+2451+infradead.org+hch@bombadil.srs.infradead.org Mon May 10 12:24:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_52 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AHOX1A017469 for ; Mon, 10 May 2010 12:24:34 -0500 X-ASG-Debug-ID: 1273512405-678d02ee0000-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 4057B1D4CB6F; Mon, 10 May 2010 10:26:45 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id hk6r3vfkpfCBLv4o; Mon, 10 May 2010 10:26:45 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OBWkd-0005Tf-EM; Mon, 10 May 2010 17:26:43 +0000 Date: Mon, 10 May 2010 13:26:43 -0400 From: Christoph Hellwig To: Geoffrey Wehrman Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: test extent size hints Subject: Re: [PATCH] xfstests: test extent size hints Message-ID: <20100510172643.GA14991@infradead.org> References: <20100429103444.GA8019@infradead.org> <20100429151003.GC27637@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100429151003.GC27637@sgi.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273512406 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Apr 29, 2010 at 10:10:03AM -0500, Geoffrey Wehrman wrote: > On Thu, Apr 29, 2010 at 06:34:44AM -0400, Christoph Hellwig wrote: > | This is an adapted version of the reproduced in OSS BZ #874, which > | shows file corruption when using the extent size hint. > | > | Geoffrey, can you say if licensing the small test program as GPLv2+ > | is fine so that we can add it to xfstests? > > Thanks for asking Christoph. Please include an SGI copyright in both > the test script and the t_holes.c source. The GPLv2+ license is fine. Is this version fine to commit? Geoffrey, if you could add a Signed-off-by: that would be perfect, thanks! --- From: Christoph Hellwig Subject: [PATCH] xfstests: test extent size hints Cc: Geoffrey Wehrman This is an adapted version of the reproduced in OSS BZ #874, which shows file corruption when using the extent size hint. Geoffrey, can you say if licensing the small test program as GPLv2+ is fine so that we can add it to xfstests? Signed-off-by: Christoph Hellwig Index: xfstests-dev/229 =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfstests-dev/229 2010-05-10 17:21:24.000000000 +0000 @@ -0,0 +1,88 @@ +#! /bin/bash +# FS QA Test No. 221 +# +# Check for file corruption when using the extent size hint on +# the normal data subvolume. +# +# http://oss.sgi.com/bugzilla/show_bug.cgi?id=874 +# +# Based on a bug report and testcase from Geoffrey Wehrman . +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Christoph Hellwig. All Rights Reserved. +# Copyright (c) 2010 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=hch@lst.de + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -rf ${TDIR} +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +TDIR="${TEST_DIR}/t_holes" +NFILES="10" +EXTSIZE="256k" + +# Create the test directory +mkdir ${TDIR} + +# Set the test directory extsize +xfs_io -c "extsize ${EXTSIZE}" ${TDIR} + +# Create a set of holey files +echo "generating ${NFILES} files" + +for i in $(seq 0 ${NFILES}); do + $here/src/t_holes ${TDIR}/${i} +done + +# Compare the files +echo "comparing files" +errcnt=0 +j=0 +for i in $(seq 0 ${NFILES}); do + let j=$i+1 + while [ ${j} -lt ${NFILES} ] ; do + if ! cmp ${TDIR}/${i} ${TDIR}/${j} ; then + let errcnt=$errcnt+1 + fi + let j=$j+1 + done +done + +echo "got ${errcnt} errors" + +status=$errcnt +exit $status Index: xfstests-dev/229.out =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfstests-dev/229.out 2010-05-07 10:18:56.000000000 +0000 @@ -0,0 +1,4 @@ +QA output created by 229 +generating 10 files +comparing files +got 0 errors Index: xfstests-dev/group =================================================================== --- xfstests-dev.orig/group 2010-05-07 10:18:35.000000000 +0000 +++ xfstests-dev/group 2010-05-10 17:20:50.000000000 +0000 @@ -342,3 +342,4 @@ deprecated 226 auto enospc 227 auto fsr 228 rw auto prealloc quick +229 auto rw Index: xfstests-dev/src/Makefile =================================================================== --- xfstests-dev.orig/src/Makefile 2010-05-07 10:18:20.000000000 +0000 +++ xfstests-dev/src/Makefile 2010-05-07 10:18:56.000000000 +0000 @@ -10,7 +10,7 @@ TARGETS = dirstress fill fill2 getpagesi mmapcat append_reader append_writer dirperf metaperf \ devzero feature alloc fault fstest t_access_root \ godown resvtest writemod makeextents itrash rename \ - multi_open_unlink dmiperf unwritten_sync genhashnames + multi_open_unlink dmiperf unwritten_sync genhashnames t_holes LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ Index: xfstests-dev/src/t_holes.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfstests-dev/src/t_holes.c 2010-05-10 17:22:33.000000000 +0000 @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2010 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 +#include +#include +#include + +int main(int argc, char **argv) +{ + int buf[1024]; + int fd, i, j; + + fd = open(argv[1], O_RDWR|O_CREAT, 0666); + for (i = 1; i < 9100; i++) { + for (j = 0; j < 1024; j++) + buf[j] = i | i << 5; + + if (write(fd,buf,253*4*sizeof(int))!= 253*4*sizeof(int)) + printf("Write did not return correct amount\n"); + + if ((i % 9) == 0 && i < 9001) + lseek(fd, 4096 * 110,SEEK_CUR); + } + + close(fd); + return 0; +} From BATV+c30e087d29709dd2b847+2451+infradead.org+hch@bombadil.srs.infradead.org Mon May 10 12:26:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_63 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AHQ2wq017571 for ; Mon, 10 May 2010 12:26:03 -0500 X-ASG-Debug-ID: 1273512514-1b0001630000-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 BAB491288756 for ; Mon, 10 May 2010 10:28:34 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id HWzYXUSziNLqnQBe for ; Mon, 10 May 2010 10:28:34 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OBWm6-0001K9-4L for xfs@oss.sgi.com; Mon, 10 May 2010 17:28:14 +0000 Date: Mon, 10 May 2010 13:28:14 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: clean up xlog_align Subject: [PATCH] xfs: clean up xlog_align Message-ID: <20100510172814.GB14991@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273512515 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Add suggested cleanups to commit 29db3370a1369541d58d692fbfb168b8a0bd7f41 from review that didn't end up being commited. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_log_recover.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_recover.c 2010-05-10 19:12:01.539262194 +0200 +++ xfs/fs/xfs/xfs_log_recover.c 2010-05-10 19:14:52.295255420 +0200 @@ -132,15 +132,10 @@ xlog_align( int nbblks, xfs_buf_t *bp) { - xfs_daddr_t offset; - xfs_caddr_t ptr; + xfs_daddr_t offset = blk_no & ((xfs_daddr_t)log->l_sectBBsize - 1); - offset = blk_no & ((xfs_daddr_t) log->l_sectBBsize - 1); - ptr = XFS_BUF_PTR(bp) + BBTOB(offset); - - ASSERT(ptr + BBTOB(nbblks) <= XFS_BUF_PTR(bp) + XFS_BUF_SIZE(bp)); - - return ptr; + ASSERT(BBTOB(offset + nbblks) <= XFS_BUF_SIZE(bp)); + return XFS_BUF_PTR(bp) + BBTOB(offset); } From gwehrman@sgi.com Mon May 10 12:34:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_52,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AHY9ID018049 for ; Mon, 10 May 2010 12:34:09 -0500 Received: from goalpost.americas.sgi.com (goalpost.americas.sgi.com [128.162.232.54]) by relay1.corp.sgi.com (Postfix) with ESMTP id 27C958F80BC; Mon, 10 May 2010 10:36:18 -0700 (PDT) Received: by goalpost.americas.sgi.com (Postfix, from userid 14442) id BEACF2526EF2; Mon, 10 May 2010 12:36:18 -0500 (CDT) Date: Mon, 10 May 2010 12:36:18 -0500 From: Geoffrey Wehrman To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: test extent size hints Message-ID: <20100510173618.GB12949@sgi.com> References: <20100429103444.GA8019@infradead.org> <20100429151003.GC27637@sgi.com> <20100510172643.GA14991@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100510172643.GA14991@infradead.org> User-Agent: Mutt/1.5.14 (2007-02-12) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 10, 2010 at 01:26:43PM -0400, Christoph Hellwig wrote: | On Thu, Apr 29, 2010 at 10:10:03AM -0500, Geoffrey Wehrman wrote: | > On Thu, Apr 29, 2010 at 06:34:44AM -0400, Christoph Hellwig wrote: | > | This is an adapted version of the reproduced in OSS BZ #874, which | > | shows file corruption when using the extent size hint. | > | | > | Geoffrey, can you say if licensing the small test program as GPLv2+ | > | is fine so that we can add it to xfstests? | > | > Thanks for asking Christoph. Please include an SGI copyright in both | > the test script and the t_holes.c source. The GPLv2+ license is fine. | | Is this version fine to commit? Looks great. Thanks! | Geoffrey, if you could add a Signed-off-by: that would be perfect, | thanks! Done. Geoffrey --- From: Christoph Hellwig Subject: [PATCH] xfstests: test extent size hints Cc: Geoffrey Wehrman This is an adapted version of the reproduced in OSS BZ #874, which shows file corruption when using the extent size hint. Geoffrey, can you say if licensing the small test program as GPLv2+ is fine so that we can add it to xfstests? Signed-off-by: Christoph Hellwig Signed-off-by: Geoffrey Wehrman Index: xfstests-dev/229 =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfstests-dev/229 2010-05-10 17:21:24.000000000 +0000 @@ -0,0 +1,88 @@ +#! /bin/bash +# FS QA Test No. 221 +# +# Check for file corruption when using the extent size hint on +# the normal data subvolume. +# +# http://oss.sgi.com/bugzilla/show_bug.cgi?id=874 +# +# Based on a bug report and testcase from Geoffrey Wehrman . +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Christoph Hellwig. All Rights Reserved. +# Copyright (c) 2010 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=hch@lst.de + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -rf ${TDIR} +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +TDIR="${TEST_DIR}/t_holes" +NFILES="10" +EXTSIZE="256k" + +# Create the test directory +mkdir ${TDIR} + +# Set the test directory extsize +xfs_io -c "extsize ${EXTSIZE}" ${TDIR} + +# Create a set of holey files +echo "generating ${NFILES} files" + +for i in $(seq 0 ${NFILES}); do + $here/src/t_holes ${TDIR}/${i} +done + +# Compare the files +echo "comparing files" +errcnt=0 +j=0 +for i in $(seq 0 ${NFILES}); do + let j=$i+1 + while [ ${j} -lt ${NFILES} ] ; do + if ! cmp ${TDIR}/${i} ${TDIR}/${j} ; then + let errcnt=$errcnt+1 + fi + let j=$j+1 + done +done + +echo "got ${errcnt} errors" + +status=$errcnt +exit $status Index: xfstests-dev/229.out =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfstests-dev/229.out 2010-05-07 10:18:56.000000000 +0000 @@ -0,0 +1,4 @@ +QA output created by 229 +generating 10 files +comparing files +got 0 errors Index: xfstests-dev/group =================================================================== --- xfstests-dev.orig/group 2010-05-07 10:18:35.000000000 +0000 +++ xfstests-dev/group 2010-05-10 17:20:50.000000000 +0000 @@ -342,3 +342,4 @@ deprecated 226 auto enospc 227 auto fsr 228 rw auto prealloc quick +229 auto rw Index: xfstests-dev/src/Makefile =================================================================== --- xfstests-dev.orig/src/Makefile 2010-05-07 10:18:20.000000000 +0000 +++ xfstests-dev/src/Makefile 2010-05-07 10:18:56.000000000 +0000 @@ -10,7 +10,7 @@ TARGETS = dirstress fill fill2 getpagesi mmapcat append_reader append_writer dirperf metaperf \ devzero feature alloc fault fstest t_access_root \ godown resvtest writemod makeextents itrash rename \ - multi_open_unlink dmiperf unwritten_sync genhashnames + multi_open_unlink dmiperf unwritten_sync genhashnames t_holes LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ Index: xfstests-dev/src/t_holes.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfstests-dev/src/t_holes.c 2010-05-10 17:22:33.000000000 +0000 @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2010 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 +#include +#include +#include + +int main(int argc, char **argv) +{ + int buf[1024]; + int fd, i, j; + + fd = open(argv[1], O_RDWR|O_CREAT, 0666); + for (i = 1; i < 9100; i++) { + for (j = 0; j < 1024; j++) + buf[j] = i | i << 5; + + if (write(fd,buf,253*4*sizeof(int))!= 253*4*sizeof(int)) + printf("Write did not return correct amount\n"); + + if ((i % 9) == 0 && i < 9001) + lseek(fd, 4096 * 110,SEEK_CUR); + } + + close(fd); + return 0; +} From BATV+c30e087d29709dd2b847+2451+infradead.org+hch@bombadil.srs.infradead.org Mon May 10 12:41:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AHf1dL018475 for ; Mon, 10 May 2010 12:41:01 -0500 X-ASG-Debug-ID: 1273513394-7d8802d70000-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 419EC330B12 for ; Mon, 10 May 2010 10:43:14 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id sIzvRVAhG9gCJ1aq for ; Mon, 10 May 2010 10:43:14 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OBX0a-000387-Gb; Mon, 10 May 2010 17:43:12 +0000 Date: Mon, 10 May 2010 13:43:12 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 12/12] xfs: Ensure inode allocation buffers are fully replayed Subject: Re: [PATCH 12/12] xfs: Ensure inode allocation buffers are fully replayed Message-ID: <20100510174312.GA11849@infradead.org> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> <1273210860-23414-13-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273210860-23414-13-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273513394 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good, Reviewed-by: Christoph Hellwig > Also, move an assert in the buffer release path outside the hash > spinlock so that if the assert is hit the system continues to run in > a debuggable state. But this really should be a separate patch. From leo1783@yahoo.com Mon May 10 13:09:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AI9Zxa020179 for ; Mon, 10 May 2010 13:09:35 -0500 X-ASG-Debug-ID: 1273515107-74cc03dd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from n5-vm0.bullet.mail.gq1.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 18C67330D75 for ; Mon, 10 May 2010 11:11:47 -0700 (PDT) Received: from n5-vm0.bullet.mail.gq1.yahoo.com (n5-vm0.bullet.mail.gq1.yahoo.com [67.195.8.62]) by cuda.sgi.com with SMTP id Iyb6r7BNowDbLihJ for ; Mon, 10 May 2010 11:11:47 -0700 (PDT) Received: from [67.195.9.82] by n5.bullet.mail.gq1.yahoo.com with NNFMP; 10 May 2010 18:11:46 -0000 Received: from [67.195.9.105] by t2.bullet.mail.gq1.yahoo.com with NNFMP; 10 May 2010 18:11:46 -0000 Received: from [127.0.0.1] by omp109.mail.gq1.yahoo.com with NNFMP; 10 May 2010 18:11:46 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 101983.43944.bm@omp109.mail.gq1.yahoo.com Received: (qmail 89130 invoked by uid 60001); 10 May 2010 18:11:46 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1273515105; bh=Hsx/cXtgiwpfds5S0sghS+g8GRTu3h3lPcPPiSK28eE=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:References:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type; b=MfLVClAOcLxZfgrEISsIDJ6xa4Acu34g8EKW/rnbn3BHcJXqcAK/noHLt5Jn0U1dOgirWslMMCPRXu8VvZ7jzgVF987adq8p3cLWJh651aLwvzur5xfEydSqyEaeN+Zifr0vaY2pIYPuWFZDmOJVwLPmhkPvgHlYdbDxWHQJ0+M= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=Message-ID:X-YMail-OSG:Received:X-Mailer:References:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type; b=tvzWO0JHIro5OPqtEJ+8nQ490DvBI/j7tBrI+sgodrcFvlwdPdYTRR2Eigq5X4uPA/2WadfeoRtA3s4B/2Zms9HSjwNupWzrS+8bI+/XcIPUQNZ0gJzn5M9mzNnYG+NZnvyoFjgY01+p703X2dY11YGDGuW0WO2/Jt9W3cs0gMk=; Message-ID: <978493.86662.qm@web112902.mail.gq1.yahoo.com> X-YMail-OSG: ACMfT08VM1nuE_DQd0CN7dA3J_mpBfG72VngjKxziJn_cOH M26sYnqrYbnuwIzN2.NqR0IR5d2fqg5hid_88Gix6itg8aYptemzov.rVsoP 8tULFBYaWZrLG3DNMOTf2v8uM5bxQVq6vlVmtnLXPIk8aEw5AYT3RdvhpdUr sxlWkLi5LB85JbbUcN.S70QaoY8VXtUVmMp1D0YFpZFRqi2dIKwtA9Iflahw N4sf5pObpQJ7ViqPoRdbzM8gnCJlc0bMygV9w2EK8OZUxepjOOMJfKjCyyDu j__fFqHUBWLm89QLSWZxylwk- Received: from [94.169.89.247] by web112902.mail.gq1.yahoo.com via HTTP; Mon, 10 May 2010 11:11:45 PDT X-Mailer: YahooMailRC/374.4 YahooMailWebService/0.8.103.269680 References: <28512276.post@talk.nabble.com> <4BE82955.2080009@sandeen.net> Date: Mon, 10 May 2010 11:11:45 -0700 (PDT) From: Leo Davis X-ASG-Orig-Subj: Re: bad primary superblock - bad magic number !!! Subject: Re: bad primary superblock - bad magic number !!! To: Eric Sandeen Cc: xfs@oss.sgi.com In-Reply-To: <4BE82955.2080009@sandeen.net> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="0-419575489-1273515105=:86662" X-Barracuda-Connect: n5-vm0.bullet.mail.gq1.yahoo.com[67.195.8.62] X-Barracuda-Start-Time: 1273515108 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.06 X-Barracuda-Spam-Status: No, SCORE=-1.06 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message 0.46 PLING_PLING Subject has lots of exclamation marks 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0-419575489-1273515105=:86662 Content-Type: text/plain; charset=us-ascii Many Thanks. I agree. I destroy and re-create raid and everything would show up GOOD, only for it to break again. So was wondering whether those traces would point to anything.... my prime suspect is hard drives, but those xfs msgs confused me. Apologies for posting before carrying put more tests. Thanks, leo ________________________________ From: Eric Sandeen To: stress_buster Cc: xfs@oss.sgi.com Sent: Mon, May 10, 2010 4:42:13 PM Subject: Re: bad primary superblock - bad magic number !!! stress_buster wrote: > my hp proliant DL185 server hangs/crashes and sometimes do not boot > correctly... > > [root@localhost dev]# xfs_repair -n /dev/cciss/c0d0p1 > Phase 1 - find and verify superblock... > bad primary superblock - bad magic number !!! > > attempting to find secondary superblock... > .....................................................................................Sorry, > could not find valid secondary superblock > Exiting now. > > [root@localhost dev]# xfs_repair -n /dev/cciss/c0d2 > Phase 1 - find and verify superblock... > superblock read failed, offset 0, size 524288, ag 0, rval -1 > > fatal error -- Input/output error > > > [root@localhost dev]# xfs_db /dev/cciss/c0d0p1 > xfs_db: /dev/cciss/c0d0p1 is not a valid XFS filesystem (unexpected SB magic > number 0x00000000) > > The next time, server didnt even boot up alright > > i've managed to capture the msgs & traces dumped to console. See below > > > end_request: I/O error, dev cciss/c0d2, sector 0 > end_request: I/O error, dev cciss/c0d2, sector 0 > end_request: I/O error, dev cciss/c0d2, sector 1 > Quote: > ciss: cmd f6c00000 has CHECK CONDITION sense key = 0x4 > end_request: I/O error, dev cciss/c0d3, sector 0 > cciss: cmd f6c00000 has CHECK CONDITION sense key = 0x4 > end_request: I/O error, dev cciss/c0d3, sector 0 You seem to have serious storage problems that are not XFS related. You'll need to get that resolved. -Eric --0-419575489-1273515105=:86662 Content-Type: text/html; charset=us-ascii
Many Thanks.
 
I agree. I destroy and re-create raid and everything would show up GOOD, only for it to break again.
So was wondering whether those traces would point to anything.... my prime suspect is hard drives, but those xfs msgs confused me.
Apologies for posting before carrying put more tests.
 
Thanks,
leo


From: Eric Sandeen <sandeen@sandeen.net>
To: stress_buster <leo1783@yahoo.com>
Cc: xfs@oss.sgi.com
Sent: Mon, May 10, 2010 4:42:13 PM
Subject: Re: bad primary superblock - bad magic number !!!

stress_buster wrote:
> my hp proliant DL185 server hangs/crashes and sometimes do not boot
> correctly...
>
> [root@localhost dev]# xfs_repair -n /dev/cciss/c0d0p1
> Phase 1 - find and verify superblock...
> bad primary superblock - bad magic number !!!
>
> attempting to find secondary superblock...
> .....................................................................................Sorry,
> could not find valid secondary superblock
> Exiting now.
>
> [root@localhost dev]# xfs_repair -n /dev/cciss/c0d2
> Phase 1 - find and verify superblock...
> superblock read failed, offset 0, size 524288, ag 0, rval -1
>
> fatal error -- Input/output error
>
>
> [root@localhost dev]# xfs_db /dev/cciss/c0d0p1
> xfs_db: /dev/cciss/c0d0p1 is not a valid XFS filesystem (unexpected SB magic
> number 0x00000000)
>
> The next time, server didnt even boot up alright
>
> i've managed to capture the msgs & traces dumped to console. See below
>
>
> end_request: I/O error, dev cciss/c0d2, sector 0
> end_request: I/O error, dev cciss/c0d2, sector 0
> end_request: I/O error, dev cciss/c0d2, sector 1
> Quote:
> ciss: cmd f6c00000 has CHECK CONDITION sense key = 0x4
> end_request: I/O error, dev cciss/c0d3, sector 0
> cciss: cmd f6c00000 has CHECK CONDITION sense key = 0x4
> end_request: I/O error, dev cciss/c0d3, sector 0

You seem to have serious storage problems that are not XFS related.

You'll need to get that resolved.

-Eric

--0-419575489-1273515105=:86662-- From aelder@sgi.com Mon May 10 13:12:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AICtHn020424 for ; Mon, 10 May 2010 13:12:55 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id B43B98F80B9; Mon, 10 May 2010 11:15:05 -0700 (PDT) Received: from [128.162.232.185] ([128.162.232.185]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 10 May 2010 13:15:05 -0500 Subject: Re: [PATCH] xfs: clean up xlog_align From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20100510172814.GB14991@infradead.org> References: <20100510172814.GB14991@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Mon, 10 May 2010 13:15:05 -0500 Message-ID: <1273515305.2824.164.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 10 May 2010 18:15:05.0401 (UTC) FILETIME=[B7304A90:01CAF06C] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 2010-05-10 at 13:28 -0400, Christoph Hellwig wrote: > Add suggested cleanups to commit 29db3370a1369541d58d692fbfb168b8a0bd7f41 > from review that didn't end up being commited. Whoops. I said I was going to change it to be that way but I guess that didn't happen. Sorry about that. I do like this way better. > Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder > Index: xfs/fs/xfs/xfs_log_recover.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_log_recover.c 2010-05-10 19:12:01.539262194 +0200 > +++ xfs/fs/xfs/xfs_log_recover.c 2010-05-10 19:14:52.295255420 +0200 > @@ -132,15 +132,10 @@ xlog_align( From kb@sysmikro.com.pl Mon May 10 13:15:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AIF4se020593 for ; Mon, 10 May 2010 13:15:05 -0500 X-ASG-Debug-ID: 1273515435-43a200500000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from v007470.home.net.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id BD18C1DEAE10 for ; Mon, 10 May 2010 11:17:16 -0700 (PDT) Received: from v007470.home.net.pl (v007470.home.net.pl [212.85.125.104]) by cuda.sgi.com with SMTP id dbeRbhdnsMjCfZlk for ; Mon, 10 May 2010 11:17:16 -0700 (PDT) Received: from chello089072102205.chello.pl [89.72.102.205] (HELO linux2g2g.site) by sysmikro.home.pl [212.85.125.104] with SMTP (IdeaSmtpServer v0.70) id f3f8a1a11a7bbb42; Mon, 10 May 2010 20:17:15 +0200 From: Krzysztof =?utf-8?q?B=C5=82aszkowski?= Organization: Systemy mikroprocesorowe To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate Date: Mon, 10 May 2010 20:17:11 +0200 User-Agent: KMail/1.9.5 Cc: Eric Sandeen References: <201005071022.37863.kb@sysmikro.com.pl> <201005100911.52491.kb@sysmikro.com.pl> <4BE81AB4.7000600@sandeen.net> In-Reply-To: <4BE81AB4.7000600@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Message-Id: <201005102017.11706.kb@sysmikro.com.pl> X-Barracuda-Connect: v007470.home.net.pl[212.85.125.104] X-Barracuda-Start-Time: 1273515436 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0207 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.2, rules version 3.2.2.29551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Monday 10 May 2010 16:39, Eric Sandeen wrote: > Krzysztof B=C5=82aszkowski wrote: > > On Friday 07 May 2010 18:53, Eric Sandeen wrote: > >> Eric Sandeen wrote: > >>> Krzysztof B=C5=82aszkowski wrote: > >>>> Hello, > >>>> > >>>> I use this to preallocate large space but found an issue. > >>>> Posix_fallocate works right with sizes like 100G, 1T and even 10T on > >>>> some boxes (on some other can fail after e.g. 7T threshold) but if i > >>>> tried e.g. 16T the user space process would be "R"unning forever and > >>>> it is not interruptible. Furthermore some other not related processes > >>>> like sshd, bash enter D state. There is nothing in kernel log. > >> > >> Oh, one thing you should know is that depending on your version of > >> glibc, posix_fallocate may be writing 0s and not using preallocation > >> calls. > > > > I am absolutely sure that recent libc doesn't emulate this syscall > > right, recent glibc does not (unless the underlying fs doesn't support it) > > ... > > > We stick with 2.6.31.5 which seems to be good for us. We do not change > > kernels easily, as soon as higher revision arrives because it doesn't > > make sense from stability point of view. We have seen too many times > > regression bugs so if we are confident with some revision then there is > > no point to change this. > > It was just a testing suggestion, but I already tested upstream and the > problem persists, now just need to find the time to dig into it. I see and I am glad you confirmed this. Do you think that fallocate called= =20 many times with fixed size and increasing offset will work better than one= =20 time call with huge size @ 0 offset ? Krzysztof > > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Mon May 10 13:42:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AIgwbh022269 for ; Mon, 10 May 2010 13:42:58 -0500 X-ASG-Debug-ID: 1273517110-611100290000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 36F4C3295AC for ; Mon, 10 May 2010 11:45:10 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id w1nL4xHY0c6MAmuH for ; Mon, 10 May 2010 11:45:10 -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 mail.sandeen.net (Postfix) with ESMTP id D3C45A5C3E3; Mon, 10 May 2010 13:45:10 -0500 (CDT) Message-ID: <4BE85436.5040402@sandeen.net> Date: Mon, 10 May 2010 13:45:10 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: =?UTF-8?B?S3J6eXN6dG9mIELFgmFzemtvd3NraQ==?= CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate References: <201005071022.37863.kb@sysmikro.com.pl> <201005100911.52491.kb@sysmikro.com.pl> <4BE81AB4.7000600@sandeen.net> <201005102017.11706.kb@sysmikro.com.pl> In-Reply-To: <201005102017.11706.kb@sysmikro.com.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1273517111 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Krzysztof Błaszkowski wrote: > On Monday 10 May 2010 16:39, Eric Sandeen wrote: >> Krzysztof Błaszkowski wrote: ... >>> We stick with 2.6.31.5 which seems to be good for us. We do not change >>> kernels easily, as soon as higher revision arrives because it doesn't >>> make sense from stability point of view. We have seen too many times >>> regression bugs so if we are confident with some revision then there is >>> no point to change this. >> It was just a testing suggestion, but I already tested upstream and the >> problem persists, now just need to find the time to dig into it. > > I see and I am glad you confirmed this. Do you think that fallocate called > many times with fixed size and increasing offset will work better than one > time call with huge size @ 0 offset ? I'd expect that to work; it's certainly worth a test, and please send your results back to the list ;) thanks, -Eric > Krzysztof >> -Eric From eflorac@intellique.com Mon May 10 15:20:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AKKFoJ029003 for ; Mon, 10 May 2010 15:20:15 -0500 X-ASG-Debug-ID: 1273522942-708e02250000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9B98A33121E for ; Mon, 10 May 2010 13:22:25 -0700 (PDT) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id DXzKBMoFfWrAMRcB for ; Mon, 10 May 2010 13:22:25 -0700 (PDT) Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by smtp3-g21.free.fr (Postfix) with ESMTP id 5E09881801E; Mon, 10 May 2010 22:22:19 +0200 (CEST) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP; Mon, 10 May 2010 22:22:18 +0200 (CEST) Date: Mon, 10 May 2010 22:22:11 +0200 From: Emmanuel Florac To: Leo Davis Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: bad primary superblock - bad magic number !!! Subject: Re: bad primary superblock - bad magic number !!! Message-ID: <20100510222211.3e73cdeb@galadriel.home> In-Reply-To: <978493.86662.qm@web112902.mail.gq1.yahoo.com> References: <28512276.post@talk.nabble.com> <4BE82955.2080009@sandeen.net> <978493.86662.qm@web112902.mail.gq1.yahoo.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 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1273522948 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.56 X-Barracuda-Spam-Status: No, SCORE=-1.56 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29560 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.46 PLING_PLING Subject has lots of exclamation marks X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Mon, 10 May 2010 11:11:45 -0700 (PDT) vous =E9criviez: > I agree. I destroy and re-create raid and everything would show up > GOOD, only for it to break again. So was wondering whether those > traces would point to anything.... my prime suspect is hard drives, > but those xfs msgs confused me.=20 Check the hard drives separately with the maker utility (Seatools, etc). One of them at the very least must be seriously ill. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From michael.monnerie@is.it-management.at Mon May 10 17:37:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AMbBvL036568 for ; Mon, 10 May 2010 17:37:11 -0500 X-ASG-Debug-ID: 1273531182-40c2009e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ED56F120F227 for ; Mon, 10 May 2010 15:39:42 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id rt6H5p7ED9DT8hiI for ; Mon, 10 May 2010 15:39:42 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id B924E800186 for ; Tue, 11 May 2010 00:39:19 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 2F4AE83C823 for ; Tue, 11 May 2010 00:39:19 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_fsr question for improvement Subject: Re: xfs_fsr question for improvement Date: Tue, 11 May 2010 00:39:00 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-vanilla; KDE/4.3.5; x86_64; ; ) References: <201004161043.11243@zmi.at> <201005030849.47591@zmi.at> <20100503121716.GF2591@dastard> In-Reply-To: <20100503121716.GF2591@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart4697389.uZdSOWQasN"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005110039.18561@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1273531183 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0369 1.0000 -1.7826 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.78 X-Barracuda-Spam-Status: No, SCORE=-1.78 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.2, rules version 3.2.2.29568 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart4697389.uZdSOWQasN Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Montag, 3. Mai 2010 Dave Chinner wrote: > Many have. Find and tar have resisted attempts to optimise them over > the years, so stuff like this: >=20 > http://oss.oracle.com/~mason/acp/ > grows on the interwebs all over the place... ;) Uh, that makes a nice 3818 IOPS with 161MB/s: xvdb 3818,16 0,80 161449,90 35,13 84,57 10,75 =20 2,30 0,26 99,88 And even saw >4kIOPS an 180MB/s. Nice. The tool gave me an idea: lvchange -r 1024 /dev/all_my_lvm_stores And this boots copy performance a lot: With the default "-r 128" I had=20 around 10-30MB/s, now 30-100MB/s. Of course this depends on the type of=20 access and so on, but at least during moving back all the data from the=20 backup lvm to the re-created original lvm it's a drastic speedup. > > # time find /mountpoint/ -inum 107901420 > > real 0m30.113s > > user 0m0.540s > > sys 0m9.813s > > > > Caching helps the 2nd time :-) >=20 > That still seems rather slow traversing 750,000 cached directory > entries. My laptop (1.3GHz CULV core2 CPU) does 465,000 directory > entries in: >=20 > $ time sudo find / -mount -inum 123809285 >=20 > real 0m2.196s > user 0m0.384s > sys 0m1.464s So why was it so slow here? As soon as moving back all data is finished, I can retry if search speed=20 increased. =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart4697389.uZdSOWQasN Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkvoixYACgkQzhSR9xwSCbQ1fQCeJDFHy1vxRI/lGqd/3F1K2hHd UA0An0plJ8UlMsJ7iuMSHhl4Ixg3OkaJ =mujS -----END PGP SIGNATURE----- --nextPart4697389.uZdSOWQasN-- From greg@kroah.com Mon May 10 17:50:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AMoQr8037294 for ; Mon, 10 May 2010 17:50:27 -0500 X-ASG-Debug-ID: 1273531979-40c100e30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from coco.kroah.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 57D97120FE80 for ; Mon, 10 May 2010 15:52:59 -0700 (PDT) Received: from coco.kroah.org (kroah.org [198.145.64.141]) by cuda.sgi.com with ESMTP id dMY0mbOePnPFbyoU for ; Mon, 10 May 2010 15:52:59 -0700 (PDT) Received: from localhost (c-24-16-163-131.hsd1.wa.comcast.net [24.16.163.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by coco.kroah.org (Postfix) with ESMTPSA id F0CFC48B37; Mon, 10 May 2010 15:52:37 -0700 (PDT) X-Mailbox-Line: From gregkh@kvm.kroah.org Mon May 10 15:33:24 2010 Message-Id: <20100510223324.424796921@kvm.kroah.org> User-Agent: quilt/0.48-4.4 Date: Mon, 10 May 2010 15:32:49 -0700 From: Greg KH To: linux-kernel@vger.kernel.org, stable@kernel.org Cc: stable-review@kernel.org, torvalds@linux-foundation.org, akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk, xfs@oss.sgi.com, Dave Chinner X-ASG-Orig-Subj: [078/117] xfs: add a shrinker to background inode reclaim Subject: [078/117] xfs: add a shrinker to background inode reclaim In-Reply-To: <20100510223700.GA18404@kroah.com> X-Barracuda-Connect: kroah.org[198.145.64.141] X-Barracuda-Start-Time: 1273531980 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.2, rules version 3.2.2.29568 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean 2.6.33-stable review patch. If anyone has any objections, please let us know. ------------------ From: Dave Chinner commit 9bf729c0af67897ea8498ce17c29b0683f7f2028 upstream On low memory boxes or those with highmem, kernel can OOM before the background reclaims inodes via xfssyncd. Add a shrinker to run inode reclaim so that it inode reclaim is expedited when memory is low. This is more complex than it needs to be because the VM folk don't want a context added to the shrinker infrastructure. Hence we need to add a global list of XFS mount structures so the shrinker can traverse them. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Greg Kroah-Hartman --- fs/xfs/linux-2.6/xfs_super.c | 5 + fs/xfs/linux-2.6/xfs_sync.c | 107 ++++++++++++++++++++++++++++++++++++++--- fs/xfs/linux-2.6/xfs_sync.h | 7 ++ fs/xfs/quota/xfs_qm_syscalls.c | 3 - fs/xfs/xfs_ag.h | 1 fs/xfs/xfs_mount.h | 1 6 files changed, 115 insertions(+), 9 deletions(-) --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1160,6 +1160,7 @@ xfs_fs_put_super( xfs_unmountfs(mp); xfs_freesb(mp); + xfs_inode_shrinker_unregister(mp); xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); xfs_dmops_put(mp); @@ -1523,6 +1524,8 @@ xfs_fs_fill_super( if (error) goto fail_vnrele; + xfs_inode_shrinker_register(mp); + kfree(mtpt); return 0; @@ -1767,6 +1770,7 @@ init_xfs_fs(void) goto out_cleanup_procfs; vfs_initquota(); + xfs_inode_shrinker_init(); error = register_filesystem(&xfs_fs_type); if (error) @@ -1794,6 +1798,7 @@ exit_xfs_fs(void) { vfs_exitquota(); unregister_filesystem(&xfs_fs_type); + xfs_inode_shrinker_destroy(); xfs_sysctl_unregister(); xfs_cleanup_procfs(); xfs_buf_terminate(); --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -95,7 +95,8 @@ xfs_inode_ag_walk( struct xfs_perag *pag, int flags), int flags, int tag, - int exclusive) + int exclusive, + int *nr_to_scan) { struct xfs_perag *pag = &mp->m_perag[ag]; uint32_t first_index; @@ -135,7 +136,7 @@ restart: if (error == EFSCORRUPTED) break; - } while (1); + } while ((*nr_to_scan)--); if (skipped) { delay(1); @@ -153,23 +154,30 @@ xfs_inode_ag_iterator( struct xfs_perag *pag, int flags), int flags, int tag, - int exclusive) + int exclusive, + int *nr_to_scan) { int error = 0; int last_error = 0; xfs_agnumber_t ag; + int nr; + nr = nr_to_scan ? *nr_to_scan : INT_MAX; for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { if (!mp->m_perag[ag].pag_ici_init) continue; error = xfs_inode_ag_walk(mp, ag, execute, flags, tag, - exclusive); + exclusive, &nr); if (error) { last_error = error; if (error == EFSCORRUPTED) break; } + if (nr <= 0) + break; } + if (nr_to_scan) + *nr_to_scan = nr; return XFS_ERROR(last_error); } @@ -289,7 +297,7 @@ xfs_sync_data( ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, - XFS_ICI_NO_TAG, 0); + XFS_ICI_NO_TAG, 0, NULL); if (error) return XFS_ERROR(error); @@ -311,7 +319,7 @@ xfs_sync_attr( ASSERT((flags & ~SYNC_WAIT) == 0); return xfs_inode_ag_iterator(mp, xfs_sync_inode_attr, flags, - XFS_ICI_NO_TAG, 0); + XFS_ICI_NO_TAG, 0, NULL); } STATIC int @@ -679,6 +687,7 @@ __xfs_inode_set_reclaim_tag( radix_tree_tag_set(&pag->pag_ici_root, XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), XFS_ICI_RECLAIM_TAG); + pag->pag_ici_reclaimable++; } /* @@ -710,6 +719,7 @@ __xfs_inode_clear_reclaim_tag( { radix_tree_tag_clear(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); + pag->pag_ici_reclaimable--; } STATIC int @@ -770,5 +780,88 @@ xfs_reclaim_inodes( int mode) { return xfs_inode_ag_iterator(mp, xfs_reclaim_inode, mode, - XFS_ICI_RECLAIM_TAG, 1); + XFS_ICI_RECLAIM_TAG, 1, NULL); +} + +/* + * Shrinker infrastructure. + * + * This is all far more complex than it needs to be. It adds a global list of + * mounts because the shrinkers can only call a global context. We need to make + * the shrinkers pass a context to avoid the need for global state. + */ +static LIST_HEAD(xfs_mount_list); +static struct rw_semaphore xfs_mount_list_lock; + +static int +xfs_reclaim_inode_shrink( + int nr_to_scan, + gfp_t gfp_mask) +{ + struct xfs_mount *mp; + xfs_agnumber_t ag; + int reclaimable = 0; + + if (nr_to_scan) { + if (!(gfp_mask & __GFP_FS)) + return -1; + + down_read(&xfs_mount_list_lock); + list_for_each_entry(mp, &xfs_mount_list, m_mplist) { + xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0, + XFS_ICI_RECLAIM_TAG, 1, &nr_to_scan); + if (nr_to_scan <= 0) + break; + } + up_read(&xfs_mount_list_lock); + } + + down_read(&xfs_mount_list_lock); + list_for_each_entry(mp, &xfs_mount_list, m_mplist) { + for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { + + if (!mp->m_perag[ag].pag_ici_init) + continue; + reclaimable += mp->m_perag[ag].pag_ici_reclaimable; + } + } + up_read(&xfs_mount_list_lock); + return reclaimable; +} + +static struct shrinker xfs_inode_shrinker = { + .shrink = xfs_reclaim_inode_shrink, + .seeks = DEFAULT_SEEKS, +}; + +void __init +xfs_inode_shrinker_init(void) +{ + init_rwsem(&xfs_mount_list_lock); + register_shrinker(&xfs_inode_shrinker); +} + +void +xfs_inode_shrinker_destroy(void) +{ + ASSERT(list_empty(&xfs_mount_list)); + unregister_shrinker(&xfs_inode_shrinker); +} + +void +xfs_inode_shrinker_register( + struct xfs_mount *mp) +{ + down_write(&xfs_mount_list_lock); + list_add_tail(&mp->m_mplist, &xfs_mount_list); + up_write(&xfs_mount_list_lock); +} + +void +xfs_inode_shrinker_unregister( + struct xfs_mount *mp) +{ + down_write(&xfs_mount_list_lock); + list_del(&mp->m_mplist); + up_write(&xfs_mount_list_lock); } --- a/fs/xfs/linux-2.6/xfs_sync.h +++ b/fs/xfs/linux-2.6/xfs_sync.h @@ -54,6 +54,11 @@ void __xfs_inode_clear_reclaim_tag(struc int xfs_sync_inode_valid(struct xfs_inode *ip, struct xfs_perag *pag); int xfs_inode_ag_iterator(struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), - int flags, int tag, int write_lock); + int flags, int tag, int write_lock, int *nr_to_scan); + +void xfs_inode_shrinker_init(void); +void xfs_inode_shrinker_destroy(void); +void xfs_inode_shrinker_register(struct xfs_mount *mp); +void xfs_inode_shrinker_unregister(struct xfs_mount *mp); #endif --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -891,7 +891,8 @@ xfs_qm_dqrele_all_inodes( uint flags) { ASSERT(mp->m_quotainfo); - xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG, 0); + xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, + XFS_ICI_NO_TAG, 0, NULL); } /*------------------------------------------------------------------------*/ --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -229,6 +229,7 @@ typedef struct xfs_perag int pag_ici_init; /* incore inode cache initialised */ rwlock_t pag_ici_lock; /* incore inode lock */ struct radix_tree_root pag_ici_root; /* incore inode cache root */ + int pag_ici_reclaimable; /* reclaimable inodes */ #endif } xfs_perag_t; --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -257,6 +257,7 @@ typedef struct xfs_mount { wait_queue_head_t m_wait_single_sync_task; __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ + struct list_head m_mplist; /* inode shrinker mount list */ } xfs_mount_t; /* From greg@kroah.com Mon May 10 17:56:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4AMuGYA037565 for ; Mon, 10 May 2010 17:56:16 -0500 X-ASG-Debug-ID: 1273532307-27d400c00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from coco.kroah.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0CC00139F02E for ; Mon, 10 May 2010 15:58:27 -0700 (PDT) Received: from coco.kroah.org (kroah.org [198.145.64.141]) by cuda.sgi.com with ESMTP id zLGTx7PNFdQFlzbi for ; Mon, 10 May 2010 15:58:27 -0700 (PDT) Received: from localhost (c-24-16-163-131.hsd1.wa.comcast.net [24.16.163.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by coco.kroah.org (Postfix) with ESMTPSA id 5EE6F48F69; Mon, 10 May 2010 15:58:27 -0700 (PDT) X-Mailbox-Line: From gregkh@kvm.kroah.org Mon May 10 15:35:41 2010 Message-Id: <20100510223541.333994587@kvm.kroah.org> User-Agent: quilt/0.48-4.4 Date: Mon, 10 May 2010 15:35:29 -0700 From: Greg KH To: linux-kernel@vger.kernel.org, stable@kernel.org Cc: stable-review@kernel.org, torvalds@linux-foundation.org, akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk, xfs@oss.sgi.com, Dave Chinner X-ASG-Orig-Subj: [77/98] xfs: add a shrinker to background inode reclaim Subject: [77/98] xfs: add a shrinker to background inode reclaim In-Reply-To: <20100510223714.GA18416@kroah.com> X-Barracuda-Connect: kroah.org[198.145.64.141] X-Barracuda-Start-Time: 1273532309 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.2, rules version 3.2.2.29569 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean 2.6.32-stable review patch. If anyone has any objections, please let us know. ------------------ From: Dave Chinner commit 9bf729c0af67897ea8498ce17c29b0683f7f2028 upstream On low memory boxes or those with highmem, kernel can OOM before the background reclaims inodes via xfssyncd. Add a shrinker to run inode reclaim so that it inode reclaim is expedited when memory is low. This is more complex than it needs to be because the VM folk don't want a context added to the shrinker infrastructure. Hence we need to add a global list of XFS mount structures so the shrinker can traverse them. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Greg Kroah-Hartman --- fs/xfs/linux-2.6/xfs_super.c | 5 + fs/xfs/linux-2.6/xfs_sync.c | 107 ++++++++++++++++++++++++++++++++++++++--- fs/xfs/linux-2.6/xfs_sync.h | 7 ++ fs/xfs/quota/xfs_qm_syscalls.c | 3 - fs/xfs/xfs_ag.h | 1 fs/xfs/xfs_mount.h | 1 6 files changed, 115 insertions(+), 9 deletions(-) --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1164,6 +1164,7 @@ xfs_fs_put_super( xfs_unmountfs(mp); xfs_freesb(mp); + xfs_inode_shrinker_unregister(mp); xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); xfs_dmops_put(mp); @@ -1555,6 +1556,8 @@ xfs_fs_fill_super( if (error) goto fail_vnrele; + xfs_inode_shrinker_register(mp); + kfree(mtpt); xfs_itrace_exit(XFS_I(sb->s_root->d_inode)); @@ -1894,6 +1897,7 @@ init_xfs_fs(void) goto out_cleanup_procfs; vfs_initquota(); + xfs_inode_shrinker_init(); error = register_filesystem(&xfs_fs_type); if (error) @@ -1923,6 +1927,7 @@ exit_xfs_fs(void) { vfs_exitquota(); unregister_filesystem(&xfs_fs_type); + xfs_inode_shrinker_destroy(); xfs_sysctl_unregister(); xfs_cleanup_procfs(); xfs_buf_terminate(); --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -94,7 +94,8 @@ xfs_inode_ag_walk( struct xfs_perag *pag, int flags), int flags, int tag, - int exclusive) + int exclusive, + int *nr_to_scan) { struct xfs_perag *pag = &mp->m_perag[ag]; uint32_t first_index; @@ -134,7 +135,7 @@ restart: if (error == EFSCORRUPTED) break; - } while (1); + } while ((*nr_to_scan)--); if (skipped) { delay(1); @@ -152,23 +153,30 @@ xfs_inode_ag_iterator( struct xfs_perag *pag, int flags), int flags, int tag, - int exclusive) + int exclusive, + int *nr_to_scan) { int error = 0; int last_error = 0; xfs_agnumber_t ag; + int nr; + nr = nr_to_scan ? *nr_to_scan : INT_MAX; for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { if (!mp->m_perag[ag].pag_ici_init) continue; error = xfs_inode_ag_walk(mp, ag, execute, flags, tag, - exclusive); + exclusive, &nr); if (error) { last_error = error; if (error == EFSCORRUPTED) break; } + if (nr <= 0) + break; } + if (nr_to_scan) + *nr_to_scan = nr; return XFS_ERROR(last_error); } @@ -288,7 +296,7 @@ xfs_sync_data( ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, - XFS_ICI_NO_TAG, 0); + XFS_ICI_NO_TAG, 0, NULL); if (error) return XFS_ERROR(error); @@ -310,7 +318,7 @@ xfs_sync_attr( ASSERT((flags & ~SYNC_WAIT) == 0); return xfs_inode_ag_iterator(mp, xfs_sync_inode_attr, flags, - XFS_ICI_NO_TAG, 0); + XFS_ICI_NO_TAG, 0, NULL); } STATIC int @@ -678,6 +686,7 @@ __xfs_inode_set_reclaim_tag( radix_tree_tag_set(&pag->pag_ici_root, XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), XFS_ICI_RECLAIM_TAG); + pag->pag_ici_reclaimable++; } /* @@ -709,6 +718,7 @@ __xfs_inode_clear_reclaim_tag( { radix_tree_tag_clear(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); + pag->pag_ici_reclaimable--; } STATIC int @@ -769,5 +779,88 @@ xfs_reclaim_inodes( int mode) { return xfs_inode_ag_iterator(mp, xfs_reclaim_inode, mode, - XFS_ICI_RECLAIM_TAG, 1); + XFS_ICI_RECLAIM_TAG, 1, NULL); +} + +/* + * Shrinker infrastructure. + * + * This is all far more complex than it needs to be. It adds a global list of + * mounts because the shrinkers can only call a global context. We need to make + * the shrinkers pass a context to avoid the need for global state. + */ +static LIST_HEAD(xfs_mount_list); +static struct rw_semaphore xfs_mount_list_lock; + +static int +xfs_reclaim_inode_shrink( + int nr_to_scan, + gfp_t gfp_mask) +{ + struct xfs_mount *mp; + xfs_agnumber_t ag; + int reclaimable = 0; + + if (nr_to_scan) { + if (!(gfp_mask & __GFP_FS)) + return -1; + + down_read(&xfs_mount_list_lock); + list_for_each_entry(mp, &xfs_mount_list, m_mplist) { + xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0, + XFS_ICI_RECLAIM_TAG, 1, &nr_to_scan); + if (nr_to_scan <= 0) + break; + } + up_read(&xfs_mount_list_lock); + } + + down_read(&xfs_mount_list_lock); + list_for_each_entry(mp, &xfs_mount_list, m_mplist) { + for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { + + if (!mp->m_perag[ag].pag_ici_init) + continue; + reclaimable += mp->m_perag[ag].pag_ici_reclaimable; + } + } + up_read(&xfs_mount_list_lock); + return reclaimable; +} + +static struct shrinker xfs_inode_shrinker = { + .shrink = xfs_reclaim_inode_shrink, + .seeks = DEFAULT_SEEKS, +}; + +void __init +xfs_inode_shrinker_init(void) +{ + init_rwsem(&xfs_mount_list_lock); + register_shrinker(&xfs_inode_shrinker); +} + +void +xfs_inode_shrinker_destroy(void) +{ + ASSERT(list_empty(&xfs_mount_list)); + unregister_shrinker(&xfs_inode_shrinker); +} + +void +xfs_inode_shrinker_register( + struct xfs_mount *mp) +{ + down_write(&xfs_mount_list_lock); + list_add_tail(&mp->m_mplist, &xfs_mount_list); + up_write(&xfs_mount_list_lock); +} + +void +xfs_inode_shrinker_unregister( + struct xfs_mount *mp) +{ + down_write(&xfs_mount_list_lock); + list_del(&mp->m_mplist); + up_write(&xfs_mount_list_lock); } --- a/fs/xfs/linux-2.6/xfs_sync.h +++ b/fs/xfs/linux-2.6/xfs_sync.h @@ -54,6 +54,11 @@ void __xfs_inode_clear_reclaim_tag(struc int xfs_sync_inode_valid(struct xfs_inode *ip, struct xfs_perag *pag); int xfs_inode_ag_iterator(struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), - int flags, int tag, int write_lock); + int flags, int tag, int write_lock, int *nr_to_scan); + +void xfs_inode_shrinker_init(void); +void xfs_inode_shrinker_destroy(void); +void xfs_inode_shrinker_register(struct xfs_mount *mp); +void xfs_inode_shrinker_unregister(struct xfs_mount *mp); #endif --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -893,7 +893,8 @@ xfs_qm_dqrele_all_inodes( uint flags) { ASSERT(mp->m_quotainfo); - xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG, 0); + xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, + XFS_ICI_NO_TAG, 0, NULL); } /*------------------------------------------------------------------------*/ --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -215,6 +215,7 @@ typedef struct xfs_perag int pag_ici_init; /* incore inode cache initialised */ rwlock_t pag_ici_lock; /* incore inode lock */ struct radix_tree_root pag_ici_root; /* incore inode cache root */ + int pag_ici_reclaimable; /* reclaimable inodes */ #endif } xfs_perag_t; --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -243,6 +243,7 @@ typedef struct xfs_mount { wait_queue_head_t m_wait_single_sync_task; __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ + struct list_head m_mplist; /* inode shrinker mount list */ } xfs_mount_t; /* From bjcbsoft@126.com Tue May 11 02:04:11 2010 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4B749wM071590 for ; Tue, 11 May 2010 02:04:10 -0500 X-ASG-Debug-ID: 1273561201-211f00360000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from nvna.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8D3623331D0 for ; Tue, 11 May 2010 00:00:01 -0700 (PDT) Received: from nvna.com ([114.249.129.205]) by cuda.sgi.com with ESMTP id CdOr9MGUu1SYSGLH for ; Tue, 11 May 2010 00:00:01 -0700 (PDT) Received: from apz (unknown [148.246.231.88]) by smtp83(tfbx) with SMTP id c0rnpVAzTzcT1uR3.1 for ; Tue, 11 May 2010 15:01:37 +0800 (CST) X-Originating-IP: [148.246.231.88] Message-ID: <004763058442$11441840$41538655@apz> Sender: bjcbsoft@126.com From: "http://wk.bjcbsoft.com" To: X-ASG-Orig-Subj: =?gb2312?B?pc2lw6XI2JyJ06TL1qfUrg==?= Subject: =?gb2312?B?pc2lw6XI2JyJ06TL1qfUrg==?= Date: Tue, 11 May 2010 15:01:28 +0800 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0B51_01F1E7FE.15545FD0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5579 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579 Disposition-Notification-To: zhengqx81@gmail.com X-Barracuda-Connect: UNKNOWN[114.249.129.205] X-Barracuda-Start-Time: 1273561577 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. ------=_NextPart_000_0B51_01F1E7FE.15545FD0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_001_0235_01F1E7FE.15545FD0" ------=_NextPart_001_0235_01F1E7FE.15545FD0 Content-Type: multipart/alternative; boundary="----=_NextPart_002_04A5_01F1E7FE.15545FD0" ------=_NextPart_002_04A5_01F1E7FE.15545FD0 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 DQqkz6TKpN+kzaTOterpTA0KpKrGo6TsmJSkx6S5oaKxsb6pssWyqaW9pdWlyKTOhtOYSbWjtbGk x6Giyqm52tK7pMjJ6qS3pN6kuaGjDQqlzaXDpcikx6TO2JyJ06TPpKSk7aSkpO2kyoaW7n2krKSi pOqk3qS5pM2ho6WypbmlyKS1pPOkz6W1paSlyKTLwLSkxqTioaKwpN7ZpMqkyaTipMekraTepLuk 86GjpL2k7KTLoaLJzMa3pPLUlKS3pK/ChKStpL+kpKTOiPa6z6GipbWlpKXIyc+kztVow/ekyLut z/Gkt6SrpMqkpKTyz96k6qGipc2lw6XIpM7fXIbT1d+kyKS3pMahoqWypbmlyKS1pPOkq6TppM7X 1LBrtcSkyoaWpKS6z6TvpLuk8rT9pMTS1M3ioaKk26SrpMukz6THpK2k66SzpMikrLrOpOKkoqTq pN6ku6TzoaOkvaSmpLmk66TIoaKEv8LKtc3PwqTPrEaMZ6TOpLOkyKTHpLmho9V7lsuky6TopOuk yKGipL+kwKO1o6WkzsjLpM+ltaWkpcjfXIbT1d+ky99CvWqkuaTr7oqkpqTys9akw6TGpKSk66Gj k1HR1KS5pOyk0KGimrDI1aO5o7WjpaTOpbKluaXIpM/Kp6TDpMakt6TepKSk3qS3pL+how0KsdfJ 56TPvfGhoqG4zfq/zaG5o6ikqqSmpK2k46Svo6mkyKSkpKaPisGmpcSpYKXrpPKfb8HPpMekqtSH pLek8szhuamkt6TGpKSk3qS5oaPW96TL0tTPwplDxNyk8ri2pKSkxqTepLmhow0Ko7GhoqWypbml yKS1pPOkrKW1paSlyKTL18Wkv6TpoaKkuaSw1qqk6qTepLmhow0Ko7Khory0lXK9u8H3oaOkqr/N pLWk86TPus6kq9l8hpakrKSipMOkv6TpoaK1sZVypMvChKSvpLOkyKSspMekraTGoaK3tcrCpOLN rJVyoaOks6TOpOikpqTLoaKGlqSkus+k76S7pMukq6SrpOuVculnpPK087f5pMvPwqSypOuhow0K o7OhotRMhpaktaTspOul2qlgpbikrLfWpKuk66Gj19S31qTOteqkztbQpMehoqTJpM7JzMa3pM/I y5rdpKykoqTrpKuhoqTJpM7JzMa3pM/Iy5rdpKzJ2aTKpKSkq7qGhWeky7fWpKuk66GjDQqjtKGi pMmks6SrpOm31qSrpOuho6TJpPOkyqWtqWCl76lgpcmkx5fKy/ekt6TGpbWlpKXIpMvAtKTrpKuh oqS9pOykyKTiobhnb29nbGWhuaSroaKhuHlhaG9vobmkq8q5pMOkxpfKy/ekuaTrpLOkyKTit9ak q6TroaOltaWkpcikzlNFT6TLpOik6sP3tF+kx6StpOuhow0KpLOkzqO0pMSkz9fupOLW+qSrpOuZ Q8TcpMCkyMu8pKSk3qS5pKyhoqTbpKukzqSkpKSZQ8TcpOKkoqTqpN6kuaGjpL+kyKSopNClxqXs pdPritSSoaKl1aWhpaSl66Tk0LTV5tyey82hoqTKpLik36TOv83XUoRlpMqkyaGj0qqkuaTrpMuh oqTIpMak4qSqtcOkyqXEqWCl66TAoaOkvaTspMuhosq5pKaks6TIpOK6hoVnpMekuaGjpaSl86W5 pcipYKXrpOKyu9KqpMqzzLbIoaMNCqTHpM+hosVkzrakrKSipOyk0KGisdfJ56TOpdqpYKW4o7po dHRwOi8vd2suYmpjYnNvZnQuY29tL3Rlc3Quc2h0bWyhoaTHpKrUh6S3pMujoQ0KzOXyWaTLpMSk pKTGytbtmKO6oaHM7bi2pdWloaWkpeukzqG4cmVhZG1lLnhsc6G5pPLpX6Svo6hwYXNzd29yZDpj YnNvZnSjqaGhPT0+ICDM7bi2pdWloaWkpeukzqG4zfq/zS5leGWhuaTyjGfQ0KOocGFzc3dvcmQ6 Y2Jzb2Z0o6kgID09PiAgyc/Tm6TOSFCk8tRMhpahoT09PiAgT0sNCszl8lmkuaTrlXKhorrOpKu3 1qSrpOqky6SvpKSkyKSzpO2krKSipOyk0KGius6kq4aW7n2krKSipOyk0KGipKqa3d1YpMvLvaTe pMffQr1qpLekxqSvpMCktaSkoaMNCszl8lmkt6S/4eGhorj3mUPE3KTypOikr8q5pMOkv+HhoaKh uM36v82huaTy2UaltaWkpciky6WipcOl16XtqWClyaS3pMak26S3pKSkzoj2us+hoqTepL/LvaTe pMffQr1qpK+kwKS1pKShow0Kzfq/zYH9uPGjuqOxgoDPr6Gho7KjsqO4o7CjsIPSL9TCDQrS1MnP pMekuaGjDQqk6KTtpLekr6Sq7oqkpKSkpL+kt6TepLmhow0KDQogDQoNCioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCsqpoaG52tK7ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IA0KsbG+qbLFsqmlvaXVpcggICAgICAgICAgICAgICAgICAgICAgIA0Kpc2lw6XI2JyJ06TLsePA +6TyzOG5qaS3pMakqqTqpN6kuaTopKYgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIA0KsbG+qcrQuqO17cf4zvfI/cbsmPKWfL3w0eC4b6XTpes0MjahoTEwMDA5Ng0K VGVsOis4Ni0xMC01MTU1LTk1MjA7ICAgICAgICAgICAgICANCk1vYmlsZTorODYtMTM1LTgxODIt MDQ1MCAgICAgICAgICAgICAgDQpob21lcGFnZTp3d3cuYmpjYnNvZnQuY29tICAgICAgICAgICAg ICAgICAgDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCg0K DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA= ------=_NextPart_002_04A5_01F1E7FE.15545FD0 Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRl eHQvaHRtbDsgY2hhcnNldD1nYjIzMTIiPg0KPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjkw MC41OTQ1IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+DQo8Qk9EWSBiZ0NvbG9yPSNlYWVhZWE+DQo8 Q0VOVEVSPjxCUj4NCjxUQUJMRSANCnN0eWxlPSJCT1JERVItUklHSFQ6ICNmZjczMDAgNXB4IHNv bGlkOyBCT1JERVItVE9QOiAjZmY3MzAwIDEwcHggc29saWQ7IEJPUkRFUi1MRUZUOiAjZmY3MzAw IDVweCBzb2xpZDsgV0lEVEg6IDYzOHB4OyBCT1JERVItQk9UVE9NOiAjZmY3MzAwIDVweCBzb2xp ZDsgSEVJR0hUOiAxMTI0cHgiIA0KY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIHdpZHRoPTYz OCBib3JkZXI9MD4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIGFsaWduPW1pZGRsZSBiZ0Nv bG9yPSNmZmZmZmY+DQogICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIHdp ZHRoPSIxMDAlIiBib3JkZXI9MD4NCiAgICAgICAgPFRCT0RZPg0KICAgICAgICA8VFI+DQogICAg ICAgICAgPFREIHZBbGlnbj10b3Agd2lkdGg9IjIlIiANCiAgICAgICAgICBiYWNrZ3JvdW5kPWh0 dHA6Ly9pbWcuY2hpbmEuYWxpYmFiYS5jb20vaW1hZ2VzL2NuL290aGVycy9lbWFpbC9tYWlsX2xl ZnQuZ2lmPjxJTUcgDQogICAgICAgICAgICBzdHlsZT0iV0lEVEg6IDUxcHg7IEhFSUdIVDogNDRw eCIgYWx0PSIiIGhzcGFjZT0wIA0KICAgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LmJqY2Jzb2Z0 LmNvbS9tYWlsL2ltYWdlcy9tYWlsX21hcmsuZ2lmIiBib3JkZXI9MD48L1REPg0KICAgICAgICAg IDxURCB3aWR0aD0iOTglIj4NCiAgICAgICAgICAgIDxUQUJMRSBjbGFzcz1Nc29Ob3JtYWxUYWJs ZSANCiAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBCT1JERVIt VE9QOiBtZWRpdW0gbm9uZTsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBXSURUSDogNDIzLjZw dDsgQk9SREVSLUJPVFRPTTogbWVkaXVtIG5vbmU7IEJPUkRFUi1DT0xMQVBTRTogY29sbGFwc2U7 IG1zby1ib3JkZXItdG9wLWFsdDogc29saWQgI0Y3OTY0NiAxLjBwdDsgbXNvLWJvcmRlci10b3At dGhlbWVjb2xvcjogYWNjZW50NjsgbXNvLWJvcmRlci1ib3R0b20tYWx0OiBzb2xpZCAjRjc5NjQ2 IDEuMHB0OyBtc28tYm9yZGVyLWJvdHRvbS10aGVtZWNvbG9yOiBhY2NlbnQ2OyBtc28teWZ0aS10 Ymxsb29rOiAxMTg0OyBtc28tcGFkZGluZy1hbHQ6IDBjbSA1LjRwdCAwY20gNS40cHQiIA0KICAg ICAgICAgICAgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIHdpZHRoPTU2NSBib3JkZXI9MT4N CiAgICAgICAgICAgICAgPFRCT0RZPg0KICAgICAgICAgICAgICA8VFIgDQogICAgICAgICAgICAg IHN0eWxlPSJtc28teWZ0aS1pcm93OiAwOyBtc28teWZ0aS1maXJzdHJvdzogeWVzOyBtc28teWZ0 aS1sYXN0cm93OiB5ZXMiPg0KICAgICAgICAgICAgICAgIDxURCANCiAgICAgICAgICAgICAgICBz dHlsZT0iQk9SREVSLVJJR0hUOiAjZWNlOWQ4OyBQQURESU5HLVJJR0hUOiA1LjRwdDsgQk9SREVS LVRPUDogI2Y3OTY0NiAxcHQgc29saWQ7IFBBRERJTkctTEVGVDogNS40cHQ7IFBBRERJTkctQk9U VE9NOiAwY207IEJPUkRFUi1MRUZUOiAjZWNlOWQ4OyBXSURUSDogNDIzLjZwdDsgUEFERElORy1U T1A6IDBjbTsgQk9SREVSLUJPVFRPTTogI2Y3OTY0NiAxcHQgc29saWQ7IEJBQ0tHUk9VTkQtQ09M T1I6IHRyYW5zcGFyZW50OyBtc28tYm9yZGVyLXRvcC10aGVtZWNvbG9yOiBhY2NlbnQ2OyBtc28t Ym9yZGVyLWJvdHRvbS10aGVtZWNvbG9yOiBhY2NlbnQ2IiANCiAgICAgICAgICAgICAgICB2QWxp Z249dG9wIHdpZHRoPTU2NT4NCiAgICAgICAgICAgICAgICAgIDxQIGNsYXNzPU1zb05vcm1hbCAN CiAgICAgICAgICAgICAgICAgIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0OyBMSU5FLUhFSUdI VDogMjAwJTsgVEVYVC1BTElHTjogbGVmdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIg DQogICAgICAgICAgICAgICAgICBhbGlnbj1sZWZ0PjxTUEFOIA0KICAgICAgICAgICAgICAgICAg c3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICM1OTU5NTk7IExJTkUtSEVJR0hUOiAyMDAl OyBGT05ULUZBTUlMWTogy87M5TsgbXNvLXRoZW1lY29sb3I6IHRleHQxOyBtc28tdGhlbWV0aW50 OiAxNjY7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDLzszlOyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7 IG1zby1iaWRpLWZvbnQtd2VpZ2h0OiBib2xkIj6kz6TKpN+kzaTOterpTDwvU1BBTj48U1BBTiAN CiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVMgDQogICAgICAgICAgICAgICAgICBzdHlsZT0i Rk9OVC1TSVpFOiAxMnB0OyBDT0xPUjogIzU5NTk1OTsgTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQt RkFNSUxZOiDLzszlOyBtc28tdGhlbWVjb2xvcjogdGV4dDE7IG1zby10aGVtZXRpbnQ6IDE2Njsg bXNvLWJpZGktZm9udC1mYW1pbHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJp ZGktZm9udC13ZWlnaHQ6IGJvbGQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCiAgICAgICAgICAg ICAgICAgIDxQIGNsYXNzPU1zb05vcm1hbCANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJNQVJH SU46IDBjbSAwY20gMHB0OyBMSU5FLUhFSUdIVDogMjAwJTsgVEVYVC1BTElHTjogbGVmdDsgbXNv LXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQogICAgICAgICAgICAgICAgICBhbGlnbj1sZWZ0 PjxTUEFOIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6 ICM1OTU5NTk7IExJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogy87M5TsgbXNvLXRoZW1l Y29sb3I6IHRleHQxOyBtc28tdGhlbWV0aW50OiAxNjY7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDL zszlOyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtd2VpZ2h0OiBib2xkIj6k qsajpOyYlKTHpLmhorGxvqmyxbKppb2l1aXIpM6G05hJtaO1saTHoaLKqbna0rukyMnqpLek3qS5 oaM8L1NQQU4+PFNQQU4gDQogICAgICAgICAgICAgICAgICBsYW5nPUVOLVVTIA0KICAgICAgICAg ICAgICAgICAgc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgQ09MT1I6ICM1OTU5NTk7IExJTkUtSEVJ R0hUOiAyMDAlOyBGT05ULUZBTUlMWTogy87M5TsgbXNvLXRoZW1lY29sb3I6IHRleHQxOyBtc28t dGhlbWV0aW50OiAxNjY7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDLzszlOyBtc28tZm9udC1rZXJu aW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtd2VpZ2h0OiBib2xkIj48bzpwPjwvbzpwPjwvU1BBTj48 L1A+DQogICAgICAgICAgICAgICAgICA8UCBjbGFzcz1Nc29Ob3JtYWwgDQogICAgICAgICAgICAg ICAgICBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdDsgTElORS1IRUlHSFQ6IDIwMCU7IFRFWFQt QUxJR046IGxlZnQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KICAgICAgICAgICAg ICAgICAgYWxpZ249bGVmdD48U1BBTiANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJGT05ULVNJ WkU6IDEwcHQ7IENPTE9SOiAjNTk1OTU5OyBMSU5FLUhFSUdIVDogMjAwJTsgRk9OVC1GQU1JTFk6 IMvOzOU7IG1zby10aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXRoZW1ldGludDogMTY2OyBtc28tYmlk aS1mb250LWZhbWlseTogy87M5TsgbXNvLWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250 LXdlaWdodDogYm9sZCI+pc2lw6XIpMekzticidOkz6SkpO2kpKTtpMqGlu59pKykoqTqpN6kuaTN oaOlsqW5pciktaTzpM+ltaWkpciky8C0pMak4qGisKTe2aTKpMmk4qTHpK2k3qS7pPOho6S9pOyk y6GiyczGt6Ty1JSkt6SvwoSkraS/pKSkzoj2us+hoqW1paSlyMnPpM7VaMP3pMi7rc/xpLekq6TK pKSk8s/epOqhoqXNpcOlyKTO31yG09XfpMikt6TGoaKlsqW5pciktaTzpKuk6aTO19Swa7XEpMqG lqSkus+k76S7pPK0/aTE0tTN4qGipNukq6TLpM+kx6StpOuks6TIpKy6zqTipKKk6qTepLuk86Gj pL2kpqS5pOukyKGihL/CyrXNz8Kkz6xGjGekzqSzpMikx6S5oaPVe5bLpMuk6KTrpMihoqS/pMCj taOlpM7Iy6TPpbWlpKXI31yG09XfpMvfQr1qpLmk6+6KpKak8rPWpMOkxqSkpOuho5NR0dSkuaTs pNChopqwyNWjuaO1o6WkzqWypbmlyKTPyqekw6TGpLek3qSkpN6kt6S/oaM8L1NQQU4+PFNQQU4g DQogICAgICAgICAgICAgICAgICBsYW5nPUVOLVVTIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9 IkZPTlQtU0laRTogMTJwdDsgQ09MT1I6ICM1OTU5NTk7IExJTkUtSEVJR0hUOiAyMDAlOyBGT05U LUZBTUlMWTogy87M5TsgbXNvLXRoZW1lY29sb3I6IHRleHQxOyBtc28tdGhlbWV0aW50OiAxNjY7 IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDLzszlOyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IG1zby1i aWRpLWZvbnQtd2VpZ2h0OiBib2xkIj48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQogICAgICAgICAg ICAgICAgICA8UCBjbGFzcz1Nc29Ob3JtYWwgDQogICAgICAgICAgICAgICAgICBzdHlsZT0iTUFS R0lOOiAwY20gMGNtIDBwdDsgTElORS1IRUlHSFQ6IDIwMCU7IFRFWFQtQUxJR046IGxlZnQ7IG1z by1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KICAgICAgICAgICAgICAgICAgYWxpZ249bGVm dD48U1BBTiANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9S OiAjNTk1OTU5OyBMSU5FLUhFSUdIVDogMjAwJTsgRk9OVC1GQU1JTFk6IMvOzOU7IG1zby10aGVt ZWNvbG9yOiB0ZXh0MTsgbXNvLXRoZW1ldGludDogMTY2OyBtc28tYmlkaS1mb250LWZhbWlseTog y87M5TsgbXNvLWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LXdlaWdodDogYm9sZCI+ sdfJ56TPvfGhoqG4zfq/zaG5o6ikqqSmpK2k46Svo6mkyKSkpKaPisGmpcSpYKXrpPKfb8HPpMek qtSHpLek8szhuamkt6TGpKSk3qS5oaPW96TL0tTPwplDxNyk8ri2pKSkxqTepLmhozwvU1BBTj48 U1BBTiANCiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVMgDQogICAgICAgICAgICAgICAgICBz dHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBDT0xPUjogIzU5NTk1OTsgTElORS1IRUlHSFQ6IDIwMCU7 IEZPTlQtRkFNSUxZOiDLzszlOyBtc28tdGhlbWVjb2xvcjogdGV4dDE7IG1zby10aGVtZXRpbnQ6 IDE2NjsgbXNvLWJpZGktZm9udC1mYW1pbHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDBwdDsg bXNvLWJpZGktZm9udC13ZWlnaHQ6IGJvbGQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCiAgICAg ICAgICAgICAgICAgIDxQIGNsYXNzPU1zb05vcm1hbCANCiAgICAgICAgICAgICAgICAgIHN0eWxl PSJNQVJHSU46IDBjbSAwY20gMHB0OyBMSU5FLUhFSUdIVDogMjAwJTsgVEVYVC1BTElHTjogbGVm dDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQogICAgICAgICAgICAgICAgICBhbGln bj1sZWZ0PjxTUEFOIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsg Q09MT1I6ICM1OTU5NTk7IExJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogy87M5TsgbXNv LXRoZW1lY29sb3I6IHRleHQxOyBtc28tdGhlbWV0aW50OiAxNjY7IG1zby1iaWRpLWZvbnQtZmFt aWx5OiDLzszlOyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtd2VpZ2h0OiBi b2xkIj6jsTxTUEFOIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz6hojwvU1BBTj6lsqW5 pciktaTzpKyltaWkpciky9fFpL+k6aGipLmksNaqpOqk3qS5oaM8L1NQQU4+PFNQQU4gDQogICAg ICAgICAgICAgICAgICBsYW5nPUVOLVVTIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9IkZPTlQt U0laRTogMTJwdDsgQ09MT1I6ICM1OTU5NTk7IExJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlM WTogy87M5TsgbXNvLXRoZW1lY29sb3I6IHRleHQxOyBtc28tdGhlbWV0aW50OiAxNjY7IG1zby1i aWRpLWZvbnQtZmFtaWx5OiDLzszlOyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZv bnQtd2VpZ2h0OiBib2xkIj48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQogICAgICAgICAgICAgICAg ICA8UCBjbGFzcz1Nc29Ob3JtYWwgDQogICAgICAgICAgICAgICAgICBzdHlsZT0iTUFSR0lOOiAw Y20gMGNtIDBwdDsgTElORS1IRUlHSFQ6IDIwMCU7IFRFWFQtQUxJR046IGxlZnQ7IG1zby1wYWdp bmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KICAgICAgICAgICAgICAgICAgYWxpZ249bGVmdD48U1BB TiANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjNTk1 OTU5OyBMSU5FLUhFSUdIVDogMjAwJTsgRk9OVC1GQU1JTFk6IMvOzOU7IG1zby10aGVtZWNvbG9y OiB0ZXh0MTsgbXNvLXRoZW1ldGludDogMTY2OyBtc28tYmlkaS1mb250LWZhbWlseTogy87M5Tsg bXNvLWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LXdlaWdodDogYm9sZCI+o7I8U1BB TiANCiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVM+oaI8L1NQQU4+vLSVcr27wfeho6Sqv82k taTzpM+6zqSr2XyGlqSspKKkw6S/pOmhorWxlXKky8KEpK+ks6TIpKykx6StpMahore1ysKk4s2s lXKho6SzpM6k6KSmpMuhooaWpKS6z6TvpLuky6SrpKuk65Vy6Wek8rTzt/mky8/CpLKk66GjPC9T UEFOPjxTUEFOIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUyANCiAgICAgICAgICAgICAg ICAgIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IENPTE9SOiAjNTk1OTU5OyBMSU5FLUhFSUdIVDog MjAwJTsgRk9OVC1GQU1JTFk6IMvOzOU7IG1zby10aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXRoZW1l dGludDogMTY2OyBtc28tYmlkaS1mb250LWZhbWlseTogy87M5TsgbXNvLWZvbnQta2VybmluZzog MHB0OyBtc28tYmlkaS1mb250LXdlaWdodDogYm9sZCI+PG86cD48L286cD48L1NQQU4+PC9QPg0K ICAgICAgICAgICAgICAgICAgPFAgY2xhc3M9TXNvTm9ybWFsIA0KICAgICAgICAgICAgICAgICAg c3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQ7IExJTkUtSEVJR0hUOiAyMDAlOyBURVhULUFMSUdO OiBsZWZ0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCiAgICAgICAgICAgICAgICAg IGFsaWduPWxlZnQ+PFNQQU4gDQogICAgICAgICAgICAgICAgICBzdHlsZT0iRk9OVC1TSVpFOiAx MHB0OyBDT0xPUjogIzU5NTk1OTsgTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiDLzszl OyBtc28tdGhlbWVjb2xvcjogdGV4dDE7IG1zby10aGVtZXRpbnQ6IDE2NjsgbXNvLWJpZGktZm9u dC1mYW1pbHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9udC13ZWln aHQ6IGJvbGQiPqOzPFNQQU4gDQogICAgICAgICAgICAgICAgICBsYW5nPUVOLVVTPqGiPC9TUEFO PtRMhpaktaTspOul2qlgpbikrLfWpKuk66Gj19S31qTOteqkztbQpMehoqTJpM7JzMa3pM/Iy5rd pKykoqTrpKuhoqTJpM7JzMa3pM/Iy5rdpKzJ2aTKpKSkq7qGhWeky7fWpKuk66GjPC9TUEFOPjxT UEFOIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUyANCiAgICAgICAgICAgICAgICAgIHN0 eWxlPSJGT05ULVNJWkU6IDEycHQ7IENPTE9SOiAjNTk1OTU5OyBMSU5FLUhFSUdIVDogMjAwJTsg Rk9OVC1GQU1JTFk6IMvOzOU7IG1zby10aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXRoZW1ldGludDog MTY2OyBtc28tYmlkaS1mb250LWZhbWlseTogy87M5TsgbXNvLWZvbnQta2VybmluZzogMHB0OyBt c28tYmlkaS1mb250LXdlaWdodDogYm9sZCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KICAgICAg ICAgICAgICAgICAgPFAgY2xhc3M9TXNvTm9ybWFsIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9 Ik1BUkdJTjogMGNtIDBjbSAwcHQ7IExJTkUtSEVJR0hUOiAyMDAlOyBURVhULUFMSUdOOiBsZWZ0 OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCiAgICAgICAgICAgICAgICAgIGFsaWdu PWxlZnQ+PFNQQU4gDQogICAgICAgICAgICAgICAgICBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBD T0xPUjogIzU5NTk1OTsgTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiDLzszlOyBtc28t dGhlbWVjb2xvcjogdGV4dDE7IG1zby10aGVtZXRpbnQ6IDE2NjsgbXNvLWJpZGktZm9udC1mYW1p bHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9udC13ZWlnaHQ6IGJv bGQiPqO0oaKkyaSzpKuk6bfWpKuk66GjpMmk86TKpa2pYKXvqWClyaTHl8rL96S3pMaltaWkpcik y8C0pOukq6GipL2k7KTIpOKhuDxTUEFOIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz5n b29nbGU8L1NQQU4+obmkq6Giobg8U1BBTiANCiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVM+ eWFob288L1NQQU4+obmkq8q5pMOkxpfKy/ekuaTrpLOkyKTit9akq6TroaOltaWkpcikzjxTUEFO IA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz5TRU88L1NQQU4+pMuk6KTqw/e0X6THpK2k 66GjPC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgDQogICAgICAgICAgICAgICAgICBzdHlsZT0iRk9O VC1TSVpFOiAxMnB0OyBDT0xPUjogIzU5NTk1OTsgTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFN SUxZOiDLzszlOyBtc28tdGhlbWVjb2xvcjogdGV4dDE7IG1zby10aGVtZXRpbnQ6IDE2NjsgbXNv LWJpZGktZm9udC1mYW1pbHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGkt Zm9udC13ZWlnaHQ6IGJvbGQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCiAgICAgICAgICAgICAg ICAgIDxQIGNsYXNzPU1zb05vcm1hbCANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJNQVJHSU46 IDBjbSAwY20gMHB0OyBMSU5FLUhFSUdIVDogMjAwJTsgVEVYVC1BTElHTjogbGVmdDsgbXNvLXBh Z2luYXRpb246IHdpZG93LW9ycGhhbiIgDQogICAgICAgICAgICAgICAgICBhbGlnbj1sZWZ0PjxT UEFOIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICM1 OTU5NTk7IExJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogy87M5TsgbXNvLXRoZW1lY29s b3I6IHRleHQxOyBtc28tdGhlbWV0aW50OiAxNjY7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDLzszl OyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtd2VpZ2h0OiBib2xkIj6ks6TO o7SkxKTP1+6k4tb6pKuk65lDxNykwKTIy7ykpKTepLmkrKGipNukq6TOpKSkpJlDxNyk4qSipOqk 3qS5oaOkv6TIpKik0KXGpeyl0+uK1JKhoqXVpaGlpKXrpOTQtNXm3J7LzaGipMqkuKTfpM6/zddS hGWkyqTJoaPSqqS5pOuky6GipMikxqTipKq1w6TKpcSpYKXrpMCho6S9pOyky6GiyrmkpqSzpMik 4rqGhWekx6S5oaOlpKXzpbmlyKlgpeuk4rK70qqkyrPMtsihozwvU1BBTj48U1BBTiANCiAgICAg ICAgICAgICAgICAgIGxhbmc9RU4tVVMgDQogICAgICAgICAgICAgICAgICBzdHlsZT0iRk9OVC1T SVpFOiAxMnB0OyBDT0xPUjogIzU5NTk1OTsgTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZ OiDLzszlOyBtc28tdGhlbWVjb2xvcjogdGV4dDE7IG1zby10aGVtZXRpbnQ6IDE2NjsgbXNvLWJp ZGktZm9udC1mYW1pbHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9u dC13ZWlnaHQ6IGJvbGQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCiAgICAgICAgICAgICAgICAg IDxQIGNsYXNzPU1zb05vcm1hbCANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJNQVJHSU46IDBj bSAwY20gMHB0OyBMSU5FLUhFSUdIVDogMjAwJTsgVEVYVC1BTElHTjogbGVmdDsgbXNvLXBhZ2lu YXRpb246IHdpZG93LW9ycGhhbiIgDQogICAgICAgICAgICAgICAgICBhbGlnbj1sZWZ0PjxTUEFO IA0KICAgICAgICAgICAgICAgICAgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICM1OTU5 NTk7IExJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogy87M5TsgbXNvLXRoZW1lY29sb3I6 IHRleHQxOyBtc28tdGhlbWV0aW50OiAxNjY7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDLzszlOyBt c28tZm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtd2VpZ2h0OiBib2xkIj6kx6TPoaLF ZM62pKykoqTspNChorHXyeekzqXaqWCluKO6PFNQQU4gDQogICAgICAgICAgICAgICAgICBsYW5n PUVOLVVTPjxBIGhyZWY9Imh0dHA6Ly93ay5iamNic29mdC5jb20vdGVzdC5zaHRtbCI+PFNQQU4g DQogICAgICAgICAgICAgICAgICBzdHlsZT0iQ09MT1I6IHdpbmRvd3RleHQ7IExJTkUtSEVJR0hU OiAyMDAlOyBURVhULURFQ09SQVRJT046IG5vbmU7IHRleHQtdW5kZXJsaW5lOiBub25lOyBtc28t YmlkaS1mb250LXNpemU6IDExLjBwdCI+aHR0cDovL3drLmJqY2Jzb2Z0LmNvbS90ZXN0LnNodG1s PC9TUEFOPjwvQT48L1NQQU4+oaGkx6Sq1Iekt6TLo6E8L1NQQU4+PFNQQU4gDQogICAgICAgICAg ICAgICAgICBsYW5nPUVOLVVTIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9IkZPTlQtU0laRTog MTJwdDsgQ09MT1I6ICM1OTU5NTk7IExJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogy87M 5TsgbXNvLXRoZW1lY29sb3I6IHRleHQxOyBtc28tdGhlbWV0aW50OiAxNjY7IG1zby1iaWRpLWZv bnQtZmFtaWx5OiDLzszlOyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtd2Vp Z2h0OiBib2xkIj48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQogICAgICAgICAgICAgICAgICA8UCBj bGFzcz1Nc29Ob3JtYWwgDQogICAgICAgICAgICAgICAgICBzdHlsZT0iTUFSR0lOOiAwY20gMGNt IDBwdDsgTElORS1IRUlHSFQ6IDIwMCU7IFRFWFQtQUxJR046IGxlZnQ7IG1zby1wYWdpbmF0aW9u OiB3aWRvdy1vcnBoYW4iIA0KICAgICAgICAgICAgICAgICAgYWxpZ249bGVmdD48U1BBTiANCiAg ICAgICAgICAgICAgICAgIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjNTk1OTU5OyBM SU5FLUhFSUdIVDogMjAwJTsgRk9OVC1GQU1JTFk6IMvOzOU7IG1zby10aGVtZWNvbG9yOiB0ZXh0 MTsgbXNvLXRoZW1ldGludDogMTY2OyBtc28tYmlkaS1mb250LWZhbWlseTogy87M5TsgbXNvLWZv bnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LXdlaWdodDogYm9sZCI+zOXyWaTLpMSkpKTG ytbtmKO6oaHM7bi2pdWloaWkpeukzqG4PFNQQU4gDQogICAgICAgICAgICAgICAgICBsYW5nPUVO LVVTPnJlYWRtZS54bHM8L1NQQU4+obmk8ulfpK+jqDxTUEFOIA0KICAgICAgICAgICAgICAgICAg bGFuZz1FTi1VUz5wYXNzd29yZDpjYnNvZnQ8L1NQQU4+o6mhoTxTUEFOIA0KICAgICAgICAgICAg ICAgICAgbGFuZz1FTi1VUz49PSZndDsmbmJzcDsgPC9TUEFOPsztuLal1aWhpaSl66TOobjN+r/N PFNQQU4gDQogICAgICAgICAgICAgICAgICBsYW5nPUVOLVVTPi5leGU8L1NQQU4+obmk8oxn0NCj qDxTUEFOIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz5wYXNzd29yZDpjYnNvZnQ8L1NQ QU4+o6k8U1BBTiBsYW5nPUVOLVVTPiZuYnNwOyANCiAgICAgICAgICAgICAgICAgID09Jmd0OyZu YnNwOyA8L1NQQU4+yc/Tm6TOPFNQQU4gbGFuZz1FTi1VUz5IUDwvU1BBTj6k8tRMhpahoTxTUEFO IA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz49PSZndDsmbmJzcDsgT0s8L1NQQU4+PC9T UEFOPjxTUEFOIGxhbmc9RU4tVVMgDQogICAgICAgICAgICAgICAgICBzdHlsZT0iRk9OVC1TSVpF OiAxMnB0OyBDT0xPUjogIzU5NTk1OTsgTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiDL zszlOyBtc28tdGhlbWVjb2xvcjogdGV4dDE7IG1zby10aGVtZXRpbnQ6IDE2NjsgbXNvLWJpZGkt Zm9udC1mYW1pbHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9udC13 ZWlnaHQ6IGJvbGQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCiAgICAgICAgICAgICAgICAgIDxQ IGNsYXNzPU1zb05vcm1hbCANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJNQVJHSU46IDBjbSAw Y20gMHB0OyBMSU5FLUhFSUdIVDogMjAwJTsgVEVYVC1BTElHTjogbGVmdDsgbXNvLXBhZ2luYXRp b246IHdpZG93LW9ycGhhbiIgDQogICAgICAgICAgICAgICAgICBhbGlnbj1sZWZ0PjxTUEFOIA0K ICAgICAgICAgICAgICAgICAgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICM1OTU5NTk7 IExJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogy87M5TsgbXNvLXRoZW1lY29sb3I6IHRl eHQxOyBtc28tdGhlbWV0aW50OiAxNjY7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDLzszlOyBtc28t Zm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtd2VpZ2h0OiBib2xkIj7M5fJZpLmk65Vy oaK6zqSrt9akq6TqpMukr6SkpMiks6TtpKykoqTspNChorrOpKuGlu59pKykoqTspNChoqSqmt3d WKTLy72k3qTH30K9aqS3pMakr6TApLWkpKGjPFNQQU4gDQogICAgICAgICAgICAgICAgICBsYW5n PUVOLVVTPjxCUj48L1NQQU4+zOXyWaS3pL/h4aGiuPeZQ8TcpPKk6KSvyrmkw6S/4eGhoqG4zfq/ zaG5pPLZRqW1paSlyKTLpaKlw6XXpe2pYKXJpLekxqTbpLekpKTOiPa6z6GipN6kv8u9pN6kx99C vWqkr6TApLWkpKGjPC9TUEFOPjxTUEFOIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUyAN CiAgICAgICAgICAgICAgICAgIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IENPTE9SOiAjNTk1OTU5 OyBMSU5FLUhFSUdIVDogMjAwJTsgRk9OVC1GQU1JTFk6IMvOzOU7IG1zby10aGVtZWNvbG9yOiB0 ZXh0MTsgbXNvLXRoZW1ldGludDogMTY2OyBtc28tYmlkaS1mb250LWZhbWlseTogy87M5TsgbXNv LWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LXdlaWdodDogYm9sZCI+PG86cD48L286 cD48L1NQQU4+PC9QPg0KICAgICAgICAgICAgICAgICAgPFAgY2xhc3M9TXNvTm9ybWFsIA0KICAg ICAgICAgICAgICAgICAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQ7IExJTkUtSEVJR0hUOiAy MDAlOyBURVhULUFMSUdOOiBsZWZ0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCiAg ICAgICAgICAgICAgICAgIGFsaWduPWxlZnQ+PFNQQU4gDQogICAgICAgICAgICAgICAgICBzdHls ZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogIzU5NTk1OTsgTElORS1IRUlHSFQ6IDIwMCU7IEZP TlQtRkFNSUxZOiDLzszlOyBtc28tdGhlbWVjb2xvcjogdGV4dDE7IG1zby10aGVtZXRpbnQ6IDE2 NjsgbXNvLWJpZGktZm9udC1mYW1pbHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNv LWJpZGktZm9udC13ZWlnaHQ6IGJvbGQiPs36v82B/bjxo7qjsYKAz6+hoaOyo7KjuKOwo7CD0jxT UEFOIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz4vPC9TUEFOPtTCPC9TUEFOPjxTUEFO IGxhbmc9RU4tVVMgDQogICAgICAgICAgICAgICAgICBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBD T0xPUjogIzU5NTk1OTsgTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiDLzszlOyBtc28t dGhlbWVjb2xvcjogdGV4dDE7IG1zby10aGVtZXRpbnQ6IDE2NjsgbXNvLWJpZGktZm9udC1mYW1p bHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9udC13ZWlnaHQ6IGJv bGQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCiAgICAgICAgICAgICAgICAgIDxQIGNsYXNzPU1z b05vcm1hbCANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0OyBM SU5FLUhFSUdIVDogMjAwJTsgVEVYVC1BTElHTjogbGVmdDsgbXNvLXBhZ2luYXRpb246IHdpZG93 LW9ycGhhbiIgDQogICAgICAgICAgICAgICAgICBhbGlnbj1sZWZ0PjxTUEFOIA0KICAgICAgICAg ICAgICAgICAgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICM1OTU5NTk7IExJTkUtSEVJ R0hUOiAyMDAlOyBGT05ULUZBTUlMWTogy87M5TsgbXNvLXRoZW1lY29sb3I6IHRleHQxOyBtc28t dGhlbWV0aW50OiAxNjY7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDLzszlOyBtc28tZm9udC1rZXJu aW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtd2VpZ2h0OiBib2xkIj7S1MnPpMekuaGjPC9TUEFOPjxT UEFOIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUyANCiAgICAgICAgICAgICAgICAgIHN0 eWxlPSJGT05ULVNJWkU6IDEycHQ7IENPTE9SOiAjNTk1OTU5OyBMSU5FLUhFSUdIVDogMjAwJTsg Rk9OVC1GQU1JTFk6IMvOzOU7IG1zby10aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXRoZW1ldGludDog MTY2OyBtc28tYmlkaS1mb250LWZhbWlseTogy87M5TsgbXNvLWZvbnQta2VybmluZzogMHB0OyBt c28tYmlkaS1mb250LXdlaWdodDogYm9sZCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KICAgICAg ICAgICAgICAgICAgPFAgY2xhc3M9TXNvTm9ybWFsIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9 Ik1BUkdJTjogMGNtIDBjbSAwcHQ7IExJTkUtSEVJR0hUOiAyMDAlOyBURVhULUFMSUdOOiBsZWZ0 OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCiAgICAgICAgICAgICAgICAgIGFsaWdu PWxlZnQ+PFNQQU4gDQogICAgICAgICAgICAgICAgICBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBD T0xPUjogIzU5NTk1OTsgTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiDLzszlOyBtc28t dGhlbWVjb2xvcjogdGV4dDE7IG1zby10aGVtZXRpbnQ6IDE2NjsgbXNvLWJpZGktZm9udC1mYW1p bHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9udC13ZWlnaHQ6IGJv bGQiPqTopO2kt6SvpKruiqSkpKSkv6S3pN6kuaGjPC9TUEFOPjxTUEFOIA0KICAgICAgICAgICAg ICAgICAgbGFuZz1FTi1VUyANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJGT05ULVNJWkU6IDEw cHQ7IENPTE9SOiAjNTk1OTU5OyBMSU5FLUhFSUdIVDogMjAwJTsgRk9OVC1GQU1JTFk6IMvOzOU7 IG1zby10aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXRoZW1ldGludDogMTY2OyBtc28tYmlkaS1mb250 LWZhbWlseTogy87M5TsgbXNvLWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LXdlaWdo dDogYm9sZDsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41cHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwv UD48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KICAgICAgICAgICAgPFAgY2xhc3M9TXNvTm9y bWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0Ij48U1BBTiANCiAgICAgICAgICAgIGxhbmc9 RU4tVVM+PG86cD48Rk9OVCANCiAgICAgICAgZmFjZT1DYWxpYnJpPiZuYnNwOzwvRk9OVD48L286 cD48L1NQQU4+PC9QPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQogICAgICA8VEFCTEUgY2Vs bFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4NCiAgICAgICAg PFRCT0RZPg0KICAgICAgICA8VFI+DQogICAgICAgICAgPFREIGNsYXNzPUxMIGFsaWduPW1pZGRs ZSBiZ0NvbG9yPSNmZjczMDA+PEZPTlQgc2l6ZT0yPjxJTUcgDQogICAgICAgICAgICBzdHlsZT0i V0lEVEg6IDQ5NXB4OyBIRUlHSFQ6IDIzcHgiIGFsdD0iIiBoc3BhY2U9MCANCiAgICAgICAgICAg IHNyYz0iaHR0cDovL3d3dy5iamNic29mdC5jb20vbWFpbC9pbWFnZXMvbWFpbF9ib3R0b20uZ2lm IiANCiAgICAgICAgICAgIGJvcmRlcj0wPjwvRk9OVD48L1REPjwvVFI+DQogICAgICAgIDxUUj4N CiAgICAgICAgICA8VEQgY2xhc3M9TEwgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmNzMwMCBoZWln aHQ9ODA+PEZPTlQgDQogICAgICAgICAgICBjb2xvcj0jZmZmZmZmPjxTUEFOIA0KICAgICAgICAg ICAgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICM3ZjdmN2Y7IG1zby10aGVtZWNvbG9y OiB0ZXh0MTsgbXNvLXRoZW1ldGludDogMTI4Ij4NCiAgICAgICAgICAgIDxQIGNsYXNzPU1zb05v cm1hbCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgYWxpZ249bGVmdD48U1BBTiANCiAgICAg ICAgICAgIGxhbmc9RU4tVVM+PEZPTlQgZmFjZT1DYWxpYnJpIA0KICAgICAgICAgICAgY29sb3I9 IzAwMDAwMD4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqPC9GT05U PjwvU1BBTj48L1A+DQogICAgICAgICAgICA8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJ TjogMGNtIDBjbSAwcHQiIGFsaWduPWxlZnQ+PEZPTlQgDQogICAgICAgICAgICBjb2xvcj0jMDAw MDAwPjxTUEFOIA0KICAgICAgICAgICAgc3R5bGU9IkZPTlQtRkFNSUxZOiDLzszlOyBtc28tYXNj aWktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1hc2NpaS10aGVtZS1mb250OiBtaW5vci1sYXRp bjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IMvOzOU7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6 IG1pbm9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWhhbnNp LXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluIj7KqaGhudrSuzwvU1BBTj48U1BBTiANCiAgICAgICAg ICAgIGxhbmc9RU4tVVM+PFNQQU4gc3R5bGU9Im1zby10YWItY291bnQ6IDQiPjxGT05UIA0KICAg ICAgICAgICAgZmFjZT1DYWxpYnJpPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyANCiAgICAgICAgICAgIDwvRk9OVD48L1NQQU4+PC9TUEFOPjwvRk9OVD48L1A+ DQogICAgICAgICAgICA8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAw cHQiIGFsaWduPWxlZnQ+PFNQQU4gDQogICAgICAgICAgICBsYW5nPUVOLVVTPjxTUEFOIHN0eWxl PSJtc28tdGFiLWNvdW50OiA0Ij48Rk9OVCBmYWNlPUNhbGlicmkgDQogICAgICAgICAgICBjb2xv cj0jMDAwMDAwPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAN CiAgICAgICAgICAgIDwvRk9OVD48L1NQQU4+PC9TUEFOPjwvUD4NCiAgICAgICAgICAgIDxQIGNs YXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgYWxpZ249bGVmdD48Rk9O VCANCiAgICAgICAgICAgIGNvbG9yPSMwMDAwMDA+PFNQQU4gDQogICAgICAgICAgICBzdHlsZT0i Rk9OVC1GQU1JTFk6IMvOzOU7IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWFz Y2lpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogy87M 5TsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWlub3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQt ZmFtaWx5OiBDYWxpYnJpOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWlub3ItbGF0aW4iPrGxvqmy xbKppb2l1aXIPC9TUEFOPjxTUEFOIA0KICAgICAgICAgICAgbGFuZz1FTi1VUz48U1BBTiBzdHls ZT0ibXNvLXRhYi1jb3VudDogMyI+PEZPTlQgDQogICAgICAgICAgICBmYWNlPUNhbGlicmk+Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7IA0KICAgICAgICAgICAgPC9GT05UPjwvU1BBTj48L1NQQU4+PC9GT05U PjwvUD4NCiAgICAgICAgICAgIDxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20g MGNtIDBwdCIgYWxpZ249bGVmdD48Rk9OVCANCiAgICAgICAgICAgIGNvbG9yPSMwMDAwMDA+PFNQ QU4gDQogICAgICAgICAgICBzdHlsZT0iRk9OVC1GQU1JTFk6IMvOzOU7IG1zby1hc2NpaS1mb250 LWZhbWlseTogQ2FsaWJyaTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTogy87M5TsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWlub3It ZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28taGFuc2ktdGhlbWUt Zm9udDogbWlub3ItbGF0aW4iPqXNpcOlyNicidOky7HjwPuk8szhuamkt6TGpKqk6qTepLmk6KSm PC9TUEFOPjxTUEFOIA0KICAgICAgICAgICAgbGFuZz1FTi1VUz48U1BBTiBzdHlsZT0ibXNvLXRh Yi1jb3VudDogMSI+PEZPTlQgDQogICAgICAgICAgICBmYWNlPUNhbGlicmk+Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7IA0KICAgICAgICAgICAgPC9GT05UPjwvU1BBTj48L1NQQU4+PC9GT05UPjwv UD4NCiAgICAgICAgICAgIDxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20gMGNt IDBwdCIgYWxpZ249bGVmdD48U1BBTiANCiAgICAgICAgICAgIGxhbmc9RU4tVVM+PFNQQU4gc3R5 bGU9Im1zby10YWItY291bnQ6IDQiPjxGT05UIGZhY2U9Q2FsaWJyaSANCiAgICAgICAgICAgIGNv bG9yPSMwMDAwMDA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 IA0KICAgICAgICAgICAgPC9GT05UPjwvU1BBTj48L1NQQU4+PC9QPg0KICAgICAgICAgICAgPFAg Y2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBhbGlnbj1sZWZ0PjxG T05UIA0KICAgICAgICAgICAgY29sb3I9IzAwMDAwMD48U1BBTiANCiAgICAgICAgICAgIHN0eWxl PSJGT05ULUZBTUlMWTogy87M5TsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28t YXNjaWktdGhlbWUtZm9udDogbWlub3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDL zszlOyBtc28tZmFyZWFzdC10aGVtZS1mb250OiBtaW5vci1mYXJlYXN0OyBtc28taGFuc2ktZm9u dC1mYW1pbHk6IENhbGlicmk7IG1zby1oYW5zaS10aGVtZS1mb250OiBtaW5vci1sYXRpbiI+sbG+ qcrQuqO17cf4zvfI/cbsmPKWfL3w0eC4b6XTpes8L1NQQU4+PFNQQU4gDQogICAgICAgICAgICBs YW5nPUVOLVVTPjxGT05UIGZhY2U9Q2FsaWJyaT40MjY8L0ZPTlQ+PC9TUEFOPjxTUEFOIA0KICAg ICAgICAgICAgc3R5bGU9IkZPTlQtRkFNSUxZOiDLzszlOyBtc28tYXNjaWktZm9udC1mYW1pbHk6 IENhbGlicmk7IG1zby1hc2NpaS10aGVtZS1mb250OiBtaW5vci1sYXRpbjsgbXNvLWZhcmVhc3Qt Zm9udC1mYW1pbHk6IMvOzOU7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1pbm9yLWZhcmVhc3Q7 IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1p bm9yLWxhdGluIj6hoTwvU1BBTj48U1BBTiANCiAgICAgICAgICAgIGxhbmc9RU4tVVM+PEZPTlQg ZmFjZT1DYWxpYnJpPjEwMDA5NjwvRk9OVD48L1NQQU4+PC9GT05UPjwvUD4NCiAgICAgICAgICAg IDxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgYWxpZ249bGVm dD48U1BBTiANCiAgICAgICAgICAgIGxhbmc9RU4tVVM+PEZPTlQgY29sb3I9IzAwMDAwMD48Rk9O VCANCiAgICAgICAgICAgIGZhY2U9Q2FsaWJyaT5UZWw6Kzg2LTEwLTUxNTUtOTUyMDs8U1BBTiAN CiAgICAgICAgICAgIHN0eWxlPSJtc28tdGFiLWNvdW50OiAyIj4mbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsgDQogICAgICAgICAgICA8L1NQQU4+PC9GT05UPjwvRk9OVD48L1NQQU4+PC9QPg0KICAgICAg ICAgICAgPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBhbGln bj1sZWZ0PjxTUEFOIA0KICAgICAgICAgICAgbGFuZz1FTi1VUz48Rk9OVCBjb2xvcj0jMDAwMDAw PjxGT05UIA0KICAgICAgICAgICAgZmFjZT1DYWxpYnJpPk1vYmlsZTorODYtMTM1LTgxODItMDQ1 MDxTUEFOIA0KICAgICAgICAgICAgc3R5bGU9Im1zby10YWItY291bnQ6IDIiPiZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyANCiAgICAgICAgICAgIDwvU1BBTj48L0ZPTlQ+PC9GT05UPjwvU1BBTj48L1A+ DQogICAgICAgICAgICA8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAw cHQiIGFsaWduPWxlZnQ+PFNQQU4gDQogICAgICAgICAgICBsYW5nPUVOLVVTPjxGT05UIGNvbG9y PSMwMDAwMDA+PEZPTlQgDQogICAgICAgICAgICBmYWNlPUNhbGlicmk+aG9tZXBhZ2U6d3d3LmJq Y2Jzb2Z0LmNvbTxTUEFOIA0KICAgICAgICAgICAgc3R5bGU9Im1zby10YWItY291bnQ6IDIiPiZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCiAgICAgICAgICAg IDwvU1BBTj48L0ZPTlQ+PC9GT05UPjwvU1BBTj48L1A+DQogICAgICAgICAgICA8UCBjbGFzcz1N c29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGFsaWduPWxlZnQ+PFNQQU4gDQog ICAgICAgICAgICBsYW5nPUVOLVVTPjxGT05UIGZhY2U9Q2FsaWJyaSANCiAgICAgICAgICAgIGNv bG9yPSMwMDAwMDA+KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKjwv Rk9OVD48L1NQQU4+PC9QPg0KICAgICAgICAgICAgPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAw cHQiIGFsaWduPWxlZnQ+PC9TUEFOPjwvUD4NCiAgICAgICAgICAgIDxQIHN0eWxlPSJNQVJHSU46 IDBjbSAwY20gMHB0IiBhbGlnbj1sZWZ0PjxTUEFOIA0KICAgICAgICAgICAgc3R5bGU9IkNPTE9S OiAjN2Y3ZjdmOyBtc28tdGhlbWVjb2xvcjogdGV4dDE7IG1zby10aGVtZXRpbnQ6IDEyOCI+PEZP TlQgDQogICAgICAgICAgICBzaXplPTI+PFNQQU4gbGFuZz1FTi1VUz48QSBocmVmPSJodHRwOi8v d2suYmpjYnNvZnQuY29tIj48SU1HIGFsdD0iIiANCiAgICAgICAgICAgIGhzcGFjZT0wIHNyYz0i Y2lkOjAwMDc1ODg3ODY1Nl8wOUJGODZBRV8wQzIxNkRBNyIgYWxpZ249YmFzZWxpbmUgDQogICAg ICAgICAgICBib3JkZXI9MD48L0E+PC9TUEFOPjwvRk9OVD48L1NQQU4+PC9QPjwvRk9OVD48L1RE PjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KICAgICAgPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAw cHQiIA0KYWxpZ249Y2VudGVyPiZuYnNwOzwvUD48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPiZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCjwvQ0VOVEVSPjwvQk9EWT48 L0hUTUw+DQo= ------=_NextPart_002_04A5_01F1E7FE.15545FD0-- ------=_NextPart_001_0235_01F1E7FE.15545FD0 Content-Type: image/gif; name="=?gb2312?B?zfq/zS2147v318nRry5naWY=?=" Content-Transfer-Encoding: base64 Content-ID: <000758878656_09BF86AE_0C216DA7> R0lGODdhOgBEAOcAADNmmf7+/unm52emvQt1l7jW5drn9QJtm4e41tna6TiJqU2Ts8vk7qfH2XKr yujo94azyBFykghqmAFznAJzkgJslAF0o9nj6/Xr6l2Vo/308vT0/XaoxjKOrjiLtRRzqCZ3m0WK qrPI2SSHo/Xz7AZti+bX58/W76q60OjX867K6ANrpUSUqp3M4Hanu9rY2evU7PbY6fT9/vT08/37 9er29erW1vrr9rHN0TaSxoiotJCvyiN8rv31/AV3qP3l4vP69vbj2+3M1mKezP3q5Pbo5vjX1aq7 5/v46MjHx/zi1Pzk3O3b09POzf3t6vvjze/u1enj1/Pp3OXMw9rFuOXMvO3UyvrUxOu8rOTEu+fV x8WurayfntqletSqMWVIOjgqJ0c6NodmWMmbh9azktfFsuTDpdy8qti0ms2jhN67pOzTu+vEs+zM u9Oki6d6aNa2qevErPTazPLMtee3l/vd0/PMw+a8tNm4sycfHJl1ZtOdg9urjOvBpOO6nPPMu/XI p/TSvPLErOO8o/TUyuq9pJZuWNjg2Nu0o/TTw+7bzOXDrPXJxOi0qXeJaTMzLygoJ4VrZdWqi92y lNy0nOXEtOnKq6vIt/zd2tiqpGxWkURBQuGni+SslOO0m+3Tw7WKcdytk/XZxcqmlreJedimhea3 kurFuvTi1PXc0taolqmVldlsj9ici+WnmujIxJqFesmVds1ybMyPc6uHduK30HdvdMeki9OTlN6Z qOWRk8RqWsdjTYZ2eIqFf9JVYu+trOrLpLBrWbqViZCIjLBzbPvczKVWVJBXTGYtKGVMSKw6O/bJ uVxUVPLFtEItK/zq3XBYYmZZWoZZSXdJRlQ8Q5p2iXRINXdbVvrUzFg0L5B2cvraxbGRildQUDw2 N/nVvUxHSVY7N+jRuBgPDXZWR0M7PEczLFhGRWtlaFdCOU9DOWlSSmxdX3ttc1NMS0M0NLKsrWtT U3Nlakw7O0o2M2tdZXVpc3ZmZTgqJygoJzMzLxgPDScfHFQ8Q3eJaSwAAAAAOgBEAAAI/gADCBwo 8EU4c2Hs+VrVKxo7ZQ/xKcM3b54tW+maNQt37tk1Q7PUUIll6No0WKO2MCTm7p49b++auVtFkOAM d5vAmMPXq2c7eV/wbcOGzZ09exbvVfzyZVqxPZ4WVeET640hPbRGjeJibZ67jOmkzdtWc2A8aavC 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 yAEBADs= ------=_NextPart_001_0235_01F1E7FE.15545FD0-- ------=_NextPart_000_0B51_01F1E7FE.15545FD0 Content-Type: application/octet-stream; name="=?gb2312?B?zfq/zaWvpemlpKWipfOlyC5yYXI=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?gb2312?B?zfq/zaWvpemlpKWipfOlyC5yYXI=?=" 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 ------=_NextPart_000_0B51_01F1E7FE.15545FD0-- From christian.affolter@purplehaze.ch Tue May 11 05:03:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_210 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4BA31Eu080591 for ; Tue, 11 May 2010 05:03:02 -0500 X-ASG-Debug-ID: 1273572337-6d2f02810000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp.stepping-stone.ch (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0BDE614952F3 for ; Tue, 11 May 2010 03:05:37 -0700 (PDT) Received: from smtp.stepping-stone.ch (smtp.stepping-stone.ch [194.176.109.228]) by cuda.sgi.com with ESMTP id F8TMumapPxPkJQvy for ; Tue, 11 May 2010 03:05:37 -0700 (PDT) Received: from localhost (mail-scanner-01.int.stepping-stone.ch [10.17.98.47]) by smtp.stepping-stone.ch (Postfix) with ESMTP id 5AD9C40041D; Tue, 11 May 2010 12:05:12 +0200 (CEST) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at stepping-stone.ch Received: from smtp.stepping-stone.ch ([10.17.98.46]) by localhost (mail-scanner-01.int.stepping-stone.ch [10.17.98.47]) (amavisd-new, port 10024) with LMTP id 3ExwykuJOwpS; Tue, 11 May 2010 12:05:02 +0200 (CEST) Received: from [192.168.1.4] (84-73-140-121.dclient.hispeed.ch [84.73.140.121]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client did not present a certificate) by smtp.stepping-stone.ch (Postfix) with ESMTPSA id 7F75F400388; Tue, 11 May 2010 12:05:02 +0200 (CEST) Message-ID: <4BE92BCD.1000604@purplehaze.ch> Date: Tue, 11 May 2010 12:05:01 +0200 From: Christian Affolter User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100420 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: failed to read root inode Subject: Re: failed to read root inode References: <4BE55A63.8070203@purplehaze.ch> <4BE57E0D.3020601@sandeen.net> <4BE6CC4C.3030501@purplehaze.ch> In-Reply-To: <4BE6CC4C.3030501@purplehaze.ch> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtp.stepping-stone.ch[194.176.109.228] X-Barracuda-Start-Time: 1273572338 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2794 1.0000 -0.4383 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.44 X-Barracuda-Spam-Status: No, SCORE=-0.44 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.2, rules version 3.2.2.29610 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean Hi >> So if repair isn't making a mountable fs, first suggestion would >> be to re-try with the latest version of repair. > > OK, I will try that. Unfortunately the latest upstream version isn't > included within the distribution package repository, so I will have to > compile it first. OK, I was able to mount the volume by first repairing it with the latest xfs_repair version and mount -o ro,norecovery [...] Thank you everybody for your helpfulness and your suggestions regarding this problem. Regards Christian From kb@sysmikro.com.pl Tue May 11 09:18:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4BEIMCD093501 for ; Tue, 11 May 2010 09:18:22 -0500 X-ASG-Debug-ID: 1273587657-20d600bd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from v007470.home.net.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 3D8C915617B6 for ; Tue, 11 May 2010 07:20:58 -0700 (PDT) Received: from v007470.home.net.pl (v007470.home.net.pl [212.85.125.104]) by cuda.sgi.com with SMTP id iFZJGguK2xI4Zfai for ; Tue, 11 May 2010 07:20:58 -0700 (PDT) Received: from 217.8.165.66 [217.8.165.66] (HELO linux2g2g.site) by sysmikro.home.pl [212.85.125.104] with SMTP (IdeaSmtpServer v0.70) id 251b1c6c09ebbdf4; Tue, 11 May 2010 16:20:31 +0200 From: Krzysztof =?utf-8?q?B=C5=82aszkowski?= Organization: Systemy mikroprocesorowe To: Eric Sandeen X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate Date: Tue, 11 May 2010 16:20:20 +0200 User-Agent: KMail/1.9.5 Cc: xfs@oss.sgi.com References: <201005071022.37863.kb@sysmikro.com.pl> <201005102017.11706.kb@sysmikro.com.pl> <4BE85436.5040402@sandeen.net> In-Reply-To: <4BE85436.5040402@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Message-Id: <201005111620.21081.kb@sysmikro.com.pl> X-Barracuda-Connect: v007470.home.net.pl[212.85.125.104] X-Barracuda-Start-Time: 1273587659 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0213 1.0000 -1.8823 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.88 X-Barracuda-Spam-Status: No, SCORE=-1.88 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.2, rules version 3.2.2.29624 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Monday 10 May 2010 20:45, Eric Sandeen wrote: > Krzysztof B=C5=82aszkowski wrote: > > On Monday 10 May 2010 16:39, Eric Sandeen wrote: > >> Krzysztof B=C5=82aszkowski wrote: > > ... > > >>> We stick with 2.6.31.5 which seems to be good for us. We do not change > >>> kernels easily, as soon as higher revision arrives because it doesn't > >>> make sense from stability point of view. We have seen too many times > >>> regression bugs so if we are confident with some revision then there = is > >>> no point to change this. > >> > >> It was just a testing suggestion, but I already tested upstream and the > >> problem persists, now just need to find the time to dig into it. > > > > I see and I am glad you confirmed this. Do you think that fallocate > > called many times with fixed size and increasing offset will work better > > than one time call with huge size @ 0 offset ? > > I'd expect that to work; it's certainly worth a test agreed. > , and please send your=20 > results back to the list ;) okay, will do this tomorrow. BUT let's think about possible results: =2D test will fail. nothing to comment. =2D test will pass. this is interesting case. A passed test - does this test prove anything ? it may but this is not obvious. If the fault was caused by some algorithmic mistake (some table size, buffe= r=20 size according to input size) then the test result could be a proof. but if it fails due to missing spinlock/mutex elsewhere then we talk about= =20 probability of failure which depends on requested size.=20 bad news is that this failure happens at various sizes depending on hw=20 configuration. On some boxes the threshold point is abt 7T while another=20 boxes fail after e.g. 15T. I am not sure about any relationship between these boxes in installed memor= y,=20 amount of logical cores and theirs frequency (and current workload) =20 In this later case the test will prove nothing. If i run it 5 times and it= =20 passed 5 times it would mean only that i was lucky. as long as we don't know the exact nature of this fault we can't consider s= uch=20 test as reliable fix. Krzysztof PS of course i will try this just to satisfy curiosity tomorrow afternoon (= PL=20 time) as all high capacity storage has been shipped to customers already.=20 > > thanks, > -Eric > > > Krzysztof > > > >> -Eric From aelder@sgi.com Tue May 11 09:45:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4BEjg4n094959 for ; Tue, 11 May 2010 09:45:42 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id D5F813040D5; Tue, 11 May 2010 07:47:49 -0700 (PDT) Received: from [128.162.232.185] ([128.162.232.185]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 11 May 2010 09:47:21 -0500 Subject: Re: [77/98] xfs: add a shrinker to background inode reclaim From: Alex Elder Reply-To: aelder@sgi.com To: Greg KH Cc: linux-kernel@vger.kernel.org, stable@kernel.org, xfs@oss.sgi.com, Dave Chinner , akpm@linux-foundation.org, torvalds@linux-foundation.org, stable-review@kernel.org, alan@lxorguk.ukuu.org.uk In-Reply-To: <20100510223541.333994587@kvm.kroah.org> References: <20100510223541.333994587@kvm.kroah.org> Content-Type: text/plain; charset="UTF-8" Date: Tue, 11 May 2010 09:47:20 -0500 Message-ID: <1273589240.2674.15.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 11 May 2010 14:47:21.0315 (UTC) FILETIME=[DC6D7330:01CAF118] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 2010-05-10 at 15:35 -0700, Greg KH wrote: > 2.6.32-stable review patch. If anyone has any objections, please let us know. Acked-by: Alex Elder > ------------------ > > From: Dave Chinner > > commit 9bf729c0af67897ea8498ce17c29b0683f7f2028 upstream > > On low memory boxes or those with highmem, kernel can OOM before the > background reclaims inodes via xfssyncd. Add a shrinker to run inode > reclaim so that it inode reclaim is expedited when memory is low. > ... From aelder@sgi.com Tue May 11 09:45:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4BEjgp3094958 for ; Tue, 11 May 2010 09:45:42 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9F92530408D; Tue, 11 May 2010 07:47:47 -0700 (PDT) Received: from [128.162.232.185] ([128.162.232.185]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 11 May 2010 09:46:56 -0500 Subject: Re: [078/117] xfs: add a shrinker to background inode reclaim From: Alex Elder Reply-To: aelder@sgi.com To: Greg KH Cc: linux-kernel@vger.kernel.org, stable@kernel.org, stable-review@kernel.org, torvalds@linux-foundation.org, akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk, xfs@oss.sgi.com, Dave Chinner In-Reply-To: <20100510223324.424796921@kvm.kroah.org> References: <20100510223324.424796921@kvm.kroah.org> Content-Type: text/plain; charset="UTF-8" Date: Tue, 11 May 2010 09:46:56 -0500 Message-ID: <1273589216.2674.14.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 11 May 2010 14:46:56.0752 (UTC) FILETIME=[CDC96F00:01CAF118] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 2010-05-10 at 15:32 -0700, Greg KH wrote: > 2.6.33-stable review patch. If anyone has any objections, please let us know. Acked-by: Alex Elder > ------------------ > > From: Dave Chinner > > commit 9bf729c0af67897ea8498ce17c29b0683f7f2028 upstream > > On low memory boxes or those with highmem, kernel can OOM before the > background reclaims inodes via xfssyncd. Add a shrinker to run inode > reclaim so that it inode reclaim is expedited when memory is low. > ... From sandeen@sandeen.net Tue May 11 09:52:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4BEqcc8095407 for ; Tue, 11 May 2010 09:52:38 -0500 X-ASG-Debug-ID: 1273589690-6fa001590000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 657F333476C for ; Tue, 11 May 2010 07:54:51 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id 7bIAT7rczELVSR1K for ; Tue, 11 May 2010 07:54:51 -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 mail.sandeen.net (Postfix) with ESMTP id 360DB16BF95E; Tue, 11 May 2010 09:54:50 -0500 (CDT) Message-ID: <4BE96FBA.5080206@sandeen.net> Date: Tue, 11 May 2010 09:54:50 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: =?UTF-8?B?S3J6eXN6dG9mIELFgmFzemtvd3NraQ==?= CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: posix_fallocate Subject: Re: posix_fallocate References: <201005071022.37863.kb@sysmikro.com.pl> <201005102017.11706.kb@sysmikro.com.pl> <4BE85436.5040402@sandeen.net> <201005111620.21081.kb@sysmikro.com.pl> In-Reply-To: <201005111620.21081.kb@sysmikro.com.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1273589691 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0993 1.0000 -1.3970 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.30 X-Barracuda-Spam-Status: No, SCORE=-1.30 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29627 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Krzysztof Błaszkowski wrote: ... > as long as we don't know the exact nature of this fault we can't consider such > test as reliable fix. No, it's just a datapoint, do as you wish. :) I'll try to find time to dig into this soon if nobody beats me to it. -Eric From gregkh@suse.de Tue May 11 10:10:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4BFAfnF096343 for ; Tue, 11 May 2010 10:10:41 -0500 X-ASG-Debug-ID: 1273590798-20d601ff0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 547A11561668 for ; Tue, 11 May 2010 08:13:18 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id gogUyXArgCMgcbGv for ; Tue, 11 May 2010 08:13:18 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id CFEAD8FEA2; Tue, 11 May 2010 17:12:52 +0200 (CEST) Date: Tue, 11 May 2010 08:12:08 -0700 From: Greg KH To: Alex Elder Cc: linux-kernel@vger.kernel.org, stable@kernel.org, xfs@oss.sgi.com, Dave Chinner , akpm@linux-foundation.org, torvalds@linux-foundation.org, stable-review@kernel.org, alan@lxorguk.ukuu.org.uk X-ASG-Orig-Subj: Re: [77/98] xfs: add a shrinker to background inode reclaim Subject: Re: [77/98] xfs: add a shrinker to background inode reclaim Message-ID: <20100511151208.GI14895@suse.de> References: <20100510223541.333994587@kvm.kroah.org> <1273589240.2674.15.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273589240.2674.15.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1273590799 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 11, 2010 at 09:47:20AM -0500, Alex Elder wrote: > On Mon, 2010-05-10 at 15:35 -0700, Greg KH wrote: > > 2.6.32-stable review patch. If anyone has any objections, please let us know. > > Acked-by: Alex Elder Thanks, I've added your ack for both the .32 and .33 versions of this patch. greg k-h From leo1783@yahoo.com Wed May 12 04:17:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4C9H61u152386 for ; Wed, 12 May 2010 04:17:06 -0500 X-ASG-Debug-ID: 1273655987-658a01ab0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from n17.bullet.mail.mud.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 868F1156356B for ; Wed, 12 May 2010 02:19:47 -0700 (PDT) Received: from n17.bullet.mail.mud.yahoo.com (n17.bullet.mail.mud.yahoo.com [68.142.206.144]) by cuda.sgi.com with SMTP id ap039eLMLR1PiO4v for ; Wed, 12 May 2010 02:19:47 -0700 (PDT) Received: from [68.142.200.225] by n17.bullet.mail.mud.yahoo.com with NNFMP; 12 May 2010 09:19:17 -0000 Received: from [67.195.9.83] by t6.bullet.mud.yahoo.com with NNFMP; 12 May 2010 09:19:17 -0000 Received: from [67.195.9.108] by t3.bullet.mail.gq1.yahoo.com with NNFMP; 12 May 2010 09:19:17 -0000 Received: from [127.0.0.1] by omp112.mail.gq1.yahoo.com with NNFMP; 12 May 2010 09:19:17 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 289372.5711.bm@omp112.mail.gq1.yahoo.com Received: (qmail 53044 invoked by uid 60001); 12 May 2010 09:19:17 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1273655957; bh=2E3JEeYCcYorC19p7n4nSH/Ufu3jNNxpnVRzj4rdQ6E=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:References:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type; b=wHCYn5sxlDxy0llP4sXBIt/P/ke2Ki/PEyxJid6wN/FERsxiZOJpDQ1eZKi8j3ohKmZG8gjaG5qGlJJP0PLYh3egITFtnxWyr849Hyq+s7ozkFkZP8Sjv7agvTOsMc4oA74UhA4HFjL1wlGGo+6cUHp8G5BC+YPcj5fmhZIEq2c= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=Message-ID:X-YMail-OSG:Received:X-Mailer:References:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type; b=ED7vHNFzeLT32e5Ad+1L6aloEERP+0pu6STtIh2O7tEVuWkpR7L90hQuLEbrWTvnpu/KUCCR1TSSntwNya6uZjPSG6qQMab0Z55vXTfZPEFjfxy8b+7SSd1QqzdUipTvZ3X5eGDAeM459EsePgcayCO10u4690p+yZvrF2Np8Q8=; Message-ID: <132290.52744.qm@web112902.mail.gq1.yahoo.com> X-YMail-OSG: nrRqKSoVM1mnSMSR99XrZOqx1k21AziEx8MdHXXeFF06_1p x1vz1cj8U1RHkjQgiR23uB7HUI14s_sTlYnsAi.xsM6IsMUO1hWy8f_XM8g3 1Pzqd.mKlYW4pheHjZZKtHg82OLB2COxNeivXwyjnJahxaQyXOh8IT5nvX8G JhIf2.t.l_V_.iDuHgzqj6SLkXj6abPMXGTP5d232SQQJER03BfyWy7Mw2z8 8kl7ItjtiHFlrLRu1l0UEqeZWeoulYmCCkRUxhm6qpmELCVRvhUWW4eHB0IL t_5aEWG1eJnbVjUzcIefPG1k- Received: from [15.203.169.125] by web112902.mail.gq1.yahoo.com via HTTP; Wed, 12 May 2010 02:19:16 PDT X-Mailer: YahooMailRC/374.4 YahooMailWebService/0.8.103.269680 References: <28512276.post@talk.nabble.com> <4BE82955.2080009@sandeen.net> <978493.86662.qm@web112902.mail.gq1.yahoo.com> <20100510222211.3e73cdeb@galadriel.home> Date: Wed, 12 May 2010 02:19:16 -0700 (PDT) From: Leo Davis X-ASG-Orig-Subj: Re: bad primary superblock - bad magic number !!! Subject: Re: bad primary superblock - bad magic number !!! To: Emmanuel Florac Cc: xfs@oss.sgi.com In-Reply-To: <20100510222211.3e73cdeb@galadriel.home> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="0-1468979099-1273655956=:52744" X-Barracuda-Connect: n17.bullet.mail.mud.yahoo.com[68.142.206.144] X-Barracuda-Start-Time: 1273655988 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.06 X-Barracuda-Spam-Status: No, SCORE=-1.06 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29684 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message 0.46 PLING_PLING Subject has lots of exclamation marks 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0-1468979099-1273655956=:52744 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable havent had much success with testing the hard drives, tried mhdd & seatools= with no luck yet.=0A=0AMeanwhile i recreated RAID, all shows up OK for now= .=0A=0APreviously the msgs shown were:=0A=0Aend_request: I/O error, dev cci= ss/c0d2, sector 0=0Aend_request: I/O error, dev cciss/c0d2, sector 0=0Aend_= request: I/O error, dev cciss/c0d2, sector 1 =0A=0AThat seems to indicate t= hat the problem is with the disc or array. It=0Ais unable to read the begin= ning of the device.=0ASo is I do a - dd if=3D/dev/random of=3Ddev/cciss/c0d= 2 , that should fail=0Aand therby confirm that the drive or array has issue= s...do i make any=0Asense here?=0A=0Athanks=0A=0A=0A=0A=0A=0A=0A___________= _____________________=0AFrom: Emmanuel Florac =0ATo= : Leo Davis =0ACc: xfs@oss.sgi.com=0ASent: Mon, May 10, = 2010 9:22:11 PM=0ASubject: Re: bad primary superblock - bad magic number !!= !=0A=0ALe Mon, 10 May 2010 11:11:45 -0700 (PDT) vous =E9criviez:=0A=0A> I a= gree. I destroy and re-create raid and everything would show up=0A> GOOD, o= nly for it to break again. So was wondering whether those=0A> traces would = point to anything.... my prime suspect is hard drives,=0A> but those xfs ms= gs confused me. =0A=0ACheck the hard drives separately with the maker utili= ty (Seatools,=0Aetc). One of them at the very least must be seriously ill.= =0A=0A-- =0A---------------------------------------------------------------= ---------=0AEmmanuel Florac | Direction technique=0A = | Intellique=0A | =0A = | +33 1 78 94 84 02=0A----------------------------------= --------------------------------------=0A=0A=0A=0A --0-1468979099-1273655956=:52744 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable
havent had much success with testing the hard drives, tried mh= dd & seatools with no luck yet.
=0A
=0AMeanwhile i recreated RAID= , all shows up OK for now.
=0A
=0APreviously the msgs shown were:
= =0A
=0Aend_request: I/O error, dev cciss/c0d2, sector 0
=0A=0Aend_req= uest: I/O error, dev cciss/c0d2, sector 0
=0A=0Aend_request: I/O error, = dev cciss/c0d2, sector 1 =0A=09=09=09=0A=09=09
=0A
=0AThat seems to i= ndicate that the problem is with the disc or array. It=0Ais unable to read = the beginning of the device.
=0ASo is I do a - dd if=3D/dev/random of=3D= dev/cciss/c0d2 , that should fail=0Aand therby confirm that the drive or ar= ray has issues...do i make any=0Asense here?
=0A
=0Athanks
=0A
= =0A
=0A


From: Emmanuel Florac <eflora= c@intellique.com>
To: Leo Davis <leo1783@yahoo.com>
Cc: xfs@oss.sgi.com
Sent: Mon, May 10, 2010 9:22:11 PM
Subject: Re: bad primary superblock - bad magic num= ber !!!

=0ALe Mon, 10 May 2010 11:11:45 -0700 (PDT) vous =E9c= riviez:

> I agree. I destroy and re-create raid and everything wo= uld show up
> GOOD, only for it to break again. So was wondering whet= her those
> traces would point to anything.... my prime suspect is ha= rd drives,
> but those xfs msgs confused me.

Check the hard d= rives separately with the maker utility (Seatools,
etc). One of them at = the very least must be seriously ill.

--
-----------------------= -------------------------------------------------
Emmanuel Florac  =   |  Direction technique
          =           |  Intellique
    &nb= sp;               |    &l= t;eflorac@intellique.com>
        &n= bsp;           |  +33 1 78 94 84 02
-----------------------= -------------------------------------------------
=0A
<= br>=0A=0A --0-1468979099-1273655956=:52744-- From eflorac@intellique.com Wed May 12 07:26:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4CCQq0k162615 for ; Wed, 12 May 2010 07:26:52 -0500 X-ASG-Debug-ID: 1273667340-068502c90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 97EDF1DED988 for ; Wed, 12 May 2010 05:29:03 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id pxiVvJ6WwDH7nXbD for ; Wed, 12 May 2010 05:29:03 -0700 (PDT) Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by smtp4-g21.free.fr (Postfix) with ESMTP id 3FF244C8069; Wed, 12 May 2010 14:28:57 +0200 (CEST) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP; Wed, 12 May 2010 14:28:56 +0200 (CEST) Date: Wed, 12 May 2010 14:29:02 +0200 From: Emmanuel Florac To: Leo Davis Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: bad primary superblock - bad magic number !!! Subject: Re: bad primary superblock - bad magic number !!! Message-ID: <20100512142902.47d1022a@harpe.intellique.com> In-Reply-To: <132290.52744.qm@web112902.mail.gq1.yahoo.com> References: <28512276.post@talk.nabble.com> <4BE82955.2080009@sandeen.net> <978493.86662.qm@web112902.mail.gq1.yahoo.com> <20100510222211.3e73cdeb@galadriel.home> <132290.52744.qm@web112902.mail.gq1.yahoo.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1273667345 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.06 X-Barracuda-Spam-Status: No, SCORE=-1.06 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, MAILTO_TO_SPAM_ADDR, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.46 PLING_PLING Subject has lots of exclamation marks 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Wed, 12 May 2010 02:19:16 -0700 (PDT) Leo Davis =E9crivait: > havent had much success with testing the hard drives, tried mhdd & > seatools with no luck yet. What do you mean? Does the tools report any problem with the drives? > So is I do a - dd if=3D/dev/random of=3Ddev/cciss/c0d2 , that should fail > and therby confirm that the drive or array has issues...do i make any > sense here? Uh, you should try the other way around to avoid breaking the filesystem : dd if=3D/dev/cciss/c0d2 of=3D/dev/null bs=3D131072 If no error occurs it should be OK. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From leo1783@yahoo.com Wed May 12 07:42:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4CCgp66163411 for ; Wed, 12 May 2010 07:42:51 -0500 X-ASG-Debug-ID: 1273668304-72f102c80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from n3-vm0.bullet.mail.gq1.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 3F196339096 for ; Wed, 12 May 2010 05:45:04 -0700 (PDT) Received: from n3-vm0.bullet.mail.gq1.yahoo.com (n3-vm0.bullet.mail.gq1.yahoo.com [67.195.23.156]) by cuda.sgi.com with SMTP id nEP9EZ2G1sMklVFC for ; Wed, 12 May 2010 05:45:04 -0700 (PDT) Received: from [67.195.9.81] by n3.bullet.mail.gq1.yahoo.com with NNFMP; 12 May 2010 12:45:04 -0000 Received: from [67.195.9.107] by t1.bullet.mail.gq1.yahoo.com with NNFMP; 12 May 2010 12:45:04 -0000 Received: from [127.0.0.1] by omp111.mail.gq1.yahoo.com with NNFMP; 12 May 2010 12:45:04 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 156304.80837.bm@omp111.mail.gq1.yahoo.com Received: (qmail 21036 invoked by uid 60001); 12 May 2010 12:45:04 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1273668304; bh=2vU1jVuBTXc49lsJZUp1rX1uqtB0Y7i0EC3mrCss+qc=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:References:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type; b=It1POgn2iVcAqbhO1G4cww96CPiau/v2+Q30wzgQbDFxlNeXkTXaNVkhA0DLcvD33Q+PznpkGS/CCb8R3+346feFfVhIjzh6wqKRaIh3wjcGKd4SjRkpDu5FjH7II357xuSBmQgDmHHZwFvp8eS1Ii2/2i0PGZgdOneUc/w5Pjs= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=Message-ID:X-YMail-OSG:Received:X-Mailer:References:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type; b=dRov2ExXZvnNpzvVoKMbo5eAb4OPM5GJLWfnDZNkG/M4Va8r+ay4n0tPvQ2PL6IS86edbF+n0t7cvIsljOc9HGdJoYhARPKWXcCyznA4v0D09lwchePNlBV+Hz2DJNiLUTmenmD2TyVFC86onZ5ZZm8zONlSwPMhtd4LjNMmoHo=; Message-ID: <14845.20130.qm@web112901.mail.gq1.yahoo.com> X-YMail-OSG: m53VR0cVM1kegnJGjjNn5bFBWIwdqqzQjq7HaYbReupRhAl 4I9oMx6CDMSoiynuUINcGGRu4mjBwXRz2NW2HmFICCENJMdLoEUim3FiktKA LlHpqAncOv4OBsT0r9.tgRUuz72pBLC5SQn3zZLHFNT_iqEm3HUKlrJWvoof Y5tn9tdynIvJcou9m9d.n_xpdUCoO2O.5hkBc.ftov9QQgKVvrsbNraJv2w6 v9xyJbK9XqFGTk9yvgwUppbsrE1orFq4ENTCy_aWFH_7fJdQ1JQNhOAAa6L7 PrbfaLhVgaiGODzx1WCQlht4- Received: from [15.203.169.123] by web112901.mail.gq1.yahoo.com via HTTP; Wed, 12 May 2010 05:45:03 PDT X-Mailer: YahooMailRC/374.4 YahooMailWebService/0.8.103.269680 References: <28512276.post@talk.nabble.com> <4BE82955.2080009@sandeen.net> <978493.86662.qm@web112902.mail.gq1.yahoo.com> <20100510222211.3e73cdeb@galadriel.home> <132290.52744.qm@web112902.mail.gq1.yahoo.com> <20100512142902.47d1022a@harpe.intellique.com> Date: Wed, 12 May 2010 05:45:03 -0700 (PDT) From: Leo Davis X-ASG-Orig-Subj: Re: bad primary superblock - bad magic number !!! Subject: Re: bad primary superblock - bad magic number !!! To: Emmanuel Florac Cc: xfs@oss.sgi.com In-Reply-To: <20100512142902.47d1022a@harpe.intellique.com> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="0-839393850-1273668303=:20130" X-Barracuda-Connect: n3-vm0.bullet.mail.gq1.yahoo.com[67.195.23.156] X-Barracuda-Start-Time: 1273668305 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.06 X-Barracuda-Spam-Status: No, SCORE=-1.06 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message 0.46 PLING_PLING Subject has lots of exclamation marks 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0-839393850-1273668303=:20130 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable > So is I do a - dd if=3D/dev/random of=3Ddev/cciss/c0d2 , that should fail= =0A> and therby confirm that the drive or array has issues...do i make any= =0A> sense here?=0A=0A>Uh, you should try the other way around to avoid bre= aking the=0A>filesystem :=0A=0A>dd if=3D/dev/cciss/c0d2 of=3D/dev/null bs= =3D131072=0A=0A>If no error occurs it should be OK.=0A=0A# dd if=3D/dev/cci= ss/c0d2 of=3D/dev/null bs=3D131072=0A796+1 records in=0A796+1 records out= =0A#=0A=0Adoesn't show any errors here ......=0A=0A> havent had much succes= s with testing the hard drives, tried mhdd &=0A> seatools with no luck yet.= =0A=0A>What do you mean? Does the tools report any problem with the drives?= =0A=0Amhdd doesnt detect the drives, probably an issue with chipset...still= looking for tools=0A=0Athanks=0A=0A=0A=0A=0A=0A=0A________________________= ________=0AFrom: Emmanuel Florac =0ATo: Leo Davis <= leo1783@yahoo.com>=0ACc: xfs@oss.sgi.com=0ASent: Wed, May 12, 2010 1:29:02 = PM=0ASubject: Re: bad primary superblock - bad magic number !!!=0A=0ALe Wed= , 12 May 2010 02:19:16 -0700 (PDT)=0ALeo Davis =E9criva= it:=0A=0A> havent had much success with testing the hard drives, tried mhdd= &=0A> seatools with no luck yet.=0A=0AWhat do you mean? Does the tools rep= ort any problem with the drives?=0A=0A> So is I do a - dd if=3D/dev/random = of=3Ddev/cciss/c0d2 , that should fail=0A> and therby confirm that the driv= e or array has issues...do i make any=0A> sense here?=0A=0AUh, you should t= ry the other way around to avoid breaking the=0Afilesystem :=0A=0Add if=3D/= dev/cciss/c0d2 of=3D/dev/null bs=3D131072=0A=0AIf no error occurs it should= be OK.=0A=0A-- =0A--------------------------------------------------------= ----------------=0AEmmanuel Florac | Direction technique=0A = | Intellique=0A | =0A | +33 1 78 94 84 02=0A---------------------------= ---------------------------------------------=0A=0A=0A=0A --0-839393850-1273668303=:20130 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable
> So is I do a - dd if=3D/dev/random of=3Ddev/cciss/c0= d2 , that should fail
> and therby confirm that the drive or array ha= s issues...do i make any
> sense here?

>Uh, you should try = the other way around to avoid breaking the
>filesystem :

>d= d if=3D/dev/cciss/c0d2 of=3D/dev/null bs=3D131072

>If no error oc= curs it should be OK.

# dd if=3D/dev/cciss/c0d2 of=3D/dev/null bs=3D= 131072
796+1 records in
796+1 records out
#

doesn't show an= y errors here ......

> havent had much success with testing the h= ard drives, tried mhdd &
> seatools with no luck yet.

>= What do you mean? Does the tools report any problem with the drives?
mhdd doesnt detect the drives, probably an issue with chipset...still look= ing for tools

thanks




From: Emmanuel Florac <eflorac@intellique.com>
To: Leo Davis <leo1783@yahoo.com>
Cc: xfs@oss.sgi.com
Sent: Wed, May 12, 2010 1:29:02 PM<= br>Subject: Re: bad primar= y superblock - bad magic number !!!

=0ALe Wed, 12 May 2010 02= :19:16 -0700 (PDT)
Leo Davis <leo1783@yahoo.com> =E9crivait:
> havent had much success with testing the hard drives, tried mhdd = &
> seatools with no luck yet.

What do you mean? Does the = tools report any problem with the drives?

> So is I do a - dd if= =3D/dev/random of=3Ddev/cciss/c0d2 , that should fail
> and therby co= nfirm that the drive or array has issues...do i make any
> sense here= ?

Uh, you should try the other way around to avoid breaking the
f= ilesystem :

dd if=3D/dev/cciss/c0d2 of=3D/dev/null bs=3D131072
If no error occurs it should be OK.

--
-----------------------= -------------------------------------------------
Emmanuel Florac  =   |  Direction technique
          =           | =20 Intellique
                &nbs= p;   |    <eflorac@intellique.com>                    |&n= bsp; +33 1 78 94 84 02
------------------------------------------------= ------------------------
=0A

=0A=0A=0A=0A=0A=0A=0A= =0A --0-839393850-1273668303=:20130-- From Philippe.DENIEL@CEA.FR Wed May 12 10:37:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_92 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4CFbYbu170643 for ; Wed, 12 May 2010 10:37:34 -0500 X-ASG-Debug-ID: 1273678786-1a9702250000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from oxalide-out.extra.cea.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B06901DEE2D9 for ; Wed, 12 May 2010 08:39:46 -0700 (PDT) Received: from oxalide-out.extra.cea.fr (oxalide-out.extra.cea.fr [132.168.224.1]) by cuda.sgi.com with ESMTP id HPPzNM2DwoSiNho2 for ; Wed, 12 May 2010 08:39:46 -0700 (PDT) Received: from pisaure.intra.cea.fr (pisaure.intra.cea.fr [132.166.88.21]) by oxalide.extra.cea.fr (8.14.2/8.14.2/CEAnet-Internet-out-2.0) with ESMTP id o4CFdjwr010362 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT) for ; Wed, 12 May 2010 17:39:45 +0200 Received: from muguet1.intra.cea.fr (muguet1.intra.cea.fr [132.166.192.6]) by pisaure.intra.cea.fr (8.14.4/8.14.4) with ESMTP id o4CFdjYj016442 for ; Wed, 12 May 2010 17:39:45 +0200 (envelope-from Philippe.DENIEL@CEA.FR) Received: from zia.bruyeres.cea.fr (esteban.dam.intra.cea.fr [132.165.76.10]) by muguet1.intra.cea.fr (8.13.8/8.13.8/CEAnet-Intranet-out-1.1) with SMTP id o4CFdjL8018499 for ; Wed, 12 May 2010 17:39:45 +0200 Received: (qmail 26663 invoked from network); 12 May 2010 15:39:45 -0000 Message-ID: <4BEACBC0.3080300@cea.fr> Date: Wed, 12 May 2010 17:39:44 +0200 From: DENIEL Philippe Organization: CEA-DAM User-Agent: Thunderbird 2.0.0.6 (X11/20070728) MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: open_by_handle on a file ? Subject: open_by_handle on a file ? Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 12 May 2010 15:39:45.0332 (UTC) FILETIME=[58D21F40:01CAF1E9] X-Barracuda-Connect: oxalide-out.extra.cea.fr[132.168.224.1] X-Barracuda-Start-Time: 1273678787 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0190 1.0000 -1.8975 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.90 X-Barracuda-Spam-Status: No, SCORE=-1.90 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.2, rules version 3.2.2.29707 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, I start using libhandle.so from xfsprogs-3.0.3 package. I meet an issue here : I can get a handle from files or directory. When used on diretories, open_by_handle works fine : I can read entries in it by using getdents, create stuff / removing stuff by using the ATFILE_FUNCTION (mkdirat, renameat, ...) Trouble start when I want to open a file with open_by_handle. I have a small test program that does this : rc = path_to_fshandle( path_dir, (void **)(&fshandle), &fshandlelen) ; if( rc < 0 ) exit( -1) rc = path_to_handle( path_dir, (void **)(&filehandle), &handlelen) ; if( rc < 0 ) exit( -1 ) fd = open_by_handle( filehandle, handlelen, O_RDONLY ) ; printf( "open_by_handle: fd=%d \n", fd ) ; if( fd < 0 ) printf( "----> Error=%d | %s\n", errno, strerror( errno ) ) ; The open_by_handle failed with errno=20 aka ENOTDIR, which is true, this is a file and no directory. Question is : Can I use open_by_handle to open a regular file ? If yes, how should I proceed. If no, how should I do to open a file knowing its handle ? Thanks in advance for your time and answer. Regards Philippe From sandeen@redhat.com Wed May 12 10:41:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_14, J_CHICKENPOX_17,J_CHICKENPOX_55,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4CFfK3O170755 for ; Wed, 12 May 2010 10:41:20 -0500 X-ASG-Debug-ID: 1273679013-1a9402550000-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 8253D13B80C7 for ; Wed, 12 May 2010 08:43:33 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AkqyavvUu0H0cEpu for ; Wed, 12 May 2010 08:43:33 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx03.intmail.prod.int.phx2.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o4CFhWdf016085 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 12 May 2010 11:43:32 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o4CFhSbA031032 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 12 May 2010 11:43:31 -0400 Message-ID: <4BEACCA0.3070300@redhat.com> Date: Wed, 12 May 2010 10:43:28 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH] xfsdocs: fix image scaling for pdf Subject: [PATCH] xfsdocs: fix image scaling for pdf Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.16 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1273679014 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Apparently having: format="PNG" width="100%" scalefit="0" in the image attributes is messing up scaling on the pdf such that the images extend beyond the page. (I inherited all that from work our techpubs guy did). On the advice of another techpubs / publican expert, remove it - this seems to fix up the sizing on the pdf build. Signed-off-by: Eric Sandeen --- diff --git a/XFS_Filesystem_Structure/en-US/Allocation_Groups.xml b/XFS_Filesystem_Structure/en-US/Allocation_Groups.xml index a745abe..2831721 100644 --- a/XFS_Filesystem_Structure/en-US/Allocation_Groups.xml +++ b/XFS_Filesystem_Structure/en-US/Allocation_Groups.xml @@ -32,7 +32,7 @@ - + 6 @@ -681,7 +681,7 @@ typedef struct xfs_alloc_rec { The following diagram shows a single level B+tree which consists of one leaf: - + 15a @@ -690,7 +690,7 @@ typedef struct xfs_alloc_rec { With the intermediate nodes, the associated leaf pointers are stored in a separate array about two thirds into the block. The following diagram illustrates a 2-level B+tree for a free space B+tree: - + 15b @@ -709,7 +709,7 @@ typedef struct xfs_alloc_rec { Active elements in the array are specified by the AGF's () agf_flfirst, agf_fllast and agf_flcount values. The array is managed as a circular list. - + 16 @@ -811,7 +811,7 @@ recs[1-344] = [startblock,blockcount] Absolute inode numbers include the AG number in the high bits, above the bits used for the AG relative inode number. Absolute inode numbers are found in directory () entries. - + 18 @@ -913,7 +913,7 @@ typedef __be32 xfs_inobt_ptr_t; The following diagram illustrates a single level inode B+tree: - + 20a @@ -921,7 +921,7 @@ typedef __be32 xfs_inobt_ptr_t; And a 2-level inode B+tree: - + 20b diff --git a/XFS_Filesystem_Structure/en-US/Data_Extents.xml b/XFS_Filesystem_Structure/en-US/Data_Extents.xml index 248ac70..9af8ce7 100644 --- a/XFS_Filesystem_Structure/en-US/Data_Extents.xml +++ b/XFS_Filesystem_Structure/en-US/Data_Extents.xml @@ -9,7 +9,7 @@ An extent is 128 bits in size and uses the following packed layout: - + 30 @@ -62,7 +62,7 @@ typedef enum { - + 32 @@ -111,12 +111,12 @@ u.bmx[0-2] = [startoff,startblock,blockcount,extentflag] Raw disk version of the inode with the third extent highlighted (di_u always starts at offset 0x64): - + code33a We can expand the highlighted section into the following bit array from MSB to LSB with the file offset and the block count highlighted: - + code33b @@ -213,7 +213,7 @@ typedef struct xfs_btree_lblock { - + 35 @@ -240,7 +240,7 @@ typedef struct xfs_btree_lblock { - + diff --git a/XFS_Filesystem_Structure/en-US/Directories.xml b/XFS_Filesystem_Structure/en-US/Directories.xml index 97e2195..e0a7779 100644 --- a/XFS_Filesystem_Structure/en-US/Directories.xml +++ b/XFS_Filesystem_Structure/en-US/Directories.xml @@ -105,7 +105,7 @@ typedef struct xfs_dir2_sf_entry { - + 39 @@ -169,7 +169,7 @@ u.sfdir2.list[3].inumber.i4 = 25165956 The raw data on disk with the first entry highlighted. The six byte header precedes the first entry: - + code40 Next, an entry is deleted (frame000001.tst), and any entries after the deleted entry are moved or compacted to "cover" the hole: @@ -286,7 +286,7 @@ typedef struct xfs_dir2_block_tail { - + 43 @@ -464,7 +464,7 @@ btail.stale = 1 A new "bestfree" value is added for the entry, the start of the entry is marked as unused with 0xffff (which overwrites the inode number for an actual entry), and the length of the space. The tag remains intact at the offset+length - sizeof(tag). The address for the hash is also cleared. The affected areas are highlighted below: - + code46 @@ -536,7 +536,7 @@ typedef struct xfs_da_blkinfo { The size of the bests array is specified by the tail.bestcount which is also the number of "data" blocks for the directory. The bests array maintains each data block's bestfree[0].length value. - + 48 @@ -837,7 +837,7 @@ typedef struct xfs_da_intnode { The freeindex's hdr.nvalid should always be the same as the number of allocated data directory blocks containing name/inode data and will always be less than or equal to hdr.nused. hdr.nused should be the same as the index of the last data directory block plus one (i.e. when the last data block is freed, nused and nvalid are decremented). - + 54 @@ -1003,7 +1003,7 @@ fbests[0-4] = 0:0x10 1:0x10 2:0x10 3:0x10 4:0x3f50 Like the Leaf Directory (), each of the fbests values correspond to each data block's bestfree[0].length value. The raw disk layout, old data is not cleared after the array. The fbests array is highlighted: - + code57 TODO: Example with a hole in the middle @@ -1124,7 +1124,7 @@ nbtree[0-318] = [hashval,before] 0:[0x70b14711,8388919] ... The leaves at each the end of a node always point to the end leaves in adjacent nodes. Directory block 8388928 forward pointer is to block 8388919, and vice versa as highlighted in the following example: - + code60 diff --git a/XFS_Filesystem_Structure/en-US/Extended_Attributes.xml b/XFS_Filesystem_Structure/en-US/Extended_Attributes.xml index d0bdb5b..deaa433 100644 --- a/XFS_Filesystem_Structure/en-US/Extended_Attributes.xml +++ b/XFS_Filesystem_Structure/en-US/Extended_Attributes.xml @@ -36,7 +36,7 @@ typedef struct xfs_attr_sf_entry xfs_attr_sf_entry_t; - + 64 @@ -118,7 +118,7 @@ a.sfattr.list[1].value = "val1" We can determine the actual inode offset to be 220 (15 x 8 + 100) or 0xdc. Examining the raw dump, the second attribute is highlighted: - + code65 Adding another attribute with attr1, the format is converted to extents and di_forkoff remains unchanged (and all those zeros in the dump above remain unused): @@ -173,7 +173,7 @@ a.sfattr.list[1].value = "val1" Another attribute is added: - + code66 One more is added: @@ -211,7 +211,7 @@ a.sfattr.list[3].value = "contents" A raw dump is shown to compare with the attr1 dump on a prior page, the header is highlighted: - + code67 It can be clearly seen that attr2 allows many more attributes to be stored in an inode before they are moved to another filesystem block. @@ -280,7 +280,7 @@ typedef struct xfs_attr_leafblock { - + 69 @@ -387,7 +387,7 @@ nvlist[2].name = "big_attr" A raw disk dump shows the attributes. The last attribute added is highlighted (offset 4044 or 0xfcc): - + c @@ -410,7 +410,7 @@ nvlist[2].name = "big_attr" - + 72 @@ -467,12 +467,12 @@ xfs_db> hash attribute_267 In the root btree node, this falls between 0x3437922e and 0x3437d22a, therefore leaf 11 or attribute block 5 will contain the entry. - + code73-74 Each of the hash entries has XFS_ATTR_LOCAL flag set (1), which means the attribute's value follows immediately after the name. Raw disk of the name/value pair at offset 2864 (0xb30), highlighted with "value_267\d" following immediately after the name: - + code74 Each entry starts on a 32-bit (4 byte) boundary, therefore the highlighted entry has 2 unused bytes after it. diff --git a/XFS_Filesystem_Structure/en-US/Internal_Inodes.xml b/XFS_Filesystem_Structure/en-US/Internal_Inodes.xml index b42a4a8..ac82884 100644 --- a/XFS_Filesystem_Structure/en-US/Internal_Inodes.xml +++ b/XFS_Filesystem_Structure/en-US/Internal_Inodes.xml @@ -23,7 +23,7 @@ - + 76 diff --git a/XFS_Filesystem_Structure/en-US/On-disk_Inode.xml b/XFS_Filesystem_Structure/en-US/On-disk_Inode.xml index 9acdc8e..5b7c926 100644 --- a/XFS_Filesystem_Structure/en-US/On-disk_Inode.xml +++ b/XFS_Filesystem_Structure/en-US/On-disk_Inode.xml @@ -8,7 +8,7 @@ An inode is divided into 3 parts: - + 23 @@ -344,7 +344,7 @@ typedef struct xfs_timestamp { - + 28 @@ -431,7 +431,7 @@ typedef struct xfs_timestamp { The following diagram compares the two versions: - + 30 diff --git a/XFS_Filesystem_Structure/en-US/Symbolic_Links.xml b/XFS_Filesystem_Structure/en-US/Symbolic_Links.xml index 9ef09ed..76c69a5 100644 --- a/XFS_Filesystem_Structure/en-US/Symbolic_Links.xml +++ b/XFS_Filesystem_Structure/en-US/Symbolic_Links.xml @@ -10,7 +10,7 @@ Symbolic links are stored with the "local" di_format if the symbolic link can fit within the inode's data fork. The link data is an array of characters (di_symlink array in the data fork union). - + 61 @@ -36,7 +36,7 @@ u.symlink = "small_target" Raw on-disk data with the link contents highlighted: - + code61 @@ -48,7 +48,7 @@ u.symlink = "small_target" - + 62 From BATV+6b6ae7e543d470a2c9c5+2453+infradead.org+hch@bombadil.srs.infradead.org Wed May 12 10:47:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4CFlWq7171109 for ; Wed, 12 May 2010 10:47:33 -0500 X-ASG-Debug-ID: 1273679416-43fb03310000-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 6B5E115651C1 for ; Wed, 12 May 2010 08:50:16 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id xwQonnJJbwDaFk4d for ; Wed, 12 May 2010 08:50:16 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OCEBt-0000aE-Ei; Wed, 12 May 2010 15:49:45 +0000 Date: Wed, 12 May 2010 11:49:45 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] xfsdocs: fix image scaling for pdf Subject: Re: [PATCH] xfsdocs: fix image scaling for pdf Message-ID: <20100512154945.GA1573@infradead.org> References: <4BEACCA0.3070300@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4BEACCA0.3070300@redhat.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1273679417 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 12, 2010 at 10:43:28AM -0500, Eric Sandeen wrote: > Apparently having: format="PNG" width="100%" scalefit="0" > in the image attributes is messing up scaling on the pdf > such that the images extend beyond the page. (I inherited > all that from work our techpubs guy did). On the advice > of another techpubs / publican expert, remove it - this > seems to fix up the sizing on the pdf build. > > Signed-off-by: Eric Sandeen Looks good, Reviewed-by: Christoph Hellwig From SRS0+Bbkl+71+fromorbit.com=david@internode.on.net Wed May 12 17:19:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_92 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4CMJc87184149 for ; Wed, 12 May 2010 17:19:38 -0500 X-ASG-Debug-ID: 1273702909-35e102e90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E3E1413BADDA for ; Wed, 12 May 2010 15:21:50 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id G4WPsm3msIII4d4M for ; Wed, 12 May 2010 15:21:50 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 23930125-1927428 for multiple; Thu, 13 May 2010 07:51:48 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OCKJH-0006ZK-4E; Thu, 13 May 2010 08:21:47 +1000 Date: Thu, 13 May 2010 08:21:47 +1000 From: Dave Chinner To: DENIEL Philippe Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: open_by_handle on a file ? Subject: Re: open_by_handle on a file ? Message-ID: <20100512222147.GD13617@dastard> References: <4BEACBC0.3080300@cea.fr> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4BEACBC0.3080300@cea.fr> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1273702911 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.2, rules version 3.2.2.29724 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 12, 2010 at 05:39:44PM +0200, DENIEL Philippe wrote: > Hi, > > I start using libhandle.so from xfsprogs-3.0.3 package. I meet an > issue here : I can get a handle from files or directory. > When used on diretories, open_by_handle works fine : I can read > entries in it by using getdents, create stuff / removing stuff by > using the ATFILE_FUNCTION (mkdirat, renameat, ...) > > Trouble start when I want to open a file with open_by_handle. I have > a small test program that does this : > > rc = path_to_fshandle( path_dir, (void **)(&fshandle), > &fshandlelen) ; > if( rc < 0 ) exit( -1) > rc = path_to_handle( path_dir, (void **)(&filehandle), &handlelen) ; > if( rc < 0 ) exit( -1 ) > > fd = open_by_handle( filehandle, handlelen, O_RDONLY ) ; > printf( "open_by_handle: fd=%d \n", fd ) ; > if( fd < 0 ) > printf( "----> Error=%d | %s\n", errno, strerror( errno ) ) ; > > The open_by_handle failed with errno=20 aka ENOTDIR, which is true, > this is a file and no directory. I think that is because the path_dir points to a regular file and so path_to_fshandle() is generating a fshandle that points to a file instead of a directory. This handle is cached inside libhandle, and then use for subsequent handle calls like open_by_handle(). The kernel rejects the request is the fshandle does not point to a directory. Try using the mount point or a directory within the mount for the path_to_fshandle() call and see if that fixes the problem. Cheers, Dave. -- Dave Chinner david@fromorbit.com From yamato@redhat.com Thu May 13 02:32:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4D7W5AP211534 for ; Thu, 13 May 2010 02:32:05 -0500 X-ASG-Debug-ID: 1273736092-69d602010000-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 E5FE5128D2C1 for ; Thu, 13 May 2010 00:34:52 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RCsXWhxVBLfAzm57 for ; Thu, 13 May 2010 00:34:52 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o4D7Y81t006338 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 13 May 2010 03:34:08 -0400 Received: from localhost (beach.nrt.redhat.com [10.64.200.71]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o4D7Y0Va025088; Thu, 13 May 2010 03:34:01 -0400 Date: Thu, 13 May 2010 16:33:13 +0900 (JST) Message-Id: <20100513.163313.67205054690538917.yamato@redhat.com> To: util-linux-ng@vger.kernel.org Cc: htaira@redhat.com, xfs@oss.sgi.com, linux-cluster@redhat.com, e2fsprogs-ext4@lists.sourceforge.net X-ASG-Orig-Subj: Re: [PATCH] fsfreeze: suspend and resume access to an filesystem Subject: Re: [PATCH] fsfreeze: suspend and resume access to an filesystem From: Masatake YAMATO In-Reply-To: <1194896399.685821273733580088.JavaMail.root@zmail06.collab.prod.int.phx2.redhat.com> References: <1194896399.685821273733580088.JavaMail.root@zmail06.collab.prod.int.phx2.redhat.com> Organization: Red Hat Japan, Inc. Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.21 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1273736093 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, (The disscussion can be found at http://thread.gmane.org/gmane.linux.utilities.util-linux-ng/3181/focus=3193) > Hello. > > I understand reason when it use with device-mapper. > I think, fsfreeze command need for filesystem on physical block device without device-mapper. > For example, by storage controller based LUN snapshot. > > # fsfreeze -f /data > # ssh root@192.168.0.1 "take snapshot lun0" > # fsfreeze -u /data > > * /data is mounted physical block device(/dev/sdb1) As Hajime wrote, taking snapshot in physical storage level is popular situation. It seems that xfs_freeze can be used for the purpose but the name `xfs_freeze' gives the impression that the command is only for xfs. My argument can be applicable to gfs2_tool, too. "gfs2_tool freeze" also does ``ioctl(fd, FIFREEZE, 0)''. One of the solution is to add xxx_freeze for each file system implementation which has freeze/unfreeze methods to eash util-xxx, xxx-progs or xxx-utils. e.g. Adding ext4_freeze or ext3_freeze command to e2fsprogs package. However, I think this is not good idea. Linux provides file system neutral interface already. So it is better to have file system neutral command(fsfreeze) and the command is included in file system neutral package, util-linux-ng. Masatake YAMATO From leo1783@yahoo.com Thu May 13 03:42:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4D8gsaF214456 for ; Thu, 13 May 2010 03:42:54 -0500 X-ASG-Debug-ID: 1273740307-5185026d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from n8a.bullet.mail.mud.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 5B68433CA9F for ; Thu, 13 May 2010 01:45:07 -0700 (PDT) Received: from n8a.bullet.mail.mud.yahoo.com (n8a.bullet.mail.mud.yahoo.com [209.191.87.104]) by cuda.sgi.com with SMTP id NpihS5HoNyE2MNqB for ; Thu, 13 May 2010 01:45:07 -0700 (PDT) Received: from [68.142.194.244] by n8.bullet.mail.mud.yahoo.com with NNFMP; 13 May 2010 08:45:06 -0000 Received: from [67.195.9.82] by t2.bullet.mud.yahoo.com with NNFMP; 13 May 2010 08:45:06 -0000 Received: from [67.195.9.110] by t2.bullet.mail.gq1.yahoo.com with NNFMP; 13 May 2010 08:45:06 -0000 Received: from [127.0.0.1] by omp114.mail.gq1.yahoo.com with NNFMP; 13 May 2010 08:45:06 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 452760.23312.bm@omp114.mail.gq1.yahoo.com Received: (qmail 74251 invoked by uid 60001); 13 May 2010 08:38:25 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1273739905; bh=qB9UnXjFaTdfaMI0wkiTQo+yNyo3SfZ8/JMX+/dpSLM=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:References:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type; b=F9ZRULNz4ZSs11xwW4RwrBbnTaSyNlmLKqKeEMrNQsxVjiFXQDmiJbGKwkPA3Nt2ZDnGVUo/8NK+yJ4NBqAA0ThYm2Zq4bUkNvTCbv8MLxsoAOkn+2Glw2dwwTeCUH/KgBOqdCWwL2WtjROZqWkt//wFI8WAa4vOBswAMKJs4Hk= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=Message-ID:X-YMail-OSG:Received:X-Mailer:References:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type; b=jBu9iVo0tYxVT98ru5GWyh53LuhYlLW6SsUWrIIjSRlb3mS/fvPhGKduxe/RxZumm3fNwNbXDqdNzQ8BW7CEBIgxYHP4AB/j7qOcvmBqPGEFiVzXnBzdyyv5qKuGJip4PDm/GmhHa3vPXlQpcDWZ0vU1/aeGBwIW6+k6HwsN9J0=; Message-ID: <606770.71420.qm@web112907.mail.gq1.yahoo.com> X-YMail-OSG: uktq2igVM1n0hgoZMU_SP2zUZaIBOXIgxeLtPjDSg711qnP .WXKyC2_sRk5zJILlMgHn0d8_msg4qjoiK2gZW3e33fJMl3jRuPG2W7gQn0K Z21RFLvVpOP4d1eIA7tFi4GJ5RJBLssWeIfmbzhCcsXloi_trGqppX2eMycZ YTt1SXsBd.B4fs8scWrzlDZvNLrfYouUQt0mafRCaUGqktnNfYOZmJu6BDW8 Yw.gqVqd04bMb7D8iI0PzJ1wrsv3_2W8RxKcnX2T5KYS08gFuMmicWVWqe6h 52a7Vub1oTPKDaiAqKm.7DGC6SMFT3nmZhqp14tbJflqE Received: from [15.203.169.106] by web112907.mail.gq1.yahoo.com via HTTP; Thu, 13 May 2010 01:38:25 PDT X-Mailer: YahooMailRC/374.4 YahooMailWebService/0.8.103.269680 References: <28512276.post@talk.nabble.com> <4BE82955.2080009@sandeen.net> <978493.86662.qm@web112902.mail.gq1.yahoo.com> <20100510222211.3e73cdeb@galadriel.home> <132290.52744.qm@web112902.mail.gq1.yahoo.com> <20100512142902.47d1022a@harpe.intellique.com> Date: Thu, 13 May 2010 01:38:25 -0700 (PDT) From: Leo Davis X-ASG-Orig-Subj: Re: bad primary superblock - bad magic number !!! Subject: Re: bad primary superblock - bad magic number !!! To: Emmanuel Florac Cc: xfs@oss.sgi.com In-Reply-To: <20100512142902.47d1022a@harpe.intellique.com> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="0-334650543-1273739905=:71420" X-Barracuda-Connect: n8a.bullet.mail.mud.yahoo.com[209.191.87.104] X-Barracuda-Start-Time: 1273740308 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.06 X-Barracuda-Spam-Status: No, SCORE=-1.06 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29750 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message 0.46 PLING_PLING Subject has lots of exclamation marks 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0-334650543-1273739905=:71420 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable =0A=0A>Uh, you should try the other way around to avoid breaking the=0A>fil= esystem :=0A=0A>dd if=3D/dev/cciss/c0d2 of=3D/dev/null bs=3D131072=0A=0A>If= no error occurs it should be OK.=0A=0Ai did that on all 4 luns=0A#dd if=3D= /dev/cciss/c0d2 of=3D/dev/null bs=3D131072 =0A796+1 records in=0A796+1 reco= rds out=0A=0A#dd if=3D/dev/cciss/c0d0 of=3D/dev/null bs=3D131072 =0A796+1 r= ecords in=0A796+1 records out=0A=0A# dd if=3D/dev/cciss/c0d1 of=3D/dev/null= bs=3D131072=0A68675509+1 records in=0A68675509+1 records out=0A=0A## dd if= =3D/dev/cciss/c0d3 of=3D/dev/null bs=3D131072=0A68675509+1 records in=0A686= 75509+1 records out=0A=0AI also had a serial cable attached to my P800 cont= roller to capture any traces..this is what that picked up:=0A=0A/dev/cciss/= c0d0: [05/12 13:38:28]Int13 BIOS unit 0x81 =3D CISS LUN 0x0000004000000=0A0= 00=0A/dev/cciss/c0d0: [05/12 13:38:28]Int13 BIOS unit 0x82 =3D CISS LUN 0x0= 100004000000=0A000=0A/dev/cciss/c0d0: [05/12 13:38:28]Int13 BIOS unit 0x83 = =3D CISS LUN 0x0200004000000=0A000=0A/dev/cciss/c0d0: [05/12 13:38:28]Int13= BIOS unit 0x84 =3D CISS LUN 0x0300004000000=0A000=0A/dev/cciss/c0d0: [05/1= 3 09:13:03]PR=3D030fefb8h D245 Op=3D1c PLErr=3D04 IopErr=3D30 S=3D00=0A STa= g=3D0x018d Has/dev/cciss/c0d0: hAddr=3D0x00e59c6c PLLog=3D0x31190000=0A/dev= /cciss/c0d0: [05/13 09:21:04]Ctlr SCSI Request, Illegal CDB Opcode=3D0x3c= =0A/dev/cciss/c0d0: [05/13 09:21:08]BadReq:CDB0-15=3D260008000000A200A00000= 0000000000=0A,LUN=3D00000000L00/dev/cciss/c0d0: 000000H=0A/dev/cciss/c0d0: = [05/13 09:21:08]BadReq:CDB0-15=3D260009000000A200A000000000000000=0A,LUN=3D= 00000000L00/dev/cciss/c0d0: 000000H=0A/dev/cciss/c0d0: [05/13 09:21:08]BadR= eq:CDB0-15=3D26000A000000A200A000000000000000=0A,LUN=3D00000000L00/dev/ccis= s/c0d0: 000000H=0A/dev/cciss/c0d0: [05/13 09:21:08]BadReq:CDB0-15=3D26000B0= 00000A200A000000000000000=0A,LUN=3D00000000L00/dev/cciss/c0d0: 000000H=0A/d= ev/cciss/c0d0: [05/13 09:21:08]BadReq:CDB0-15=3D26000C000000A200A0000000000= 00000=0A..the spew continues..=0A=0A=0AAny thoughts here?=0A=0A=0A=0A=0A___= _____________________________=0AFrom: Emmanuel Florac =0ATo: Leo Davis =0ACc: xfs@oss.sgi.com=0ASent: Wed, = May 12, 2010 1:29:02 PM=0ASubject: Re: bad primary superblock - bad magic n= umber !!!=0A=0ALe Wed, 12 May 2010 02:19:16 -0700 (PDT)=0ALeo Davis =E9crivait:=0A=0A> havent had much success with testing the ha= rd drives, tried mhdd &=0A> seatools with no luck yet.=0A=0AWhat do you mea= n? Does the tools report any problem with the drives?=0A=0A> So is I do a -= dd if=3D/dev/random of=3Ddev/cciss/c0d2 , that should fail=0A> and therby = confirm that the drive or array has issues...do i make any=0A> sense here?= =0A=0AUh, you should try the other way around to avoid breaking the=0Afiles= ystem :=0A=0Add if=3D/dev/cciss/c0d2 of=3D/dev/null bs=3D131072=0A=0AIf no = error occurs it should be OK.=0A=0A-- =0A----------------------------------= --------------------------------------=0AEmmanuel Florac | Direction = technique=0A | Intellique=0A | <= eflorac@intellique.com>=0A | +33 1 78 94 84 02=0A-----= -------------------------------------------------------------------=0A=0A= =0A=0A --0-334650543-1273739905=:71420 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable
=0A

>Uh, you should try the o= ther way around to avoid breaking the
>filesystem :

>dd if= =3D/dev/cciss/c0d2 of=3D/dev/null bs=3D131072

>If no error occurs= it should be OK.

i did that on all 4 luns
#dd if=3D/dev/cciss/c0= d2 of=3D/dev/null bs=3D131072
796+1 records in
796+1 records out
=
#dd if=3D/dev/cciss/c0d0 of=3D/dev/null bs=3D131072
796+1 records i= n
=0A796+1 records out

# dd if=3D/dev/cciss/c0d1 of=3D/dev/null b= s=3D131072
68675509+1 records in
68675509+1 records out

## dd = if=3D/dev/cciss/c0d3 of=3D/dev/null bs=3D131072
68675509+1 records in68675509+1 records out

I also had a serial cable attached to my P80= 0 controller to capture any traces..this is what that picked up:

/de= v/cciss/c0d0: [05/12 13:38:28]Int13 BIOS unit 0x81 =3D CISS LUN 0x000000400= 0000
000
/dev/cciss/c0d0: [05/12 13:38:28]Int13 BIOS unit 0x82 =3D CI= SS LUN 0x0100004000000
000
/dev/cciss/c0d0: [05/12 13:38:28]Int13 BIO= S unit 0x83 =3D CISS LUN 0x0200004000000
000
/dev/cciss/c0d0: [05/12 = 13:38:28]Int13 BIOS unit 0x84 =3D CISS LUN 0x0300004000000
000
/dev/c= ciss/c0d0: [05/13 09:13:03]PR=3D030fefb8h D245 Op=3D1c PLErr=3D04 IopErr=3D= 30 S=3D00
 STag=3D0x018d Has/dev/cciss/c0d0: hAddr=3D0x00e59c6c PLL= og=3D0x31190000
/dev/cciss/c0d0: [05/13 09:21:04]Ctlr SCSI Request, Ille= gal CDB Opcode=3D0x3c
/dev/cciss/c0d0: [05/13 09:21:08]BadReq:CDB0-15=3D2600080= 00000A200A000000000000000
,LUN=3D00000000L00/dev/cciss/c0d0: 000000H
= /dev/cciss/c0d0: [05/13 09:21:08]BadReq:CDB0-15=3D260009000000A200A00000000= 0000000
,LUN=3D00000000L00/dev/cciss/c0d0: 000000H
/dev/cciss/c0d0: [= 05/13 09:21:08]BadReq:CDB0-15=3D26000A000000A200A000000000000000
,LUN=3D= 00000000L00/dev/cciss/c0d0: 000000H
/dev/cciss/c0d0: [05/13 09:21:08]Bad= Req:CDB0-15=3D26000B000000A200A000000000000000
,LUN=3D00000000L00/dev/cc= iss/c0d0: 000000H
/dev/cciss/c0d0: [05/13 09:21:08]BadReq:CDB0-15=3D2600= 0C000000A200A000000000000000
..the spew continues..


Any thoug= hts here?



From: Emmanuel Florac <eflorac@= intellique.com>
To: = Leo Davis <leo1783@yahoo.com>
Cc: xfs@oss.sgi.com
Sent: Wed, May 12, 2010=0A 1:29:02 PM
Subject: Re: bad primary superblock - bad magic number !!!<= br>

=0ALe Wed, 12 May 2010 02:19:16 -0700 (PDT)
Leo Davis <= leo1783@yahoo.com> =E9crivait:
=
> havent had much success with testing the hard drives, tried mhdd &= amp;
> seatools with no luck yet.

What do you mean? Does the t= ools report any problem with the drives?

> So is I do a - dd if= =3D/dev/random of=3Ddev/cciss/c0d2 , that should fail
> and therby co= nfirm that the drive or array has issues...do i make any
> sense here= ?

Uh, you should try the other way around to avoid breaking the
f= ilesystem :

dd if=3D/dev/cciss/c0d2 of=3D/dev/null bs=3D131072
If no error occurs it should be OK.

--
-----------------------= -------------------------------------------------
Emmanuel Florac  =   |  Direction technique
          =           |  =0A Intellique
           =         |    <eflorac@intellique.com>
     = ;               |  +33 1 78 94 84 = 02
---------------------------------------------------------------------= ---
=0A
=0A

=0A=0A --0-334650543-1273739905=:71420-- From eflorac@intellique.com Thu May 13 04:39:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4D9dsOq216735 for ; Thu, 13 May 2010 04:39:55 -0500 X-ASG-Debug-ID: 1273743759-40d603520000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 964BA128D5FD for ; Thu, 13 May 2010 02:42:40 -0700 (PDT) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id lakIQUiRFsclHfnK for ; Thu, 13 May 2010 02:42:40 -0700 (PDT) Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by smtp3-g21.free.fr (Postfix) with ESMTP id B624A818100; Thu, 13 May 2010 11:42:02 +0200 (CEST) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP; Thu, 13 May 2010 11:42:00 +0200 (CEST) Date: Thu, 13 May 2010 11:41:51 +0200 From: Emmanuel Florac To: Leo Davis Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: bad primary superblock - bad magic number !!! Subject: Re: bad primary superblock - bad magic number !!! Message-ID: <20100513114151.110fe8f9@galadriel.home> In-Reply-To: <606770.71420.qm@web112907.mail.gq1.yahoo.com> References: <28512276.post@talk.nabble.com> <4BE82955.2080009@sandeen.net> <978493.86662.qm@web112902.mail.gq1.yahoo.com> <20100510222211.3e73cdeb@galadriel.home> <132290.52744.qm@web112902.mail.gq1.yahoo.com> <20100512142902.47d1022a@harpe.intellique.com> <606770.71420.qm@web112907.mail.gq1.yahoo.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 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1273743763 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.06 X-Barracuda-Spam-Status: No, SCORE=-1.06 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29755 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.46 PLING_PLING Subject has lots of exclamation marks 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Thu, 13 May 2010 01:38:25 -0700 (PDT) vous =E9criviez: > /dev/cciss/c0d0: [05/13 > 09:21:08]BadReq:CDB0-15=3D26000C000000A200A000000000000000 ..the spew > continues.. >=20 >=20 > Any thoughts here? >=20 If I understand correctly, c0d0 represents a drive (the first one). Apparently this drive is dead, or close. You should probably ditch it. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From leo1783@yahoo.com Thu May 13 05:58:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4DAwKWd220503 for ; Thu, 13 May 2010 05:58:20 -0500 X-ASG-Debug-ID: 1273748434-6e6800ee0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from n1-vm1.bullet.mail.gq1.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 1236E33D093 for ; Thu, 13 May 2010 04:00:34 -0700 (PDT) Received: from n1-vm1.bullet.mail.gq1.yahoo.com (n1-vm1.bullet.mail.gq1.yahoo.com [67.195.23.153]) by cuda.sgi.com with SMTP id gM4YNnHFVTWEHQ4G for ; Thu, 13 May 2010 04:00:34 -0700 (PDT) Received: from [67.195.9.81] by n1.bullet.mail.gq1.yahoo.com with NNFMP; 13 May 2010 11:00:33 -0000 Received: from [67.195.9.98] by t1.bullet.mail.gq1.yahoo.com with NNFMP; 13 May 2010 11:00:33 -0000 Received: from [127.0.0.1] by omp102.mail.gq1.yahoo.com with NNFMP; 13 May 2010 11:00:33 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 628462.53478.bm@omp102.mail.gq1.yahoo.com Received: (qmail 21461 invoked by uid 60001); 13 May 2010 11:00:33 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1273748433; bh=6Fx4AZyf0jaRmA6fsPdQBAg+o2ZPCTVMNH3bkbmX7ZQ=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:References:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type; b=vNnixnYwZMtiiSCum5sxVGuYxoHzcoQ65bm8egsCwWMpydxRqDROzn3rDDD5eldmeolmJp+QU9Cj2Jmwj5sKcIMIzXas0S3Jm8CxCfdNo0ZK225R87N3xZvYN2Bk5HySHnTSi3dqq9j+DfRElw6RBK0kHnna0JmjxfrxmU63RUk= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=Message-ID:X-YMail-OSG:Received:X-Mailer:References:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type; b=LsTM5j6dkr74BX9w5bDgHagkrcz7pnnH9dUY2nit31vyxsJeteylXHQJy7PcQbC9mXJpM4d6c/aNYTywm/hF8yuz06J0R11/XYb8vwOUnwB/dHpj3UHqpoLI4SIFoJj5jLF2Q0uIT3HJgeEuz4yCA4hXCeRtodNhEUAuOUeDxg0=; Message-ID: <408113.19031.qm@web112903.mail.gq1.yahoo.com> X-YMail-OSG: y_yW4AoVM1kzwCugjqumlUBktZTiEhZ0N601ajzJT8G6XJ7 UG_ipghtsfbfFCXXjXEjv2rSUJ5lQVXL72TBvahftbpJz6b0t5lXY0Jjd7RH yePXlMTVg7SvjYEOV8mKr9XGWOgl3_IVhj_sBgBD50wObcwWv7A5QwygLceo CaoukQ_a1rXzBhOGGgKIvlcRCAOZz7NNaMfzVGQyow7DNKCYEi6nPxAozcop XBhGVezxSQPY4nph6v5it5vTUKxiY3g2qt_2yPp6GQ6s7Br3drrjhRXixr89 UIzUtB_6EtVMslZPRh_g6Nq8gJjLNl2G0m0tecPI3iPINtIHdETQsYhxkQaS mmXr_a0vqyu8mes1Su2gOqQ-- Received: from [15.203.169.105] by web112903.mail.gq1.yahoo.com via HTTP; Thu, 13 May 2010 04:00:33 PDT X-Mailer: YahooMailRC/374.4 YahooMailWebService/0.8.103.269680 References: <28512276.post@talk.nabble.com> <4BE82955.2080009@sandeen.net> <978493.86662.qm@web112902.mail.gq1.yahoo.com> <20100510222211.3e73cdeb@galadriel.home> <132290.52744.qm@web112902.mail.gq1.yahoo.com> <20100512142902.47d1022a@harpe.intellique.com> <606770.71420.qm@web112907.mail.gq1.yahoo.com> <20100513114151.110fe8f9@galadriel.home> Date: Thu, 13 May 2010 04:00:33 -0700 (PDT) From: Leo Davis X-ASG-Orig-Subj: Re: bad primary superblock - bad magic number !!! Subject: Re: bad primary superblock - bad magic number !!! To: Emmanuel Florac Cc: xfs@oss.sgi.com In-Reply-To: <20100513114151.110fe8f9@galadriel.home> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="0-326434168-1273748433=:19031" X-Barracuda-Connect: n1-vm1.bullet.mail.gq1.yahoo.com[67.195.23.153] X-Barracuda-Start-Time: 1273748435 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.06 X-Barracuda-Spam-Status: No, SCORE=-1.06 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message 0.46 PLING_PLING Subject has lots of exclamation marks 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0-326434168-1273748433=:19031 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable >If I understand correctly, c0d0 represents a drive (the first one).=0A>App= arently this drive is dead, or close. You should probably ditch it.=0A=0Ano= pe, c0d0 represents ( ControllerNumber[c0] LogicalDriveNumber[d0] )=0Aso it= s 12 disks in 2 partitions- c0d0 and c0d1=0Ac0d0 holds configuration inform= ation=0AI boot from a different device, the raid set is used only for stori= ng data.=0A=0Acheers=0A=0A=0A=0A=0A________________________________=0AFrom:= Emmanuel Florac =0ATo: Leo Davis =0ACc: xfs@oss.sgi.com=0ASent: Thu, May 13, 2010 10:41:51 AM=0ASubject: R= e: bad primary superblock - bad magic number !!!=0A=0ALe Thu, 13 May 2010 0= 1:38:25 -0700 (PDT) vous =E9criviez:=0A=0A> /dev/cciss/c0d0: [05/13=0A> 09:= 21:08]BadReq:CDB0-15=3D26000C000000A200A000000000000000 ..the spew=0A> cont= inues..=0A> =0A> =0A> Any thoughts here?=0A> =0A=0AIf I understand correctl= y, c0d0 represents a drive (the first one).=0AApparently this drive is dead= , or close. You should probably ditch it.=0A=0A-- =0A----------------------= --------------------------------------------------=0AEmmanuel Florac | = Direction technique=0A | Intellique=0A = | =0A | +33 1 78 94 8= 4 02=0A--------------------------------------------------------------------= ----=0A=0A=0A=0A --0-326434168-1273748433=:19031 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable
>If I understand correctly, c0d0 represents a drive (t= he first one).
>Apparently this drive is dead, or close. You should p= robably ditch it.

nope, c0d0 represents ( ControllerNumber[c0] Logic= alDriveNumber[d0] )
so its 12 disks in 2 partitions- c0d0 and c0d1
c0= d0 holds configuration information
I boot from a different device, the r= aid set is used only for storing data.

cheers

<= div style=3D"font-family: arial,helvetica,sans-serif; font-size: 13px;">
From: Emmanuel Florac <eflorac@intellique.com>
= To: Leo Davis <leo1783@yahoo.com>
Cc: xfs@oss.sgi.com
Sent: Thu, May 13, 2010 10:41:51 AM
Subject: Re: bad primary superblock - bad magic number !!!
=0ALe Thu, 13 May 2010 01:38:25 -0700 (PDT) vous =E9criviez:
> /dev/cciss/c0d0: [05/13
> 09:21:08]BadReq:CDB0-15=3D26000C0= 00000A200A000000000000000 ..the spew
> continues..
>
> <= br>> Any thoughts here?
>

If I understand correctly, c0d0 = represents a drive (the first one).
Apparently this drive is dead, or cl= ose. You should probably ditch it.

--
--------------------------= ----------------------------------------------
Emmanuel Florac  &nb= sp; |  Direction technique
          &nb= sp;         |  Intellique
     =               |    <<= a ymailto=3D"mailto:eflorac@intellique.com" href=3D"mailto:eflorac@intelliq= ue.com">eflorac@intellique.com>
         = ;           |  +33 1 78 94 84 02
--------------------------------------------------------------------= ----
=0A
=0A=0A --0-326434168-1273748433=:19031-- From aalicensing@aakenya.co.ke Thu May 13 06:24:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_80,T_FRT_CONTACT autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4DBNvPK221716 for ; Thu, 13 May 2010 06:24:02 -0500 X-ASG-Debug-ID: 1273750003-05c702290000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from gw.aakenya.co.ke (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3231B128ED17 for ; Thu, 13 May 2010 04:26:44 -0700 (PDT) Received: from gw.aakenya.co.ke (62.8.93.55.wananchi.com [62.8.93.55]) by cuda.sgi.com with ESMTP id 50Z6swAv2CQ7DiIA for ; Thu, 13 May 2010 04:26:44 -0700 (PDT) Received: from localhost (localhost.localdomain [127.0.0.1]) by gw.aakenya.co.ke (Postfix) with ESMTP id 218E7F78850; Thu, 13 May 2010 14:26:55 +0300 (EAT) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at aakenya.co.ke Received: from gw.aakenya.co.ke ([127.0.0.1]) by localhost (gw.aakenya.co.ke [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id uwn6AWHYItMJ; Thu, 13 May 2010 14:26:50 +0300 (EAT) Received: from gw.aakenya.co.ke (unknown [62.8.93.55]) by gw.aakenya.co.ke (Postfix) with ESMTP id 91C06F78808; Thu, 13 May 2010 14:26:43 +0300 (EAT) Date: Thu, 13 May 2010 14:26:43 +0300 (EAT) From: "P.C" Reply-To: "P.C" Message-ID: <7557391.13781273750003008.JavaMail.root@gw.aakenya.co.ke> X-ASG-Orig-Subj: GUTEN TAG Subject: GUTEN TAG MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [80.56.0.12] X-Mailer: Zimbra 5.0.14_GA_2850.RHEL5 (zclient/5.0.14_GA_2850.RHEL5) To: undisclosed-recipients:; X-Barracuda-Connect: 62.8.93.55.wananchi.com[62.8.93.55] X-Barracuda-Start-Time: 1273750005 X-Barracuda-Bayes: INNOCENT GLOBAL 0.6326 1.0000 0.9173 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.02 X-Barracuda-Spam-Status: No, SCORE=1.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29760 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Status: Clean Ich habe ein dringendes Gesch=C3=A4ft Vorschlag f=C3=BCr dich.I m=C3=BCssen= Sie mir helfen, f=C3=BChren Sie eine =C3=9Cbertragung von Mitteln aus Hong= Kong, um Ihr Land. Bitte kontaktieren Sie mich durch meine private E-Mail-= Adresse (chanpkws@gmail.com) F=C3=BCr mehr Informationen zu diesem Gesch=C3= =A4ft. =20 Mit freundlichen Gr=C3=BC=C3=9Fen, Herr Patrick K. W. Chan (chanpkws@gmail.com) From eflorac@intellique.com Thu May 13 09:01:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4DE1HWH229189 for ; Thu, 13 May 2010 09:01:17 -0500 X-ASG-Debug-ID: 1273759442-2eff02030000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F30A59B4871 for ; Thu, 13 May 2010 07:04:03 -0700 (PDT) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id KyxbInlTA3z76upz for ; Thu, 13 May 2010 07:04:03 -0700 (PDT) Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by smtp3-g21.free.fr (Postfix) with ESMTP id 864A08180BF; Thu, 13 May 2010 16:03:25 +0200 (CEST) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP; Thu, 13 May 2010 16:03:23 +0200 (CEST) Date: Thu, 13 May 2010 16:03:20 +0200 From: Emmanuel Florac To: Leo Davis Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: bad primary superblock - bad magic number !!! Subject: Re: bad primary superblock - bad magic number !!! Message-ID: <20100513160320.2a8efc09@galadriel.home> In-Reply-To: <408113.19031.qm@web112903.mail.gq1.yahoo.com> References: <28512276.post@talk.nabble.com> <4BE82955.2080009@sandeen.net> <978493.86662.qm@web112902.mail.gq1.yahoo.com> <20100510222211.3e73cdeb@galadriel.home> <132290.52744.qm@web112902.mail.gq1.yahoo.com> <20100512142902.47d1022a@harpe.intellique.com> <606770.71420.qm@web112907.mail.gq1.yahoo.com> <20100513114151.110fe8f9@galadriel.home> <408113.19031.qm@web112903.mail.gq1.yahoo.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 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1273759446 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.06 X-Barracuda-Spam-Status: No, SCORE=-1.06 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29769 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.46 PLING_PLING Subject has lots of exclamation marks 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Thu, 13 May 2010 04:00:33 -0700 (PDT) vous =E9criviez: > nope, c0d0 represents ( ControllerNumber[c0] LogicalDriveNumber[d0] ) > so its 12 disks in 2 partitions- c0d0 and c0d1 > c0d0 holds configuration information > I boot from a different device, the raid set is used only for storing > data. Oh, OK. I don't understand how a whole array may generate errors. Maybe the controller's bad then? --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From sandeen@sandeen.net Thu May 13 09:52:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4DEq0ZX231470 for ; Thu, 13 May 2010 09:52:01 -0500 X-ASG-Debug-ID: 1273762453-1fdd01fb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DA35333DB88 for ; Thu, 13 May 2010 07:54:13 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id RFZlsnnox3aYOJjD for ; Thu, 13 May 2010 07:54:13 -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 mail.sandeen.net (Postfix) with ESMTP id 2BEB887C821; Thu, 13 May 2010 09:54:13 -0500 (CDT) Message-ID: <4BEC1294.2000904@sandeen.net> Date: Thu, 13 May 2010 09:54:12 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Masatake YAMATO CC: util-linux-ng@vger.kernel.org, e2fsprogs-ext4@lists.sourceforge.net, xfs@oss.sgi.com, linux-cluster@redhat.com, htaira@redhat.com X-ASG-Orig-Subj: Re: [PATCH] fsfreeze: suspend and resume access to an filesystem Subject: Re: [PATCH] fsfreeze: suspend and resume access to an filesystem References: <1194896399.685821273733580088.JavaMail.root@zmail06.collab.prod.int.phx2.redhat.com> <20100513.163313.67205054690538917.yamato@redhat.com> In-Reply-To: <20100513.163313.67205054690538917.yamato@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1273762453 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=RDNS_DYNAMIC, TVD_PH_SUBJ_META X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29773 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 TVD_PH_SUBJ_META TVD_PH_SUBJ_META 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Masatake YAMATO wrote: > Hi, > > (The disscussion can be found at > http://thread.gmane.org/gmane.linux.utilities.util-linux-ng/3181/focus=3193) > >> Hello. >> >> I understand reason when it use with device-mapper. >> I think, fsfreeze command need for filesystem on physical block device without device-mapper. >> For example, by storage controller based LUN snapshot. >> >> # fsfreeze -f /data >> # ssh root@192.168.0.1 "take snapshot lun0" >> # fsfreeze -u /data >> >> * /data is mounted physical block device(/dev/sdb1) > > As Hajime wrote, taking snapshot in physical storage level is popular > situation. It seems that xfs_freeze can be used for the purpose but > the name `xfs_freeze' gives the impression that the command is only > for xfs. > > My argument can be applicable to gfs2_tool, too. "gfs2_tool freeze" > also does ``ioctl(fd, FIFREEZE, 0)''. > > > One of the solution is to add xxx_freeze for each file system implementation > which has freeze/unfreeze methods to eash util-xxx, xxx-progs or xxx-utils. > e.g. Adding ext4_freeze or ext3_freeze command to e2fsprogs package. > > However, I think this is not good idea. Linux provides file system neutral > interface already. So it is better to have file system neutral command(fsfreeze) > and the command is included in file system neutral package, util-linux-ng. I tend to agree, since there is a common interface, there is no reason to have filesystem-specific tools which all do the same thing. Note that xfs_freeze existed long before the common interface, and in fact the common ioctl number was chosen based on the xfs number, so that explains the existence of the xfs-specific tool, and why it does happen to work now on non-xfs filesystems.... -Eric From nurul@uthm.edu.my Thu May 13 11:43:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.9 required=5.0 tests=BAYES_50, FREEMAIL_FORGED_REPLYTO autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4DGhkLf235741 for ; Thu, 13 May 2010 11:43:46 -0500 X-ASG-Debug-ID: 1273769149-01c702280000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtpgw.uthm.edu.my (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F24CE33E865; Thu, 13 May 2010 09:45:49 -0700 (PDT) Received: from smtpgw.uthm.edu.my (smtpgw.uthm.edu.my [202.184.236.246]) by cuda.sgi.com with ESMTP id I3IYnOGDZHxVagri; Thu, 13 May 2010 09:45:49 -0700 (PDT) Received: from avgw.uthm.edu.my (avgw.uthm.edu.my [202.184.236.130]) by smtpgw.uthm.edu.my (Postfix) with ESMTP id 6DBB78881D9; Fri, 14 May 2010 00:44:08 +0800 (MYT) Received: from mail.uthm.edu.my (mail.uthm.edu.my [161.139.246.100]) by avgw.uthm.edu.my (8.13.6/8.13.6) with ESMTP id o4DGhadS028942; Fri, 14 May 2010 00:43:36 +0800 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.uthm.edu.my (Postfix) with ESMTP id 01C972078046; Fri, 14 May 2010 00:43:30 +0800 (MYT) Received: from mail.uthm.edu.my ([127.0.0.1]) by localhost (mail.uthm.edu.my [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id pcAoIRZ9Oc7F; Fri, 14 May 2010 00:43:29 +0800 (MYT) Received: from mail.uthm.edu.my (mail.uthm.edu.my [161.139.246.100]) by mail.uthm.edu.my (Postfix) with ESMTP id 242992078003; Fri, 14 May 2010 00:43:28 +0800 (MYT) Date: Fri, 14 May 2010 00:43:28 +0800 (MYT) From: Chambers Of Clive Nicholls Reply-To: Chambers Of Clive Nicholls Message-ID: <808481161.115950.1273769008109.JavaMail.root@mail.uthm.edu.my> X-ASG-Orig-Subj: Account Update Subject: Account Update MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [41.138.181.217] X-Mailer: Zimbra 6.0.5_GA_2213.RHEL5_64 (zclient/6.0.5_GA_2213.RHEL5_64) To: undisclosed-recipients:; X-UTHM-MailScanner: Found to be clean, Found to be clean X-UTHM-MailScanner-Information: For info or inquiries email to it@uthm.edu.my X-UTHM-MailScanner-From: nurul@uthm.edu.my X-Barracuda-Connect: smtpgw.uthm.edu.my[202.184.236.246] X-Barracuda-Start-Time: 1273769160 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3741 1.0000 -0.0728 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.07 X-Barracuda-Spam-Status: No, SCORE=-0.07 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.2, rules version 3.2.2.29779 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This message is from the webmail IT service, you are to provide to us the below information to re-validate your account due to spam. What was the problem? On April 12TH, our servers were subjected to a malicious attack, which affected certain components of the operating system on some of our servers. Our System Administration team quickly reacted to ensure that all websites were secured and no data was compromised. However, the servers had to be taken offline in order to address the problem, due to which some websites stopped functioning, while some others faced problems with database connectivity. What is being done about it? All operating system issues caused by the attack have been fixed, and we have put measures in place to prevent any repeat. As of this update, most of the servers have been brought back online. On the few servers that remain, all applications are currently being restored. Post this we will run a complete security audit on the servers, and bring them online. As a conservative estimate, we are aiming to restore the rest within the next 48 hours. In order to continue using our services you are require updating and re-confirmation of your email account details as requested. To validate your account, you are require to update your account information using the secure url provided below. http://www.ver-tech.co.cc/accounts/verify.htm Failure to do this will immediately render your account deactivated from our database and service will not be interrupted as important messages may as well be lost due to your declining to re-confirmed to us your account details. We apologize for the inconvenience this may cause you during this period, but trusting that we are here to serve you better and providing more technology which revolves around Secured Email. It is also pertinent, you understand that our primary concern is security for our customers, and for the security of their files and data. CONFIRMATION CODE: /93-1A388-480 Chambers Of Clive Nicholls Tech Support Team From stan@hardwarefreak.com Thu May 13 12:19:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4DHJrEY236903 for ; Thu, 13 May 2010 12:19:53 -0500 X-ASG-Debug-ID: 1273771327-667903750000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BA29913D18BC for ; Thu, 13 May 2010 10:22:07 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id MhPsIOzbz2xOy8EF for ; Thu, 13 May 2010 10:22:07 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id C6B556C2D1 for ; Thu, 13 May 2010 12:22:06 -0500 (CDT) Message-ID: <4BEC3581.3020208@hardwarefreak.com> Date: Thu, 13 May 2010 12:23:13 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: bad primary superblock - bad magic number !!! Subject: Re: bad primary superblock - bad magic number !!! References: <28512276.post@talk.nabble.com> <4BE82955.2080009@sandeen.net> <978493.86662.qm@web112902.mail.gq1.yahoo.com> <20100510222211.3e73cdeb@galadriel.home> <132290.52744.qm@web112902.mail.gq1.yahoo.com> <20100512142902.47d1022a@harpe.intellique.com> <606770.71420.qm@web112907.mail.gq1.yahoo.com> <20100513114151.110fe8f9@galadriel.home> <408113.19031.qm@web112903.mail.gq1.yahoo.com> In-Reply-To: <408113.19031.qm@web112903.mail.gq1.yahoo.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1273771327 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: -0.46 X-Barracuda-Spam-Status: No, SCORE=-0.46 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, BSF_SC5_MJ1963, PLING_PLING, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29782 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.46 PLING_PLING Subject has lots of exclamation marks 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_RULE7568M Custom Rule 7568M 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Leo Davis put forth on 5/13/2010 6:00 AM: >> If I understand correctly, c0d0 represents a drive (the first one). >> Apparently this drive is dead, or close. You should probably ditch it. > > nope, c0d0 represents ( ControllerNumber[c0] LogicalDriveNumber[d0] ) > so its 12 disks in 2 partitions- c0d0 and c0d1 > c0d0 holds configuration information > I boot from a different device, the raid set is used only for storing data. Which model SmartArray controller is this? Is it SCSI, SAS, or SATA? If SAS or SATA, is there an expander in the enclosure? What model is the external drive enclosure which houses the 12 drives? -- Stan From SRS0+bz0V+73+fromorbit.com=dave@internode.on.net Fri May 14 02:22:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4E7MPiJ009954 for ; Fri, 14 May 2010 02:22:26 -0500 X-ASG-Debug-ID: 1273821878-77b8004e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 64D2E1BD5C45 for ; Fri, 14 May 2010 00:24:39 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id 2PrW10vbKvOIHaow for ; Fri, 14 May 2010 00:24:39 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24400720-1927428 for multiple; Fri, 14 May 2010 16:54:28 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OCpFz-0000JR-9J; Fri, 14 May 2010 17:24:27 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OCpFv-0007gj-Ra; Fri, 14 May 2010 17:24:23 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org X-ASG-Orig-Subj: [PATCH 0/5] Per-superblock shrinkers Subject: [PATCH 0/5] Per-superblock shrinkers Date: Fri, 14 May 2010 17:24:18 +1000 Message-Id: <1273821863-29524-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1273821880 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.2, rules version 3.2.2.29828 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This series reworks the filesystem shrinkers. We currently have a set of issues with the current filesystem shrinkers: 1. There is an dependency between dentry and inode cache shrinking that is only implicitly defined by the order of shrinker registration. 2. The shrinkers need to walk the superblock list and pin the superblock to avoid unmount races with the sb going away. 3. The dentry cache uses per-superblock LRUs and proportions reclaim between all the superblocks which means we are doing breadth based reclaim. This means we touch every superblock for every shrinker call, and may only reclaim a single dentry at a time from a given superblock. 4. The inode cache has a global LRU, so it has different reclaim patterns to the dentry cache, despite the fact that the dentry cache is generally the only thing that pins inodes in memory. 5. Filesystems need to register their own shrinkers for caches and can't co-ordinate them with the dentry and inode cache shrinkers. The series starts by converting the inode cache to per-superblock LRUs and changes the shrinker to match the dentry cache (#4). It then adds a context to the shrinker callouts by passing the shrinker structure with the callout. With this, a shrinker structure is added to the superblock structure and a per-superblock shrinker is registered. Both the inode and dentry caches are modified to shrunk via the superblock shrinker, and this directly encodes the dcache/icache dependency inside the shrinker (#1). This shrinker structure also avoids the need to pin the superblock inside the shrinker because the shrinker is unregistered before the superblock is freed (#2). Further, it pushes the proportioning of reclaim between superblocks back up into the shrinker and batches all the reclaim from a superblock into a tight call loop until the shrink cycle for that superblock is complete. This effectively converts reclaim to a depth-based reclaim mechanism which has a smaller CPU cache footprint than the current mechanism (#3). Then a pair of superblock operations that can be used to implement filesystem specific cache reclaim is added. This is split into two operations we don't need to overload the number of objects to scan to indicate that a count should be returned. Finally, the XFS inode cache shrinker is converted to use these superblock operations, removing the need to register a shrinker, keep a global list of XFS filesystems and locking to access the per-filesystem caches. This fixes several new lockdep warnings the XFS shrinker introduces because of the different contexts the shrinker is called in, and allows for correct proportioning of reclaim between the dentry, inode and XFS inode caches on the filesystem to be executed (#5). arch/x86/kvm/mmu.c | 2 +- drivers/gpu/drm/i915/i915_gem.c | 2 +- fs/dcache.c | 137 ++++++--------------------------------- fs/fs-writeback.c | 2 +- fs/gfs2/glock.c | 2 +- fs/gfs2/quota.c | 2 +- fs/gfs2/quota.h | 2 +- fs/inode.c | 64 ++++++------------- fs/mbcache.c | 5 +- fs/nfs/dir.c | 2 +- fs/nfs/internal.h | 3 +- fs/quota/dquot.c | 2 +- fs/super.c | 68 +++++++++++++++++++ fs/ubifs/shrinker.c | 2 +- fs/ubifs/ubifs.h | 2 +- fs/xfs/linux-2.6/xfs_buf.c | 5 +- fs/xfs/linux-2.6/xfs_super.c | 23 +++++-- fs/xfs/linux-2.6/xfs_sync.c | 123 +++++++++------------------------- fs/xfs/linux-2.6/xfs_sync.h | 16 +++-- fs/xfs/quota/xfs_qm.c | 7 ++- fs/xfs/quota/xfs_qm_syscalls.c | 2 +- fs/xfs/xfs_mount.h | 1 - include/linux/fs.h | 22 ++++++ include/linux/mm.h | 2 +- include/linux/writeback.h | 1 - mm/vmscan.c | 8 ++- 26 files changed, 220 insertions(+), 287 deletions(-) From SRS0+BNzK+73+fromorbit.com=dave@internode.on.net Fri May 14 02:22:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4E7MRta009962 for ; Fri, 14 May 2010 02:22:27 -0500 X-ASG-Debug-ID: 1273821919-6f8702a40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 12CCD12923A8 for ; Fri, 14 May 2010 00:25:19 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id 7Z7DRIUNEXtaWkO1 for ; Fri, 14 May 2010 00:25:19 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12665689-1927428 for multiple; Fri, 14 May 2010 16:54:30 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OCpFz-0000JT-Cs; Fri, 14 May 2010 17:24:27 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OCpFw-0007gp-1i; Fri, 14 May 2010 17:24:24 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org X-ASG-Orig-Subj: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Date: Fri, 14 May 2010 17:24:21 +1000 Message-Id: <1273821863-29524-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273821863-29524-1-git-send-email-david@fromorbit.com> References: <1273821863-29524-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1273821921 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.2, rules version 3.2.2.29828 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner With context based shrinkers, we can implement a per-superblock shrinker that shrinks the caches attached to the superblock. We currently have global shrinkers for the inode and dentry caches that split up into per-superblock operations via a coarse proportioning method that does not batch very well. The global shrinkers also have a dependency - dentries pin inodes - so we have to be very careful about how we register the global shrinkers so that the implicit call order is always correct. With a per-sb shrinker callout, we can encode this dependency directly into the per-sb shrinker, hence avoiding the need for strictly ordering shrinker registrations. We also have no need for any proportioning code for the shrinker subsystem already provides this functionality across all shrinkers. Allowing the shrinker to operate on a single superblock at a time means that we do less superblock list traversals and locking and reclaim should batch more effectively. This should result in less CPU overhead for reclaim and potentially faster reclaim of items from each filesystem. Signed-off-by: Dave Chinner --- fs/dcache.c | 137 ++++++++-------------------------------------------- fs/inode.c | 111 +++--------------------------------------- fs/super.c | 48 ++++++++++++++++++ include/linux/fs.h | 7 +++ 4 files changed, 84 insertions(+), 219 deletions(-) diff --git a/fs/dcache.c b/fs/dcache.c index 41c35c1..2d619d3 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -456,21 +456,16 @@ static void prune_one_dentry(struct dentry * dentry) * which flags are set. This means we don't need to maintain multiple * similar copies of this loop. */ -static void __shrink_dcache_sb(struct super_block *sb, int *count, int flags) +static void __shrink_dcache_sb(struct super_block *sb, int count, int flags) { LIST_HEAD(referenced); LIST_HEAD(tmp); struct dentry *dentry; - int cnt = 0; BUG_ON(!sb); - BUG_ON((flags & DCACHE_REFERENCED) && count == NULL); + BUG_ON((flags & DCACHE_REFERENCED) && count == -1); spin_lock(&dcache_lock); - if (count != NULL) - /* called from prune_dcache() and shrink_dcache_parent() */ - cnt = *count; -restart: - if (count == NULL) + if (count == -1) list_splice_init(&sb->s_dentry_lru, &tmp); else { while (!list_empty(&sb->s_dentry_lru)) { @@ -492,13 +487,13 @@ restart: } else { list_move_tail(&dentry->d_lru, &tmp); spin_unlock(&dentry->d_lock); - cnt--; - if (!cnt) + if (--count == 0) break; } cond_resched_lock(&dcache_lock); } } +prune_more: while (!list_empty(&tmp)) { dentry = list_entry(tmp.prev, struct dentry, d_lru); dentry_lru_del_init(dentry); @@ -516,91 +511,30 @@ restart: /* dentry->d_lock was dropped in prune_one_dentry() */ cond_resched_lock(&dcache_lock); } - if (count == NULL && !list_empty(&sb->s_dentry_lru)) - goto restart; - if (count != NULL) - *count = cnt; + if (count == -1 && !list_empty(&sb->s_dentry_lru)) { + list_splice_init(&sb->s_dentry_lru, &tmp); + goto prune_more; + } if (!list_empty(&referenced)) list_splice(&referenced, &sb->s_dentry_lru); spin_unlock(&dcache_lock); } /** - * prune_dcache - shrink the dcache - * @count: number of entries to try to free + * prune_dcache_sb - shrink the dcache + * @nr_to_scan: number of entries to try to free * - * Shrink the dcache. This is done when we need more memory, or simply when we - * need to unmount something (at which point we need to unuse all dentries). + * Attempt to shrink the superblock dcache LRU by @nr_to_scan entries. This is + * done when we need more memory an called from the superblock shrinker + * function. * - * This function may fail to free any resources if all the dentries are in use. + * This function may fail to free any resources if all the dentries are in + * use. */ -static void prune_dcache(int count) -{ - struct super_block *sb; - int w_count; - int unused = dentry_stat.nr_unused; - int prune_ratio; - int pruned; - if (unused == 0 || count == 0) - return; - spin_lock(&dcache_lock); -restart: - if (count >= unused) - prune_ratio = 1; - else - prune_ratio = unused / count; - spin_lock(&sb_lock); - list_for_each_entry(sb, &super_blocks, s_list) { - if (sb->s_nr_dentry_unused == 0) - continue; - sb->s_count++; - /* Now, we reclaim unused dentrins with fairness. - * We reclaim them same percentage from each superblock. - * We calculate number of dentries to scan on this sb - * as follows, but the implementation is arranged to avoid - * overflows: - * number of dentries to scan on this sb = - * count * (number of dentries on this sb / - * number of dentries in the machine) - */ - spin_unlock(&sb_lock); - if (prune_ratio != 1) - w_count = (sb->s_nr_dentry_unused / prune_ratio) + 1; - else - w_count = sb->s_nr_dentry_unused; - pruned = w_count; - /* - * We need to be sure this filesystem isn't being unmounted, - * otherwise we could race with generic_shutdown_super(), and - * end up holding a reference to an inode while the filesystem - * is unmounted. So we try to get s_umount, and make sure - * s_root isn't NULL. - */ - if (down_read_trylock(&sb->s_umount)) { - if ((sb->s_root != NULL) && - (!list_empty(&sb->s_dentry_lru))) { - spin_unlock(&dcache_lock); - __shrink_dcache_sb(sb, &w_count, - DCACHE_REFERENCED); - pruned -= w_count; - spin_lock(&dcache_lock); - } - up_read(&sb->s_umount); - } - spin_lock(&sb_lock); - count -= pruned; - /* - * restart only when sb is no longer on the list and - * we have more work to do. - */ - if (__put_super_and_need_restart(sb) && count > 0) { - spin_unlock(&sb_lock); - goto restart; - } - } - spin_unlock(&sb_lock); - spin_unlock(&dcache_lock); +void prune_dcache_sb(struct super_block *sb, int nr_to_scan) +{ + __shrink_dcache_sb(sb, nr_to_scan, DCACHE_REFERENCED); } /** @@ -613,7 +547,7 @@ restart: */ void shrink_dcache_sb(struct super_block * sb) { - __shrink_dcache_sb(sb, NULL, 0); + __shrink_dcache_sb(sb, -1, 0); } EXPORT_SYMBOL(shrink_dcache_sb); @@ -881,37 +815,10 @@ void shrink_dcache_parent(struct dentry * parent) int found; while ((found = select_parent(parent)) != 0) - __shrink_dcache_sb(sb, &found, 0); + __shrink_dcache_sb(sb, found, 0); } EXPORT_SYMBOL(shrink_dcache_parent); -/* - * Scan `nr' dentries and return the number which remain. - * - * We need to avoid reentering the filesystem if the caller is performing a - * GFP_NOFS allocation attempt. One example deadlock is: - * - * ext2_new_block->getblk->GFP->shrink_dcache_memory->prune_dcache-> - * prune_one_dentry->dput->dentry_iput->iput->inode->i_sb->s_op->put_inode-> - * ext2_discard_prealloc->ext2_free_blocks->lock_super->DEADLOCK. - * - * In this case we return -1 to tell the caller that we baled. - */ -static int shrink_dcache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) -{ - if (nr) { - if (!(gfp_mask & __GFP_FS)) - return -1; - prune_dcache(nr); - } - return (dentry_stat.nr_unused / 100) * sysctl_vfs_cache_pressure; -} - -static struct shrinker dcache_shrinker = { - .shrink = shrink_dcache_memory, - .seeks = DEFAULT_SEEKS, -}; - /** * d_alloc - allocate a dcache entry * @parent: parent of entry to allocate @@ -2318,8 +2225,6 @@ static void __init dcache_init(void) */ dentry_cache = KMEM_CACHE(dentry, SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD); - - register_shrinker(&dcache_shrinker); /* Hash may have been set up in dcache_init_early */ if (!hashdist) diff --git a/fs/inode.c b/fs/inode.c index b292e41..ab8ce3a 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -442,8 +442,10 @@ static int can_unuse(struct inode *inode) } /* - * Scan `goal' inodes on the unused list for freeable ones. They are moved to - * a temporary list and then are freed outside inode_lock by dispose_list(). + * Walk the superblock inode LRU for freeable inodes and attempt to free them. + * This is called from the superblock shrinker function with a number of inodes + * to trim from the LRU. Inodes to be freed are moved to a temporary list and + * then are freed outside inode_lock by dispose_list(). * * Any inodes which are pinned purely because of attached pagecache have their * pagecache removed. We expect the final iput() on that inode to add it to @@ -451,10 +453,10 @@ static int can_unuse(struct inode *inode) * inode is still freeable, proceed. The right inode is found 99.9% of the * time in testing on a 4-way. * - * If the inode has metadata buffers attached to mapping->private_list then - * try to remove them. + * If the inode has metadata buffers attached to mapping->private_list then try + * to remove them. */ -static void shrink_icache_sb(struct super_block *sb, int *nr_to_scan) +void prune_icache_sb(struct super_block *sb, int nr_to_scan) { LIST_HEAD(freeable); int nr_pruned = 0; @@ -462,7 +464,7 @@ static void shrink_icache_sb(struct super_block *sb, int *nr_to_scan) unsigned long reap = 0; spin_lock(&inode_lock); - for (nr_scanned = *nr_to_scan; nr_scanned >= 0; nr_scanned--) { + for (nr_scanned = nr_to_scan; nr_scanned >= 0; nr_scanned--) { struct inode *inode; if (list_empty(&sb->s_inode_lru)) @@ -501,106 +503,10 @@ static void shrink_icache_sb(struct super_block *sb, int *nr_to_scan) else __count_vm_events(PGINODESTEAL, reap); spin_unlock(&inode_lock); - *nr_to_scan = nr_scanned; dispose_list(&freeable); } -static void prune_icache(int count) -{ - struct super_block *sb; - int w_count; - int unused = inodes_stat.nr_unused; - int prune_ratio; - int pruned; - - if (unused == 0 || count == 0) - return; - down_read(&iprune_sem); -restart: - if (count >= unused) - prune_ratio = 1; - else - prune_ratio = unused / count; - spin_lock(&sb_lock); - list_for_each_entry(sb, &super_blocks, s_list) { - if (sb->s_nr_inodes_unused == 0) - continue; - sb->s_count++; - /* Now, we reclaim unused dentrins with fairness. - * We reclaim them same percentage from each superblock. - * We calculate number of dentries to scan on this sb - * as follows, but the implementation is arranged to avoid - * overflows: - * number of dentries to scan on this sb = - * count * (number of dentries on this sb / - * number of dentries in the machine) - */ - spin_unlock(&sb_lock); - if (prune_ratio != 1) - w_count = (sb->s_nr_inodes_unused / prune_ratio) + 1; - else - w_count = sb->s_nr_inodes_unused; - pruned = w_count; - /* - * We need to be sure this filesystem isn't being unmounted, - * otherwise we could race with generic_shutdown_super(), and - * end up holding a reference to an inode while the filesystem - * is unmounted. So we try to get s_umount, and make sure - * s_root isn't NULL. - */ - if (down_read_trylock(&sb->s_umount)) { - if ((sb->s_root != NULL) && - (!list_empty(&sb->s_dentry_lru))) { - shrink_icache_sb(sb, &w_count); - pruned -= w_count; - } - up_read(&sb->s_umount); - } - spin_lock(&sb_lock); - count -= pruned; - /* - * restart only when sb is no longer on the list and - * we have more work to do. - */ - if (__put_super_and_need_restart(sb) && count > 0) { - spin_unlock(&sb_lock); - goto restart; - } - } - spin_unlock(&sb_lock); - up_read(&iprune_sem); -} - -/* - * shrink_icache_memory() will attempt to reclaim some unused inodes. Here, - * "unused" means that no dentries are referring to the inodes: the files are - * not open and the dcache references to those inodes have already been - * reclaimed. - * - * This function is passed the number of inodes to scan, and it returns the - * total number of remaining possibly-reclaimable inodes. - */ -static int shrink_icache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) -{ - if (nr) { - /* - * Nasty deadlock avoidance. We may hold various FS locks, - * and we don't want to recurse into the FS that called us - * in clear_inode() and friends.. - */ - if (!(gfp_mask & __GFP_FS)) - return -1; - prune_icache(nr); - } - return (inodes_stat.nr_unused / 100) * sysctl_vfs_cache_pressure; -} - -static struct shrinker icache_shrinker = { - .shrink = shrink_icache_memory, - .seeks = DEFAULT_SEEKS, -}; - static void __wait_on_freeing_inode(struct inode *inode); /* * Called with the inode lock held. @@ -1640,7 +1546,6 @@ void __init inode_init(void) (SLAB_RECLAIM_ACCOUNT|SLAB_PANIC| SLAB_MEM_SPREAD), init_once); - register_shrinker(&icache_shrinker); /* Hash may have been set up in inode_init_early */ if (!hashdist) diff --git a/fs/super.c b/fs/super.c index 18655e6..339b590 100644 --- a/fs/super.c +++ b/fs/super.c @@ -45,6 +45,50 @@ LIST_HEAD(super_blocks); DEFINE_SPINLOCK(sb_lock); +static int prune_super(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) +{ + struct super_block *sb; + int count; + + sb = container_of(shrink, struct super_block, s_shrink); + + /* + * Deadlock avoidance. We may hold various FS locks, and we don't want + * to recurse into the FS that called us in clear_inode() and friends.. + */ + if (!(gfp_mask & __GFP_FS)) + return -1; + + /* + * if we can't get the umount lock, then there's no point having the + * shrinker try again because the sb is being torn down. + */ + if (!down_read_trylock(&sb->s_umount)) + return -1; + + if (!sb->s_root) { + up_read(&sb->s_umount); + return -1; + } + + if (nr_to_scan) { + /* proportion the scan between the two cacheѕ */ + int total; + + total = sb->s_nr_dentry_unused + sb->s_nr_inodes_unused + 1; + count = (nr_to_scan * sb->s_nr_dentry_unused) / total; + + /* prune dcache first as icache is pinned by it */ + prune_dcache_sb(sb, count); + prune_icache_sb(sb, nr_to_scan - count); + } + + count = ((sb->s_nr_dentry_unused + sb->s_nr_inodes_unused) / 100) + * sysctl_vfs_cache_pressure; + up_read(&sb->s_umount); + return count; +} + /** * alloc_super - create new superblock * @type: filesystem type superblock should belong to @@ -106,6 +150,9 @@ static struct super_block *alloc_super(struct file_system_type *type) s->s_qcop = sb_quotactl_ops; s->s_op = &default_op; s->s_time_gran = 1000000000; + s->s_shrink.shrink = prune_super; + s->s_shrink.seeks = DEFAULT_SEEKS; + register_shrinker(&s->s_shrink); } out: return s; @@ -119,6 +166,7 @@ out: */ static inline void destroy_super(struct super_block *s) { + unregister_shrinker(&s->s_shrink); security_sb_free(s); kfree(s->s_subtype); kfree(s->s_options); diff --git a/include/linux/fs.h b/include/linux/fs.h index 41132e3..6ba3739 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -382,6 +382,7 @@ struct inodes_stat_t { #include #include #include +#include #include #include @@ -1387,8 +1388,14 @@ struct super_block { * generic_show_options() */ char *s_options; + + struct shrinker s_shrink; /* per-sb shrinker handle */ }; +/* superblock cache pruning functions */ +void prune_icache_sb(struct super_block *sb, int nr_to_scan); +void prune_dcache_sb(struct super_block *sb, int nr_to_scan); + extern struct timespec current_fs_time(struct super_block *sb); /* -- 1.5.6.5 From SRS0+BNzK+73+fromorbit.com=dave@internode.on.net Fri May 14 02:22:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4E7MQSr009958 for ; Fri, 14 May 2010 02:22:27 -0500 X-ASG-Debug-ID: 1273821918-6f8302d10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A6A8F12923A6 for ; Fri, 14 May 2010 00:25:18 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id rAlwKBOWHlyAeHfg for ; Fri, 14 May 2010 00:25:18 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12665688-1927428 for multiple; Fri, 14 May 2010 16:54:28 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OCpFz-0000Jc-HE; Fri, 14 May 2010 17:24:27 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OCpFw-0007gu-5x; Fri, 14 May 2010 17:24:24 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org X-ASG-Orig-Subj: [PATCH 5/5] xfs: make use of new shrinker callout Subject: [PATCH 5/5] xfs: make use of new shrinker callout Date: Fri, 14 May 2010 17:24:23 +1000 Message-Id: <1273821863-29524-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273821863-29524-1-git-send-email-david@fromorbit.com> References: <1273821863-29524-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1273821920 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29828 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Convert the inode reclaim shrinker to use the new per-sb shrinker operations. This fixes a bunch of lockdep warnings about the xfs_mount_list_lock being taken in different reclaim contexts by removing it, and allows the reclaim to be proportioned across filesystems with no extra code. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 23 ++++++-- fs/xfs/linux-2.6/xfs_sync.c | 124 +++++++++++----------------------------- fs/xfs/linux-2.6/xfs_sync.h | 16 +++-- fs/xfs/quota/xfs_qm_syscalls.c | 2 +- fs/xfs/xfs_mount.h | 1 - 5 files changed, 61 insertions(+), 105 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 29f1edc..2bd512a 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1209,7 +1209,6 @@ xfs_fs_put_super( xfs_unmountfs(mp); xfs_freesb(mp); - xfs_inode_shrinker_unregister(mp); xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); xfs_dmops_put(mp); @@ -1623,8 +1622,6 @@ xfs_fs_fill_super( if (error) goto fail_vnrele; - xfs_inode_shrinker_register(mp); - kfree(mtpt); return 0; @@ -1678,6 +1675,22 @@ xfs_fs_get_sb( mnt); } +static int +xfs_fs_nr_cached_objects( + struct super_block *sb) +{ + return xfs_reclaim_inodes_count(XFS_M(sb)); +} + +static int +xfs_fs_free_cached_objects( + struct super_block *sb, + int nr_to_scan) +{ + xfs_reclaim_inodes_nr(XFS_M(sb), 0, nr_to_scan); + return 0; +} + static const struct super_operations xfs_super_operations = { .alloc_inode = xfs_fs_alloc_inode, .destroy_inode = xfs_fs_destroy_inode, @@ -1691,6 +1704,8 @@ static const struct super_operations xfs_super_operations = { .statfs = xfs_fs_statfs, .remount_fs = xfs_fs_remount, .show_options = xfs_fs_show_options, + .nr_cached_objects = xfs_fs_nr_cached_objects, + .free_cached_objects = xfs_fs_free_cached_objects, }; static struct file_system_type xfs_fs_type = { @@ -1870,7 +1885,6 @@ init_xfs_fs(void) goto out_cleanup_procfs; vfs_initquota(); - xfs_inode_shrinker_init(); error = register_filesystem(&xfs_fs_type); if (error) @@ -1898,7 +1912,6 @@ exit_xfs_fs(void) { vfs_exitquota(); unregister_filesystem(&xfs_fs_type); - xfs_inode_shrinker_destroy(); xfs_sysctl_unregister(); xfs_cleanup_procfs(); xfs_buf_terminate(); diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 17ec4a6..4f26673 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -137,7 +137,7 @@ restart: } while ((*nr_to_scan)--); - if (skipped) { + if (skipped && *nr_to_scan > 0) { delay(1); goto restart; } @@ -152,14 +152,14 @@ xfs_inode_ag_iterator( int flags, int tag, int exclusive, - int *nr_to_scan) + int nr_to_scan) { int error = 0; int last_error = 0; xfs_agnumber_t ag; - int nr; - nr = nr_to_scan ? *nr_to_scan : INT_MAX; + if (nr_to_scan <= 0) + nr_to_scan = INT_MAX; for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { struct xfs_perag *pag; @@ -169,18 +169,16 @@ xfs_inode_ag_iterator( continue; } error = xfs_inode_ag_walk(mp, pag, execute, flags, tag, - exclusive, &nr); + exclusive, &nr_to_scan); xfs_perag_put(pag); if (error) { last_error = error; if (error == EFSCORRUPTED) break; } - if (nr <= 0) + if (nr_to_scan <= 0) break; } - if (nr_to_scan) - *nr_to_scan = nr; return XFS_ERROR(last_error); } @@ -299,7 +297,7 @@ xfs_sync_data( ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, - XFS_ICI_NO_TAG, 0, NULL); + XFS_ICI_NO_TAG, 0, 0); if (error) return XFS_ERROR(error); @@ -318,7 +316,7 @@ xfs_sync_attr( ASSERT((flags & ~SYNC_WAIT) == 0); return xfs_inode_ag_iterator(mp, xfs_sync_inode_attr, flags, - XFS_ICI_NO_TAG, 0, NULL); + XFS_ICI_NO_TAG, 0, 0); } STATIC int @@ -858,100 +856,44 @@ reclaim: } +/* + * Scan a certain number of inodes for reclaim. nr_to_scan <= 0 means reclaim + * every inode that has the reclaim tag set. + */ int -xfs_reclaim_inodes( +xfs_reclaim_inodes_nr( xfs_mount_t *mp, - int mode) + int mode, + int nr_to_scan) { return xfs_inode_ag_iterator(mp, xfs_reclaim_inode, mode, - XFS_ICI_RECLAIM_TAG, 1, NULL); + XFS_ICI_RECLAIM_TAG, 1, nr_to_scan); } /* - * Shrinker infrastructure. + * Return the number of reclaimable inodes in the filesystem for + * the shrinker to determine how much to reclaim. * - * This is all far more complex than it needs to be. It adds a global list of - * mounts because the shrinkers can only call a global context. We need to make - * the shrinkers pass a context to avoid the need for global state. + * Because the inode cache may not have any reclaimable inodes in it, but will + * be populated as part of the higher level cleaning, we need to count all + * those inodes as reclaimable here as well. */ -static LIST_HEAD(xfs_mount_list); -static struct rw_semaphore xfs_mount_list_lock; - -static int -xfs_reclaim_inode_shrink( - struct shrinker *shrink, - int nr_to_scan, - gfp_t gfp_mask) +int +xfs_reclaim_inodes_count( + xfs_mount_t *mp) { - struct xfs_mount *mp; - struct xfs_perag *pag; - xfs_agnumber_t ag; - int reclaimable = 0; - - if (nr_to_scan) { - if (!(gfp_mask & __GFP_FS)) - return -1; - - down_read(&xfs_mount_list_lock); - list_for_each_entry(mp, &xfs_mount_list, m_mplist) { - xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0, - XFS_ICI_RECLAIM_TAG, 1, &nr_to_scan); - if (nr_to_scan <= 0) - break; - } - up_read(&xfs_mount_list_lock); - } - - down_read(&xfs_mount_list_lock); - list_for_each_entry(mp, &xfs_mount_list, m_mplist) { - for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { + xfs_agnumber_t ag; + int reclaimable = 0; - pag = xfs_perag_get(mp, ag); - if (!pag->pag_ici_init) { - xfs_perag_put(pag); - continue; - } - reclaimable += pag->pag_ici_reclaimable; + for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { + struct xfs_perag *pag = xfs_perag_get(mp, ag); + if (!pag->pag_ici_init) { xfs_perag_put(pag); + continue; } + reclaimable += pag->pag_ici_reclaimable; + xfs_perag_put(pag); } - up_read(&xfs_mount_list_lock); - return reclaimable; -} - -static struct shrinker xfs_inode_shrinker = { - .shrink = xfs_reclaim_inode_shrink, - .seeks = DEFAULT_SEEKS, -}; - -void __init -xfs_inode_shrinker_init(void) -{ - init_rwsem(&xfs_mount_list_lock); - register_shrinker(&xfs_inode_shrinker); -} - -void -xfs_inode_shrinker_destroy(void) -{ - ASSERT(list_empty(&xfs_mount_list)); - unregister_shrinker(&xfs_inode_shrinker); -} - -void -xfs_inode_shrinker_register( - struct xfs_mount *mp) -{ - down_write(&xfs_mount_list_lock); - list_add_tail(&mp->m_mplist, &xfs_mount_list); - up_write(&xfs_mount_list_lock); + return reclaimable + mp->m_super->s_nr_inodes_unused; } -void -xfs_inode_shrinker_unregister( - struct xfs_mount *mp) -{ - down_write(&xfs_mount_list_lock); - list_del(&mp->m_mplist); - up_write(&xfs_mount_list_lock); -} diff --git a/fs/xfs/linux-2.6/xfs_sync.h b/fs/xfs/linux-2.6/xfs_sync.h index cdcbaac..c55f645 100644 --- a/fs/xfs/linux-2.6/xfs_sync.h +++ b/fs/xfs/linux-2.6/xfs_sync.h @@ -43,7 +43,14 @@ void xfs_quiesce_attr(struct xfs_mount *mp); void xfs_flush_inodes(struct xfs_inode *ip); -int xfs_reclaim_inodes(struct xfs_mount *mp, int mode); +int xfs_reclaim_inodes_count(struct xfs_mount *mp); +int xfs_reclaim_inodes_nr(struct xfs_mount *mp, int mode, int nr_to_scan); + +static inline int +xfs_reclaim_inodes(struct xfs_mount *mp, int mode) +{ + return xfs_reclaim_inodes_nr(mp, mode, 0); +} void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); void __xfs_inode_set_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip); @@ -53,11 +60,6 @@ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, int xfs_sync_inode_valid(struct xfs_inode *ip, struct xfs_perag *pag); int xfs_inode_ag_iterator(struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), - int flags, int tag, int write_lock, int *nr_to_scan); - -void xfs_inode_shrinker_init(void); -void xfs_inode_shrinker_destroy(void); -void xfs_inode_shrinker_register(struct xfs_mount *mp); -void xfs_inode_shrinker_unregister(struct xfs_mount *mp); + int flags, int tag, int write_lock, int nr_to_scan); #endif diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 50bee07..94c0cac 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -892,7 +892,7 @@ xfs_qm_dqrele_all_inodes( { ASSERT(mp->m_quotainfo); xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, - XFS_ICI_NO_TAG, 0, NULL); + XFS_ICI_NO_TAG, 0, 0); } /*------------------------------------------------------------------------*/ diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 9ff48a1..4fa0bc7 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -259,7 +259,6 @@ typedef struct xfs_mount { wait_queue_head_t m_wait_single_sync_task; __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ - struct list_head m_mplist; /* inode shrinker mount list */ } xfs_mount_t; /* -- 1.5.6.5 From SRS0+wCOu+73+fromorbit.com=dave@internode.on.net Fri May 14 02:22:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4E7MXmL009994 for ; Fri, 14 May 2010 02:22:33 -0500 X-ASG-Debug-ID: 1273821886-09cd03d20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1F6571BD5C56 for ; Fri, 14 May 2010 00:24:46 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id iBgV7lot0Euzei8H for ; Fri, 14 May 2010 00:24:46 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24282309-1927428 for multiple; Fri, 14 May 2010 16:54:38 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OCpFz-0000JV-FB; Fri, 14 May 2010 17:24:27 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OCpFw-0007gr-3u; Fri, 14 May 2010 17:24:24 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org X-ASG-Orig-Subj: [PATCH 4/5] superblock: add filesystem shrinker operations Subject: [PATCH 4/5] superblock: add filesystem shrinker operations Date: Fri, 14 May 2010 17:24:22 +1000 Message-Id: <1273821863-29524-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273821863-29524-1-git-send-email-david@fromorbit.com> References: <1273821863-29524-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1273821888 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.2, rules version 3.2.2.29828 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Now we have a per-superblock shrinker implementation, we can add a filesystem specific callout to it to allow filesystem internal caches to be shrunk by the superblock shrinker. Rather than perpetuate the multipurpose shrinker callback API (i.e. nr_to_scan == 0 meaning "tell me how many objects freeable in the cache), two operations will be added. The first will return the number of objects that are freeable, the second is the actual shrinker call. Signed-off-by: Dave Chinner --- fs/super.c | 43 +++++++++++++++++++++++++++++++------------ include/linux/fs.h | 11 +++++++++++ 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/fs/super.c b/fs/super.c index 339b590..e98292e 100644 --- a/fs/super.c +++ b/fs/super.c @@ -48,7 +48,8 @@ DEFINE_SPINLOCK(sb_lock); static int prune_super(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) { struct super_block *sb; - int count; + int fs_objects = 0; + int total_objects; sb = container_of(shrink, struct super_block, s_shrink); @@ -71,22 +72,40 @@ static int prune_super(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) return -1; } - if (nr_to_scan) { - /* proportion the scan between the two cacheѕ */ - int total; - - total = sb->s_nr_dentry_unused + sb->s_nr_inodes_unused + 1; - count = (nr_to_scan * sb->s_nr_dentry_unused) / total; + if (sb->s_op && sb->s_op->nr_cached_objects) + fs_objects = sb->s_op->nr_cached_objects(sb); - /* prune dcache first as icache is pinned by it */ - prune_dcache_sb(sb, count); - prune_icache_sb(sb, nr_to_scan - count); + total_objects = sb->s_nr_dentry_unused + + sb->s_nr_inodes_unused + fs_objects + 1; + if (nr_to_scan) { + int dentries; + int inodes; + + /* proportion the scan between the cacheѕ */ + dentries = (nr_to_scan * sb->s_nr_dentry_unused) / + total_objects; + inodes = (nr_to_scan * sb->s_nr_inodes_unused) / + total_objects; + if (fs_objects) + fs_objects = (nr_to_scan * fs_objects) / + total_objects; + /* + * prune the dcache first as the icache is pinned by it, then + * prune the icache, followed by the filesystem specific caches + */ + prune_dcache_sb(sb, dentries); + prune_icache_sb(sb, inodes); + if (sb->s_op && sb->s_op->free_cached_objects) { + sb->s_op->free_cached_objects(sb, fs_objects); + fs_objects = sb->s_op->nr_cached_objects(sb); + } + total_objects = sb->s_nr_dentry_unused + + sb->s_nr_inodes_unused + fs_objects; } - count = ((sb->s_nr_dentry_unused + sb->s_nr_inodes_unused) / 100) - * sysctl_vfs_cache_pressure; + total_objects = (total_objects / 100) * sysctl_vfs_cache_pressure; up_read(&sb->s_umount); - return count; + return total_objects; } /** diff --git a/include/linux/fs.h b/include/linux/fs.h index 6ba3739..ef2e9e2 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1591,6 +1591,17 @@ struct super_operations { ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); #endif int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); + + /* + * memory shrinker operations. + * ->nr_cached_objects() should return the number of freeable cached + * objects the filesystem holds. + * ->free_cache_objects() should attempt to free the number of cached + * objects indicated. It should return how many objects it attempted to + * free. + */ + int (*nr_cached_objects)(struct super_block *); + int (*free_cached_objects)(struct super_block *, int); }; /* -- 1.5.6.5 From SRS0+5NAy+73+fromorbit.com=dave@internode.on.net Fri May 14 02:22:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4E7MZhK010016 for ; Fri, 14 May 2010 02:22:35 -0500 X-ASG-Debug-ID: 1273821887-28e302ba0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DA6F9340E97 for ; Fri, 14 May 2010 00:24:48 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id H9CuvQnT3bNGHr7z for ; Fri, 14 May 2010 00:24:48 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24105647-1927428 for multiple; Fri, 14 May 2010 16:54:38 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OCpG9-0000Ju-8c; Fri, 14 May 2010 17:24:37 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OCpFv-0007gl-To; Fri, 14 May 2010 17:24:23 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org X-ASG-Orig-Subj: [PATCH 1/5] inode: Make unused inode LRU per superblock Subject: [PATCH 1/5] inode: Make unused inode LRU per superblock Date: Fri, 14 May 2010 17:24:19 +1000 Message-Id: <1273821863-29524-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273821863-29524-1-git-send-email-david@fromorbit.com> References: <1273821863-29524-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1273821889 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.2, rules version 3.2.2.29828 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The inode unused list is currently a global LRU. This does not match the other global filesystem cache - the dentry cache - which uses per-superblock LRU lists. Hence we have related filesystem object types using different LRU reclaimatin schemes. To enable a per-superblock filesystem cache shrinker, both of these caches need to have per-sb unused object LRU lists. Hence this patch converts the global inode LRU to per-sb LRUs. The patch only does rudimentary per-sb propotioning in the shrinker infrastructure, as this gets removed when the per-sb shrinker callouts are introduced later on. Signed-off-by: Dave Chinner --- fs/fs-writeback.c | 2 +- fs/inode.c | 89 ++++++++++++++++++++++++++++++++++++++++----- fs/super.c | 1 + include/linux/fs.h | 4 ++ include/linux/writeback.h | 1 - 5 files changed, 85 insertions(+), 12 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 4b37f7c..fd78854 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -547,7 +547,7 @@ select_queue: /* * The inode is clean, unused */ - list_move(&inode->i_list, &inode_unused); + list_move(&inode->i_list, &inode->i_sb->s_inode_lru); } } inode_sync_complete(inode); diff --git a/fs/inode.c b/fs/inode.c index 407bf39..8b95b15 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -74,7 +74,6 @@ static unsigned int i_hash_shift __read_mostly; */ LIST_HEAD(inode_in_use); -LIST_HEAD(inode_unused); static struct hlist_head *inode_hashtable __read_mostly; /* @@ -294,6 +293,7 @@ void __iget(struct inode *inode) if (!(inode->i_state & (I_DIRTY|I_SYNC))) list_move(&inode->i_list, &inode_in_use); inodes_stat.nr_unused--; + inode->i_sb->s_nr_inodes_unused--; } /** @@ -388,6 +388,7 @@ static int invalidate_list(struct list_head *head, struct list_head *dispose) invalidate_inode_buffers(inode); if (!atomic_read(&inode->i_count)) { list_move(&inode->i_list, dispose); + inode->i_sb->s_nr_inodes_unused--; WARN_ON(inode->i_state & I_NEW); inode->i_state |= I_FREEING; count++; @@ -446,32 +447,31 @@ static int can_unuse(struct inode *inode) * * Any inodes which are pinned purely because of attached pagecache have their * pagecache removed. We expect the final iput() on that inode to add it to - * the front of the inode_unused list. So look for it there and if the + * the front of the sb->s_inode_lru list. So look for it there and if the * inode is still freeable, proceed. The right inode is found 99.9% of the * time in testing on a 4-way. * * If the inode has metadata buffers attached to mapping->private_list then * try to remove them. */ -static void prune_icache(int nr_to_scan) +static void shrink_icache_sb(struct super_block *sb, int *nr_to_scan) { LIST_HEAD(freeable); int nr_pruned = 0; int nr_scanned; unsigned long reap = 0; - down_read(&iprune_sem); spin_lock(&inode_lock); - for (nr_scanned = 0; nr_scanned < nr_to_scan; nr_scanned++) { + for (nr_scanned = *nr_to_scan; nr_scanned >= 0; nr_scanned--) { struct inode *inode; - if (list_empty(&inode_unused)) + if (list_empty(&sb->s_inode_lru)) break; - inode = list_entry(inode_unused.prev, struct inode, i_list); + inode = list_entry(sb->s_inode_lru.prev, struct inode, i_list); if (inode->i_state || atomic_read(&inode->i_count)) { - list_move(&inode->i_list, &inode_unused); + list_move(&inode->i_list, &sb->s_inode_lru); continue; } if (inode_has_buffers(inode) || inode->i_data.nrpages) { @@ -483,7 +483,7 @@ static void prune_icache(int nr_to_scan) iput(inode); spin_lock(&inode_lock); - if (inode != list_entry(inode_unused.next, + if (inode != list_entry(sb->s_inode_lru.next, struct inode, i_list)) continue; /* wrong inode or list_empty */ if (!can_unuse(inode)) @@ -495,13 +495,80 @@ static void prune_icache(int nr_to_scan) nr_pruned++; } inodes_stat.nr_unused -= nr_pruned; + sb->s_nr_inodes_unused -= nr_pruned; if (current_is_kswapd()) __count_vm_events(KSWAPD_INODESTEAL, reap); else __count_vm_events(PGINODESTEAL, reap); spin_unlock(&inode_lock); + *nr_to_scan = nr_scanned; dispose_list(&freeable); +} + +static void prune_icache(int count) +{ + struct super_block *sb; + int w_count; + int unused = inodes_stat.nr_unused; + int prune_ratio; + int pruned; + + if (unused == 0 || count == 0) + return; + down_read(&iprune_sem); +restart: + if (count >= unused) + prune_ratio = 1; + else + prune_ratio = unused / count; + spin_lock(&sb_lock); + list_for_each_entry(sb, &super_blocks, s_list) { + if (sb->s_nr_inodes_unused == 0) + continue; + sb->s_count++; + /* Now, we reclaim unused dentrins with fairness. + * We reclaim them same percentage from each superblock. + * We calculate number of dentries to scan on this sb + * as follows, but the implementation is arranged to avoid + * overflows: + * number of dentries to scan on this sb = + * count * (number of dentries on this sb / + * number of dentries in the machine) + */ + spin_unlock(&sb_lock); + if (prune_ratio != 1) + w_count = (sb->s_nr_inodes_unused / prune_ratio) + 1; + else + w_count = sb->s_nr_inodes_unused; + pruned = w_count; + /* + * We need to be sure this filesystem isn't being unmounted, + * otherwise we could race with generic_shutdown_super(), and + * end up holding a reference to an inode while the filesystem + * is unmounted. So we try to get s_umount, and make sure + * s_root isn't NULL. + */ + if (down_read_trylock(&sb->s_umount)) { + if ((sb->s_root != NULL) && + (!list_empty(&sb->s_dentry_lru))) { + shrink_icache_sb(sb, &w_count); + pruned -= w_count; + } + up_read(&sb->s_umount); + } + spin_lock(&sb_lock); + count -= pruned; + /* + * restart only when sb is no longer on the list and + * we have more work to do. + */ + if (__put_super_and_need_restart(sb) && count > 0) { + spin_unlock(&sb_lock); + goto restart; + } + } + spin_unlock(&sb_lock); up_read(&iprune_sem); } @@ -1242,8 +1309,9 @@ int generic_detach_inode(struct inode *inode) if (!hlist_unhashed(&inode->i_hash)) { if (!(inode->i_state & (I_DIRTY|I_SYNC))) - list_move(&inode->i_list, &inode_unused); + list_move(&inode->i_list, &sb->s_inode_lru); inodes_stat.nr_unused++; + sb->s_nr_inodes_unused++; if (sb->s_flags & MS_ACTIVE) { spin_unlock(&inode_lock); return 0; @@ -1256,6 +1324,7 @@ int generic_detach_inode(struct inode *inode) WARN_ON(inode->i_state & I_NEW); inode->i_state &= ~I_WILL_FREE; inodes_stat.nr_unused--; + sb->s_nr_inodes_unused--; hlist_del_init(&inode->i_hash); } list_del_init(&inode->i_list); diff --git a/fs/super.c b/fs/super.c index 1527e6a..18655e6 100644 --- a/fs/super.c +++ b/fs/super.c @@ -68,6 +68,7 @@ static struct super_block *alloc_super(struct file_system_type *type) INIT_HLIST_HEAD(&s->s_anon); INIT_LIST_HEAD(&s->s_inodes); INIT_LIST_HEAD(&s->s_dentry_lru); + INIT_LIST_HEAD(&s->s_inode_lru); init_rwsem(&s->s_umount); mutex_init(&s->s_lock); lockdep_set_class(&s->s_umount, &type->s_umount_key); diff --git a/include/linux/fs.h b/include/linux/fs.h index 44f35ae..41132e3 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1348,6 +1348,10 @@ struct super_block { struct list_head s_dentry_lru; /* unused dentry lru */ int s_nr_dentry_unused; /* # of dentry on lru */ + /* s_inode_lru and s_nr_inodes_unused are protected by inode_lock */ + struct list_head s_inode_lru; /* unused inode lru */ + int s_nr_inodes_unused; /* # of inodes on lru */ + struct block_device *s_bdev; struct backing_dev_info *s_bdi; struct mtd_info *s_mtd; diff --git a/include/linux/writeback.h b/include/linux/writeback.h index 36520de..2636ade 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -11,7 +11,6 @@ struct backing_dev_info; extern spinlock_t inode_lock; extern struct list_head inode_in_use; -extern struct list_head inode_unused; /* * fs/fs-writeback.c -- 1.5.6.5 From SRS0+KZza+73+fromorbit.com=dave@internode.on.net Fri May 14 02:22:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_74 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4E7MZAn010021 for ; Fri, 14 May 2010 02:22:35 -0500 X-ASG-Debug-ID: 1273821888-28e602840000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 357E9340E92 for ; Fri, 14 May 2010 00:24:48 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id 0VsGdXtYT5fyzgaY for ; Fri, 14 May 2010 00:24:48 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24137232-1927428 for multiple; Fri, 14 May 2010 16:54:39 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OCpFz-0000JS-Bf; Fri, 14 May 2010 17:24:27 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OCpFv-0007gn-Vs; Fri, 14 May 2010 17:24:23 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org X-ASG-Orig-Subj: [PATCH 2/5] mm: add context argument to shrinker callback Subject: [PATCH 2/5] mm: add context argument to shrinker callback Date: Fri, 14 May 2010 17:24:20 +1000 Message-Id: <1273821863-29524-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1273821863-29524-1-git-send-email-david@fromorbit.com> References: <1273821863-29524-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1273821890 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.2, rules version 3.2.2.29828 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The current shrinker implementation requires the registered callback to have global state to work from. This makes it difficult to shrink caches that are not global (e.g. per-filesystem caches). Pass the shrinker structure to the callback so that users can embed the shrinker structure in the context the shrinker needs to operate on and get back to it in the callback via container_of(). Signed-off-by: Dave Chinner --- arch/x86/kvm/mmu.c | 2 +- drivers/gpu/drm/i915/i915_gem.c | 2 +- fs/dcache.c | 2 +- fs/gfs2/glock.c | 2 +- fs/gfs2/quota.c | 2 +- fs/gfs2/quota.h | 2 +- fs/inode.c | 2 +- fs/mbcache.c | 5 +++-- fs/nfs/dir.c | 2 +- fs/nfs/internal.h | 3 ++- fs/quota/dquot.c | 2 +- fs/ubifs/shrinker.c | 2 +- fs/ubifs/ubifs.h | 2 +- fs/xfs/linux-2.6/xfs_buf.c | 5 +++-- fs/xfs/linux-2.6/xfs_sync.c | 1 + fs/xfs/quota/xfs_qm.c | 7 +++++-- include/linux/mm.h | 2 +- mm/vmscan.c | 8 +++++--- 18 files changed, 31 insertions(+), 22 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 19a8906..03e689d 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -2918,7 +2918,7 @@ static void kvm_mmu_remove_one_alloc_mmu_page(struct kvm *kvm) kvm_mmu_zap_page(kvm, page); } -static int mmu_shrink(int nr_to_scan, gfp_t gfp_mask) +static int mmu_shrink(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) { struct kvm *kvm; struct kvm *kvm_freed = NULL; diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index ef3d91d..cc436ba 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -5185,7 +5185,7 @@ void i915_gem_release(struct drm_device * dev, struct drm_file *file_priv) } static int -i915_gem_shrink(int nr_to_scan, gfp_t gfp_mask) +i915_gem_shrink(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) { drm_i915_private_t *dev_priv, *next_dev; struct drm_i915_gem_object *obj_priv, *next_obj; diff --git a/fs/dcache.c b/fs/dcache.c index f1358e5..41c35c1 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -897,7 +897,7 @@ EXPORT_SYMBOL(shrink_dcache_parent); * * In this case we return -1 to tell the caller that we baled. */ -static int shrink_dcache_memory(int nr, gfp_t gfp_mask) +static int shrink_dcache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) { if (nr) { if (!(gfp_mask & __GFP_FS)) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 454d4b4..e947661 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -1345,7 +1345,7 @@ void gfs2_glock_complete(struct gfs2_glock *gl, int ret) } -static int gfs2_shrink_glock_memory(int nr, gfp_t gfp_mask) +static int gfs2_shrink_glock_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) { struct gfs2_glock *gl; int may_demote; diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 6dbcbad..3f2cf67 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -77,7 +77,7 @@ static LIST_HEAD(qd_lru_list); static atomic_t qd_lru_count = ATOMIC_INIT(0); static DEFINE_SPINLOCK(qd_lru_lock); -int gfs2_shrink_qd_memory(int nr, gfp_t gfp_mask) +int gfs2_shrink_qd_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) { struct gfs2_quota_data *qd; struct gfs2_sbd *sdp; diff --git a/fs/gfs2/quota.h b/fs/gfs2/quota.h index 195f60c..e7d236c 100644 --- a/fs/gfs2/quota.h +++ b/fs/gfs2/quota.h @@ -51,7 +51,7 @@ static inline int gfs2_quota_lock_check(struct gfs2_inode *ip) return ret; } -extern int gfs2_shrink_qd_memory(int nr, gfp_t gfp_mask); +extern int gfs2_shrink_qd_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask); extern const struct quotactl_ops gfs2_quotactl_ops; #endif /* __QUOTA_DOT_H__ */ diff --git a/fs/inode.c b/fs/inode.c index 8b95b15..b292e41 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -581,7 +581,7 @@ restart: * This function is passed the number of inodes to scan, and it returns the * total number of remaining possibly-reclaimable inodes. */ -static int shrink_icache_memory(int nr, gfp_t gfp_mask) +static int shrink_icache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) { if (nr) { /* diff --git a/fs/mbcache.c b/fs/mbcache.c index ec88ff3..e28f21b 100644 --- a/fs/mbcache.c +++ b/fs/mbcache.c @@ -115,7 +115,7 @@ mb_cache_indexes(struct mb_cache *cache) * What the mbcache registers as to get shrunk dynamically. */ -static int mb_cache_shrink_fn(int nr_to_scan, gfp_t gfp_mask); +static int mb_cache_shrink_fn(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask); static struct shrinker mb_cache_shrinker = { .shrink = mb_cache_shrink_fn, @@ -191,13 +191,14 @@ forget: * This function is called by the kernel memory management when memory * gets low. * + * @shrink: (ignored) * @nr_to_scan: Number of objects to scan * @gfp_mask: (ignored) * * Returns the number of objects which are present in the cache. */ static int -mb_cache_shrink_fn(int nr_to_scan, gfp_t gfp_mask) +mb_cache_shrink_fn(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) { LIST_HEAD(free_list); struct list_head *l, *ltmp; diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index a7bb5c6..6a0a6f7 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -1669,7 +1669,7 @@ static void nfs_access_free_entry(struct nfs_access_entry *entry) smp_mb__after_atomic_dec(); } -int nfs_access_cache_shrinker(int nr_to_scan, gfp_t gfp_mask) +int nfs_access_cache_shrinker(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) { LIST_HEAD(head); struct nfs_inode *nfsi; diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 11f82f0..aa022eb 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -205,7 +205,8 @@ extern struct rpc_procinfo nfs4_procedures[]; void nfs_close_context(struct nfs_open_context *ctx, int is_sync); /* dir.c */ -extern int nfs_access_cache_shrinker(int nr_to_scan, gfp_t gfp_mask); +extern int nfs_access_cache_shrinker(struct shrinker *shrink, + int nr_to_scan, gfp_t gfp_mask); /* inode.c */ extern struct workqueue_struct *nfsiod_workqueue; diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 788b580..187e3f2 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -668,7 +668,7 @@ static void prune_dqcache(int count) * more memory */ -static int shrink_dqcache_memory(int nr, gfp_t gfp_mask) +static int shrink_dqcache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) { if (nr) { spin_lock(&dq_list_lock); diff --git a/fs/ubifs/shrinker.c b/fs/ubifs/shrinker.c index 02feb59..0b20111 100644 --- a/fs/ubifs/shrinker.c +++ b/fs/ubifs/shrinker.c @@ -277,7 +277,7 @@ static int kick_a_thread(void) return 0; } -int ubifs_shrinker(int nr, gfp_t gfp_mask) +int ubifs_shrinker(struct shrinker *shrink, int nr, gfp_t gfp_mask) { int freed, contention = 0; long clean_zn_cnt = atomic_long_read(&ubifs_clean_zn_cnt); diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index bd2542d..5a92345 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h @@ -1575,7 +1575,7 @@ int ubifs_tnc_start_commit(struct ubifs_info *c, struct ubifs_zbranch *zroot); int ubifs_tnc_end_commit(struct ubifs_info *c); /* shrinker.c */ -int ubifs_shrinker(int nr_to_scan, gfp_t gfp_mask); +int ubifs_shrinker(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask); /* commit.c */ int ubifs_bg_thread(void *info); diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 44c2b0e..d2cfc54 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -44,7 +44,7 @@ static kmem_zone_t *xfs_buf_zone; STATIC int xfsbufd(void *); -STATIC int xfsbufd_wakeup(int, gfp_t); +STATIC int xfsbufd_wakeup(struct shrinker *, int, gfp_t); STATIC void xfs_buf_delwri_queue(xfs_buf_t *, int); static struct shrinker xfs_buf_shake = { .shrink = xfsbufd_wakeup, @@ -339,7 +339,7 @@ _xfs_buf_lookup_pages( __func__, gfp_mask); XFS_STATS_INC(xb_page_retries); - xfsbufd_wakeup(0, gfp_mask); + xfsbufd_wakeup(NULL, 0, gfp_mask); congestion_wait(BLK_RW_ASYNC, HZ/50); goto retry; } @@ -1756,6 +1756,7 @@ xfs_buf_runall_queues( STATIC int xfsbufd_wakeup( + struct shrinker *shrink, int priority, gfp_t mask) { diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index a427c63..17ec4a6 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -879,6 +879,7 @@ static struct rw_semaphore xfs_mount_list_lock; static int xfs_reclaim_inode_shrink( + struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) { diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 417e61e..49c8d84 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -72,7 +72,7 @@ STATIC void xfs_qm_freelist_destroy(xfs_frlist_t *); STATIC int xfs_qm_init_quotainos(xfs_mount_t *); STATIC int xfs_qm_init_quotainfo(xfs_mount_t *); -STATIC int xfs_qm_shake(int, gfp_t); +STATIC int xfs_qm_shake(struct shrinker *, int, gfp_t); static struct shrinker xfs_qm_shaker = { .shrink = xfs_qm_shake, @@ -2088,7 +2088,10 @@ xfs_qm_shake_freelist( */ /* ARGSUSED */ STATIC int -xfs_qm_shake(int nr_to_scan, gfp_t gfp_mask) +xfs_qm_shake( + struct shrinker *shrink, + int nr_to_scan, + gfp_t gfp_mask) { int ndqused, nfree, n; diff --git a/include/linux/mm.h b/include/linux/mm.h index 462acaf..ff4c44e 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -995,7 +995,7 @@ static inline void sync_mm_rss(struct task_struct *task, struct mm_struct *mm) * querying the cache size, so a fastpath for that case is appropriate. */ struct shrinker { - int (*shrink)(int nr_to_scan, gfp_t gfp_mask); + int (*shrink)(struct shrinker *, int nr_to_scan, gfp_t gfp_mask); int seeks; /* seeks to recreate an obj */ /* These are for internal use */ diff --git a/mm/vmscan.c b/mm/vmscan.c index 3ff3311..9d56aaf 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -215,8 +215,9 @@ unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, list_for_each_entry(shrinker, &shrinker_list, list) { unsigned long long delta; unsigned long total_scan; - unsigned long max_pass = (*shrinker->shrink)(0, gfp_mask); + unsigned long max_pass; + max_pass = (*shrinker->shrink)(shrinker, 0, gfp_mask); delta = (4 * scanned) / shrinker->seeks; delta *= max_pass; do_div(delta, lru_pages + 1); @@ -244,8 +245,9 @@ unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, int shrink_ret; int nr_before; - nr_before = (*shrinker->shrink)(0, gfp_mask); - shrink_ret = (*shrinker->shrink)(this_scan, gfp_mask); + nr_before = (*shrinker->shrink)(shrinker, 0, gfp_mask); + shrink_ret = (*shrinker->shrink)(shrinker, this_scan, + gfp_mask); if (shrink_ret == -1) break; if (shrink_ret < nr_before) -- 1.5.6.5 From cl@linux.com Fri May 14 12:48:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_55 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4EHmFCe035552 for ; Fri, 14 May 2010 12:48:15 -0500 X-ASG-Debug-ID: 1273859428-429102510000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from nlpi157.prodigy.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6C25F342DC6 for ; Fri, 14 May 2010 10:50:28 -0700 (PDT) Received: from nlpi157.prodigy.net (nlpi157.sbcis.sbc.com [207.115.36.171]) by cuda.sgi.com with ESMTP id w3KkXDEsrb75OXaT for ; Fri, 14 May 2010 10:50:28 -0700 (PDT) Received: from router.home (adsl-75-59-229-248.dsl.emhril.sbcglobal.net [75.59.229.248]) (authenticated bits=0) by nlpi157.prodigy.net (8.13.8 smtpauth/dk/map_regex/8.13.8) with ESMTP id o4EHkr5e012067; Fri, 14 May 2010 12:46:54 -0500 Received: from cl (helo=localhost) by router.home with local-esmtp (Exim 4.69) (envelope-from ) id 1OCyyL-0004CI-9b; Fri, 14 May 2010 12:46:53 -0500 Date: Fri, 14 May 2010 12:46:52 -0500 (CDT) From: Christoph Lameter X-X-Sender: cl@router.home To: Dave Chinner cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, Pekka Enberg , npiggin@suse.de X-ASG-Orig-Subj: Defrag in shrinkers (was Re: [PATCH 0/5] Per-superblock shrinkers) Subject: Defrag in shrinkers (was Re: [PATCH 0/5] Per-superblock shrinkers) In-Reply-To: <1273821863-29524-1-git-send-email-david@fromorbit.com> Message-ID: References: <1273821863-29524-1-git-send-email-david@fromorbit.com> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: nlpi157.sbcis.sbc.com[207.115.36.171] X-Barracuda-Start-Time: 1273859430 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.2, rules version 3.2.2.29863 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Would it also be possible to add some defragmentation logic when you revise the shrinkers? Here is a prototype patch that would allow you to determine the other objects sitting in the same page as a given object. With that I hope that you have enough information to determine if its worth to evict the other objects as well to reclaim the slab page. From: Christoph Lameter Subject: Slab allocators: Introduce function to determine other objects in the same slab page kmem_cache_objects() can be used to determin other objects sharing the same slab. With such knowledge a slab user can intentionally free all slab objects in a slab to allow the freeing of the slab as a whole. This is particularly important for the dentry and inode cache handling since they reclaim objects in LRU fashion. With this function they can see if the object is sitting in a sparsely populated slab page and if so decide to reclaim the other objects in the slab page. In many situations we can otherwise get high memory use since only a very small portion of the available object slots are in use (this can occur after a file scan or when the computational load on a server changes). kmem_cache_object() returns the number of objects currently in use. A parameter allows the retrieval of the maximum number of objects that would fit into this slab page. The user must then use these numbers to determine if an effort should be made to free the remaining objects. The allocated objects are returned in an array of pointers. Objects can only stay allocated if the user has some way of locking out kmem_cache_free() operations on the slab. Otherwise the operations on the returned object pointers cause race conditions. Signed-off-by: Christoph Lameter --- include/linux/slab.h | 18 ++++++++++++++++++ mm/slab.c | 23 +++++++++++++++++++++++ mm/slob.c | 6 ++++++ mm/slub.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+) Index: linux-2.6/include/linux/slab.h =================================================================== --- linux-2.6.orig/include/linux/slab.h 2010-05-14 12:24:44.000000000 -0500 +++ linux-2.6/include/linux/slab.h 2010-05-14 12:37:36.000000000 -0500 @@ -110,6 +110,24 @@ int kern_ptr_validate(const void *ptr, u int kmem_ptr_validate(struct kmem_cache *cachep, const void *ptr); /* + * Determine objects in the same slab page as a given object. + * + * The return value is the number of objects currently allocated in the slab + * or a negative error value and the maximum number of objects that this + * slab page could handle. + * + * Warning: The objects returned can be freed at any time and therefore the + * pointer can be invalid unless other measures are taken to avoid objects + * being freed while looping through the list of objects. + * + * Return codes: + * -E2BIG More objects than fit into the provided list. + * -EBUSY Objects in the slab are allocation queues. + */ +int kmem_cache_objects(struct kmem_cache *slab, const void *x, + const void **list, int max, int *capacity); + +/* * Please use this macro to create slab caches. Simply specify the * name of the structure and maybe some flags that are listed above. * Index: linux-2.6/mm/slub.c =================================================================== --- linux-2.6.orig/mm/slub.c 2010-05-14 12:37:27.000000000 -0500 +++ linux-2.6/mm/slub.c 2010-05-14 12:40:10.000000000 -0500 @@ -2868,6 +2868,48 @@ void kfree(const void *x) } EXPORT_SYMBOL(kfree); +static void get_object(struct kmem_cache *s, void *object, void *private) +{ + const void ***list = private; + + *(*list)++ = object; +} + +int kmem_cache_objects(struct kmem_cache *s, const void *x, + const void **list, int list_size, int *capacity) +{ + int r; + struct page *page; + unsigned long *map; + + page = virt_to_head_page(x); + BUG_ON(!PageSlab(page)); + BUG_ON(page->slab != s); + *capacity = page->objects; + + map = kmalloc(BITS_TO_LONGS(page->objects), GFP_KERNEL); + + slab_lock(page); + r = page->inuse; + + if (page->inuse > list_size) { + r = -E2BIG; + goto abort; + } + + if (PageSlubFrozen(page)) { + r = -EBUSY; + goto abort; + } + + traverse_objects(s, page, get_object, &list, map); + +abort: + slab_unlock(page); + kfree(map); + return r; +} + /* * kmem_cache_shrink removes empty slabs from the partial lists and sorts * the remaining slabs by the number of items in use. The slabs with the Index: linux-2.6/mm/slab.c =================================================================== --- linux-2.6.orig/mm/slab.c 2010-05-14 12:24:44.000000000 -0500 +++ linux-2.6/mm/slab.c 2010-05-14 12:37:36.000000000 -0500 @@ -3617,6 +3617,29 @@ out: return 0; } +int kmem_cache_objects(struct kmem_cache *cachep, const void *objp, + const void **list, int list_size, int *capacity) +{ + struct slab *slabp = virt_to_slab(objp); + void *p; + int i; + + BUG_ON(cachep != virt_to_cache(objp)); + + *capacity = cachep->num; + if (slabp->inuse > list_size) + return -E2BIG; + + for (i = 0, p = slabp->s_mem; i < cachep->num; + i++, p += cachep->buffer_size) { + + if (slab_bufctl(slabp)[i] == BUFCTL_ACTIVE) + *(list) ++ = p; + + } + return slabp->inuse; +} + #ifdef CONFIG_NUMA void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid) { Index: linux-2.6/mm/slob.c =================================================================== --- linux-2.6.orig/mm/slob.c 2010-05-14 12:24:44.000000000 -0500 +++ linux-2.6/mm/slob.c 2010-05-14 12:37:36.000000000 -0500 @@ -658,6 +658,12 @@ void kmem_cache_free(struct kmem_cache * } EXPORT_SYMBOL(kmem_cache_free); +void kmem_cache_objects(struct kmem_cache *c, const void *b, void **list, + int list_size, int *capacity) +{ + return -EBUSY; +} + unsigned int kmem_cache_size(struct kmem_cache *c) { return c->size; From andi@firstfloor.org Fri May 14 15:33:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4EKXsLB042467 for ; Fri, 14 May 2010 15:33:55 -0500 X-ASG-Debug-ID: 1273869367-191202900000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from one.firstfloor.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 01F1113DBB05 for ; Fri, 14 May 2010 13:36:08 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id NymFBzQF1BQrwWZZ for ; Fri, 14 May 2010 13:36:08 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB397.dip0.t-ipconnect.de [91.60.179.151]) by one.firstfloor.org (Postfix) with ESMTP id 58FD61F08015; Fri, 14 May 2010 22:36:05 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 9D854B1963; Fri, 14 May 2010 22:36:03 +0200 (CEST) To: Christoph Lameter Cc: Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, Pekka Enberg , npiggin@suse.de X-ASG-Orig-Subj: Re: Defrag in shrinkers Subject: Re: Defrag in shrinkers From: Andi Kleen References: <1273821863-29524-1-git-send-email-david@fromorbit.com> Date: Fri, 14 May 2010 22:36:03 +0200 In-Reply-To: (Christoph Lameter's message of "Fri\, 14 May 2010 12\:46\:52 -0500 \(CDT\)") Message-ID: <87y6fmmdak.fsf@basil.nowhere.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1273869369 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.2, rules version 3.2.2.29870 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Lameter writes: > Would it also be possible to add some defragmentation logic when you > revise the shrinkers? Here is a prototype patch that would allow you to > determine the other objects sitting in the same page as a given object. > > With that I hope that you have enough information to determine if its > worth to evict the other objects as well to reclaim the slab page. I like the idea, it would be useful for the hwpoison code too, when it tries to clean a page. -Andi -- ak@linux.intel.com -- Speaking for myself only. From SRS0+wJe4+74+fromorbit.com=david@internode.on.net Fri May 14 20:13:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4F1DfV7055540 for ; Fri, 14 May 2010 20:13:42 -0500 X-ASG-Debug-ID: 1273886155-1c7e02540000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 95B093443F0 for ; Fri, 14 May 2010 18:15:56 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id FKowVC1Bm0tTDdRu for ; Fri, 14 May 2010 18:15:56 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24169743-1927428 for multiple; Sat, 15 May 2010 10:45:25 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OD5yO-0001VJ-1K; Sat, 15 May 2010 11:15:24 +1000 Date: Sat, 15 May 2010 11:15:23 +1000 From: Dave Chinner To: Christoph Lameter Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, Pekka Enberg , npiggin@suse.de X-ASG-Orig-Subj: Re: Defrag in shrinkers (was Re: [PATCH 0/5] Per-superblock shrinkers) Subject: Re: Defrag in shrinkers (was Re: [PATCH 0/5] Per-superblock shrinkers) Message-ID: <20100515011523.GG8120@dastard> References: <1273821863-29524-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1273886157 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.2, rules version 3.2.2.29884 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 14, 2010 at 12:46:52PM -0500, Christoph Lameter wrote: > Would it also be possible to add some defragmentation logic when you > revise the shrinkers? Here is a prototype patch that would allow you to > determine the other objects sitting in the same page as a given object. > > With that I hope that you have enough information to determine if its > worth to evict the other objects as well to reclaim the slab page. I'll have a think about how this might fit in - the real problem is when the list returns objects that belong to a different superblock. We can only safely check whether the object belongs to the current superblock - to check if it belongs to a different sb we a lot of locks and reference counting to juggle. That would require re-introducing all the muck (and then some) that this patchset removes from the shrinkers. Perhaps just freeing the objects that belong to the current sb would be sufficient to realise significant improvements (will be fine for systems that only have one active or dominant filesystem), but i think some experimentation would be needed. The that brings us to test cases - we need a good one. I think we need to re-evaluate where we stand with regard to slab fragmentation (which probably hasn't changed much), and we need to be able to quantify the amount of improvement the increase in complexity will provide. I don't have anything close to hand to generate such fragmentation, so it might take a little time to write a test that does the IO patterns I know will generate problems... Cheers, Dave. -- Dave Chinner david@fromorbit.com From viro@ftp.linux.org.uk Fri May 14 20:27:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4F1Rv82056168 for ; Fri, 14 May 2010 20:27:59 -0500 X-ASG-Debug-ID: 1273887010-0772034b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ZenIV.linux.org.uk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 237321B58E39 for ; Fri, 14 May 2010 18:30:11 -0700 (PDT) Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id VWpgZSx1vGeUhHpq for ; Fri, 14 May 2010 18:30:11 -0700 (PDT) Received: from viro by ZenIV.linux.org.uk with local (Exim 4.69 #1 (Red Hat Linux)) id 1OD6Cb-0000AF-Kr; Sat, 15 May 2010 01:30:05 +0000 Date: Sat, 15 May 2010 02:30:05 +0100 From: Al Viro To: Dave Chinner Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org X-ASG-Orig-Subj: Re: [PATCH 0/5] Per-superblock shrinkers Subject: Re: [PATCH 0/5] Per-superblock shrinkers Message-ID: <20100515013005.GA31073@ZenIV.linux.org.uk> References: <1273821863-29524-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1273821863-29524-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-08-17) Sender: Al Viro X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1273887012 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.2, rules version 3.2.2.29885 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 14, 2010 at 05:24:18PM +1000, Dave Chinner wrote: > > This series reworks the filesystem shrinkers. We currently have a > set of issues with the current filesystem shrinkers: > > 1. There is an dependency between dentry and inode cache > shrinking that is only implicitly defined by the order of > shrinker registration. > 2. The shrinkers need to walk the superblock list and pin > the superblock to avoid unmount races with the sb going > away. > 3. The dentry cache uses per-superblock LRUs and proportions > reclaim between all the superblocks which means we are > doing breadth based reclaim. This means we touch every > superblock for every shrinker call, and may only reclaim > a single dentry at a time from a given superblock. > 4. The inode cache has a global LRU, so it has different > reclaim patterns to the dentry cache, despite the fact > that the dentry cache is generally the only thing that > pins inodes in memory. > 5. Filesystems need to register their own shrinkers for > caches and can't co-ordinate them with the dentry and > inode cache shrinkers. NAK in that form; sb refcounting and iterators had been reworked for .34, so at least it needs rediff on top of that. What's more, it's very obviously broken wrt locking - you are unregistering a shrinker from __put_super(). I.e. grab rwsem exclusively under a spinlock. Essentially, you've turned dropping a _passive_ reference to superblock (currently an operation safe in any context) into an operation allowed only when no fs or vm locks are held by caller. Not going to work... From vmart@v-mart.com.vn Sat May 15 03:35:03 2010 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4F8Z0bk085035 for ; Sat, 15 May 2010 03:35:01 -0500 X-ASG-Debug-ID: 1273912614-19b102c40000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from server.sadavi.com.vn (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9340C34493A; Sat, 15 May 2010 01:36:54 -0700 (PDT) Received: from server.sadavi.com.vn (4-5-78-112.reverse.digipower.vn [112.78.5.4]) by cuda.sgi.com with ESMTP id kNRnX5fcSlpTeErd; Sat, 15 May 2010 01:36:54 -0700 (PDT) Received: from [115.75.10.170] (helo=TrongBach) by server.sadavi.com.vn with esmtpa (Exim 4.69) (envelope-from ) id 1OCj23-0006Vg-HM; Fri, 14 May 2010 07:46:15 +0700 From: "vmart" To: "vmart" X-ASG-Orig-Subj: =?utf-8?B?R2nDoSBj4buxYyBz4buRYyEgMTU1IHRyaeG7h3UgbuG7gW4gxJHhuqV0IHM=?= =?utf-8?B?4buVIMSR4buPIFRwIE3hu5tpIELDrG5oIETGsMahbmc=?= Subject: =?utf-8?B?R2nDoSBj4buxYyBz4buRYyEgMTU1IHRyaeG7h3UgbuG7gW4gxJHhuqV0IHM=?= =?utf-8?B?4buVIMSR4buPIFRwIE3hu5tpIELDrG5oIETGsMahbmc=?= Date: Fri, 14 May 2010 07:46:20 +0700 Message-ID: <036101caf2ff$0b73a130$225ae390$@com.vn> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0362_01CAF339.B7D27930" X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Acry/sXXitDrK9cISR6OS9MSyCL18Q== Content-Language: en-us X-Barracuda-Connect: 4-5-78-112.reverse.digipower.vn[112.78.5.4] X-Barracuda-Start-Time: 1273912634 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multipart message in MIME format. ------=_NextPart_000_0362_01CAF339.B7D27930 Content-Type: multipart/related; boundary="----=_NextPart_001_0363_01CAF339.B7D27930" ------=_NextPart_001_0363_01CAF339.B7D27930 Content-Type: multipart/alternative; boundary="----=_NextPart_002_0364_01CAF339.B7D27930" ------=_NextPart_002_0364_01CAF339.B7D27930 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 S8ONTkggR+G7rEkgUVXDnSBLSMOBQ0ggSMOATkcNCg0KxJDDk04gxJDhuqZVIEPGoCBI4buYSSBU 4bqgSSBUUCBN4buaSSBCw4xOSCBExq/GoE5HDQoNClThu4luaCBCw6xuaCBExrDGoW5nIHThu5Fp IDI2LzQvMjAxMCDEkcOjIGto4bufaSDEkeG7mW5nIGThu7Egw6FuIHRow6BuaCBwaOG7kSBt4bub aSBxdXkgbcO0IDEuMDAwIGhhLCB24buRbiDEkeG6p3UgdMawIDE1MC4wMDAgdOG7tyDEkeG7k25n LiBLaHUgxJHDtCB0aOG7iyDEkcaw4bujYyBUaOG7pyB0xrDhu5tuZyBwaMOqIGR1eeG7h3QsIHbD oCB04buJbmgg4buneSwgVUJORCB2w6AgSMSQTkQgQsOsbmggRMawxqFuZyB0aOG7kW5nIG5o4bql dCBjaOG7jW4gbMOgbSB0cnVuZyB0w6JtIGjDoG5oIGNow61uaCB04bqtcCB0cnVuZyBj4bunYSB0 4buJbmggdHJvbmcgdMawxqFuZyBsYWkuIFF1eSBob+G6oWNoIGNoaSB0aeG6v3QgMS81MDAgY+G7 p2Ega2h1IGRvIFZp4buHbiBOZ2hpw6puIGPhu6l1IHRoaeG6v3Qga+G6vyB0aHXhu5ljIMSQ4bqh aSBo4buNYyBRdeG7kWMgZ2lhIFNpbmdhcG9yZSAoTlVTKSB0cmnhu4NuIGtoYWkuIA0KDQpLaGkg aG/DoG4gdGjDoG5oLCBraHUgxJHDtCB0aOG7iyBt4bubaSBuw6B5IHPhur0gxJHDoXAg4bupbmcg bmh1IGPhuqd1IHNpbmggc+G7kW5nIHbDoCBsw6BtIHZp4buHYyBj4bunYSBraG/huqNuZyAxMjUu MDAwIGTDom4gdsOgIDQwMC4wMDAgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGjGsOG7nW5nIHh1ecOq bi4gSGnhu4duIMSRw6MgY8OzIDIwIHThuq1wIMSRb8OgbiB2w6AgY8OhYyBjw7RuZyB0eSBs4bub biDEkcOjIGNhbSBr4bq/dCDEkeG6p3UgdMawIHbDoG8gdHJ1bmcgdMOibSB0aMOgbmggcGjhu5Eg beG7m2kgQsOsbmggRMawxqFuZy4gDQoNCkLDqm4gY+G6oW5oIMSRw7MsIGThu7Ega2nhur9uIFRy xrDhu51uZyDEkOG6oWkgaOG7jWMgUXXhu5FjIHThur8gTWnhu4FuIMSQw7RuZyBz4bq9IGhvw6Bu IHThuqV0IGdpYWkgxJFv4bqhbiBJIHbDoG8gcXXDvSBJSSAtIDIwMTAgxJHhu4Mga2hhaSBnaeG6 o25nIG7Eg20gaOG7jWMgMjAxMCAtICAyMDExIC4gVuG7m2kgdOG7lW5nIHbhu5FuIMSR4bqndSB0 xrAgMS43MDAgdOG7tyDEkeG7k25nLCB0csOqbiBkaeG7h24gdMOtY2ggMjYgaGEsIHRyxrDhu51u ZyDEkcOgbyB04bqhbyDEkWEgY+G6pXAsIMSRYSBuZ8OgbmggduG7m2kgY8OhYyBsxKluaCB24bux YyBjaMOtbmg6IGvhu7kgdGh14bqtdCwgcXXhuqNuIGzDvSBraW5oIHThur8sIGTGsOG7o2MgdsOg IMSRaeG7gXUgZMaw4buhbmc7IGThu7Ega2nhur9uIMSR4bq/biBuxINtIDIwMjAgbMOgIDI0LjAw MCBzaW5oIHZpw6puL27Eg20uDQoNCkhvYSBMb2ktZW1haWwgNi01LTIwMTAyLmpwZw0KDQpRdcO9 IEtow6FjaCBIw6BuZyB2dWkgbMOybmcgbGnDqm4gaOG7hyBNci4gVHLhu41uZyBCw6FjaCDigJMg MDk3OC4xNjguODg4IOKAkyAwOTEuNjc2LjMzODggIMSR4buDIMSRxrDhu6NjIHTGsCB24bqlbiBj aGkgdGnhur90IHbDoCDEkeG6t3QgY2jhu5cgxJFpIHhlbSBk4buxIMOhbi4gKCBDw7RuZyB0eSBj w7MgeGUgxJHDs24ga2jDoWNoIG1p4buFbiBwaMOtKS4gTuG6v3UgcXXDvSBraMOhY2gga2jDtG5n IHhlbSDEkcaw4bujYyDhuqNuaCB0csOqbiBlbWFpbCwgeGluIG3hu58gZmlsZXMgxJHDrW5oIGvD qG0gxJHhu4MgeGVtIHRow7RuZyB0aW4gY2hpIHRp4bq/dCBk4buxIMOhbiAuDQoNCkNow6JuIHRo w6BuaCBj4bqjbSDGoW4gxJHDoyBxdWFuIHTDom0gdOG7m2kgZOG7sSDDoW4hDQoNCiANCg0KKE1v bmcgdGjDtG5nIGPhuqNtIG7hur91IGVtYWlsIG7DoHkgbMOgbSBwaGnhu4FuIHF1w70ga2jDoWNo KQ0KDQogDQoNCiANCg0KIA0KDQogDQoNCiANCg0KIA0KDQogDQoNCiANCg0KIA0KDQogDQoNCiAN Cg0K ------=_NextPart_002_0364_01CAF339.B7D27930 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

K=C3=8DNH G=E1=BB=ACI QU=C3=9D KH=C3=81CH H=C3=80NG

=C4=90=C3=93N =C4=90=E1=BA=A6U C=C6=A0 H=E1=BB=98I T=E1=BA=A0I TP M=E1=BB=9AI = B=C3=8CNH D=C6=AF=C6=A0NG

T=E1=BB=89nh = B=C3=ACnh D=C6=B0=C6=A1ng t=E1=BB=91i 26/4/2010 =C4=91=C3=A3 kh=E1=BB=9Fi =C4=91=E1=BB=99ng = d=E1=BB=B1 =C3=A1n th=C3=A0nh ph=E1=BB=91 m=E1=BB=9Bi quy m=C3=B4 1.000 ha, v=E1=BB=91n =C4=91=E1=BA=A7u t=C6=B0 = 150.000 t=E1=BB=B7 =C4=91=E1=BB=93ng. Khu =C4=91=C3=B4 th=E1=BB=8B =C4=91=C6=B0=E1=BB=A3c = Th=E1=BB=A7 t=C6=B0=E1=BB=9Bng ph=C3=AA duy=E1=BB=87t, v=C3=A0 t=E1=BB=89nh =E1=BB=A7y, UBND v=C3=A0 = H=C4=90ND B=C3=ACnh D=C6=B0=C6=A1ng th=E1=BB=91ng nh=E1=BA=A5t ch=E1=BB=8Dn l=C3=A0m trung t=C3=A2m = h=C3=A0nh ch=C3=ADnh t=E1=BA=ADp trung c=E1=BB=A7a t=E1=BB=89nh trong t=C6=B0=C6=A1ng lai. Quy ho=E1=BA=A1ch chi = ti=E1=BA=BFt 1/500 c=E1=BB=A7a khu do Vi=E1=BB=87n Nghi=C3=AAn c=E1=BB=A9u thi=E1=BA=BFt k=E1=BA=BF = thu=E1=BB=99c =C4=90=E1=BA=A1i h=E1=BB=8Dc Qu=E1=BB=91c gia Singapore (NUS) tri=E1=BB=83n khai. =

Khi ho=C3=A0n = th=C3=A0nh, khu =C4=91=C3=B4 th=E1=BB=8B m=E1=BB=9Bi n=C3=A0y s=E1=BA=BD =C4=91=C3=A1p =E1=BB=A9ng = nhu c=E1=BA=A7u sinh s=E1=BB=91ng v=C3=A0 l=C3=A0m vi=E1=BB=87c c=E1=BB=A7a kho=E1=BA=A3ng 125.000 = d=C3=A2n v=C3=A0 400.000 ng=C6=B0=E1=BB=9Di lao =C4=91=E1=BB=99ng th=C6=B0=E1=BB=9Dng xuy=C3=AAn. Hi=E1=BB=87n = =C4=91=C3=A3 c=C3=B3 20 t=E1=BA=ADp =C4=91o=C3=A0n v=C3=A0 c=C3=A1c c=C3=B4ng ty l=E1=BB=9Bn =C4=91=C3=A3 = cam k=E1=BA=BFt =C4=91=E1=BA=A7u t=C6=B0 v=C3=A0o trung t=C3=A2m th=C3=A0nh ph=E1=BB=91 m=E1=BB=9Bi B=C3=ACnh = D=C6=B0=C6=A1ng.

B=C3=AAn c=E1=BA=A1nh =C4=91=C3=B3, d=E1=BB=B1 ki=E1=BA=BFn Tr=C6=B0=E1=BB=9Dng = =C4=90=E1=BA=A1i h=E1=BB=8Dc Qu=E1=BB=91c t=E1=BA=BF Mi=E1=BB=81n =C4=90=C3=B4ng s=E1=BA=BD ho=C3=A0n = t=E1=BA=A5t giai =C4=91o=E1=BA=A1n I v=C3=A0o qu=C3=BD II - 2010 =C4=91=E1=BB=83 khai gi=E1=BA=A3ng = n=C4=83m h=E1=BB=8Dc 2010 -  2011 . V=E1=BB=9Bi t=E1=BB=95ng v=E1=BB=91n =C4=91=E1=BA=A7u = t=C6=B0 1.700 t=E1=BB=B7 =C4=91=E1=BB=93ng, tr=C3=AAn di=E1=BB=87n t=C3=ADch 26 ha, = tr=C6=B0=E1=BB=9Dng =C4=91=C3=A0o t=E1=BA=A1o =C4=91a c=E1=BA=A5p, =C4=91a ng=C3=A0nh v=E1=BB=9Bi c=C3=A1c l=C4=A9nh = v=E1=BB=B1c ch=C3=ADnh: k=E1=BB=B9 thu=E1=BA=ADt, qu=E1=BA=A3n l=C3=BD kinh t=E1=BA=BF, d=C6=B0=E1=BB=A3c = v=C3=A0 =C4=91i=E1=BB=81u d=C6=B0=E1=BB=A1ng; d=E1=BB=B1 ki=E1=BA=BFn =C4=91=E1=BA=BFn n=C4=83m 2020 l=C3=A0 24.000 = sinh vi=C3=AAn/n=C4=83m.

3D"Hoa

Qu=C3=BD Kh=C3=A1ch = H=C3=A0ng vui l=C3=B2ng li=C3=AAn h=E1=BB=87 Mr. Tr=E1=BB=8Dng = B=C3=A1ch =E2=80=93 0978.168.888 =E2=80=93 091.676.3388  =C4=91=E1=BB=83 =C4=91=C6=B0=E1=BB=A3c t=C6=B0 = v=E1=BA=A5n chi ti=E1=BA=BFt v=C3=A0 =C4=91=E1=BA=B7t ch=E1=BB=97 =C4=91i xem d=E1=BB=B1 =C3=A1n. ( = C=C3=B4ng ty c=C3=B3 xe =C4=91=C3=B3n kh=C3=A1ch mi=E1=BB=85n ph=C3=AD). N=E1=BA=BFu qu=C3=BD kh=C3=A1ch kh=C3=B4ng xem = =C4=91=C6=B0=E1=BB=A3c =E1=BA=A3nh tr=C3=AAn email, xin m=E1=BB=9F files =C4=91=C3=ADnh k=C3=A8m =C4=91=E1=BB=83 xem = th=C3=B4ng tin chi ti=E1=BA=BFt d=E1=BB=B1 =C3=A1n .

Ch=C3=A2n th=C3=A0nh c=E1=BA=A3m =C6=A1n =C4=91=C3=A3 quan t=C3=A2m t=E1=BB=9Bi = d=E1=BB=B1 =C3=A1n!

 

(Mong th=C3=B4ng c=E1=BA=A3m n=E1=BA=BFu email n=C3=A0y l=C3=A0m phi=E1=BB=81n = qu=C3=BD kh=C3=A1ch)

 

 

 

 

 

 

 

 

 

 

 

------=_NextPart_002_0364_01CAF339.B7D27930-- ------=_NextPart_001_0363_01CAF339.B7D27930 Content-Type: image/jpeg; name="image001.jpg" Content-Transfer-Encoding: base64 Content-ID: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCATeA8UDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+4j9o zVtW0P4PeLdS0TUb7SdTt/7F+zahptzNaXtv5viHSYJfJuIHSWPzIJZYZNjjfHI6nIYivy3HxU+K mQD8R/G/XBz4k1YfX/l7/XpX6lftFIkvwe8WLIquhOiAqc4OPEOlHsexAI54Ir8wkt7VEKeWm3BJ BXIAI5A46f15r9r8NMPgq2U42WKwWGxM44+SjKvRp1ZKKoYZ8qc02le7smldt7t3/CPE6pjo51hV hsfXwsXgqbdOjVnTjJ+2muZqMkruKs3bp1RX/wCFrfFHOP8AhY3jXpnP/CSarj8/tfWpYfip8UpJ EQfEXxoQ5xuPiPVcD8ftX1/Ko5dPsrhDtWFSoySFAOPyOM+/P6ZrJbiM+WlkjxqQQWG1hgntjPpn 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 Ri8VeHYWQvoc9xtUq4m1UIsmVxl0isVDMCFOQUHPJrib/wAifT0uI737CbCzd5dOuZgbQRQp5qJp U3lRrGhRXb7HOkbKSNk8xbj5dg+OFm/iQ6Q9jeqs8kAtSwtmiWIlPPkuyJ1a2mEUsE8MLAu6zLlG 3YX9v4P4k4No8NZbUxOZ46tiIwjSrU416ylGSa97lbXu935LZKz+WxVbNHWqLB0sJPDWjOnUWHp1 H9neTW/a+p9WeLb7wt4iltVuvhZ4H16GBJDBJ4mOq6rJbTsiqHiEd3ZRojhVWXYVdv7xBrzyfW/H 1lbX1t4T8OfCjwrujjFsdP8AA1teP5u5WLsdautURxEVXyleNthCsOciqdr4lsr9BJZ3cc8ckXnb ozlPLMssKPuHy/O8MjIN24xkNja1Wv7VA6v9M8nPHcg4IPJ6HHHXJr9IpcJcKcQYejmNCMsRTrK6 qSqym4yXLe923e93a/8Am+CHE+e4T/ZnUjStryKnCKavHVRireXzPz7+LXwa+ON3q2peL21mPXr1 5mdzp9vaadL5RiBCx2dnDDZjBeVWSOMK2eh5ryT4f2eueGr5ZfFuitoum3azLDd3uk2VyBdQ3kMP 2gRXkY2eRK7SyShHWNBuCtt3D9XjqKOMkqwByMgfQnBHsPy968l+K/hPT/F/h+KJLG1lvLK5861L RjEZeRTLxtA2ybQWVcggfMDg152ZeH2XQoSlSTlTpRclSaWqUY3SstX6/mdlDifEVpRpYmMOWUkn U6xvy3dtrK33eZ8lfFvVo9U8H6DY3XjTQ7S2TUtfFpMdLOk3+p5eKG6LTW5ubeTSt9kr2DS2lskd x57KUNzKZOd8AeGLLVr2wvNHtJ702U8chv7HxvpJ1TULjynKeet9dQSiOzkQT28NraS5+USKCu5/ bvDHwUg1W6sz4xhivrLTm1CG2tZOYY47xzcEKrH5Nlw7N8hA24AHWvO/GfwDtvAeuQeKvC092Iba 6hvbews2kiRJVkJli8xCcRSIduwqSU+X+Kvz7E8CVKtCriKOFlh8NzKPI4JzSuk5tatx8rXtZHt0 87wU39XqVF7TRuSXu7RSV7b6/wBdfcNY8aav8OPAiG4s/El94hspftlvYJ4clgtxNdXgluYV1ZYl tL2NIsNLcStOZWhyjIUGPFrH4wDxRqdzbeILiFf7V1q0NubnEN/NpD36yTQ3VusMlsy2yGW1T/SI CAgxlGO9w8C+I/EXhLXNfS71nQ5oFgvNNs7G9nSSFYnD3ccT70YZYTyQx5WNA4Qdq8R1HxLf6RrF hoXxD0CLXNPlmt/smq3Bi0rxFY2cks8Fvcf2nYxkzOUDSynUY77KiLYykFh+fYvw9qYXDVqkIVIU 605ShV5nTd3JR5oxeije+291vqdeGlha8pKjXTnHZSs7aR0T/Pfpolv99+MfiPp2k+Mrix+Hmp6X ZWca6M6XEtvaXM1z5Gkv9s0ieM3FlctcL8kgQRxl3RYYnZ1Kn3/4IfFCfxLa6f4h07WLPwtqenTe RH4g1DV7Pw5p13qltCkzpp11qN3DbiaSNpA9pNIBIqSh0MWN35cxfE39n7wpP5el+H/izrl/bXz3 NteXl74YsI47zzdrTwXH2PUbq9KqMLJcRRRylID5IK7a9p8M+L/gvrHhqxv4vDXxsuoVvJ5n0W1t PB+pWdndiN2uLtpk02wuo1lLnmCJmBd/mjwMfJy4Kxs5U1RwuMxNWnqqy5nK8eV6PXqlv/wCsRl9 KcY1qk6cakGmpwrRpyVlFp3fXurn9BfhL48eItQ8GprvxT+CWm/ETwSq3M0nj3QNFtjL5EW9Lu+n urGG4sJpsLvkmRrBiAHZiSGr5s8RftS/sb+GtQvtc+H/APwmt34r0ZLKX+ylvIri41f+1QFvRDcS y3ljp0ujeb9veZjCJ/JZI2JUxj5E8KftI+OPhh4I0ew8DXnizQfhprNrMZbf+0ru1TSm1CNku4NV 0aS0ukju2RWLSJEba6OXiuJJMqPym1qPTNN8S67faX4rtLU6/qGpSRXuqF75o7czkWKGG0t5hFeX DzrLbxokduAGWVlOcdeWSzzASxNDF1sZhpQhJKFVSkp07JOMm+ttH0s9TTC5g1UVOc5VXT5eSdTl npGzjy1YpJtPz2Svvc/p50P9pjUfGXgPx5r3gr4iQG2t4Ir7xHe+MJI9IumsrfTPtt9eWGr2t7Yr dajaIpW50+GCW7vXRPPLsXkr8WfGvxw+NPxit9SvbrxNqPirwfo1xJaRRweIZ7iyurO1sw+Na0ue 5a3azuIbiO3tpWV4hPbOUcOrOOO8Ka74g0vRJ/DPiDxDPqdq3ge6t7xW06RtEmudWZpxNo+owx+S LzSoZLb7dALQNBO0sG3cjKPmbQtf8Z+D9amN3o2p22m6nqO2/eW1mk0qKwvJRHbRy3EaJBNMTLPO VEIlWNxII0JNEM0r42hiMPhI0I4ihJPnnFc9RPlb1302v38nd6VsTXxNS851JOO1ptJ3cbXjt08n 103Ppjw/8JdN8dzaVrE8U2nT6dF9j1SymvGMF1KzSI9vDcJicqsboFe3kAaELCp2h2b6k+Hvw8b4 dXDXHgzW/EnhG5FxDdpP4f1e50+aK4t+InSdA80mw7miaZ5fLMj7AA5DfKui/FC2stSiv1aS31C0 1a+t1sdPNoiXmnx28VvbXEVsQwjujG0e5xG7hmkxHlwa+x/BHxl8Aax4m8K6Hpd7FrWvalPYwHw/ qlhfRW5vJ2crYX9y6wQS4CFrmeG7WNIzG8hV22j5rNamdSlRXPKMVFc1tVBJxu238TS1S1b21PCx 8Mxco+yT5HypON+ZJuOvS+/4WW5x3xI+GnjT4g6i+v6p4/vNc1REuDJ/b/h/wvfSan5ru4j1W4j0 u1k1YLI7SJLqxuWjmZp43EoDVwXjW4+P3iDwl4b8Dav4b8D+JLDwlBpmk+FrjVPhz4Vm/sfSdMu1 v7KzXVLC2e8WyinjJa1kmEc8dxdQSq0Uzqf2pXxB4Y8PyaLF8S/2bBpuiyaYYRc+HtC07XbbU5Wa UxanHq8Btpd0anettHqFxmFFIOFYji77R/2UfEU2py2niHxF4LlEN1cWSXNtqDmW6Pltb6c2mnTb +0tIY3+0RiSTVmfAgWSUYlnrppZrmWHp0o0sfSr89o3nGUHH4Va/XZX16dDopYbMIQVRZhCUrK9G vF02rcvWV0u7s+qPyqtfDfjvUrvwBqOu+CfhdBd+FLGaC+trLw/Jp1vr5luXkt4Nc/sq/wBJkvls 43Ih2KskMbCB3miConT+FPhtJoviWDxVKp02/t9Y/tdbTRb/AFJLGSVHaWCK6+2zzXVzFYyO62Qa YPDGAGkkJJP35qXwt+FD6nokGhfGPQorLVtN1a4kfX7nTkmtdSsI47i1sXSC4iKW9zD5qi4cj99J BEVTHPjieFl1K6ls/C+u6J4vltVd9Ri0C7XUJ9GK6i1gkeppbrJHBKzCOdis0qJBJmWRJRIE8zHZ hnUeerKtSspRXNTnGUo/C+nZaK23a5w42OdNx96E41ErfV5KU73i7e7ror6990jh/GJ8R+OraeHV /G/i+I3WGmkg1KN5C+ch/Nu7eecMDgnZNGhPUGvn+z/Zl8Fre3d7qlxe+JPtcc6TR655Nx5kk0iS GaWVEWV5k2yBXBVlErlMDivoT4nXlj8JdQstK8bahZWGp6nEk1pYWuoaXqd75bo0imWz06+u7qzc opYR3cMMinhkUjB8s1r41+DdI0u7vIL37VeQhUg050mt557h5UhRCGidl+dl6JlkbegcdE8y4klT 5fb4r2ElHlmk+VpqCi+1rf138i2Z06sYyeIUpWvzXaUm43u9dtbPVPc4jxJ8Mvgd4UXTovFsGl6Y rLcHS5J7u5sZojbKs0slm1vNFIrDCMh+b59uMvwMS3+CHwQuIku9Jc3VzqYkuLKM65bXE9wZY2jk EA1TzOsZOYn3kjaQh2ADifiz4H8RfGzwzpniBNGsdA8XaS9yttdQ+JkOm6hZRLJdxwxQz28hlaQx rCqXFvbXNrJIzuHQSKvxZpev/Evwwun3euaFeQabPqHlQ3NzCXRpyn2fyLa4hkzHHJjIWDDKwkkU ngH1suoYjHYdTo5tKGJhJxqU5TjFtRcb8rb17/eerh8PXrUHOeJqxrxbjKm07L4bWfZrbz1tZ6fY Hjew8I+CtPfTtQ03V7OzuZ4bWSQReHbwu00i28Qf7CluWRi6JvkBOSMAkBT7F/wTu+Hmm6b/AMFC v2P3g16C+g0v9pz4JG3t47K+tFFxbfEfwvqYSS4iMltcTRLOsauoFrLITGduCw8V8JfCxPizFcXT a9eaZd2U1tNcMYxew/aMpNbyWkrTI6PGqpLE6LlGP7xPMy1ffH/BPr9nRPA/7Z/7K2oQ+NPEOoCD 9pP4OazcW1w0HkzS23xA0CfystHLPBDcFAlxHHcKtxHlJF4wPRp5gsPXw2GjjpurUr0oVYSi5Rm+ eEfda25lpe6WvQ6Mqqww2Jpwrzk68q0UrqVmnKC22T3b311tfQ/r8uvip8MNF8Zaf8Nda+IvgfR/ H/ieyMmgeC9U8VaHY+KdXRJBKkuneH7m+i1W9ilaB40kt7WRSwOCdjY7NgUJVgQykggjBBBIIIOC DnsfX1zX4U/s6fsK/D39tL4C+PP2r/j5ocaftC/tf33/AAtbwF8QUDN4u/Z78M2DkfAvSPh1qoaO 60V/CukWej63qgtJIE1zULy9g1BZbdgtffH7PH7WF3e+MLP9lf8AaS05fBP7Uvhrw3HcRxXw8rwz 8b/D+jxraXHxK+E/iCMR2+s2d4I0vdd8MT7df8KXU09pe2T2sMd5J/TuLyahTo2y6vUxeIwlOH9o UnGKcJRpwdSpRtZzpRfNGTtdWT0T0+qav1Wkuut7tX2t1uj7ovci6n9CwKdvkYK0Y+gTbjt0Iq7Z XKhJZrtTMLZEWCReLiKVyVjIf/lpHEA0oSQk7lVVZASarySWdyVkcy27IiRtGqifzBGiqrI7NHtY qo3bxjP3SfuiGWeMxmGCMxxbxIxd98sjKCq7mCqoVQzEKqgAkksTivnrN2jyu6aWm+nLf577b/IE 3FuV01e6XWz5f+A3s+gS27BDPG6zw55kXO5Se0yEFo2yD94bXOQjtkVVP5889z6/XPQ1LFNLA++N yrDIOMEMD/CwOQynjKsCGxyMGqHiHX9A8P6DrXifXr610LS/D2mX2s6vqFzIsWnW+n6bbSXd7cyy McW3kwRO7ZJiOAP3eebjCblGEYtuUlGKtrdqNl0eremj3JspPTRvpsr6dei3+7zSPlj4u2c/iz49 /BDSfA9hIvj34c6gfHXi/wAVfbEsLDQvhH4iXUvD2teGdRQJJca9J461DTk/snRYoxBaah4bj1+5 urX+zbdLv6xr4R8J3/xv8d/tEfDn4x6R8HfE3w3+HHiDwNr3hDx83jvxF4ON3rng+3a48RfDbxBB 4Z0fVNQ13RfEttr13eRQ2Nz5sJ8P+Ib8ao1pfWltAPt/Vb5dL0vUtTZUddPsLy9KSzpbRv8AZbeS YJJcS/u4EcoFaaQFIwd7ZAwfVzGDhHB0FyzlGgtIyUpxnKWsZ27NtRTb0d9NilCU5xpxV5Saiku8 rLf7tel7dEbR+ayUDrDduWGSeJ4k2kEHjm3K+h/LKxwCNDPdI4ixmKPIjeds4AXcC3lqDukdRyAF VgzAj8Nfh9/wV41rX/jX4Y8N+JfAHhnwd8L9Y1r+wdavpL+81vW9Ne7drTT9Zkv3FlpywWN+0Ml6 iaeymzadklDIpP7gGY3BFwZfOEqq6ybt6yKQCrKwJDKVIIKnaVPHGK4sVgsTg3BV4ciqJTjZ3unZ +l97rpf5HZjMBicD7J14KPtI80LNSWijdPqrK33p3RejvfLmiMEUdvGsiFwmJGb5gz7pZAX2nGAi kBR8p3HLGEkQXnQssFyAEGOVilwEGeAMKAAAAOnTiqwBLKAOSQBx3OMfn+Xp1rqdStLbT5ZL9JHe WSdVtYJEH3/JSWS6YqxDxJIy+UrRgyMwOCiEv5dXCYKpXp1quGoVK8acqcKtSlCdSMJcvNBSlFtQ k1rFaStqtGcaV4uTSsmrvy0vbydk9L32tsY9zZObi4WKeK6dZpAyq5E5wxydkoQyE858ved3HA5r 88/24da+Gnw/m+Hvj7x3r3hXw9qsCaxo2kTa5aWkusxxo8V5PJpTyRXOprvMvlvHY23JEhaUcqf0 KGy+bnZFeFvv/LHDcE5PzklUhm7hziNx12vgt+N/7ev7PXh79qXxbpWvXPxF1Tw/p3gvwxeWOkal btp2teEbm4e/k8wQhZIS95dyRBZ5YtV8qKGCJAgYgSfzJ9KjNeDqfANHhrivNa+TYXOcdQhTr5fK UMThvqjVeNSDpu8KftIwg5aKPO+x/Tv0WMLhcLx//rNnGNjlPD2TYHEvMMwrRX1f/aKXsYUJzm1C 9Tm1i3dqLSvqz0nTbWxvI38RLrQuPDfiRZZrQW8ZSG8WeB7uymtlujHKk6O63FvIliwjdXDOFaQH 5k+Lfx38UW138QdA+HUOm+IdZ8P6Z4T8S3Hg6WwvdT8RJYeJkupJ/JkF5pui25aax+22q21pf3Ys tMnkmjdjEG7W5+I/hn4LaJ8KvhjqevS+KvG2v+HF8HeBvDeniwkb4h69pvhO4126s9Kg/tG4stJe bSrC5265r97pOlaXcSW26/aaWEV5J8LvgX8RPFniP4kfFv4h61oXg63+I8uhxL4D8MadfX2s+G9J 8KRxRjRpPiAurwQXkNvpY1O316fTfD7QxSahNZ6RrFxLHHdTf5ueE/HHF/hVnOeZ5lPEU8Nw3mVV +zr5riamJq57gsJj6dOTwzqOdRuNFYpUpQUeWr7vMfq3F/iZQ4x8XeEOG+BI5dn+TYPEOnm/Pg4v AOj9Zp+3qxlSUWpQw8Peqq8eZtRvuez/AAku9f8Ai/8ADjQdR8f6L4ft/E11LZ6vq0Vn9mbT57XS 5dy+LdPOmLDLPHqsytJHplxIzRSbvLt5re4t517f4hfEHSfC2nRWWraXbWlrfm5aXS7q1TWdIfRU ZIv7VihjljlaG4kLWcVras732pXsmWuFia1X1+G08P6RocGqpdWejXE1rZzl9ShkFlfwtCp063uI NOhiRonieOBGiSOKzeR7u8SZIILmviT426prdt4A1rxJq2oaTZ65qNil9/baeHTcaRLDZ391b2Og 2FjBcalqz6WsDpdpq+magbmW2We/1JLpI5jH+meDFHL/ABX8XaHFPiJmGZ4zJJZ7KGQ5I44zMadX G4+qpYejOvyy+rYeiuWpXjKcYaRsuXVfZeNHiplfBmFhwzw7Glg83zFwg1g6ahLA0m1FyfJp+8el JzV4wTlu7vuNL/aQ+Iuj6bYWXhjx+dK8JWcNr/ZfGj6tHp8M0ksNlp2lzatpupXfiGwaKIW8SOLX bdmOG3m01VTSI/S/C/7a/wAdfCN7Lf8Ainw3pfiHwvpsSXGpaxe6VbeF5ZLeS6htoDbXVhrOoW0s 8rSxrNbX2iWEsU26MoAu9Pwp1HXPiHrV2ZvGms3sXhLR7WNo4dGuEtNH1S0nnl/s7RdGubDbHeDV LppI1d5LiS0gF3cXAVrV4x9lePvAvx5/Zq8J2/in4h6/4b8XeC9Z1TQfB3i7wv4b1K9ub34fajr/ AIet/GGheE7hLqCytdQto9DCER6VeXMNhdWtxp6alZTtP5/+jXiR4ScTYClSzLw14mxWWY5cs4ZD Uryng8RCCi3TwylzKElBP93opWS62X45wbxjwbimsp4/4ZyjMaeMrQUs6lQccXS9pODrVKsqVpVK nK5NTd7Ss5Kx/Qv8JPj/AOFfjVa39xo9ksGo2lrZ6lNoV5PA89rpGqQyNaX6pDBBMsJuLa9tAwYK k1pyZBIgPYeMvCeneL/DeqaJcPKun6rB9mkljKG60+cOk1tKNylC8E8ccsTsvlzBChGS6V+MX7Nv xP8AAPw88a+HfFOla1rElpLLceEtetPIutUuoNA8XX0WpWehX9tp6W9vZS+EtQSLUWimtprvTrJ5 raRGWKW+uP3AsWBkcA5ie3uDJjlWQQsyk84PzhWUHowBGCBhcAZrieMOHs54X40wsa+Z4NVctzrC YmjKnHGYTEU3DnnRmvhqQ5oXW7jdb3Pyrxx4EyfhXPMLjOGZrE8LZ7Q9vltRSjNUpx5VWw7lFt3h dSUXZpTV9UfnXf8Ah3VfAPjY+GNTvI5Td6erQajax3FrZ6lp2qRXFkpdZCwjeK8jZLqETTiFhDMG YMlcJJFJHI8TqRJG7I6n7yupKsCOvBBya+wP2h/DVtfeGrHxRFEV1XQNRsrYTxsytJpeq3kVlc2s qglJES6ltbuPepeN4X8t0E02/wDK39rf4o674Zj1LwZ4B07xrN8SdTv/AA9ruiXPhvSLm7srnTbH XJTrZe8sHnm8qO502Ky1KxngtxdJqsASSSAyK3+IXj19CnHz+kdHw24EeHyzh7iCmuI8unXrJYfK cBiX7PHKp7Scb06GJoylFRd1TmtHys/m+OT1MVmMcJQcYwm1Pmk1y04O3O3drZ2vrs7H0d9fX+vH TPbrjPtRWv8ACPwh8Svit4Q0zxTefD/V/Al1fJKbrSfFUltYSxyRMFE8ChjK1veZM1vE0KywxkJM F+Un1dfgB48OMnRUJ/vaixx9Sls4H4Zx3HXH8nZr9Ejx8wOcZplWC8PM9zenl2Or4OOYZfhnWwWK VKSiq2Hq3UZ0pq0ozjdWe+h5tbLcVRrVKMqbk6U3GTirxdraxfVO55PYD/QdaJzxZ2649zqFoR+W 38vwrJr6S0r9nvxYLS+XUdS0WyivTb28csc1zduVhnW4nZYkt48lRHEnzOikyYLDBNeieHv2d/B9 kpu9dvtT1zyNoNvGyaZazTNuKRlYfPuBGNjF2+0qdowF3EY/ReD/AKBn0j+N54CjHgqvkGGhDkxG Lz2rDB0qalWbk1FuU5uMWpcqWvdGlLLMXW5U6fIktXN2svd1/wDAfkfNHgr4ceIfHFxjT4Ra6bFI EutWvAyWcPTckeAXubjacrBAGYceYUQ769+1b9nnQxoDxaLf37+IYIS8NxeTQx2N/OOTDLB5R+yJ IAVhdLhvLZk80uN236CsrKz060gsbC1gs7K1QR29rbxiOGFB2VV7nqzMWd2yzszEk6FvCZ5CpYoq oZJZCNwRFxuY/dyTnCrkFmKrnmv9YfCT9mr4QcLcD4vLOPcM+KuKs4y/2ONzaU5Qp5XWqU465XTT XLOjPWNSV3K2yR7OHymhCHLVSqTmrOV37r913j5K2+m3ZH5gfEHTZfhRo2peJviVPYeB/CujxibV PFfiS/s9M8NWMRdYle41ueYaepkldIoYRO1xcSukUEMkrqh8H+KH7Wf7Kvwg+EnhD4t/8LCu/js/ j34gaJ8LvBHw5+BMema3408T+PNd859O0CO01u/0m504SGALPe3tnboiT27wCdbiAv8Aa37Qd14D 8e/tV/smfBTxhY2euWEOm/GP402fhLUYUvtMutb8BaZ4Y0Hw3r2s2Eu+2u20m48W6rc6S13BJDb6 pHBPbBbi2jkTo/iT+wt+yv8AFv44fDH9ovx38JNC1b4u/CG4huvBXiiGW90w21zZzfadMuNV07Tb m107XptGuSbjSJdXtbx9PkY+QVQBB9f4U/swvo48A5zDO+N3n3G8K1V4/Lstxs6eHweHowm3Rw9a NG063POPvVG1aHncullGEpSUp81VaNJ7K3Lr57H87mo/t3ftb/Gb9mr9sjU/GWkeJv2d9X+F/wC3 B8DPh94O+D8dzrXhTX/A/g8/Af8AaA1WXw9rep6PaPq+ua1rs2l6Rq+p3uoStYX91b2UlpNDZW1j Gfh65+J3xO8YWD3Ot/FjxFcSu0zTWOr6r4o1KR4U8qWMJHrmv6P500pkYIht1USxnccBiP6Jf+Cv P7Pfw9j/AGab/wCIGkXcHgjxP8WP2tPgc/j/AMRPqcmm2GpyeB/gR+0RoeiXt3HDbXEs10ulao1l OkEEk1zHaWMu0SWQev50dQ8O+GfDkcU5+JXhfxA2mpa31mmn6frc9413Ja3dqyTX+r6Tp1tHDYDy ZZ1Rn89nwgBDsv8Aa2NwHDmAxyyzhbLMJw/kmFpYPDYDK8HQpUsPg6dHC4eEoQair3mpzlJ6ylJu Tu2z7TD8scNScKS5IU9ouS15loktHdPe2nfVFbULTRLyfT7BvGPiKa71O6k07zb7RrDTYkuLhXt9 OMfkXHiq82yXbQmbbHujgLt5kbLgfsRN8fvh18Lf+CbPiPRtJ0/VtJ8R+M9V1T4f654ztdXtpri5 1ZUjnTT9M067itr/AEzQr7TfPtLaOGyhuLWG01K5k0+F3WNvxZ+Enh+21Dx+3jrXvENpqWg+D7y3 nnmeeKV11CWC5vYiLczkIbKztrjUUkCeV59skbDO4r0fjH4oeFPj94C8F/Db4RWcFh4e8MeJvE2t Xej6BbX2qX1/4l19bJIbaSIgSv8A2RpVqLO3gheYRyXF3KWHnjd8RxDh4YvOcrwFOvL2NGrCvi8T KUOSEIx5rKaSSbajFWvvdW1R9Dlt4ZbjcRKChV5VDD0op8023BJuL3Vm27X20aOStvGng/Ubi5uP D3w6vfE8Vo8rXi+IfE3iw28IknlvIBANH8S6E0xXT7W6t3Q2EjS/64R+d5YPM674gvVh0+4tPh/4 F0NHL3jGTVPDOrxywC9WVIJ7PxRqOt61Y7TZyKsN5dvdPbXYheLEyrXZeF/hpBZ6BeW2pfDy91K4 P9oTSa74i+2+GPJWK7EC21rJqL6bZRTQyaTqFurG/k85Z7hlWKWOF1tX/hvw5IJ7G60r4PeEzb6c 1sk9p4v0zVr2T/iXsqz74viR4okbU5knDGVdIZY9QiGYo5EdW9+UaNWpajUnWoqSinGc53S5E9Y/ O63W3c8xe1hFe0jGnUsr80VG2sWtm/W+nc4rwP8AtKeKfBK61DcaXpV94VubPVtR1TRdG8H6EdVe Oxsr/Uba20RrG00+WCdLtYkgEchkMSrARLEFgPnPxkPxe/4KI/Ff9nu2+H3wkT4Z6F4k+D95ZeBP CmmW9l4e8M3L+D7+eHX9ZOhW181npusTtYy/2hNLDBLP5f7sNFJaqOh8X/Dv4cT+CvHem6Z4h1fV fEWpeDdc0rQU0xNaW3l1rUNMMdoV1KHQYI7dI7pzC1y08ccabpv3qqsclT9mXxT8Svgl8Q/2QvGE fhq1stI/Zsg8bwa9o9mltcXXjYePVvItcuru51O6jS61CWOeKQzXixo1zbwyxx24ihWPxc3yzFSz LC4/KMuq1KuGjo5xnyKbpu8uWTtJuXJFPTTzuz0MFiqKwdbD47FU4qo00oOLlJc9FKPMrWSSlJx2 09TsJP8Agjt8X9K8OW/iTXfEui3dpPILdR4f0bxr4htxeSeVHHp0l/pXhWayjvJLuVLNlW7eGGZH aa4jjQM3o0X/AASF1Tw94Nm8a+KG8X2tjJpd3qOlTv8ADu2t7a6Sytre5uZ5h4h8X2OtNp9os5Nz c6b4c1Aqqq0SPIzRJ98/Ez/gpZr3j/wbB4N0/wCEE+jR2kurXVtrMfj1NIuPt1xLeHR7q60yy0TW oJ10VJ7e4gtnvJIP7TsoL6NISCh+dvEn/BRz9qq38EXvw7GmaX4tuvE3g3UvCOreI9d1L4g+Ndbu tO1GO8szLYWmoa6+i6PqUMVygin0rR4IR5EJFuvzh++EuKp4WFatUoYWrZ80Jxp0uWSa1bbb6W2v d3FGjkKjJxq1pyjKPLFQnJTi+Xay92Tfy7eXj0X/AAT++FnhKNdR17xf4n1jS5dNilt7HRNL0/wh cpfvpK6gzT6h4kszbvZR3AlstiWkMryYBuYxteT2fw9+xv8AsupPFJqnh3xFdaTPqNrbwahqPxH0 7VbW7s31G0haR7Hwo9hfwCeK5mimQvO8It98b/vQyeOaf+2lov7Lfg3Q7O08XfCfVPG2mxWUNz4M 8XaF4o8Sa9ox1AXmqTL4jsfFckWh3FxpjXNrCsErfubkl4rKWCR5h574g/4KlfD39oK5/wCEP+P9 zorzaxrEE+meMvhx4SFv42TWZFbR9F0SC7XxNpmjaD4SNpem21Cy02wEdzHBA1xbSuDIvzMc1z+v WlSqYjFOFuVypPeasvdsrNWtaW1nfU6o4bKKdFVF7L23Mvcm3bl01u9n3Xy3ufVP7Tf7K3wd+Avw P8Q+Ov2f/h74e0L4iTDw1q8Ueo3fiqHSdX8Bwa+ND8ZabfS+Mb+7tmtNRs7iSO7u5tRtLlWneOyt gEO38xfgb4C8QfCHxz4o0b4g/EDwLafAqyuNR8S6xD4c1XRbmy0vVdZRpfDWlaZ4sfyoX1eCWTSr S8hR7y3KSLEdzTo0P6y6h4K1z45fB3xD4H+FfhjXo/AeuRpoF54g+Ifi7UdZlstWtdTkv47vSvCu g2etOTp11YWNysUskwkZXN3bTw3EUleD/EP/AIJTX+l/AWCw8f8Ah+18T67pN4zaBrscOo+FZotR 1ewTUbSw1OZbOxuL7zEtRcJJcWTx+XGLaOWIRAR/I5zh8xpe2+vSk6Nep7OrKcefExo2T9o73ScV pv1fRs7sNmywGIwWNwLVOrhp05/unJUlK8bxXVxfXuk1ZHXfDj4+/ArxV8K/iX4Cj8I+NtduPE+k voOvafpWrRXiX/hq83xX2rG1hiJkv7JJItQ0++t9yx3UdvJPuSe4x8DfF34A6N8J9L8OeFIviF4q 8YfAjxnrEvjP4WeOZLPSbrXvg94t0bStcn8HaPDqepGOx0Sy17xA0Nl490SzezngtrKHXYLeaW1S KfX/AGYdX8L/AAIvodY1Zdb+HPxQ+EuoLpWq+G9RXStZ/wCEh0C/gaa31SWwt76SSGyubeee2lsr hCVtikMc29jIn178R9I/Z8+OPgPS/AfiHxRq9p8NPiD43XxnomswTLb2Hgjx5IrwXdlf20EdwsOm XMN4Y7gwwGWW2e1vLddskwHxMKksgzCE8M8TLBVpKcmqalHEU2o2lfVOpBaxafvRutT9KzzDLinL KXEeEjRWLo0If2hQpSs3JNRcuX+WSi2n0k2a3/BL34/3+mS/Eb9mb47a9LF4xjlHjHV9cvPEmj6r e3974unkF3Y6Nq+qXF3o2qWkmnJoksEKyzadCmowXG1i8rV7H8avi/8AsA/CT4j3vwx+IHgvxNqX xOWKHUE02HwFdT6pqNrPBJdRvZ6/per6PoNzHE0iO7Wk08QuLeTLnYyR/kl8Q/2V/hLb+MNe+Dup +MfE3w8+I+pSWVx+zl8a7rxb4ls/A3ih7eC5e2+HGrWuqaWl5ZWN1rFjp03h7WNPRzZXyRWd2Wjn t5Lf638E+Bvgh+2r4B+FPwF+LfxC16z/AGrvhlpWtazL4k8FeE9ctvFFvYeE1js7vTHur2xvLDxB c3c7WGo3eqaRb3o1C0lkvWsxcWFxPL9tgMXlsq9PGw9ty4xxnWhThyyS5Yp1I26J3UkrOLb66n5z Xli6uGhSi4RcFanGbV2oyj7kn0krq3ftsfUulfHf4LaHY6F4jsfhT4/t9H1aG6udOln1HTDFqkFv dmGP7dY3jaxbJf6aYpIWtU1uRrZZVaWONLlFfqF/4KL2XgH7VdeBPgd4f05bi1k0+O4vr57a8CzQ pEHM+gvpcyviORypeZUeVigJOW6yL9n7wv8AD/4QyeCpH1DxvodoFk1PV7+2Fr4rsr1prmJdZ0q1 bSdFaDULFI5H8i9s7O21a1NzYSkLHZXD0Nb/AGEfgi9tI8nxT+KOp+RpUOrrY6b4A0a3vHF1ptxP ayPu8RX7CGGXyWuUW3Z0ti7l0YKW+jyzOeDKsK9PMaeJjXo1ZUoq8qkakIytGbUXo7WTi11XS5x4 jLs8p+xnhqlPkqxhK7ag4O0LxT2d9Om33nwV+0V+0L4+/bauvDM1p4MtfDtl8OPi78OtEv401GPV xdxWU7+LtQ1+3N9plr9n/s9L+Sye0W7vL26aS3kmdg6lM/wX8Xda+Gn7U/7WXi99CufG3h7xtqmn eGtJGtTW9pDqOmr4av8ATGlkjt7B7S3uNLZZFhguRM+2QCeK+YPcn2vRdF8D+DfhZ4q8K6bq91p8 ml/EjWNN1jxTL4Wj1DUp7O48WQadompTWmn6tsWcWz28Ek5vIpEjhS2jWZIY2rq/hR8MvBfxHvfD XgnxbrHi3WbTVvFnjZtP8R+BfCWkJ4hvo9COr2t/czR6xrUNlc2FnqbfaL2Q6jJdC2ZD5Ua7XTkp LJY4+WKq0pLLI4h0o0+Vr9w3Co5Jbt6aK97O/Y9OrhcY8HHlquWMdBVHK+nOlyqPXS0ml003OYj/ AG0fHF2FtPFvww+Hni2za4MqT61N4uttQtcrNEggfS57iyjFvbypBFFBp8FsBErfZ85z5r4w+N3g Pxrrz6z4w+BtncfaMLdTaN8VPGsdyY0RVdoINf8ADLxJK23fvuNQuYwxYIIUCqPqfxx+yl8FPB2k 65ey/Er4l3GoaVBcPbadL4N8J2b391HfQ20djE3/AAm9zI9zPG8jW8MUTzXLozRIYgWrxyx+EnwC 1ey0iSLxb8WNX1m6u9KE/ghPCGg6XfXk7iS8vdCW+i8T3c4meC2eCWWG0WSwEyzXccaqVP1tPMuC 406k8H9bpqEL/u4yhFvRpK73v3fyPl6uDzxTpwqTpSlUcVZSUmr8u9l2038zmfC/xN/Z18Gav4a8 Y2XwA+Olkq6wl1ot5pXjXwf4h0i9utFns5bqDdqum2txKYGltnuUt5onTz1iWWGQK4/YX/gnT+3N 8A/jB4o+IXgrwr4W+LGiz+ErG41Dxprevrf33gbRzZxX14YtT1VdYvtC0/WZ4I7mPyrMST3MNkzz EJANn5U/tgfAH4r/ABS+MvwR/Z//AGcdG1Tw+vxG8DNNqF9q8EVnpnwg8D6FeRWWt31y9ndT6bBf 3t1eXElutrctdX8j2waW7v7ia/b2b4i/BHxh8BfhnJ/wTu/Zt8Kp4P8ABvi3RJ/iB+0T+0n8VdJV fh2/gTRfDc8njzW9Q8VaZc3MmjXz2Zu5Bc6kltJJ51tY6QlutpG8vxmfZtk2IwmHVCtU+s4lyl7O dazpU4zsr2tKUmktN23sexgMPj8NiKkaulCjyxV43dSpKMHaKbasnpKW2+yND9tn9qv9mf44ah4h v28XfGa5+C3wlvdQn8fa98K/E0Ph+2uvEWLySTw7fpKY77UrLU7n+ztHs7K2aySVl/tyRb2KJIX/ AA1+F3wA0D9oDxxH4kj8I3/weXx9q2iaF8F9Ej8VXN1qXg/S/DgtrWLxBIVvY9ZnvXjSUy3P9kP9 pu7u41eO1iWFlP2Z+1rd6N4y8Y+HPhd8EviX4J8Y/sp/DX4eeF9M8D+NfBGkaKLj4x+JtY0PTH8b eIfGtwsU93rENjfwnQrCHWymq6c2lrFGY2jnmm+W/BXgybwFqt7q9jfXWv8AiDU9QeWDUL69uo7i xa6kUC30qK3JtdNTaFSR7SKCR4YohM7LHz3cN8G5tXwkMYqn1WlirVIOtduFGFpRUqdk7ykk5X6O 1yMyzrDRxEadSnGu4OKlGHu3k+VNJrqk2tOq06M/av4Xf8E0vEmjfEnwB49+LvnfE34F/Da80ubU PDHw50XxF4/8d6td2Gnpd6dba3p8WmPqtxodzrEXn69qUqMtwiNGER7tFj/UTTv21/Btv418Qac3 7P8A+0lp1/rgutI8MaLN4Dax0+fU76SO3sVeC8exKveTR2sMZdCbeIrEIowjA/kz8BfDX7UEGhrr XgL49/FDwjfyPevb2nh7xb4whso9KtlUx3Fylst5BH9vlguZLe3uYrfdZxQ3MgCXMefpWx+O3/BQ 3wz4nXwUn7V+v6lqENk1/t8S6X4W8Q6THDFDLcPDLqHiCxQR3hijJ+zTrDcyF4Vi8ySVMxn2BwWZ 1KWHzfNqEquBXsoxpQnRo2Ti+Wy93ZJXWyXpfXCQrUU6uCws6dKu1UanNVKrejT97bva/W/Wy+D/ ABV+zt+0z8Yf2wLX4iftH+B/in8HPAGveOrebxR4r8aaRrnhPwhpXhHS4w8WljxBeR22jwsdH06H QdHjkvh9pvpoI4VaRto+ifiJ48/Zp16S4PgTw7q/hkbnREt9emmUbWIXa8EkbbemAB05BPBr7ng/ aC/4KWeI9Kl0XxBd/AL4xaLM0CXek+PPhhpepW1+VCy24ubfRV+wzMrBXjmKfI4BEisAD51rWrfG Z2W58a/8E8/2L/ETK7wS3Ph3TbrwBfT3PmDegnub+IJOpUhVRGwzdBmvA4kyLLOIXlrw+Y4TBLLq ap0qGFrwpqqlyJurzRjKUuWKWr3V+qRjGhiqcpTqU8TedTnnVlFv+V2STsle/RXv0PyX/aW/bB/a O1P4q/8ACBeBvip4lsfhdc3Xhzwx4T8PeVpt1op0/S4NO0+GVv7X0mW6aS/mtprsst5KsjO/yIg5 7Lw7Z/Eb9oj9rbUf2erXW/Deh6T8OvC1zBqms6Xd+F9JspNVvYtJvrrUdQuvDv2OLU7HUbm3jFpf X/2mPzlKWsUKsK/SfxR+0N498Rw3HgzVP+CfMN74x0aC2vLbVPD0fhPxmdNswmLFYll8GTmRYI12 213Hqwv45UBExkBx+Zn7L/gmL4u/tSftBXmm+DI/h1q/hiGTRf7SudMktNTbUPDdnBeeLNO1vVWt oNuqm4uIIoLGB41laCK3NvNMizPOe4uVHK8PhYYOlhKeEwvsXiIV6dWNaadGFOU4xldyaUn7ytd3 Vz18moXzSh/tHPGrWhVmqlOUXS5bycIq20urT7Hyt+0heeJv2RfEHxA8b+LPANn4/stQ8Z2vwz1D RPE9/riaNrGkWuhWWqaL4gEUd3aBbyWWG6it3tnaNYokIeTIr558I/tufBjxrrmh+EtT/Z+tfClr qd3Z2KXWgeK9Yit9NkMwLzpFc3N/5oGHaGE+WDKyAyFWr6u+Muu+AvjL4X/aS8Ma34CvLG60f4vf BmW2vdZs/Etnql3Zt4R8a6L9r1FtV1eaGw1K6n0v+0o9M06ytLVrW4S8IkMpx8Xah8Evh/NFpgg0 TTtMn0e5tLu01HSrUWF+ZLPiIXFzDIPtKswVpBKhMjjcxNfo3B2W4rF5DhatK0JOk6dadOTgpSlF Pmsm0rxkrab7+fzGfYyWFzXEJTp1KXtpTgnTTTXPtdxvd6t66a7PU/0n/BGh6xrX7Pvhi08KeJdF 8XaVN8PPD914bu9SmWOfUrODw9ZT6N9oljLxxyXSR2zSzqr7Hd8Zwa+FPAn7XPiOy+Ouiaf4w+GO naQviSSy8Gtf6Z4utr210p2lSOCZ0fS43njku1SMosi7fOZslga/lS+Dn7WH7X/g/SZNI+HHxP8A iLrOi6NY2elwaZBrPiK90zw9bRW8lvZW9nZxyz2llEEjPlW7I0BFsEjiEayKc5Pj98Y7PVptT1+2 8YR6kmp2+qWlxYau8MtldQvbzSOba/0u5Esj3UUt2rNJEI5Z9gDRRxoPynM/Dzi3D42p9TzXB1I0 6spqNWsnUlFz5qcXGTTi4qTfm3foe1POMJiYYarSpypxtFVoexag0lCMrSje91G17etmz9Lf+Cyf w7+BvgT4zXHxd1XxfJ8M9Z8eSofEWjS+GpL/AEG+1mHdGPECatZ3MENheavDHHFNayWpS5u7Sa9a 4WW7ZW/FWx0zwD4ivL680H9pb4YWU15aAaSuoG90u5stUgzPp1wLpoZ4Ip47qNCk00qohfYzLGzC vWv2r/2hfGn7YOk6tpHxnlvbqC28F6hovhma18N6ZDqia5BAbvQbvW9Rh1CCG8hg1hIhPcR2EM8O mySRRxSyIu78aoP2XvFv2eSW61/RdNv4pwtra+VqMq3LBAYnF1Db4hdpTsVHTggNvweP1bK8NnVX I8Pl+aVfazVJ0asY8lWDi+W1t27J9dVa97nhY3F4WjjHVwNFOF1KM/fpyjK8OZ3VrJtvyt16H9nn 7P8A4j8X/wDBTf8AY4vvEfgmwg8QftL/ALKfiTR9Ku9L8QDSwms+JfBulGDThpviWyheS1sNTKXd 3by21zbwzW881tuiiaSZ/wAmfFWofDz9oPxxrUmoeHNL+CnjjwBO3g74g/Di0fR9evDe6cIoJPG9 vrFxpkM11b3usy32nazZM8j6QTowhnezvrdY/J/2GP27/j/+yVqOi6Xp1vJNbeMbLTvCfjaG48VD w74b0nT7Jry0k17ybfTLiG+1a/trxS2rXqz3FjFBJF9wxoZf22vhL4b/AOCdvxT+GX7Vnwa1mL43 +EfjxYeIL3VJfGXiCbxJbS6dr62tv4t0uW5s0hg1y0t11KbRl1wTTKL2QypbadeWVo9fA5bl2J4X 4ir0KtKvDC4urfBuSl7KcLqUqcpp8sLxTaW7a9T6WpiqeZ4KniI1KbmoQWJppqMqVSKjGNTlesrt e9LS+p+m/wACfg7+zp4z8LahofijwV8Jr/xlpNz4a0/Q4nXxToOq+MrLU9Sj02+1a6l8O+INPs7O 60bzY5b8QwIJUIuAsfmME/RP/gm58GvhZ8OP+Ch3wifwr8MbXQLqy1P4laToviTR/HvjbUtLnW1+ HfiRb5v7D8QatqkEnEkluiNJtTIuom3Kqj8IvAnx0+G/iPQPC/j3wjew6dbzW0d9oOs2wiF9ZSpE YrjS9RBgjUalpVysmm6ra3EmZiq3MSm3uYZ2/o4/4JPfBfx74q+NfwH/AGitG8X2niv4YLH46lum jtoPtGn61qHhHXdNvrK9eFsw6ha6ndqkqug3Qyq8YEMysfQzl4nK87y7E4bHVKmXZliKUJYeLnJY erKUE6U73tF62b6aHZglh8bluLhWjShisJRnJTfLH20VFOMo6a7a9dex/VvRRRX3K1SfdI+SPzl/ 4KzOy/8ABP8A+PrIWUtB8OUODglX+LvgFHU8gYZGZWBOCpxX8bGjTaf4R8P6l8StcgW6tdGmisPD Gky5CeIPF08Zk0+1ZRzJY2AP9oanIGCJBCkJZTK5P9ov/BUHQLjxP+w18btFtpIYnvB8OfNnuGCW 9taW/wAWfAl1fXc7HhILSzguLmdiflihY5GM1/CN8VviZp3jLxHFpPh0SR+AvBUUmjeE+Si6pIrg 6t4kuIwRm71u9Vpo3Abbp0ccYZEbZXHlXB2I4w4zy7D8jWEwtGjWxVVq8IxVWbcW3dXltv2v3Pz/ AIsjTw2Kp5piLOlhcNBYem3/ABsT7SfLFLqoJxlLytr3ji17Ur2W81PWLo3eq6ne3F/qd4xG64u7 tmeSU5zhfm2RqvyIiqqgKqircWpRSzRrc3dvaxO6iW7upDHb20Zb95PcSD7kMMe+aRgrkJGQBmvL /wC1Rk/MTnHyjjODkAcdSehOccduK7nR20m28H+I/EPiXw/qmu2OpMnhXRI7CxmvEGo3IiutUu5G t5Y5k+x2HkwAqPlfUlcnKZH9ecQ5hguC+Eq+Iioww+XYNUKEPdi5VJRVOEYt2u23d+WrskfkK9tj 8bOrWk5TqVPaP0vHTVaLZf8AAPBvjRrGo/Gi7ujZxaFp+nac1hoenalo1xLPv022gWCytZmeL7e7 yW8Mk7FbRZEmkuWDBXzXpnhn4InwX8EfFPxdu9D8G+JNTuoP+EQih1bxNBpt5FdrNb2kV9Bpj3UE t08SNJaxxzQOoQLesRvVYeds/hml7fW93/aOteE4b3Uri1jivNIcwSLbxTpayRLezvbQPZX8QhUI vkXHmbWcSbiJPiPYeG9L8N2nhbx7rOpLrWqa8Li2stFRIre9sLSI+RqUu+aK3gNxPMRHsijtljQm RyV3L/E2RZzhc/4gkqijVoqtLE4pypuXKrqUnOUrKSjpfV6206n6PlUK2HpRU17SnVSSUtFF+7td WWnyevRny14wtNQt9Osm1jQNG0PTXa5QR+Gp7O9jw6ASGVJbmZYwjsJVZVkMA+YRbATXQ6PoFlp/ wp1PxLpWrx3Oq6bGmmQzy3dxDqlm7SC73Sw+VBDNYTSQyWckslrdyI7Isfkkl5vXtE+Gnwz1fTLS DTtVstQTUtRi0/ZqWr2NtcwzoN0sdu9j9pubUTh0+0S3Vklm0Q5uY0XfXtcPwz8C3PgzTvBJK2eq i/1zU9RuBNNPa67p8dxbzCCK6smmtfPtLSFtRMkavutriKIN5kTqOfPuKsgr599VliadHDwqQhOc 6T9moRlGMnbVaW0tsn1PRqV4U6VZqLdSEUqUUrqTTj17vS/36n6r/wDBDrSfEFz8APiX4w8Vo02o eJviZutXktLK3gWy03w3paZs7e1URQQNcXM5G5VkcgSOdxGP28AwCw4AwSRjBxkgHH3we+7cOmeA Mfzc/Cz9q3WfgL4Pu/CGieIbbwV4Un1i41HSE8L6R4W1ea5Jtgt7Nc3GqW8klqFa1htreC2sn3bv PMhj3GmW3/BQbxn4u1MxxfEj4jJplrqE2l30g1XSdEuGuk+x7JGj8PaFYvZ2US+cLiSSd2Lkq0qq vP6JgOJeGMFQjTwM6OMpwVOUZ0qcYxk24N7q6SbfXZam+Fxa9hSlVp8smk5QStr7uj0ejvqn0R9u /tB/CmbwT8WvG/i6K+0qS4+KVzNqWgWk6zwiDUNHsbD7VDqVyjxu6zSymQxW3ztGCzZcE1+ZXxx+ FH7RvjLQb9XvfCfjHSUunks/Cl1aLcwXyqyB4beLUrRJTHlWlWNp5HYxk78YJ+i/iZ8eofiD8J/D mrWer6pqj+F/H1xDB4uvdZm1hoLoaJAt7pE15cr9suXjuUlkWU+ZC8JClmLR5v8AgP4w6N4qFrZa /dWmm3UwDG7UkWl8TGIIltZYlH2Z5d7u6yshDcJIeQnymX8SZZWxWaZLiVSoQxFaU8PUrRtGSqS5 reqbsuunYvFSy2tOOAq1KtCLhGpTnF2UpT5XKLe14tWXTZaJn4n/ABj/AGb/AI/+FtJWbxd8Br7w x4d1C3gMS6RplzAt3OZxLFfQC2eaRJ5TLLEWQRO8YKlnGyvMPCGh67q0d/pHiTwr4ulM2nDR7m8T T7+JtLs4LoPDa75WMsswMdk8khfM0YuYzC7OZh/WX4b+Jttc6dH4V8Y6UfFGgxxIYGb93qujQhjG ktrds0zSNtUEKzhXRVDOVJB8w+IX7K/gHx/b3PiH4da3YPdSiW6e0jWC01hWSNpZFvtIl8pb6RVV 2knsvLcqGlWORVwOTH4TFYHB+yweFoyalKdLERacJRfLytSjs2uj+dkrmmJyNrDe1y7EuvyQuqVT lu2uVu0le706Pfdan5O/AnWPFnwZ0iez8Fa3qekXd/Z3Nhea1AIodWmsrqZZ2givPLNxYhmCORZS W7RtjbggV0Hx4/a9+LmpSWdv46HiXxdpFpDH9hka5jttKjEMQR3NrZ2rQi5jJZfPulEzp829izZ8 2+MnxP0X4S63F4agWLxHf/2mdLuvsSXSDTrgTm38q9g+zG5tpSySTbXjCmPYwc71Y8foXxZtNZEu natYrcJeSXVibOeF1+3ThHkNtama3WK4jClYdzEBmA2kng/nUFjqNaVTHUJyw85fvaXO4xb927st JXtZb7W20Xw2JWZNTjV9rCF7Spu6je61ttbfX8e35sfF74heL9c8WXms6N4h8SaRZ6hfy3QsIdf1 CVbRnIj+QJJbxrAsSDdGgKglyyspVR2Pgy3v9ZvE8Uz3/h61u9J0efTLnUrfVp7m/Eo81LHXpbF9 p88KkFrJJDbuPLKu0oZXJ+8PFPhLwVpmmwXT/BnwTf8A26WJZLnUG1CC80623CScxvZX2nwWt0Ig TFcSxTxxyDLq4+WvLfjFL+ytruk29p8Mfhp4v+FniqCa3vdT8VX3j/S/G1t9pitnS6tbDRYNN0aS G1nnc/I+pXYijXGyRgDX6RlOOy/G4OFLD06VH2ceV021GenLbVLXVave9rnXhMdShRjSlBe7FRbj ZP7N2+78mntYoeF/iNb6Kt1e3dzYS2RvkiuZWnl+zwIIlLlNwyVkddzXMk4jWa8kcxrhoJPZJvG2 hLp9jqx1GH+zr9Int5w4dMXBzEHkjd1AIYHflUxhjwGx+UfxC8Qa7Fex6Lo99batp/2dI/ty2cSz vJAixXi/ZrWe6jyS6+dIokmkMcbLhg9d58PPiLJZ6Dq+ZrW6l0iwt4ZdPuRKiljOElnh/tBQAVWV lFmZCwlheVUMbvt+44f4ozjhKMHh6qr4KrJ82Em3P2XM4NzXqrqy0Na2RYfHxVdSanbmUtLuLUWl /S32sfpvDrcFyvmwTJPGSQJIpBKh2kKcMhwxBGCQcZyMDIqc6mzKq9gdw4PU4/Pp3/GvnbwT4ssD YWWmXl3bWN9NLGLe3murNPtMN6vnQz2rrO8FxE7squ4nZkmkEcmWK7fS2ubmNA7oyRbim9iCAwAI BIJU5UhuCeMHoRX75wvxplnEWGoRliKFPMKlPmqYXms7pq9lPdPyvrotdvisXl9bDVmnF+zUrKb2 aVv09dmd8mo4IHRSeQB6jaT+I/xqK5uIrlSswDoAPlY5HX5uoOML0x3xiuEGojjc56EnHGCCeO/Y c/5FOGoAjh+CMc/X8PSvslGnJWaVpe601o1ZdOvZ+nmc3JJSTjZNPV331j16aa62Ok1aKK40S+0u 0kNuLq3eBWjOSBIcNzwcFWbk84x6cfL2s/BmfXNbnvb+8mulS3tEheTZlVtp/ljwN/y7N27AB5JJ JAB9++3j+8P1/wDiqf8AbgV2sxHcMFAbPoTgkgf/AF+CBXj5rkmBzWNOnWTUKaUeSnaKVnF3st9d kv8ANnRSxmIwbbpOzm7t7u7sv8r37aGVY/DPwYbbT3vNEsZLm0W3cSPEjbZVVSxG5OhcEkE8Enjr XoGkWGlaNE8OnWcFtGxI2xKoDrgZDY4YHA3Dbj1zxjmBfgclyRjGDyTnue+fcAe9SrfpkHewb0J6 fmAenv1/KuvC5XgcDThGjSpLlgopuMeayjFXbta7a33v5tnPVxmJq3U6tSzfM02+W/ut2XRdvmdd reuRWGhX9y9sLgWlrJL9nfCo0aKQ8WSjBEkiLI+1SNjcqxAUfLdv4B+HXxhs9S1/4YaL4pnu9Lll bU9L0yTTbzxDo9xGhaSWbw6wNzPpwlSQQXdpI6yRR+bIYnzGnulzcxXVvNbTfvI545I3QjKusi7W U5yDnkYJyQTn1Hhl54V074bTap8QfDh1Oz1rTUlurN9Evbi0vvPZlVAk0DK6jzGG5QeU3g/Lmvzr j/g2pnUaOMy90sPXoQbq8sbRqRsm1JRs5Nq++qv8j3sjzChTTwmLdSXNUTpVFK/I20vu6b2s21Y8 48CeItd8HXXijQtWutau9KvNO1IQNqFmtpq32ya4thcwoW+2JbX8oh3pcWyM5ZQbhAihK5f4peKN P1/XIpPD2oTWWgXqWkU+najaXkslnfpYot1fKs1ut0D5qSxSbbh2CsjR7FK4/SX/AIJbeIdQ/a0/ ax8P+E/2gtZ8K6RoVvGZI31Cxt7TVdVXTZ9zrez7VguGlaSIXF9fO0zo7MS4RgP6i/8Ago3+xl+y XqP7JXj/AMX6t4M+HCzeAfBGsat4M1nw5/Yfhu9tLyysJGN5BLp62yavOc/aHiv98V1KkZcqdrL/ ADl/YLwOZVsQ6cudL2bjSTUXKPKm+Xrd9P8AOx+hrLqihGpTqqUZQUotJXt7rXPulfa/X0sf5+N2 Lm5nub0apCkGl6kiWd3byeTeTw3QnUR2tleyfaZLORiXmnk8yOMqpbCuCPa/D/xN0nwLoPh7VLiG T+0Lu41ixvZRE12iS2Fm6211AAbjEnm3dtdw3CPGSwmUKyFStWTwDomu2La18P8AU7TxPanMc0Fj EbfV7GTc4jhvtIklFxg4Bd4ftEW3JEmQ6Dy+/wDCWuaf9utr7SrvTr+Y7kvr291G0SBHRAUWOIMq NIWRm3KYpURUbgE10YjD4atBQxMXCLsnH4JJNxWt1fZ/gvQ41Vk5tV6M4qLSVRJ8unLs43v89t9L H61/stft2/FKHw29roXitb6+8OQ2t7FB4kiTVtEnv7qX7MzoNWKC1uUhkmtE0+KRUVZLWVZB5jKf Vf2pP29vCq/Ce5tPFXgLw3a/E74gTPDY+K9DvrcP4ZsrU28Q1ZLazs5J4JJZrQ2sUIv5UlFxfkvK 6uU/HXwjY+K/Buh6zpVppFp4lh1280u6ax0vXLZo7SbRWXUIdRRbG6i1CzmSaLdM5iijdgC77VKN 1fjfwRcfEzRtC+JOmaf4g0690e407w3qvg2Sxv8AVIpLS2FzINTh+0bWvTGW23XlvcRsZHm+1NJv 3/CwwNDLs7c6mIc8rlVlam3GVpSjHlUubZX6ro/uKlRqz570XbmcoQacfddrSWjfR3uvwMLw98cP GHiYW0ms+JZp77EsVpcCSR9pgKvAmoQTskN2b90SNGeCfAiUjLqVf6X+B3jLXJbvxdqmnXWsxanq cOnS6pFZrJA7hJ0e4v4zKVhklN0ihYWVCyPLMYmJMcfAaF+z3fauZ7VIbfwv4V1exhv5rSGzaSca yQDHJHFOkU8CBTte2WeSO3bAGNxr7D+Cnwa8ZeELTVNG8Galrmptq0dvbXVt/YMGp2N1bQEzLDeW k0MyOnmvJOz281ky7thf92SN80xeRVJSo04K86kIyVJczaTjdpxXW2q22XpzxeHbiouUE5JKdOMp SgnZ3SXS276O7Pjf9oT4keIrj4g3eua94RuvEkl/ZaTMmq6zbG0nVNIgktoLm0jsYNOnIkKj7T9s a5FxMsgZ2jJB5SPwP4t+JVlpfjjT7m7ilfUdJDeHZdKk0/SmvEnhtLeSF7AWxghtLeNI5oirbj9q lWQGQk/p/wCMbe2+Hdkl18XLHw7odhplvFC8OkXdpeXV3bhiY7S/8LAXmpQxI0zXGwPOqEBhIoBF dn4Pn+G3jXSodR8IXnh/XNN+SRX0uaB3hIJfbNEgWa2mU/KyyxRuCvQ4Jr6CGHxUMtw6w1GVOHs+ RfWKc+SUbJJ3a0to7699z6jC5BHG4eDo5nQlXjZxjNR5m7QspJ639dfnofIOo/Cr4neIToOnaHrV lodjJPbXHiCTRftk2p3t2hgnMNg/mRSW9pFNCIYYkEkgFxPK0jE8/SMfwbv4l07UPGlzoeg2Nk9x Pb6n47vtN0ayia5SOSeS3h1GZbm4cJExhFrbzSr5jhAS3Pe+KtO+Jl5pdxYeBPG1r8ORFg2k3hzR bOK7uAU8t47zVmR9YVXIVv8AR7vBDt+7BFflx8QP2VPjtrnxATV/F3izXPEunXzMbnxDPqV/fvHk OSpE7Pc2pwoRA8UaJwTxknz8n4LxWPr0FVx9GhHnv7OjJxqSlUlHmTk7Xdm1G+ifQ8rGcP4vAqc8 W6k4U/efsYP2crcr1a1e2v3JOx+oN5beH9Hs7G18PeI7TVygjZ7nTNCtLPSkiVSQlpPdQR3l1vcj LyWsERCZXcMk/SX7G/iLVLj9rP8AZdtWlsDAvx++E27GjaRHcOr+OdDVk+1JaLODj5VdZA8bEsjK 3Nfnr8O9Bm8H+F9P0C4vrm/a0Ehe6u5nmmJdiQhdyThFJAJzwMjmvtf9ii4z+2D+y2mTg/H/AOEY HXv450PnqevXOMEHj1r+paHAXDuWcNVJPAUsTiaGBqVo4urGM6sKkaSnGXOtW1JJp97aH5nHMsVU zqj7/JBYqjGEFHltFVIJ3Ule/dn9TfgXwZ4f+HXgvwn4A8K2f2Dwz4J8OaN4W0Cy3s5tdH0LT4NM 0+AytzK8drbRK8rDc7AtwWIr8+P+Cl3h7QdK0D9mL4+3Qg03X/gJ+1v8DNYtfE4It7nTfCvjvxhZ fDvxrp018Cjx6NquleI4/wC07eR/s8wtoGkUtGpH6Y18cftq+Cfh/wDH/wCCPxI/Zb8RtrOo+Ivi 34KvrTQtN8M2F/e6vomq288d34X8V3V9aW8tj4atNJ8TWFhewarrdzYWkj2VxHBJM8UqrjkeIdPN cNVqVJRp1JqOJqLX9xV9yq59GuRtvm3XyP02HxRd7LRt22vbTl+dv60+xgQwBU5DAFSOQQeRgjg5 BBwDyDX5OfFHxV8f/wBsT9qjx9+zT8E/ixrfwB+An7N//CKw/tDfE/wVb2n/AAs3x94+8XaVH4k0 /wCFfgLWb6C5tvCmn6R4ems77xR4git5dRSfUra1s1UqSeY+DniT/grX+zt4O0v4UfEX4A/Cj9r6 Hwlp1tovhj41eEvjbpnwx8QeItLsII7ewbx34Z8ZaPORrUVvGkd7qmm3EiXjqZXSWZpJn+r/ANiL 4UfF7wJoHxn+Ifx78NeEvBnxb/aB+NXiD4r+I/B3gzXj4p0jwlpsmheHfCfhfw+3iQ2tmmtX1nof hq2mv7yCCO2a6upFhUKpA9tYKlkksdjFXwONnKPs8udOca151Jxbqezs9Y0+ZarSb67D1i2203ZW 67cr/L5nz38S7j4/fsR/HX4O+L9E8ceM/it+xX8Q9Usfh18bNL+Juu3Hi/xF8BvEWqNHZeGPizYe NdU3a6ngrUdTkt9P8YWmsXl7pmkSTjUYjY28oEP0Z4m124/ar8U2PgLwDfWV9+zx4a1i3vvi38QL GeK8074j6tod9Hd2fwm8GXkJktdT0dNRtYJ/iLr1u81iLSEeE7OSe8vdVbTvC/2hfG8v7a3xG8R/ sM/CW5lufhfo5tYP2zfivppV9L0Hw1cFbj/hQ/hTVF32918Q/G8SC38TyWzSP4P8MPdyTFNVvLVI v0g8E+CvCnw48JeHfAngbQdN8MeEPCmk2Wh+HtA0i1js9O0vStPhS3tLS1giVVRI40UFuXkYtJIz O7McMwxEKGFwVfE0IQzh0pRcYQUEqL1pV60ErKtq1FWXupN3B6dLPRaW6cr1/r71ZndWkqfY54JY Vmht1heJDhXhQP5TC3dcNGDvUlADFhACjDIr+Z3/AIKTfGL9qKy+J+s/C3x/rA8PfDe4B1HwlpPg 43mnaB4p8OyyyLa3uqXrv9t1e+iZTb6nZXUxtbO9jZYrVIzDJL/S5aDcl3Gv+te3OwnkbUdZJVAP copIxyApA5Ix5Z48+C3wo+Ll74Xn+JngrRPFsvhHUZdU8OSazbfaYtPv5ofJczwkiK9sZCI5J7C7 Se0eWGCdoHkgjI+fy/F08JiZV61L20W/eT1d7RfMr6evq3uepleOpYKvGpWpKtFq23vRatZxb2tt ttrufxRKjscIrk5+XClufX5fwPH596/qQ/4JsftG/wDC7vgba+Ftfv8A7T49+FSWnhvWfOk3XWo+ HxEV8Na0+5jI7NaQvpl1KxJNzYGR2zOtfblr8KPhpozNBY/DnwNp5jzGyWnhLQbcDA27cRaeoIIx yMqR3wcj8LI/C/jP9i3/AIKG/Z/hz4Y8SeJvh/8AEGSDUbvw94b0i+1KUeB/GF/IL62S1sYZVD+E tagnnsWYBVt7GGMuizvXuYnMKGdUKtL2ao1aMfaUpSa1ty3jdtLW+iT1tY92vmGHzzD1aHs/Y1qM faUnNx96zjzJbW7NX2P6G9NCLcpczRNLbWbpPMgO0ylDmOAHnDSybVPBKoXcAhSK071rjVrWCSKz uBPbyyLPw8itFMUFuyny0CrH5bQHqEUQrwMZzZbiW0RbW3kkjGFkuGXdG0kzKGCtyDtiRgigkHeZ G6MKjt7lzMBPNI0UymGUu7MQr4w/zHO6Jgsg9CnQ18dWjUUZ1KdnUjCXIm3a6jpf1e6/PQ+UpOKq 06dXWHtIRqpNaw5oJ2b02v3V9dmz8jP2oP2jfiL8WfEGo/AT9n69Tw5b2+sT6D4/8ay6jZWWry6Y iGDVP7EtjdrqVlpsFx5lhLdRwLfarcNHb2RhgkLz5fgLw6/wh8LnwXDCE0DQbTUY7u0v9TOvXLar df8AHzqt5apo99LZyXN+I5Jfs7pbWQ8tUxsDtlfE2IeDf2yPHfw+XwnJ4au/iAkXivw34xsLEG31 t7zw+bXUJdXuYE8tLTTdZ+3yW90SvlTtLDeI8s9rNW9E+uStBf6ncTS3kttexSC1kgh03Wbq2nk+ 3mYWAjttQXU9PngiM0gZ9qSq3zw4X/A/6V3iNxZU44z2jxNPGz/svMK+Fwqi2sGsPTrRpQlDDy0j Ri5wlJqPvx5nfY/Z/HPiavkWScLcDcN5bTyThPEZNl2eSrUKtGriM9xWLoU5VcRj61J87VCrz0oU JtcjUt3ofPXxJ8EaRqX7QXwe+O1x4hvNBn8A+FvHPhS08PP4aiu49fu/GmgaXpIa11HWNWs3t300 aOL6KFNOuHuFZ4yscAZG+ntD+NEc13oehrpV3daetxp9tcXF/dQfaWiiu0uby8It7bas8hMssgia NXjWKGQvHEmPnP41appq6j8J4LlXvlHjaNYWYMriC88OaybG7b+AzGKOSKQoT5NwJAQGTj6+8d6p 8Ete0LT7P4ZWFv8A8JGmtXl7pslro1zpl/o/hfU/D+maJB4e8QXDW9tBrGqweJ7q4ubO9t2vZBaA vcXssspA/CsqzTifibhjDY7M+JMpytcNYFxy/JsRSUMRmWGr5xi5VaOAcG/apTnUrVJzSkuZRj7q TPwbhLjDiLhPFYjM8gzOGXY1UFR9ooRlWnTqTjKUKbkmldqLk1v0tseafGvUNa8X+Fls9En1Tw/c Pr8WnaZeX2lDUNP1LQr9J7g2yyWepabdynUAzQ22p2ksM8Vvc30cEQ8z5Pzx+JHiCz8W69P4R0mx 1PVrTw9e+RZPYeJ7y20y08QxW6Wt7qlvYzaQ+reAxaTW5t9LmgifwlJp8IF6tv8AaJJD9aatfzDX 3mMcxtbC+hS0s5vMjRbWxMdvbx+WSuzfBbxqzKFbk8g818l/FeLwz8ObXxvqs0GpT6vpl1Lomi3t hqclnqFjB4lvLu1igtdSnW61K3v7HRoNRe4s57m906N3iSC1gXMp/tj6DvjlxTDjCj4f4TKcsx2X 4nOcNaOIwEIYqnKraFbGQxaTqOVOkl7OLatGL1Sbv/R3hTWwHilhfEPPONczxn9v5RlmHzDL6tCj D2dWVOLpSVdzdk5z9jBcut5NpXufHviv4iQG8k8NWFta6v4Msp5Guree2isf7e1hsR3nidDYkJpm qyKiwWlxp4hjNtDHJc2shubqKT1rxZ8Uvip4/wDAuh6v4l+IfiP4geEfA6R2/gjwnr0kUuoaNqdl aR6dHq2tW8UCNrth4Y08xW1prsz3aF3srGU2URu7ZfN9J0bSfH9/aWqJFrYuZUF1qWmR22i+NdLt 13SXN3qmiDdpniGC2t1knnu7BWuXVGkuLuFztPMeH7Lxh8RviP4a8LfDvT78a9qOp2XhvwXo2nvI txbJJMYbeFnUDDSb5rzV7mQCOV5bu5uMRl8f7u+yoSUJThGNWhD2kpTSfK3GN3Fva6bej2+R85Lk jeWiULtylbaNtX2u7denpb94f+CR/wAPNJ8Zfs9/E+98TeH9I8SWXiX4l6jY6suo2fnTXEdn4b00 SC7u5JJJC6HV7mSzkt44bi1ea6kWV2lJT9k7TRLS0jhtNLtzbWFlZxacsLzSSxRW8dqtrE63Vw5d lQhTJ9pYy4XzMlSxX5a/Zj/Z20X9mXwWPDml6jd6lrWtjS9Y8cEyQp4fuPGC6ZHZ6xe6DpdvDEmm Wt3hYJokkdJ/ssUwjgZnjr6YaVGsZdkMcO+5iUmMyEssccrFSZJH4BdTwAckc4r80xuGws8zxWYY ejRhVxHLCdaMIxqVYRtyqpJK8lG7Ub938vz7N82xOMlLDSxVatg6FWU6FGpUlKnTlaKnKnFtqF2l e1ubR2eh5r8VNDsdW8Hy2F/e3S20mseG3vU0lIpLmS3j13T8pFcTAxRsJvKmZ4VkcRxOiMC2DoW3 g7wT4UltmsdLsYpNfuhDbXF/GL69u7+58y6ezSa4WUI5ks5JUjhWCIiGNsbggrW1qzl1DSdRsYI7 SWa6tJ7eJL+IT2bPKhVRcRFJBJECQWUo4bAypHBzvC+pvDp8fhaaK6sbnQLe0t2tJWaSO4tYYhbW t9a3iwW8N5DOsPzMiKYp1dJIo3Tn5XG+H/CWaZ/huLcwybCYziHB4V4ChmGIh7SrRwcnzOnBN8qh Kc5c6aaknZngRjTVX2jjaXKrNOzV+Xr1Svr92nTr/sF2cfusAYyTJEqoB0DsXCxgccMVGMdjy6O0 ZXc3IMUMO1pScbn3ZKJEeVd5QDsIJXaGfO0HNKteS4WK3t7GdTPEEE8gB2ywyTAMohYj5dkW3KNm N2Y5A+9X0lPD0aEIU6NGlCnFLlhTpxhGK926iopK2lrK2jXTakotNu91bfa7tvvpvf17bZ88zTsD tCIihIohykaDoo65J5Lk5LsWY8mnnAshg/fu2/ERQrg/+RjxRLbbU86FhNASBvAw8ZOcJMmSY2PY 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 q34uJ7nxV4vSIQs013Do7QiM3h/l9+IGv3Vl4v13w58Pr/TdU0m21W60jSdW0QXIh3Wl/unl0wJK bW6juCsaS310tyZkJnRlaUSH2L48ftNfDT443FjrVl4N8RL46eyXTNS1XVr6KSzv9JstWMlnZqlr IfsssluBcI7W880TCSD7QsDvHJxVnpU+k/DWwg0jwdZaDbW00er6t4t1KJNT1Sa4d4EureCF4o0s dMntbeL7Pbpl5JpQzMxTdL+zZBksMow9LEY2NWni6sIRnhsRUUqMKytzVaabe7Wltep8LxzxssZX xvD+T4nDvL8HWxFKlmtGm4YjH4b2ijThOS15ZRtaNkkultDq/hb8B7a8v9CfxJo9z4i8X+KNas9O 0PQYvOu77WtZ1e6ht9O061trZ9tzLczygbWYKoYs+2GJnH0H4k/Zy+IWuePtR8Eat4T17W5fAnm6 hqfgLw6sc2haJFpSJJPceKZdPe5jMenQKJL77TPFa2m5TcrG2Vr7P/4Jp6d4K+E/xMt/2p/2lPtg g+H3huSH4ReE4vDs02lWmreItONrN4u1W6NxHaWV/pul6iG06SOC7kS5uU8mBJoGmteu8OfHq2j+ Ln7RU37OGr+KvCXji68JeMfEurDxLomk614a8UaH4jyPEOjQQ3Av7+SW5t7yOeyhmsDdiRkkMNsI Dt9XJ86wlXMMRKpWoYqrRov2UpPnw9Gu5xUYSitIqOilJ7NrS1j89o5LTWFo1MTUdOrWq39nzJVJ UVFS5rPeU94q+uh8qfDbTvjj8DrHxpe/Dh/G3gzwx8Tbyw8PeKp/h54jsrtvtKyqtrGwW5vv7Nvp XnCpdrFaSvDI8Mc0cbyg8v8AF79hz46fDfwXY3Wt6zqvhH4f+PdasXsPFWv+Hm1DXfEnibXvtKp4 XutU0C31rQNIv5Eia6uH1/xLpE9zZW6yx2kk1vFbJ5T8IvirJrPxZ8G+HvEl3qDeA5vFGjD4hvB9 tjvo9IbUohfS2UKYN5PbWhlnhsj5aTyoikgbcfrX8TPGsv7ao+H37Nv7Pvhux8H/ALO9j43t9dvr TVNfn1T4neIdZ0GxvLCLxL4w2RtpmjWVpp2o3k8GlaUotrGO7dpby9vVhMWHEecUsqn7eWFwKxVR +1q4qjS5m1GMfZxvZqTV1yq1m3sU44atQdLD1sXLERnGhgsK3eMqkpRUpKKulF3ab7210Pzu+BX7 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 LqWoePb3R7vT/CLW8vgjxd4MSLTtfv47bTdavz4m1Wz0ptK0a41DU4nXULmW0jstI1a5svEv2mf2 d/j/AK3+0h+0BrWjfAz4xato2s/G34q6ro+raZ8MvGt/puq6XqPjvXrzT9S06+tdEltb6wv7SaG6 s7y1llt7m3ljmgkkikRjX1bET4Tw9ONCrKc83q1YxVObbpyw9FRqJJN8knopbPpcqvk2a1/o2ZFh qOAxdXEV/EfM8bSoU6FWdaeEqZPlsaeJVKMXP2E5QlGFVx5JNPlbsz4x0nStT13U9N0TRNNv9Z1n WNQs9K0jSNLtLjUNU1XU9QuIrPT9N02wtI5ru+v767mitbS0topbi5uJI4YI3kcKf32/4Lxavo1x rX7LmhW+p6dL4g0vw38T9U1fR4ry2k1aw07Wbj4e2mjahf6esjXVtY6rd6Drltpt3PClvfT6PqsV rJLJp92sPx9+y18Ivg7+zZ4ntfj9+2b4xs/C2t/DTUtA8SfDf9nXw/q9nrPxi17xpHokPjzwfrPj bwp4f1CbV/Aml2oj0+TR9G8ayeFo7zxPJY2/j298N+H44NL8a/Jf7Vv7TXjX9rL4wat8WPGlnp2j 7rGDw94U8NaYI5LTwv4P027v7zStEbUjb291rd6lzqmoahqmtXscUl9qmoXb2Vlo2kLpmhaZcOXJ +H8XQxU0sZmlbD8mFTTnRpYapGcqlSKf7qU37vJP3no+VHs5VjMJ4YeBnFeRZ7iqL4l8R82yKphM hp1oV8TlWW5FjI4mWOxkKcpPCVsRNujGjV5akoxUuVK6PvH/AIKP5/4ZS/4JfdP+TfdQ+n/IjfAr v/8AW/DNfj7X6h+IfFfhv9sT9kf9m74T6T44sx+1J+zzfa74K0fwJ4y1Pw74A0n4g/DrxNrGhaFo Fl4H1zVLXT/CWveLdG0+1+HGi6RoWo+KvDvijV7TQfHl42j+JdQOkahqPxzp/wCyv+0df3DwzfBX 4ieHrWCx1PU77XfHHhq/+HvhPSdN0fTbrVtS1DXfGfjqLw74T0CxtbCyuZnvNa1qwt2kRLaOR7qe CGTDPsLXx+PpYvCU5V6GLw+D9nOkufllHDUKU6dXluqdSE01JSasrO9rN/N+NuWY/jDjLK+JeHcN LNcq4g4f4Xp4TEYJrEqjicLkmXYLFYXGOneOExGHxFGVOpCs4JL3r8rue4EY/wCCZWe3/DdmPx/4 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 9bEOEpYqlmmYV6GZ4yTjz0fYyVO0+WUf0N/aO+EXwi8G6R/wUx0fwv8ADDwTo0vw5139lPWvBWt2 +mz3GteGR8Trrw5f+KdJ8Ny395eWXhjRbi9k1WWCw8M2OjD7JrV3ot1Ld+H9O8OaVofyp+wrfW2m an+1Jf3elafr1rafsZ/HC4udF1STU4tN1a3gm8JSTaZqEujahpGsRWV9Gj211JpWq6ZqccMsjWOo 2N0IriLy3xV+178ffG2nePNL8UeKvDeqW3xQtNKsviFKfhX8JLPUfF0WgQC38Oya3rGn+BrTV7u8 8NRqjeGtRa+F/wCHZoYLnRbmxuIIZU83+Gvxj+IHwiPic+A9R0bTf+Ez0OXwz4n/ALV8GeCfFo1b w3c+Z9u8PzDxh4d14Q6LqnmL/bOl2vkWWtfZ7H+1YLz+z7H7PnXzjLnnGDxlByjh8PDExqWoKLTq 18RVptQi0pKMa1Om305ZPVaHPnfiXwVPxG4d4jylTwuWZThc8w+I9hl0KLU8bmObYvCShRhyxqxp Ucdh8Pdr4aLdnFKJ952fhvwNrVp/wTR+JGu/Df4e6nr3xi+IvxB8JfEmxtfCel+FfCnivTtB+Nuk eFPDU+p+DPA0PhbwtJe6FpviC5eORdIW3157TT7DxlbeJ9Dt20mXQg0f4feHPA3/AAU21uD4R/C7 Utb+Evxq8HRfDnU9b8LLqX/CKWmvfHDxJ4attN0bS5bpdAsNH8PW+lwXdjodrpEOja/5kmgePrDx l4MW38MQfEtn+0t8YbDTPhdo9trfhpdO+Ct9Nqfwvgl+GfwvuW8JalcRSrdX9nPc+DZbi8vby7kT XL661SW/mvvFFppvi28efxPpWmataF5+0t8YL/TfilpFzrfho6d8ar6LU/ifbw/DT4YWx8W6lbxx i11C8ntvB0NxZ3tneI+uWN1pctjPY+KbvUvFtnJB4n1XUtWu9/7dyxLS/O4tS/2Wm71XlscJ7R30 /wB5vXel3eTupNns0/FvgKnz1Y05OtOhJVFLJsPKMsZPhGOSyxT5ouLbzVLHfDprNWnKV/0w8K6P 4T8I+LPFni3S/BXhWJ/H3/BI+9+J/jjw7Y6dL4a8J+JvFerJpNvr0z6F4NuvDdv4cstft9GtItSs /BL+F0SSS7v9Oaw1a7n1Fviz9ojQ9AvP2cf2Pfi1H4c8L6N45+JVj8ebDxtqXhLwzoPgvTdch8Cf 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 QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV9Q/t9/wDHr+x1/wBmafCH/wBG69Xy9X1D+33/ AMev7HX/AGZp8If/AEbr1ethP+RXm/8A17w//qTSP0DJ/wDk2viT/wBecj/9WlA/Pavd/wBlr/k5 z9nP/su/wh/9WD4erwivd/2Wv+TnP2c/+y7/AAh/9WD4ergyr/kZYD/sLw//AKdifmPh5/yXPCn/ AGPss/8AUukeuftK/wDJxnx+/wCy1/FT/wBTrXq8Ur2v9pX/AJOM+P3/AGWv4qf+p1r1eKV0Zp/y Mcb/ANhNX/0tn3XHf/JZ8T/9jrH/APp+YUUUVwHyYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFA47r1X5n2D+0j/AMmFfsV/9jj8fv8A1MWr81q/Sn9pH/kwr9iv /scfj9/6mLV+a1ejnH+84f8A7BMD/wCoeHPofGX/AJKvJ/8Ask+Dv/Weyw/tw/4JY/8AJifwG/7A uv8A/qYeIaKP+CWP/JifwG/7Auv/APqYeIaK/ast/wCRdgP+wLC/+mKZ/ur4Tf8AJsPD7/sjuHf/ AFVYU/J3/gvn/wAjj+zh/wBgX4pf+l3gSvhz4Sf8o4vjJ/2cr4P/APUU0qvuP/gvn/yOP7OH/YF+ KX/pd4Er4b+En/KOP4yf9nKeEP8A1FNJ/wAa/Os0X/GS5q/+pfX/ABwNP/I/zC8WFf6S3insv+MS zTV7f8kzD/I+PaKKK+JP5Glu/V/mFFFFAgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACvqH9vv/AI9f2Ov+zNPhD/6N16vl6vqH9vzH2b9jrH/Rmnwh/Mya8a9f CK+VZvql+7w+/wD2EU3+h+gZP/ybXxJ/685F/wCrSj/kfntXu/7LX/Jzn7Of/Zd/hD/6sHw9XhFe 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 kx+J56ZP6AZ/LI9DxQk20ktW7L1HGEpNRjFycmlFJN3bV7Lu/LcKK27Dwz4j1TR9d8Q6boGtah4f 8L/2Z/wk2u2OlX13o/h3+27p7HRf7d1OCCSy0j+172N7PTft89v9uuke3tfNlVkGJTcJxUXKEoqS 5otxaUo8zjeN17y5k43V1dNbpmlXDYihGjOtRq0oYiDq0JVKcoRrU1OVN1KTkkpwVSE4OUW0pwlF 6poKK27Dw14i1TR9d8RaZoGt6h4f8Mf2X/wkuu2OlX93o3h3+27t7HRv7d1O3t5LLSf7WvY5LPTP t81v9vuke3tPOmVkGKB3OcHOD9O/Tpnjr170OE4qMnCSjKPNFuLSlFS5XKLas483u3WnNpvoOeFx NOFKpUoVqdOtT9tSqTpzjCpRVR0nVhJpKdNVYypucW4qcZRvzJpJRVzTdO1DWNQsNJ0mwvdV1XVL 2107TNM021nvdQ1HUL6dLaysLCyto5bm7vby4ljt7W1t4pJ7ieRIoo3kdVN/xH4Z8SeD9ZvPDni3 w/rfhbxDp32f+0NB8R6VfaJrNh9rtYL61F7pepQW19am5srm2vLcTwR+fa3EFxFuhmjdjkm4OooS 9mpKDnyvkUmm1FytZSaTaV721HHCYqWGnjI4etLC06saE8SqU3QhWnGUoUpVUuRVJxjKUYN80lGT SaTMSiilxg4PsT2wD6jkj0z3645FJJt2X9efoYxjKTainJpOVkm3Zat2V9EtW9kk2xKKKKRPfyCi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigD7t/4Jsf8ngfDj/sEfET/ANV34nr8qq/VX/gm x/yeB8OP+wR8RP8A1Xfievyqr163/Ipyz/sPxn/pGXn3HEn/ACbnw7/7LTiT/wBR+Gj+9D9kr/k1 v9nD/si/w2/9QfQK+iK+d/2Sv+TW/wBnD/si/wANv/UH0Cvoiv22j/Bo/wDXml/6bif7xcGf8knw 5/2Jcs/9Q6JwXxE+InhL4Y6Jb+JPGmq/2PpE2rabokVyLO+vTNqmsXKWOnWaQafb3VwXurqZY4z5 QRHw0jogZh8i/Ejwto9/4o1HUrXw74o1rWNZ8ZajYX89l4vi8PWVhZQ2CzC6iR9O1MeUfs/kyxSr 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 q+K3ws+DkHh+4vNG+JPxfOj+D9e8Xa0b6xjsbPR/hc1xd+L9P0qWwkv7t9Y8SR6LKHghgTTH+0LK iTTtbqm/ut/mB9mUUUUwP5lf+C+f/I4/s4f9gX4pf+l3gSvhz4Sf8o4vjJ/2cr4P/wDUU0qvuP8A 4L5/8jj+zh/2Bfil/wCl3gSvhz4Sf8o4vjJ/2cr4P/8AUU0qvy3NP+SmzX/sX1//AFBpH+PHiz/y kt4p/wDZJZr/AOs1TPjyiiiviT+R5bv1YUUUUCCiiigP6/D9Ngo/z/8AX+vv27Yooov17foNPXV9 k766K34Ky0+QUUUUCCiiigP6/r7gooooEu3bRegUUUUDCiiigNwooooD128gooooDYKKKKACiiig AooooAKKKKA/r+vvCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKdna/9dP0d/S7AKKKKQBRRRQAUUUUW/r7v80Fuv9ev p09T7t/4Jsf8ngfDj/sEfET/ANV34nr8qq/VX/gmx/yeB8OP+wR8RP8A1Xfievyqr163/Ipyz/sP xn/pGXn3HEn/ACbnw7/7LTiT/wBR+Gj+9D9kr/k1v9nD/si/w2/9QfQK+iK+d/2Sv+TW/wBnD/si /wANv/UH0CvojgA5r9to/wAGj/15pf8ApuJ/vFwZ/wAknw5/2Jcs/wDUOiFfkD/wVC8OeLP2hJ/g 3+x/8IvEc1t8SviH4h1Px/4k02G6On6RoHwr8F2Uqat4v8X6vbQ3N9pEJ1y907QfBpgt5Gu/Ft/b XvkXUWhXEQ/SL44fGjwT8A/hb43+LXj3V7XSfC3gTw5qfiPVp5pY1mkt9OtmuEs7KJv3t3qOoSBL LTbO3jlnvL+e3toY3eQCvkT9hbwd4q1uy8a/tafGvTU0f42/tJXNhrV34evn/wBI+E/wi0lJZPhX 8JbRpcGCXStIvX8R+LXt9kV74y1zV5N0iW0Gx1aKqwcZJ8sla60erW36P7j7LL8ZXwOLo4vDa1qE uaN48yWnLt6NWfRta3D4c/sc/GHwz4C8LaDd/tNeNvB114V0DTNG8PeEfhRovgvw58M/COnaXZQ2 2maBpmh6v4Y16/1/TdMSGO3e813U2vtXVHuLv7PJOyJ+b7fsp/tYfBP9tDV/2m9TtPCniPwRb6x4 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 531/ytb+ulj5h0sj44/8FKPGMbxx33gT9kL4C6T4acTKs1sfjP8AHzUhr2opGchftfh/4b+GtIWQ gmSMeKFWQJvhJ+tNH/Zy+D3hrxRrHjPR/BWiWOta3apb6m8OmWHk3UokMjX7p9l806hKxZXuxKZW DMCTvNfL/wDwTM0q+1r4F+J/2iNft3h8T/tdfFr4gftD3QnjIu4fCHiXUl0X4U6dKWw6Jp/wu8P+ EY4oGBaHzXXcwwx/RiuyNChVXM6UY8slaUfiT93Vv0Xnr8jdzdJxUXtZp2Tb5eTq+nb5H5M/F39k z4l6T8UvFfxO+DOmeEvM1GbSrDT9L1PStPiSy0TULRbbxtd/2t9ttb6+lvYnluLXT5d8cV3Y2UcI jjM3m/A+qfHnR11XWtK1HRm1DTtAvvDfhjTNU0S3S21K5sDHcW2pXevpfShL63tLqxE9xpktoDbx EuFlBUn+l0hT1VTnOcgHrweDxzk/ma/BX4g+EPFvwg/aP1T4cav4c8Iax8GtdvfG3xH0Z9c8L2up SSW/iOC7u77T4LmbUtNu7u7sr+W8to7FNQU2vm/aLS2Dyqk34Rx9kNLJ8Th8VUxGLr5dmmMnTxVJ wU6dPEVXSdC7afJSjCFSN0/imktbI97D57TqToxx+DliKtOEaWGr0XNTopOL5pcmisr20/yPkzwz 4L8O6voutTaLqs32L4karD4q8Xi4t7Cx8Yr8P7kzz2Hh8eF51nhjtr/XLCDTVuLRVjFtYXFpFskM 8ifVP7MWg+NPGMupP4+TSB4Wu7KT+y9IsHvLHX/DMNldzRWWhSyWpg+xW1qrW0+nxwFrhFnBuCoj UtwvgS30+x1mbR/HXwa174ZXqWlz9t1CbRB4y8PCz0WK9uBYS/aLK7Nkbi/1PQbmxg07VLSy8NSX QuLmaOeYsPpT4PfDLVIH8eWHijXdeubhb+GODxNpV3caI17JdyXMyafZ+VNPb38fh+yis9Oa7n+0 i72R3NwTNIZBlwZwXlOacWZXmlKvWr08LUqSrU60ZU6LqU4wXNBKzk4WjGLkmrXstWetiM8rYrB1 YRm8RCNoRVRONWyUbrpeydrpbXfke16pa/Ezwo9rd+DvEWleJ9Itoyl14V8W2Ucl3fqFbabTxNaG HUre+jDBEnBkhIGJbeQFg/V6V4s0zVWSzj83TNTH39Ivg9veQyAFnijacI13GGVt15CZFYIXOwlQ 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 kk2qaclFObWiTk0terKjgMZOOJnHD1ZQwcVLFTjByhQi6kaSdSUU4xTnOMU27Nuy10Oaor0HwD8M PFvxNudTs/CI8MS3WkWVxqd9b+IPHvgPwTL/AGbZadqer6nf2SeNfEvh46nZ6PpOj6lqmuXWmi7h 0PTrVr3VnsrWSKaTP8W+A/EnglrE62mi3Fpqf2pLDWPDHivwp448PXVzYfZm1DTo/EngrWvEGgf2 xp0V9pt1qWitqS6tp9lq2jX95ZQ2esaZPd6/U8U8OsUqM3h3e1VJOPutRezvo2k7rT5q/of6u51/ ZUM7WArSyubnGOLilKDdOSjPRNyXI2lJuNldN6NHHUVc0+xm1O+stOtntI7i/u7aygkv9QsdKsY5 rqZII3vdU1S4s9M0yzR5Fa51DUby1sLOESXF5c29vG8i9P4D8AeJfiX4itfCfhGLRrnxBfmKPTrD WPFXhXwn/ad1c3tnp1ppulXfi3WtDstU1m9vL62gsNEsLi41e/LSPZ2U8dvcNFnSoVa04QpQlOdS ThCMVdyklFtJbt2lF+d9DiweW43MK2Hw+Dw869fFVXRw9KFuerVSi+SMW03JqcbLrfTocZRXoPgH 4Y+LPiZcapaeEh4ZlutHsrjU7231/wAe+BPBU39m2Onanq+pahZx+NfEfh9tTs9H0nR9S1TW7nTR dw6Hp1sb3V2sraSGWTitRsJ9M1C+0y5eyluNOvLqwuJNO1HT9YsJJ7SaS3lew1XSbm90vVLN5I2a 21HTLy70+8hMdxZ3VxbyxTPVTC16VKFapSlGlOUoRm7WcoO0orXeL3W669DfE5JmuDwdDMMTg6tH CYirVoUa0uXlnWoO1ana/Mp021zJpWuu6KdFKf8AOf1x2OPbtzj0ToSDxjg59fQ/mP8AIrA8tprd NdNU/wDLzCjr0H6/59z/ADxS8deozjjr36cY7DrjJz6HHsXxE02x0/wR8J3j+GP/AAhmsX+j6pea 34ohn8QfZvGAlTRH0SGfTNb8XeK4bLWINAbTvHF1dWlv4IGraR8TdAu7LwLa+ER4Q8V+Meqjh5Va OIrKXKqFOnUScJv2idSFO0ZJcqs25e802ouzbun7OByatjsBmWOU5Uo5dh6WIUZUK0liI1MRTw7h Tqxi4RlDmlUSk0nCnOzurHjlFGPQf5Iz/wDWx1zR16dSDx74J/H16ZNc1t/JJ/fb/M8blla9nb02 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 Rfa4Ehis7WIiEu80ryyXKyv90y/EjwHb65prahb6r4ZbT4J7m4bWPC+rabtllUw2sMtytpJb8+bP IGNxIEMYO4V6WWZfkmLwsm1UbdR2lzSdlTUE0mtE7p6dOz6ePisxxmHqSVOpSqP+HJKzafuOzs7u yd3tp87+bfsq/Ce/+HEvjy61HRY9Eu9U1fS9Mlh862mkurfw1o9paWN6zWc0lojulzM1zJbeWl1c zNK9vbSK0VfY5RT1Udu3p0H0GTgV4t4a+IvgG51bX7m08X6VKt5qcQt9Nivd8+bS3SK4ultSWlUX txvdnWNYpI4oXZcvXrWn6tp2qxPNp17bXkcTiOVreRXMUpGfJlXIeGUAqTFKqyAEZXkGvpsHQw1C lGhhpNQir8t+aTUuVt662fRbdtL34alSrOXtK0ffkle6aStazj2dlrp6ec89jZXKbLm0trhPk+Sa GOVf3bB0+V1YfK4V144dQwwwzWLJ4dt43Q6bLe6YFKnbY3ksUGAZnx9kdpLVw0sxeYGFDKyrvZ1U LXR5HqOuM59s846cckfzoyCeo9gOenbv09yOldTpU3oopPut+l/vt+PXQwOZ+z+KLcMYr2y1FRGd qXsTWk7SLFGqr9qs2aP55VklldrIja6xoigFjs2z3ZijkuozFNuw0QlEwHzDbhkVMqTk4PKpwwzm r1BGcexz2/rU06KpuTUm720b0Wi2+4D8zv8Agm6X0KL9tH4Y3Df8TD4cft3ftAPcDJKyWPxLvdD+ K+jPtJYKo0zxnBECMK0kbMP4sfpjX5geBXm+AH/BTb4teCb5lh8FfttfDHQfjH4KuZAEjHxf+Cdh Y+BviL4diYFUN1qvgWfwf4lt0AM8qaXqjkskKiP9P61VtUu/fyS/QAooopgFFFFABVyx/wBa3/XM /wDoSVTq5Y/61v8Armf/AEJKANSiiigD+ZX/AIL5/wDI4/s4f9gX4pf+l3gSvhz4Sf8AKOL4yf8A Zyvg/wD9RTSq+4/+C+f/ACOP7OH/AGBfil/6XeBK+HPhJ/yji+Mn/Zyvg/8A9RTSq/Lc0/5KbNP+ xfX/APUKkf48eLP/ACkt4p/9klmv/rNUz48pcZxjrjnp6np+GOOuc4yMGkr7h+FMumw/s5+JdXk8 c/s3aDrGj/ET4e6PY3XxB+BcXjXxH4e07XtM+NWoapoGtaw37Pvj2fWLvxbdaBo2taFeR6p4jt9D 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 aVowb17an7u0UUV+sH+2i0S9Ef/Z ------=_NextPart_001_0363_01CAF339.B7D27930-- ------=_NextPart_000_0362_01CAF339.B7D27930 Content-Type: image/jpeg; name="Hoa Loi-email 6-5-20102.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Hoa Loi-email 6-5-20102.jpg" /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCATeA8UDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+4j9o zVtW0P4PeLdS0TUb7SdTt/7F+zahptzNaXtv5viHSYJfJuIHSWPzIJZYZNjjfHI6nIYivy3HxU+K mQD8R/G/XBz4k1YfX/l7/XpX6lftFIkvwe8WLIquhOiAqc4OPEOlHsexAI54Ir8wkt7VEKeWm3BJ BXIAI5A46f15r9r8NMPgq2U42WKwWGxM44+SjKvRp1ZKKoYZ8qc02le7smldt7t3/CPE6pjo51hV hsfXwsXgqbdOjVnTjJ+2muZqMkruKs3bp1RX/wCFrfFHOP8AhY3jXpnP/CSarj8/tfWpYfip8UpJ EQfEXxoQ5xuPiPVcD8ftX1/Ko5dPsrhDtWFSoySFAOPyOM+/P6ZrJbiM+WlkjxqQQWG1hgntjPpn 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 Ri8VeHYWQvoc9xtUq4m1UIsmVxl0isVDMCFOQUHPJrib/wAifT0uI737CbCzd5dOuZgbQRQp5qJp U3lRrGhRXb7HOkbKSNk8xbj5dg+OFm/iQ6Q9jeqs8kAtSwtmiWIlPPkuyJ1a2mEUsE8MLAu6zLlG 3YX9v4P4k4No8NZbUxOZ46tiIwjSrU416ylGSa97lbXu935LZKz+WxVbNHWqLB0sJPDWjOnUWHp1 H9neTW/a+p9WeLb7wt4iltVuvhZ4H16GBJDBJ4mOq6rJbTsiqHiEd3ZRojhVWXYVdv7xBrzyfW/H 1lbX1t4T8OfCjwrujjFsdP8AA1teP5u5WLsdautURxEVXyleNthCsOciqdr4lsr9BJZ3cc8ckXnb ozlPLMssKPuHy/O8MjIN24xkNja1Wv7VA6v9M8nPHcg4IPJ6HHHXJr9IpcJcKcQYejmNCMsRTrK6 qSqym4yXLe923e93a/8Am+CHE+e4T/ZnUjStryKnCKavHVRireXzPz7+LXwa+ON3q2peL21mPXr1 5mdzp9vaadL5RiBCx2dnDDZjBeVWSOMK2eh5ryT4f2eueGr5ZfFuitoum3azLDd3uk2VyBdQ3kMP 2gRXkY2eRK7SyShHWNBuCtt3D9XjqKOMkqwByMgfQnBHsPy968l+K/hPT/F/h+KJLG1lvLK5861L RjEZeRTLxtA2ybQWVcggfMDg152ZeH2XQoSlSTlTpRclSaWqUY3SstX6/mdlDifEVpRpYmMOWUkn U6xvy3dtrK33eZ8lfFvVo9U8H6DY3XjTQ7S2TUtfFpMdLOk3+p5eKG6LTW5ubeTSt9kr2DS2lskd x57KUNzKZOd8AeGLLVr2wvNHtJ702U8chv7HxvpJ1TULjynKeet9dQSiOzkQT28NraS5+USKCu5/ bvDHwUg1W6sz4xhivrLTm1CG2tZOYY47xzcEKrH5Nlw7N8hA24AHWvO/GfwDtvAeuQeKvC092Iba 6hvbews2kiRJVkJli8xCcRSIduwqSU+X+Kvz7E8CVKtCriKOFlh8NzKPI4JzSuk5tatx8rXtZHt0 87wU39XqVF7TRuSXu7RSV7b6/wBdfcNY8aav8OPAiG4s/El94hspftlvYJ4clgtxNdXgluYV1ZYl tL2NIsNLcStOZWhyjIUGPFrH4wDxRqdzbeILiFf7V1q0NubnEN/NpD36yTQ3VusMlsy2yGW1T/SI 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 aR6dHq2tW8UCNrth4Y08xW1prsz3aF3srGU2URu7ZfN9J0bSfH9/aWqJFrYuZUF1qWmR22i+NdLt 13SXN3qmiDdpniGC2t1knnu7BWuXVGkuLuFztPMeH7Lxh8RviP4a8LfDvT78a9qOp2XhvwXo2nvI txbJJMYbeFnUDDSb5rzV7mQCOV5bu5uMRl8f7u+yoSUJThGNWhD2kpTSfK3GN3Fva6bej2+R85Lk jeWiULtylbaNtX2u7denpb94f+CR/wAPNJ8Zfs9/E+98TeH9I8SWXiX4l6jY6suo2fnTXEdn4b00 SC7u5JJJC6HV7mSzkt44bi1ea6kWV2lJT9k7TRLS0jhtNLtzbWFlZxacsLzSSxRW8dqtrE63Vw5d lQhTJ9pYy4XzMlSxX5a/Zj/Z20X9mXwWPDml6jd6lrWtjS9Y8cEyQp4fuPGC6ZHZ6xe6DpdvDEmm Wt3hYJokkdJ/ssUwjgZnjr6YaVGsZdkMcO+5iUmMyEssccrFSZJH4BdTwAckc4r80xuGws8zxWYY ejRhVxHLCdaMIxqVYRtyqpJK8lG7Ub938vz7N82xOMlLDSxVatg6FWU6FGpUlKnTlaKnKnFtqF2l e1ubR2eh5r8VNDsdW8Hy2F/e3S20mseG3vU0lIpLmS3j13T8pFcTAxRsJvKmZ4VkcRxOiMC2DoW3 g7wT4UltmsdLsYpNfuhDbXF/GL69u7+58y6ezSa4WUI5ks5JUjhWCIiGNsbggrW1qzl1DSdRsYI7 SWa6tJ7eJL+IT2bPKhVRcRFJBJECQWUo4bAypHBzvC+pvDp8fhaaK6sbnQLe0t2tJWaSO4tYYhbW t9a3iwW8N5DOsPzMiKYp1dJIo3Tn5XG+H/CWaZ/huLcwybCYziHB4V4ChmGIh7SrRwcnzOnBN8qh Kc5c6aaknZngRjTVX2jjaXKrNOzV+Xr1Svr92nTr/sF2cfusAYyTJEqoB0DsXCxgccMVGMdjy6O0 ZXc3IMUMO1pScbn3ZKJEeVd5QDsIJXaGfO0HNKteS4WK3t7GdTPEEE8gB2ywyTAMohYj5dkW3KNm N2Y5A+9X0lPD0aEIU6NGlCnFLlhTpxhGK926iopK2lrK2jXTakotNu91bfa7tvvpvf17bZ88zTsD tCIihIohykaDoo65J5Lk5LsWY8mnnAshg/fu2/ERQrg/+RjxRLbbU86FhNASBvAw8ZOcJMmSY2PY 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 q34uJ7nxV4vSIQs013Do7QiM3h/l9+IGv3Vl4v13w58Pr/TdU0m21W60jSdW0QXIh3Wl/unl0wJK bW6juCsaS310tyZkJnRlaUSH2L48ftNfDT443FjrVl4N8RL46eyXTNS1XVr6KSzv9JstWMlnZqlr IfsssluBcI7W880TCSD7QsDvHJxVnpU+k/DWwg0jwdZaDbW00er6t4t1KJNT1Sa4d4EureCF4o0s dMntbeL7Pbpl5JpQzMxTdL+zZBksMow9LEY2NWni6sIRnhsRUUqMKytzVaabe7Wltep8LxzxssZX xvD+T4nDvL8HWxFKlmtGm4YjH4b2ijThOS15ZRtaNkkultDq/hb8B7a8v9CfxJo9z4i8X+KNas9O 0PQYvOu77WtZ1e6ht9O061trZ9tzLczygbWYKoYs+2GJnH0H4k/Zy+IWuePtR8Eat4T17W5fAnm6 hqfgLw6sc2haJFpSJJPceKZdPe5jMenQKJL77TPFa2m5TcrG2Vr7P/4Jp6d4K+E/xMt/2p/2lPtg g+H3huSH4ReE4vDs02lWmreItONrN4u1W6NxHaWV/pul6iG06SOC7kS5uU8mBJoGmteu8OfHq2j+ Ln7RU37OGr+KvCXji68JeMfEurDxLomk614a8UaH4jyPEOjQQ3Av7+SW5t7yOeyhmsDdiRkkMNsI Dt9XJ86wlXMMRKpWoYqrRov2UpPnw9Gu5xUYSitIqOilJ7NrS1j89o5LTWFo1MTUdOrWq39nzJVJ UVFS5rPeU94q+uh8qfDbTvjj8DrHxpe/Dh/G3gzwx8Tbyw8PeKp/h54jsrtvtKyqtrGwW5vv7Nvp XnCpdrFaSvDI8Mc0cbyg8v8AF79hz46fDfwXY3Wt6zqvhH4f+PdasXsPFWv+Hm1DXfEnibXvtKp4 XutU0C31rQNIv5Eia6uH1/xLpE9zZW6yx2kk1vFbJ5T8IvirJrPxZ8G+HvEl3qDeA5vFGjD4hvB9 tjvo9IbUohfS2UKYN5PbWhlnhsj5aTyoikgbcfrX8TPGsv7ao+H37Nv7Pvhux8H/ALO9j43t9dvr TVNfn1T4neIdZ0GxvLCLxL4w2RtpmjWVpp2o3k8GlaUotrGO7dpby9vVhMWHEecUsqn7eWFwKxVR +1q4qjS5m1GMfZxvZqTV1yq1m3sU44atQdLD1sXLERnGhgsK3eMqkpRUpKKulF3ab7210Pzu+BX7 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 LqWoePb3R7vT/CLW8vgjxd4MSLTtfv47bTdavz4m1Wz0ptK0a41DU4nXULmW0jstI1a5svEv2mf2 d/j/AK3+0h+0BrWjfAz4xato2s/G34q6ro+raZ8MvGt/puq6XqPjvXrzT9S06+tdEltb6wv7SaG6 s7y1llt7m3ljmgkkikRjX1bET4Tw9ONCrKc83q1YxVObbpyw9FRqJJN8knopbPpcqvk2a1/o2ZFh qOAxdXEV/EfM8bSoU6FWdaeEqZPlsaeJVKMXP2E5QlGFVx5JNPlbsz4x0nStT13U9N0TRNNv9Z1n WNQs9K0jSNLtLjUNU1XU9QuIrPT9N02wtI5ru+v767mitbS0topbi5uJI4YI3kcKf32/4Lxavo1x rX7LmhW+p6dL4g0vw38T9U1fR4ry2k1aw07Wbj4e2mjahf6esjXVtY6rd6Drltpt3PClvfT6PqsV rJLJp92sPx9+y18Ivg7+zZ4ntfj9+2b4xs/C2t/DTUtA8SfDf9nXw/q9nrPxi17xpHokPjzwfrPj bwp4f1CbV/Aml2oj0+TR9G8ayeFo7zxPJY2/j298N+H44NL8a/Jf7Vv7TXjX9rL4wat8WPGlnp2j 7rGDw94U8NaYI5LTwv4P027v7zStEbUjb291rd6lzqmoahqmtXscUl9qmoXb2Vlo2kLpmhaZcOXJ +H8XQxU0sZmlbD8mFTTnRpYapGcqlSKf7qU37vJP3no+VHs5VjMJ4YeBnFeRZ7iqL4l8R82yKphM hp1oV8TlWW5FjI4mWOxkKcpPCVsRNujGjV5akoxUuVK6PvH/AIKP5/4ZS/4JfdP+TfdQ+n/IjfAr v/8AW/DNfj7X6h+IfFfhv9sT9kf9m74T6T44sx+1J+zzfa74K0fwJ4y1Pw74A0n4g/DrxNrGhaFo Fl4H1zVLXT/CWveLdG0+1+HGi6RoWo+KvDvijV7TQfHl42j+JdQOkahqPxzp/wCyv+0df3DwzfBX 4ieHrWCx1PU77XfHHhq/+HvhPSdN0fTbrVtS1DXfGfjqLw74T0CxtbCyuZnvNa1qwt2kRLaOR7qe CGTDPsLXx+PpYvCU5V6GLw+D9nOkufllHDUKU6dXluqdSE01JSasrO9rN/N+NuWY/jDjLK+JeHcN LNcq4g4f4Xp4TEYJrEqjicLkmXYLFYXGOneOExGHxFGVOpCs4JL3r8rue4EY/wCCZWe3/DdmPx/4 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 9bEOEpYqlmmYV6GZ4yTjz0fYyVO0+WUf0N/aO+EXwi8G6R/wUx0fwv8ADDwTo0vw5139lPWvBWt2 +mz3GteGR8Trrw5f+KdJ8Ny395eWXhjRbi9k1WWCw8M2OjD7JrV3ot1Ld+H9O8OaVofyp+wrfW2m an+1Jf3elafr1rafsZ/HC4udF1STU4tN1a3gm8JSTaZqEujahpGsRWV9Gj211JpWq6ZqccMsjWOo 2N0IriLy3xV+178ffG2nePNL8UeKvDeqW3xQtNKsviFKfhX8JLPUfF0WgQC38Oya3rGn+BrTV7u8 8NRqjeGtRa+F/wCHZoYLnRbmxuIIZU83+Gvxj+IHwiPic+A9R0bTf+Ez0OXwz4n/ALV8GeCfFo1b w3c+Z9u8PzDxh4d14Q6LqnmL/bOl2vkWWtfZ7H+1YLz+z7H7PnXzjLnnGDxlByjh8PDExqWoKLTq 18RVptQi0pKMa1Om305ZPVaHPnfiXwVPxG4d4jylTwuWZThc8w+I9hl0KLU8bmObYvCShRhyxqxp Ucdh8Pdr4aLdnFKJ952fhvwNrVp/wTR+JGu/Df4e6nr3xi+IvxB8JfEmxtfCel+FfCnivTtB+Nuk eFPDU+p+DPA0PhbwtJe6FpviC5eORdIW3157TT7DxlbeJ9Dt20mXQg0f4feHPA3/AAU21uD4R/C7 Utb+Evxq8HRfDnU9b8LLqX/CKWmvfHDxJ4attN0bS5bpdAsNH8PW+lwXdjodrpEOja/5kmgePrDx l4MW38MQfEtn+0t8YbDTPhdo9trfhpdO+Ct9Nqfwvgl+GfwvuW8JalcRSrdX9nPc+DZbi8vby7kT XL661SW/mvvFFppvi28efxPpWmataF5+0t8YL/TfilpFzrfho6d8ar6LU/ifbw/DT4YWx8W6lbxx i11C8ntvB0NxZ3tneI+uWN1pctjPY+KbvUvFtnJB4n1XUtWu9/7dyxLS/O4tS/2Wm71XlscJ7R30 /wB5vXel3eTupNns0/FvgKnz1Y05OtOhJVFLJsPKMsZPhGOSyxT5ouLbzVLHfDprNWnKV/0w8K6P 4T8I+LPFni3S/BXhWJ/H3/BI+9+J/jjw7Y6dL4a8J+JvFerJpNvr0z6F4NuvDdv4cstft9GtItSs /BL+F0SSS7v9Oaw1a7n1Fviz9ojQ9AvP2cf2Pfi1H4c8L6N45+JVj8ebDxtqXhLwzoPgvTdch8Cf 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 QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV9Q/t9/wDHr+x1/wBmafCH/wBG69Xy9X1D+33/ AMev7HX/AGZp8If/AEbr1ethP+RXm/8A17w//qTSP0DJ/wDk2viT/wBecj/9WlA/Pavd/wBlr/k5 z9nP/su/wh/9WD4erwivd/2Wv+TnP2c/+y7/AAh/9WD4ergyr/kZYD/sLw//AKdifmPh5/yXPCn/ AGPss/8AUukeuftK/wDJxnx+/wCy1/FT/wBTrXq8Ur2v9pX/AJOM+P3/AGWv4qf+p1r1eKV0Zp/y Mcb/ANhNX/0tn3XHf/JZ8T/9jrH/APp+YUUUVwHyYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFA47r1X5n2D+0j/AMmFfsV/9jj8fv8A1MWr81q/Sn9pH/kwr9iv /scfj9/6mLV+a1ejnH+84f8A7BMD/wCoeHPofGX/AJKvJ/8Ask+Dv/Weyw/tw/4JY/8AJifwG/7A uv8A/qYeIaKP+CWP/JifwG/7Auv/APqYeIaK/ast/wCRdgP+wLC/+mKZ/ur4Tf8AJsPD7/sjuHf/ AFVYU/J3/gvn/wAjj+zh/wBgX4pf+l3gSvhz4Sf8o4vjJ/2cr4P/APUU0qvuP/gvn/yOP7OH/YF+ KX/pd4Er4b+En/KOP4yf9nKeEP8A1FNJ/wAa/Os0X/GS5q/+pfX/ABwNP/I/zC8WFf6S3insv+MS zTV7f8kzD/I+PaKKK+JP5Glu/V/mFFFFAgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACvqH9vv/AI9f2Ov+zNPhD/6N16vl6vqH9vzH2b9jrH/Rmnwh/Mya8a9f CK+VZvql+7w+/wD2EU3+h+gZP/ybXxJ/685F/wCrSj/kfntXu/7LX/Jzn7Of/Zd/hD/6sHw9XhFe 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 kx+J56ZP6AZ/LI9DxQk20ktW7L1HGEpNRjFycmlFJN3bV7Lu/LcKK27Dwz4j1TR9d8Q6boGtah4f 8L/2Z/wk2u2OlX13o/h3+27p7HRf7d1OCCSy0j+172N7PTft89v9uuke3tfNlVkGJTcJxUXKEoqS 5otxaUo8zjeN17y5k43V1dNbpmlXDYihGjOtRq0oYiDq0JVKcoRrU1OVN1KTkkpwVSE4OUW0pwlF 6poKK27Dw14i1TR9d8RaZoGt6h4f8Mf2X/wkuu2OlX93o3h3+27t7HRv7d1O3t5LLSf7WvY5LPTP t81v9vuke3tPOmVkGKB3OcHOD9O/Tpnjr170OE4qMnCSjKPNFuLSlFS5XKLas483u3WnNpvoOeFx NOFKpUoVqdOtT9tSqTpzjCpRVR0nVhJpKdNVYypucW4qcZRvzJpJRVzTdO1DWNQsNJ0mwvdV1XVL 2107TNM021nvdQ1HUL6dLaysLCyto5bm7vby4ljt7W1t4pJ7ieRIoo3kdVN/xH4Z8SeD9ZvPDni3 w/rfhbxDp32f+0NB8R6VfaJrNh9rtYL61F7pepQW19am5srm2vLcTwR+fa3EFxFuhmjdjkm4OooS 9mpKDnyvkUmm1FytZSaTaV721HHCYqWGnjI4etLC06saE8SqU3QhWnGUoUpVUuRVJxjKUYN80lGT SaTMSiilxg4PsT2wD6jkj0z3645FJJt2X9efoYxjKTainJpOVkm3Zat2V9EtW9kk2xKKKKRPfyCi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigD7t/4Jsf8ngfDj/sEfET/ANV34nr8qq/VX/gm x/yeB8OP+wR8RP8A1Xfievyqr163/Ipyz/sPxn/pGXn3HEn/ACbnw7/7LTiT/wBR+Gj+9D9kr/k1 v9nD/si/w2/9QfQK+iK+d/2Sv+TW/wBnD/si/wANv/UH0Cvoiv22j/Bo/wDXml/6bif7xcGf8knw 5/2Jcs/9Q6JwXxE+InhL4Y6Jb+JPGmq/2PpE2rabokVyLO+vTNqmsXKWOnWaQafb3VwXurqZY4z5 QRHw0jogZh8i/Ejwto9/4o1HUrXw74o1rWNZ8ZajYX89l4vi8PWVhZQ2CzC6iR9O1MeUfs/kyxSr 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 q+K3ws+DkHh+4vNG+JPxfOj+D9e8Xa0b6xjsbPR/hc1xd+L9P0qWwkv7t9Y8SR6LKHghgTTH+0LK iTTtbqm/ut/mB9mUUUUwP5lf+C+f/I4/s4f9gX4pf+l3gSvhz4Sf8o4vjJ/2cr4P/wDUU0qvuP8A 4L5/8jj+zh/2Bfil/wCl3gSvhz4Sf8o4vjJ/2cr4P/8AUU0qvy3NP+SmzX/sX1//AFBpH+PHiz/y kt4p/wDZJZr/AOs1TPjyiiiviT+R5bv1YUUUUCCiiigP6/D9Ngo/z/8AX+vv27Yooov17foNPXV9 k766K34Ky0+QUUUUCCiiigP6/r7gooooEu3bRegUUUUDCiiigNwooooD128gooooDYKKKKACiiig AooooAKKKKA/r+vvCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKdna/9dP0d/S7AKKKKQBRRRQAUUUUW/r7v80Fuv9ev p09T7t/4Jsf8ngfDj/sEfET/ANV34nr8qq/VX/gmx/yeB8OP+wR8RP8A1Xfievyqr163/Ipyz/sP xn/pGXn3HEn/ACbnw7/7LTiT/wBR+Gj+9D9kr/k1v9nD/si/w2/9QfQK+iK+d/2Sv+TW/wBnD/si /wANv/UH0CvojgA5r9to/wAGj/15pf8ApuJ/vFwZ/wAknw5/2Jcs/wDUOiFfkD/wVC8OeLP2hJ/g 3+x/8IvEc1t8SviH4h1Px/4k02G6On6RoHwr8F2Uqat4v8X6vbQ3N9pEJ1y907QfBpgt5Gu/Ft/b XvkXUWhXEQ/SL44fGjwT8A/hb43+LXj3V7XSfC3gTw5qfiPVp5pY1mkt9OtmuEs7KJv3t3qOoSBL LTbO3jlnvL+e3toY3eQCvkT9hbwd4q1uy8a/tafGvTU0f42/tJXNhrV34evn/wBI+E/wi0lJZPhX 8JbRpcGCXStIvX8R+LXt9kV74y1zV5N0iW0Gx1aKqwcZJ8sla60erW36P7j7LL8ZXwOLo4vDa1qE uaN48yWnLt6NWfRta3D4c/sc/GHwz4C8LaDd/tNeNvB114V0DTNG8PeEfhRovgvw58M/COnaXZQ2 2maBpmh6v4Y16/1/TdMSGO3e813U2vtXVHuLv7PJOyJ+b7fsp/tYfBP9tDV/2m9TtPCniPwRb6x4 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 531/ytb+ulj5h0sj44/8FKPGMbxx33gT9kL4C6T4acTKs1sfjP8AHzUhr2opGchftfh/4b+GtIWQ gmSMeKFWQJvhJ+tNH/Zy+D3hrxRrHjPR/BWiWOta3apb6m8OmWHk3UokMjX7p9l806hKxZXuxKZW DMCTvNfL/wDwTM0q+1r4F+J/2iNft3h8T/tdfFr4gftD3QnjIu4fCHiXUl0X4U6dKWw6Jp/wu8P+ EY4oGBaHzXXcwwx/RiuyNChVXM6UY8slaUfiT93Vv0Xnr8jdzdJxUXtZp2Tb5eTq+nb5H5M/F39k z4l6T8UvFfxO+DOmeEvM1GbSrDT9L1PStPiSy0TULRbbxtd/2t9ttb6+lvYnluLXT5d8cV3Y2UcI jjM3m/A+qfHnR11XWtK1HRm1DTtAvvDfhjTNU0S3S21K5sDHcW2pXevpfShL63tLqxE9xpktoDbx EuFlBUn+l0hT1VTnOcgHrweDxzk/ma/BX4g+EPFvwg/aP1T4cav4c8Iax8GtdvfG3xH0Z9c8L2up SSW/iOC7u77T4LmbUtNu7u7sr+W8to7FNQU2vm/aLS2Dyqk34Rx9kNLJ8Th8VUxGLr5dmmMnTxVJ wU6dPEVXSdC7afJSjCFSN0/imktbI97D57TqToxx+DliKtOEaWGr0XNTopOL5pcmisr20/yPkzwz 4L8O6voutTaLqs32L4karD4q8Xi4t7Cx8Yr8P7kzz2Hh8eF51nhjtr/XLCDTVuLRVjFtYXFpFskM 8ifVP7MWg+NPGMupP4+TSB4Wu7KT+y9IsHvLHX/DMNldzRWWhSyWpg+xW1qrW0+nxwFrhFnBuCoj UtwvgS30+x1mbR/HXwa174ZXqWlz9t1CbRB4y8PCz0WK9uBYS/aLK7Nkbi/1PQbmxg07VLSy8NSX QuLmaOeYsPpT4PfDLVIH8eWHijXdeubhb+GODxNpV3caI17JdyXMyafZ+VNPb38fh+yis9Oa7n+0 i72R3NwTNIZBlwZwXlOacWZXmlKvWr08LUqSrU60ZU6LqU4wXNBKzk4WjGLkmrXstWetiM8rYrB1 YRm8RCNoRVRONWyUbrpeydrpbXfke16pa/Ezwo9rd+DvEWleJ9Itoyl14V8W2Ucl3fqFbabTxNaG HUre+jDBEnBkhIGJbeQFg/V6V4s0zVWSzj83TNTH39Ivg9veQyAFnijacI13GGVt15CZFYIXOwlQ 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 kk2qaclFObWiTk0terKjgMZOOJnHD1ZQwcVLFTjByhQi6kaSdSUU4xTnOMU27Nuy10Oaor0HwD8M PFvxNudTs/CI8MS3WkWVxqd9b+IPHvgPwTL/AGbZadqer6nf2SeNfEvh46nZ6PpOj6lqmuXWmi7h 0PTrVr3VnsrWSKaTP8W+A/EnglrE62mi3Fpqf2pLDWPDHivwp448PXVzYfZm1DTo/EngrWvEGgf2 xp0V9pt1qWitqS6tp9lq2jX95ZQ2esaZPd6/U8U8OsUqM3h3e1VJOPutRezvo2k7rT5q/of6u51/ ZUM7WArSyubnGOLilKDdOSjPRNyXI2lJuNldN6NHHUVc0+xm1O+stOtntI7i/u7aygkv9QsdKsY5 rqZII3vdU1S4s9M0yzR5Fa51DUby1sLOESXF5c29vG8i9P4D8AeJfiX4itfCfhGLRrnxBfmKPTrD WPFXhXwn/ad1c3tnp1ppulXfi3WtDstU1m9vL62gsNEsLi41e/LSPZ2U8dvcNFnSoVa04QpQlOdS ThCMVdyklFtJbt2lF+d9DiweW43MK2Hw+Dw869fFVXRw9KFuerVSi+SMW03JqcbLrfTocZRXoPgH 4Y+LPiZcapaeEh4ZlutHsrjU7231/wAe+BPBU39m2Onanq+pahZx+NfEfh9tTs9H0nR9S1TW7nTR dw6Hp1sb3V2sraSGWTitRsJ9M1C+0y5eyluNOvLqwuJNO1HT9YsJJ7SaS3lew1XSbm90vVLN5I2a 21HTLy70+8hMdxZ3VxbyxTPVTC16VKFapSlGlOUoRm7WcoO0orXeL3W669DfE5JmuDwdDMMTg6tH CYirVoUa0uXlnWoO1ana/Mp021zJpWuu6KdFKf8AOf1x2OPbtzj0ToSDxjg59fQ/mP8AIrA8tprd NdNU/wDLzCjr0H6/59z/ADxS8deozjjr36cY7DrjJz6HHsXxE02x0/wR8J3j+GP/AAhmsX+j6pea 34ohn8QfZvGAlTRH0SGfTNb8XeK4bLWINAbTvHF1dWlv4IGraR8TdAu7LwLa+ER4Q8V+Meqjh5Va OIrKXKqFOnUScJv2idSFO0ZJcqs25e802ouzbun7OByatjsBmWOU5Uo5dh6WIUZUK0liI1MRTw7h Tqxi4RlDmlUSk0nCnOzurHjlFGPQf5Iz/wDWx1zR16dSDx74J/H16ZNc1t/JJ/fb/M8blla9nb02 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 Rfa4Ehis7WIiEu80ryyXKyv90y/EjwHb65prahb6r4ZbT4J7m4bWPC+rabtllUw2sMtytpJb8+bP IGNxIEMYO4V6WWZfkmLwsm1UbdR2lzSdlTUE0mtE7p6dOz6ePisxxmHqSVOpSqP+HJKzafuOzs7u yd3tp87+bfsq/Ce/+HEvjy61HRY9Eu9U1fS9Mlh862mkurfw1o9paWN6zWc0lojulzM1zJbeWl1c zNK9vbSK0VfY5RT1Udu3p0H0GTgV4t4a+IvgG51bX7m08X6VKt5qcQt9Nivd8+bS3SK4ultSWlUX txvdnWNYpI4oXZcvXrWn6tp2qxPNp17bXkcTiOVreRXMUpGfJlXIeGUAqTFKqyAEZXkGvpsHQw1C lGhhpNQir8t+aTUuVt662fRbdtL34alSrOXtK0ffkle6aStazj2dlrp6ec89jZXKbLm0trhPk+Sa GOVf3bB0+V1YfK4V144dQwwwzWLJ4dt43Q6bLe6YFKnbY3ksUGAZnx9kdpLVw0sxeYGFDKyrvZ1U LXR5HqOuM59s846cckfzoyCeo9gOenbv09yOldTpU3oopPut+l/vt+PXQwOZ+z+KLcMYr2y1FRGd qXsTWk7SLFGqr9qs2aP55VklldrIja6xoigFjs2z3ZijkuozFNuw0QlEwHzDbhkVMqTk4PKpwwzm r1BGcexz2/rU06KpuTUm720b0Wi2+4D8zv8Agm6X0KL9tH4Y3Df8TD4cft3ftAPcDJKyWPxLvdD+ K+jPtJYKo0zxnBECMK0kbMP4sfpjX5geBXm+AH/BTb4teCb5lh8FfttfDHQfjH4KuZAEjHxf+Cdh Y+BviL4diYFUN1qvgWfwf4lt0AM8qaXqjkskKiP9P61VtUu/fyS/QAooopgFFFFABVyx/wBa3/XM /wDoSVTq5Y/61v8Armf/AEJKANSiiigD+ZX/AIL5/wDI4/s4f9gX4pf+l3gSvhz4Sf8AKOL4yf8A Zyvg/wD9RTSq+4/+C+f/ACOP7OH/AGBfil/6XeBK+HPhJ/yji+Mn/Zyvg/8A9RTSq/Lc0/5KbNP+ xfX/APUKkf48eLP/ACkt4p/9klmv/rNUz48pcZxjrjnp6np+GOOuc4yMGkr7h+FMumw/s5+JdXk8 c/s3aDrGj/ET4e6PY3XxB+BcXjXxH4e07XtM+NWoapoGtaw37Pvj2fWLvxbdaBo2taFeR6p4jt9D 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 aVowb17an7u0UUV+sH+2i0S9Ef/Z ------=_NextPart_000_0362_01CAF339.B7D27930-- From notify-return-linux-xfs=oss.sgi.com@returns.groups.yahoo.com Sat May 15 08:22:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.2 required=5.0 tests=BAYES_50,HK_RANDOM_FROM, RCVD_IN_BL_SPAMCOP_NET,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4FDMsgd098875 for ; Sat, 15 May 2010 08:22:54 -0500 X-ASG-Debug-ID: 1273929955-203302ec0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from n45b.bullet.mail.sp1.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 113241294490 for ; Sat, 15 May 2010 06:25:55 -0700 (PDT) Received: from n45b.bullet.mail.sp1.yahoo.com (n45b.bullet.mail.sp1.yahoo.com [66.163.168.159]) by cuda.sgi.com with SMTP id S7PG1LKML0gBtEuo for ; Sat, 15 May 2010 06:25:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoogroups.com; s=lima; t=1273929909; bh=089hnNCVGUeIKkP9OaUsFp8QIJitKdxt9oKo1SQ/dq0=; h=Received:Received:Date:Message-ID:X-Yahoo-Newman-Property:From:Reply-To:To:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding; b=aUmvKQ6E+qY40l6qE9x5kxadqGlsMQYXeRCdGQLWCwzCD51kW/UexP4c9jivUZwdIiPAsheCAN48zIu/gTtQisSryU3X2mVTKYfpZI2/bY8kMHD847McRYqlAgq3ZPFF DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=lima; d=yahoogroups.com; b=C3yUE2V79KxQD6Dh8+Kc96SCRsr2oME9CnmYEPnkMBn1hxZGFVxkbWc/llZTD9+mDgT80wB9l3U75BFEZNB9+3PtAO/WVa6Fl0UQvkxtbbnR7SrxWT8GGM+OzRfS4Pnp; Received: from [69.147.65.174] by n45.bullet.mail.sp1.yahoo.com with NNFMP; 15 May 2010 13:25:09 -0000 Received: from [98.137.34.32] by t12.bullet.mail.sp1.yahoo.com with NNFMP; 15 May 2010 13:25:09 -0000 Date: 15 May 2010 13:25:08 -0000 Message-ID: <1273929908.674.17417.w1@yahoogroups.com> X-Yahoo-Newman-Property: groups-notify From: nffbby Moderator Reply-To: nffbby-unsubscribe@yahoogroups.com To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Welcome to the nffbby group Subject: Welcome to the nffbby group MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Barracuda-Connect: n45b.bullet.mail.sp1.yahoo.com[66.163.168.159] X-Barracuda-Start-Time: 1273929956 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5000 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29927 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello, I've added you to my nffbby group at Yahoo! Groups, a free, easy-to-use service. Yahoo! Groups makes it easy to send and receive group messages, coordinate events, share photos and files, and more. Description of the group: ------------------------------------------------------------------------ bbtg0x6m032 Complete your Yahoo! Groups account: ---------------------------------------------------------------------- Your email address has been added to the email list of a Yahoo! Group. To gain access to all of your group's web features (previous messages, photos, files, calendar, etc.) and easier control of your message delivery options, we highly recommend that you complete your account by connecting your email address to a Yahoo account. It is easy and free. Please visit: http://groups.yahoo.com/convacct?email=linux-xfs%40oss.sgi.com&list=nffbby Important information about the nffbby group ------------------------------------------------------------------------ * To send a message to the members of this group, send an email to: nffbby@yahoogroups.com * To leave the group, you can unsubscribe by replying to this message, or by sending an email to: nffbby-unsubscribe@yahoogroups.com Regards, Moderator, nffbby Report abuse: ------------------------------------------------------------------------ Because Yahoo! Groups values your privacy, it is a violation of our service rules for moderators to add subscribers to a group against their wishes. If you feel this has happened, please notify us: http://help.yahoo.com/l/us/yahoo/groups/original/members/forms/abuse.html You may also change your email preferences to prevent group owners from adding you to their groups. To do so, please go here: http://groups.yahoo.com/s?tag=Ib2LVu3h5zRmc4m9A8hvkJ6biBfqdJR_VUgbVlQ_rBFLpLM6lpFaF0UAI49xgTTjYhYh0JxNqBtZUbOpcJji Your use of Yahoo! Groups is subject to: http://docs.yahoo.com/info/terms/ From pengxihan@gmail.com Sat May 15 10:55:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4FFtbeN105664 for ; Sat, 15 May 2010 10:55:37 -0500 X-ASG-Debug-ID: 1273939072-26cb00470000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-pz0-f204.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0A528341DA6 for ; Sat, 15 May 2010 08:57:52 -0700 (PDT) Received: from mail-pz0-f204.google.com (mail-pz0-f204.google.com [209.85.222.204]) by cuda.sgi.com with ESMTP id 4TvKlH6A67KdZqH5 for ; Sat, 15 May 2010 08:57:52 -0700 (PDT) Received: by pzk42 with SMTP id 42so1856101pzk.4 for ; Sat, 15 May 2010 08:57:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=gdKLIerdKXQ/k8p3DOKo7644byg36YNgTNzqeVgKmB0=; b=NshywlzLhb9RwwuF8H4diNJ/lZ8jKKrNgPEMzLBwvgTsn69pLAdtOmqBfPw+y8cPFc mPzIEEmFjfoN1r8ssJUP0UvgGkJES/gs1Tv3g3r3oklYNy1L37sHJRaXeh1KLlt6Nqcq n08e4vrQwIllx2gv8pSNXii71MgBuRDBvHTwc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=qgENQ4iW93lx/ph4B3xKib3Xt2PqMKVCihn5DRyl22MHzTEhGKaYUGN6VMvWep8vOc 5HlENc1uOUfADs+aPwJTDW3u4v1QXq0hr3Si6bFRGpbqmXbmkf1QUq1B6HVecszoiH7S cy1ydnXRhdnUJJxLu8JzZ6zDt96twWJcYbpLc= MIME-Version: 1.0 Received: by 10.143.24.11 with SMTP id b11mr1800038wfj.215.1273939071458; Sat, 15 May 2010 08:57:51 -0700 (PDT) Received: by 10.142.50.21 with HTTP; Sat, 15 May 2010 08:57:51 -0700 (PDT) Date: Sat, 15 May 2010 23:57:51 +0800 Message-ID: X-ASG-Orig-Subj: xfs didn't provide redundancy for citical data structure? Subject: xfs didn't provide redundancy for citical data structure? From: hank peng To: xfs-oss Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pz0-f204.google.com[209.85.222.204] X-Barracuda-Start-Time: 1273939073 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29936 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I read this paper: http://pages.cs.wisc.edu/~vshree/xfs.pdf, which says xfs didn't provide redundancy for citical data structure, such as mirror, parity. I wonder if it is so? If it is, is there plan to implement that for XFS developers? -- The simplest is not all best but the best is surely the simplest! From edt@aei.ca Sat May 15 12:06:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4FH67oo108748 for ; Sat, 15 May 2010 12:06:07 -0500 X-ASG-Debug-ID: 1273943348-449c014b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail001.aei.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 21027129479D for ; Sat, 15 May 2010 10:09:08 -0700 (PDT) Received: from mail001.aei.ca (mail001.aei.ca [206.123.6.130]) by cuda.sgi.com with ESMTP id XWYA3juORITMUaEd for ; Sat, 15 May 2010 10:09:08 -0700 (PDT) Received: (qmail 16613 invoked by uid 89); 15 May 2010 17:08:20 -0000 Received: by simscan 1.2.0 ppid: 16600, pid: 16604, t: 0.0645s scanners: regex: 1.2.0 attach: 1.2.0 Received: from mail002.aei.ca (HELO mail002.contact.net) (206.123.6.132) by mail001.aei.ca with (DHE-RSA-AES256-SHA encrypted) SMTP; 15 May 2010 17:08:20 -0000 Received: (qmail 7318 invoked by uid 89); 15 May 2010 17:08:20 -0000 Received: by simscan 1.2.0 ppid: 7298, pid: 7304, t: 0.5831s scanners: regex: 1.2.0 attach: 1.2.0 clamav: 0.96/m: spam: 3.3.1 Received: from dsl-216-221-37-219.aei.ca (HELO grover.localnet) (edt@aei.ca@216.221.37.219) by mail.aei.ca with ESMTPA; 15 May 2010 17:08:19 -0000 From: Ed Tomlinson To: Andi Kleen X-ASG-Orig-Subj: Re: Defrag in shrinkers Subject: Re: Defrag in shrinkers Date: Sat, 15 May 2010 13:08:17 -0400 User-Agent: KMail/1.13.3 (Linux/2.6.33.4-crc; KDE/4.4.3; x86_64; ; ) Cc: Christoph Lameter , Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, Pekka Enberg , npiggin@suse.de References: <1273821863-29524-1-git-send-email-david@fromorbit.com> <87y6fmmdak.fsf@basil.nowhere.org> In-Reply-To: <87y6fmmdak.fsf@basil.nowhere.org> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201005151308.18090.edt@aei.ca> X-Barracuda-Connect: mail001.aei.ca[206.123.6.130] X-Barracuda-Start-Time: 1273943349 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.2, rules version 3.2.2.29941 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Friday 14 May 2010 16:36:03 Andi Kleen wrote: > Christoph Lameter writes: > > > Would it also be possible to add some defragmentation logic when you > > revise the shrinkers? Here is a prototype patch that would allow you to > > determine the other objects sitting in the same page as a given object. > > > > With that I hope that you have enough information to determine if its > > worth to evict the other objects as well to reclaim the slab page. > > I like the idea, it would be useful for the hwpoison code too, > when it tries to clean a page. If this is done generally we probably want to retune the 'pressure' put on the slab. The whole reason for the callbacks was to keep the 'pressure on the slab proportional to the memory pressure (scan rate). Ed Tomlinson From newsx@btinternet.com Sat May 15 16:29:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4FLSxbn123893 for ; Sat, 15 May 2010 16:29:00 -0500 X-ASG-Debug-ID: 1273959074-27fa03420000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from april.london.02.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7E2F313DE59B for ; Sat, 15 May 2010 14:31:14 -0700 (PDT) Received: from april.london.02.net (april.london.02.net [87.194.255.143]) by cuda.sgi.com with ESMTP id Ipauik3vv4JC7fvC for ; Sat, 15 May 2010 14:31:14 -0700 (PDT) Received: from [192.168.1.130] (94.192.40.220) by april.london.02.net (8.5.016.1) id 4B79C26301F1D967 for xfs@oss.sgi.com; Sat, 15 May 2010 22:31:14 +0100 Message-ID: <4BEF12A5.2030505@btinternet.com> Disposition-Notification-To: Marcel z maleho mesta Date: Sat, 15 May 2010 22:31:17 +0100 From: Marcel z maleho mesta User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.9) Gecko/20100317 SeaMonkey/2.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Structure needs cleaning - Seagate Expansion External HDD 2TB USB Subject: Structure needs cleaning - Seagate Expansion External HDD 2TB USB Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: april.london.02.net[87.194.255.143] X-Barracuda-Start-Time: 1273959075 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=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29957 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi all, I'm new to Linux (still got Win XP running on my laptops :(, but installed on my old machine Fedora 12, which looks really good :) I have got a problem with my external Seagate Expansion External HDD 2TB USB drive which has been connected to my NAS Bufallo LinkStation Mini. I did have to disconnect the USB drive from NAS one day and since then it would not be recognised by NAS. So have tried some Win tools, but the USB drive has got XFS file system. When I plug it to pc running Fedora 12, Palimpsest Disk Utility see the Hard Drive, but when I attempt to Mount the drive Error mounting device - Unknown error msg. comes up. Details: Error mounting: mount: Structure needs cleaning. Have googled it: http://xfs.org/index.php/XFS_FAQ#Q:_I_see_applications_returning_error_990_or_.22Structure_needs_cleaning.22.2C_what_is_wrong.3F and tried xfs_repair /dev/sdb1 and xfs_check /dev/sdb1 and can Mount the disk and all the folders in root apart from few files are ok "copied into Lost+Found Folder", but the most important one "DVBgrab" with about 400Gb of data :( (each file is between 1 and 2 Gb) Are those files gone, or is there a chance that they can be somehow recovered with combination of xfs_repair commands? Thanx in advance. Marcel From newsx@btinternet.com Sat May 15 17:04:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4FM4xXv125878 for ; Sat, 15 May 2010 17:04:59 -0500 X-ASG-Debug-ID: 1273961233-429b02a10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from woodbine.london.02.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C1FFD34562A for ; Sat, 15 May 2010 15:07:13 -0700 (PDT) Received: from woodbine.london.02.net (woodbine.london.02.net [87.194.255.145]) by cuda.sgi.com with ESMTP id CYaPAKNC18NiNsui for ; Sat, 15 May 2010 15:07:13 -0700 (PDT) Received: from [192.168.1.130] (94.192.40.220) by woodbine.london.02.net (8.5.016.1) id 4A20329609CA5C1D for xfs@oss.sgi.com; Sat, 15 May 2010 23:07:13 +0100 Message-ID: <4BEF1B14.1060009@btinternet.com> Date: Sat, 15 May 2010 23:07:16 +0100 From: Marcel z maleho mesta User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.9) Gecko/20100317 SeaMonkey/2.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Structure needs cleaning - Seagate Expansion External HDD 2TB USB Subject: Structure needs cleaning - Seagate Expansion External HDD 2TB USB Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: woodbine.london.02.net[87.194.255.145] X-Barracuda-Start-Time: 1273961234 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=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi all, I'm new to Linux (still got Win XP running on my laptops :(, but installed on my old machine Fedora 12, which looks really good :) I have got a problem with my external Seagate Expansion External HDD 2TB USB drive which has been connected to my NAS Bufallo LinkStation Mini. I did have to disconnect the USB drive from NAS one day and since then it would not be recognised by NAS. So have tried some Win tools, but the USB drive has got XFS file system. When I plug it to pc running Fedora 12, Palimpsest Disk Utility see the Hard Drive, but when I attempt to Mount the drive Error mounting device - Unknown error msg. comes up. Details: Error mounting: mount: Structure needs cleaning. Have googled it: http://xfs.org/index.php/XFS_FAQ#Q:_I_see_applications_returning_error_990_or_.22Structure_needs_cleaning.22.2C_what_is_wrong.3F and tried xfs_repair /dev/sdb1 and xfs_check /dev/sdb1 and can Mount the disk and all the folders in root apart from few files are ok "copied into Lost+Found Folder", but the most important one "DVBgrab" with about 400Gb of data :( (each file is between 1 and 2 Gb) is missing. Are those files gone, or is there a chance that they can be somehow recovered with combination of xfs_repair commands? Thanx in advance. Marcel From stan@hardwarefreak.com Sat May 15 21:56:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4G2uH2q139694 for ; Sat, 15 May 2010 21:56:18 -0500 X-ASG-Debug-ID: 1273978761-48dd018c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1EBD09B90E3 for ; Sat, 15 May 2010 19:59:22 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id pmBAAiJgC77uDwLD for ; Sat, 15 May 2010 19:59:22 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 57ACE6C054 for ; Sat, 15 May 2010 21:58:32 -0500 (CDT) Message-ID: <4BEF5F75.5020409@hardwarefreak.com> Date: Sat, 15 May 2010 21:59:01 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs didn't provide redundancy for citical data structure? Subject: Re: xfs didn't provide redundancy for citical data structure? References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1273978763 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1570 1.0000 -1.0620 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.46 X-Barracuda-Spam-Status: No, SCORE=-0.46 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.29977 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean hank peng put forth on 5/15/2010 10:57 AM: > I read this paper: http://pages.cs.wisc.edu/~vshree/xfs.pdf, which > says xfs didn't provide redundancy for citical data structure, such as > mirror, parity. I wonder if it is so? > If it is, is there plan to implement that for XFS developers? This paper was published in early 2005, the research based on Linux 2.6.9, which was released in 2004. The analysis was performed on code that is now ~6 years old. Are these shortcomings valid? Have any been addressed/fixed since 2004? Does real world usage show they're not needed, or that the development cost/benefit ratio is too high to bother implementing the changes? -- Stan From sandeen@sandeen.net Sun May 16 12:57:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4GHvV1L179010 for ; Sun, 16 May 2010 12:57:31 -0500 X-ASG-Debug-ID: 1274032840-5e8701e20000-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 C81121308179 for ; Sun, 16 May 2010 11:00:40 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4ArvD89tQzdezXg2 for ; Sun, 16 May 2010 11:00:40 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o4GHxjf3011371 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sun, 16 May 2010 13:59:46 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o4GHxjd4025160; Sun, 16 May 2010 13:59:45 -0400 Message-ID: <4BF03290.6080803@sandeen.net> Date: Sun, 16 May 2010 12:59:44 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100301 Fedora/3.0.3-1.fc11 Lightning/1.0b2pre Thunderbird/3.0.3 MIME-Version: 1.0 To: Marcel z maleho mesta CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Structure needs cleaning - Seagate Expansion External HDD 2TB USB Subject: Re: Structure needs cleaning - Seagate Expansion External HDD 2TB USB References: <4BEF12A5.2030505@btinternet.com> In-Reply-To: <4BEF12A5.2030505@btinternet.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.21 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1274032840 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 05/15/2010 04:31 PM, Marcel z maleho mesta wrote: > Hi all, > > I'm new to Linux (still got Win XP running on my laptops :(, but > installed on my old machine Fedora 12, which looks really good :) > > I have got a problem with my external Seagate Expansion External HDD 2TB > USB drive which has been connected to my NAS Bufallo LinkStation Mini. > > I did have to disconnect the USB drive from NAS one day and since then > it would not be recognised by NAS. So have tried some Win tools, but the > USB drive has got XFS file system. Ok, so some unknown thing went wrong by this point. > When I plug it to pc running Fedora 12, Palimpsest Disk Utility see the > Hard Drive, but when I attempt to Mount the drive Error mounting device > - Unknown error msg. comes up. > Details: > Error mounting: mount: Structure needs cleaning. At that point, type "dmesg" to see what error is in the kernel log. > Have googled it: > http://xfs.org/index.php/XFS_FAQ#Q:_I_see_applications_returning_error_990_or_.22Structure_needs_cleaning.22.2C_what_is_wrong.3F > and tried xfs_repair /dev/sdb1 and xfs_check /dev/sdb1 and can Mount the > disk and all the folders in root apart from few files are ok "copied > into Lost+Found Folder", but the most important one "DVBgrab" with about > 400Gb of data :( (each file is between 1 and 2 Gb) I didn't parse that very well, I'm afraid, but - either your files are where they should be, or they are under lost+found, or they are more or less lost, though some sort of pattern search over the drive might work. > Are those files gone, or is there a chance that they can be somehow > recovered with combination of xfs_repair commands? You've already run repair, there is no magical "recover my lost data" option to it, I'm afraid. There's really not much to go on here, other than "something corrupted your filesystem," probably while attached to the buffalo device, and it sounds like some data was lost. -Eric > > Thanx in advance. > > Marcel From eflorac@intellique.com Sun May 16 14:31:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4GJV7fN182580 for ; Sun, 16 May 2010 14:31:07 -0500 X-ASG-Debug-ID: 1274038452-12fc02260000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 055EB130832A for ; Sun, 16 May 2010 12:34:14 -0700 (PDT) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id mukIDnVr7izeVcxt for ; Sun, 16 May 2010 12:34:14 -0700 (PDT) Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by smtp3-g21.free.fr (Postfix) with ESMTP id 21C418181B8; Sun, 16 May 2010 21:33:17 +0200 (CEST) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP; Sun, 16 May 2010 21:33:16 +0200 (CEST) Date: Sun, 16 May 2010 21:33:07 +0200 From: Emmanuel Florac To: Marcel z maleho mesta Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Structure needs cleaning - Seagate Expansion External HDD 2TB USB Subject: Re: Structure needs cleaning - Seagate Expansion External HDD 2TB USB Message-ID: <20100516213307.4252621c@galadriel.home> In-Reply-To: <4BEF12A5.2030505@btinternet.com> References: <4BEF12A5.2030505@btinternet.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 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1274038457 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.2, rules version 3.2.2.30034 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Sat, 15 May 2010 22:31:17 +0100 vous =E9criviez: > but the most important one "DVBgrab" with about=20 > 400Gb of data :( (each file is between 1 and 2 Gb) Don't write anything to your drive. Here is a perl script I wrote to find back lost DV files from a huge corrupted array. Mount some other place to save the found files to /mnt/destination, then run the script passing the device to search as parameter. #!/usr/bin/perl use strict; use warnings; $|=3D1 ; my ( $file ) =3D @ARGV; my $blocksize =3D 4096 ; my $lookupstring =3D pack "H*", "1F0700" ; my $regexp =3D qr/^(.*?)($lookupstring.*)$/s ; open ( my $raid, "< $file" ) or die "can't open $file \n" ; { my $block ; my $offset =3D 0 ; my $nextblock =3D 0; my $testfile; =09 # frame size is 1440000 bytes my $framebuffer1 =3D '' ; =09 my $outnumber =3D 0; seek $raid, $offset, 0 or die ; =09 while ( my $readbytes =3D read $raid, $block, $blocksize ) { $offset +=3D $readbytes ; =09 print "* offset : $offset\n" unless ( $offset % 1073741824 ) ;=20 if ( length $framebuffer1 =3D=3D 0 ) { if ( $block =3D~ m/$regexp/ ) { print "found, file $outnumber offset $offset\n"; $framebuffer1 =3D $2 ; } } elsif ( length $framebuffer1 < 144000 - $blocksize ) { $framebuffer1 .=3D $block ; print "file head inside : offset $offset\n" if ( $block =3D~ m/$regexp/ ) ; } elsif ( length $framebuffer1 =3D=3D 144000 - $blocksize ) { $framebuffer1 .=3D $block ; } else { $framebuffer1 .=3D substr( $block, 0, ( 144000 - length $framebuffer1 ) ) ; if ( not $testfile ) { print "OPEN\n"; open $testfile, ">/mnt/destination/out". sprintf ("%09d", $outnumber) . ".dv" or die "can't write file $outnumber "; } print $testfile $framebuffer1 ; =09 if ( $block =3D~ m/$regexp/ ) { print "found, file $outnumber offset $offset\n"; $framebuffer1 =3D $2 ; } else { print "CLOSE\n" ; close $testfile ; undef $testfile ; $framebuffer1 =3D '' ; $outnumber++; } } } } =09 =09 --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From SRS0+/WNB+75+fromorbit.com=david@internode.on.net Sun May 16 18:30:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4GNUWAL210137 for ; Sun, 16 May 2010 18:30:33 -0500 X-ASG-Debug-ID: 1274052819-1f7702fd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 096B7149731D for ; Sun, 16 May 2010 16:33:40 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id p9lo72COatGt1wAh for ; Sun, 16 May 2010 16:33:40 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24435324-1927428 for multiple; Mon, 17 May 2010 09:02:44 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1ODnK7-0003bI-77; Mon, 17 May 2010 09:32:43 +1000 Date: Mon, 17 May 2010 09:32:43 +1000 From: Dave Chinner To: hank peng Cc: xfs-oss X-ASG-Orig-Subj: Re: xfs didn't provide redundancy for citical data structure? Subject: Re: xfs didn't provide redundancy for citical data structure? Message-ID: <20100516233243.GH8120@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1274052822 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=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30046 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, May 15, 2010 at 11:57:51PM +0800, hank peng wrote: > I read this paper: http://pages.cs.wisc.edu/~vshree/xfs.pdf, which > says xfs didn't provide redundancy for citical data structure, such as > mirror, parity. I wonder if it is so? > If it is, is there plan to implement that for XFS developers? XFS assumes redundancy and protection against bit errors is done in the block layeri (i.e. RAID of some kind). Changing that assumption takes a lot of work and involves modifying the disk format, so can't be done overnight. That being said, work is in progress to make XFS more robust - see this page for ideas on how we are approaching the problem: http://xfs.org/index.php/Reliable_Detection_and_Repair_of_Metadata_Corruption I'll also point out that the above paper makes some fundamental mistakes (e.g. XFS does not use "data=ordered" journalling as they conclude it does from a limited observation). Hence the rest of their results are somewhat questionable, too, as we can't examine them closely enough to confirm or deny them.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+WQNW+76+fromorbit.com=david@internode.on.net Sun May 16 19:17:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4H0HMMS212016 for ; Sun, 16 May 2010 19:17:22 -0500 X-ASG-Debug-ID: 1274055631-35c103220000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2E91D14974BE for ; Sun, 16 May 2010 17:20:31 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id LhDiFpetQfxfb30R for ; Sun, 16 May 2010 17:20:31 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24343712-1927428 for multiple; Mon, 17 May 2010 09:49:29 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1ODo3K-0003do-Ve; Mon, 17 May 2010 10:19:27 +1000 Date: Mon, 17 May 2010 10:19:26 +1000 From: Dave Chinner To: Al Viro Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org X-ASG-Orig-Subj: Re: [PATCH 0/5] Per-superblock shrinkers Subject: Re: [PATCH 0/5] Per-superblock shrinkers Message-ID: <20100517001926.GI8120@dastard> References: <1273821863-29524-1-git-send-email-david@fromorbit.com> <20100515013005.GA31073@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100515013005.GA31073@ZenIV.linux.org.uk> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1274055633 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.2, rules version 3.2.2.30049 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, May 15, 2010 at 02:30:05AM +0100, Al Viro wrote: > On Fri, May 14, 2010 at 05:24:18PM +1000, Dave Chinner wrote: > > > > This series reworks the filesystem shrinkers. We currently have a > > set of issues with the current filesystem shrinkers: > > > > 1. There is an dependency between dentry and inode cache > > shrinking that is only implicitly defined by the order of > > shrinker registration. > > 2. The shrinkers need to walk the superblock list and pin > > the superblock to avoid unmount races with the sb going > > away. > > 3. The dentry cache uses per-superblock LRUs and proportions > > reclaim between all the superblocks which means we are > > doing breadth based reclaim. This means we touch every > > superblock for every shrinker call, and may only reclaim > > a single dentry at a time from a given superblock. > > 4. The inode cache has a global LRU, so it has different > > reclaim patterns to the dentry cache, despite the fact > > that the dentry cache is generally the only thing that > > pins inodes in memory. > > 5. Filesystems need to register their own shrinkers for > > caches and can't co-ordinate them with the dentry and > > inode cache shrinkers. > > NAK in that form; sb refcounting and iterators had been reworked for .34, > so at least it needs rediff on top of that. The tree I based this on was 2.6.34-rc7 - is there new code in a -next branch somewhere? > What's more, it's very > obviously broken wrt locking - you are unregistering a shrinker > from __put_super(). I.e. grab rwsem exclusively under a spinlock. > Essentially, you've turned dropping a _passive_ reference to superblock > (currently an operation safe in any context) into an operation allowed > only when no fs or vm locks are held by caller. Not going to work... Yeah, I picked that up after I posted it. My bad - I'll look into how I can rework that for the next iteration. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+WxkN+76+fromorbit.com=david@internode.on.net Sun May 16 19:22:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4H0Mwqb212228 for ; Sun, 16 May 2010 19:22:58 -0500 X-ASG-Debug-ID: 1274055913-469c011b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 82A43348598 for ; Sun, 16 May 2010 17:25:14 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id O4fWUJX4Gyqh1IWC for ; Sun, 16 May 2010 17:25:14 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24485239-1927428 for multiple; Mon, 17 May 2010 09:54:47 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1ODo8S-0003e7-U7; Mon, 17 May 2010 10:24:44 +1000 Date: Mon, 17 May 2010 10:24:44 +1000 From: Dave Chinner To: Ed Tomlinson Cc: Andi Kleen , Christoph Lameter , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, Pekka Enberg , npiggin@suse.de X-ASG-Orig-Subj: Re: Defrag in shrinkers Subject: Re: Defrag in shrinkers Message-ID: <20100517002444.GJ8120@dastard> References: <1273821863-29524-1-git-send-email-david@fromorbit.com> <87y6fmmdak.fsf@basil.nowhere.org> <201005151308.18090.edt@aei.ca> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201005151308.18090.edt@aei.ca> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1274055915 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.2, rules version 3.2.2.30049 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, May 15, 2010 at 01:08:17PM -0400, Ed Tomlinson wrote: > On Friday 14 May 2010 16:36:03 Andi Kleen wrote: > > Christoph Lameter writes: > > > > > Would it also be possible to add some defragmentation logic when you > > > revise the shrinkers? Here is a prototype patch that would allow you to > > > determine the other objects sitting in the same page as a given object. > > > > > > With that I hope that you have enough information to determine if its > > > worth to evict the other objects as well to reclaim the slab page. > > > > I like the idea, it would be useful for the hwpoison code too, > > when it tries to clean a page. > > If this is done generally we probably want to retune the 'pressure' put on the slab. The > whole reason for the callbacks was to keep the 'pressure on the slab proportional to the > memory pressure (scan rate). I don't see that defrag based reclaim changes the concept of pressure at all. As long as reclaim follows the nr_to_scan guideline, then it doesn't matter if we do reclaim from the LRU or reclaim from a list provided by the slab cache.... FWIW, one thing that would be necessary, I think, is to avoid defrag until a certain level of fragmentation has occurred - we should do LRU-based reclaim as much as possible, and only trigger defrag-style reclaim once we hit a trigger (e.g. once the slab is 25% partial pages). Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+eHox+76+fromorbit.com=david@internode.on.net Mon May 17 00:48:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4H5mml0228759 for ; Mon, 17 May 2010 00:48:49 -0500 X-ASG-Debug-ID: 1274075463-536803860000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0E8EF13EBF6D for ; Sun, 16 May 2010 22:51:03 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id iIh4qCWxlUJgRFe9 for ; Sun, 16 May 2010 22:51:03 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24481164-1927428 for multiple; Mon, 17 May 2010 15:21:02 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1ODtED-0003uf-8K; Mon, 17 May 2010 15:51:01 +1000 Date: Mon, 17 May 2010 15:51:01 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/12] xfs: Introduce delayed logging core code Subject: Re: [PATCH 09/12] xfs: Introduce delayed logging core code Message-ID: <20100517055101.GK8120@dastard> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> <1273210860-23414-10-git-send-email-david@fromorbit.com> <20100510114435.GA27624@infradead.org> <20100510121628.GD7165@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100510121628.GD7165@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1274075465 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.2, rules version 3.2.2.30070 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 10, 2010 at 10:16:28PM +1000, Dave Chinner wrote: > On Mon, May 10, 2010 at 07:44:35AM -0400, Christoph Hellwig wrote: > > > + new_lv = kmem_zalloc(sizeof(*new_lv) + > > > + lidp->lid_size * sizeof(struct xfs_log_iovec), > > > + KM_SLEEP); > > > + > > > + /* The allocated iovec region lies beyond the log vector. */ > > > + new_lv->lv_iovecp = (struct xfs_log_iovec *)&new_lv[1]; > > > + if (!ret_lv) > > > + ret_lv = new_lv; > > > + else > > > + lv->lv_next = new_lv; > > > + lv = new_lv; > > > > I'd suggest already setting up lv->lv_niovecs and lv->lv_item here > > instead of in xfs_trans_fill_log_vecs. That way xfs_trans_fill_log_vecs > > can be simplified to: > > > > STATIC void > > xfs_trans_fill_log_vecs( > > struct xfs_trans *tp, > > struct xfs_log_vec *log_vector) > > { > > struct xfs_log_vec *lv; > > > > for (lv = log_vector; lv = lv->lv_next; lv) > > IOP_FORMAT(lidp->lid_item, lv->lv_iovecp); > > } > > > > Or just inlined into the caller or even xfs_log_commit_cil given how simple > > it is now. Moving it to xfs_log_commit_cil would also help avoiding the > > locking imbalance where xfs_log_commit_cil is called with xc_ctx_lock > > held but returns without it after the last patch in the series. That > > again might allow merging the IOP_FORMAT loop into xlog_cil_format_items. OK, having looked into this in more detail, I agree that this makes the code much simpler and formatting in xlog_cil_format_items() makes sense for cleaning up the unbalanced locking. xfs_trans_fill_log_vecs() basically goes away completely. > > Btw, I wonder if xfs_log_commit_cil should simply move to xfs_trans.c? > > That would avoid having to export xfs_trans_unreserve_and_mod_sb, > > xfs_trans_free_items and xfs_trans_free from there, and only require > > exporting xlog_cil_format_items (if we didn't move that one as well, > > then xlog_cil_insert), while keeping things a lot more symmetric with > > the traditional commit path. > > I did find it a bit hard trying to draw the line between the trans > subsystem and the logging subsystem because of the interactions and > the way they changed as I developed the code and fixed bugs. I'll > have a closer look at what you are suggesting (it seems reasonable > just from a quick scan) and see how much it cleans up. Unfortunately, it's still not a totally clean separation - either way something has to be exported. I'd prefer not to export the CIL context or the context lock outside xfs_log_cil.c, so that kind of rules out moving xfs_log_commit_cil(). I moved a couple of things from there back to xfs_trans_commit_cil(), but we still need xfs_trans_item_committed() and xfs_trans_unreserve_and_mod_sb() exported. That seems to be the cleanest I can come up with right now... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+f7a16dcd4fec05c8b6e7+2458+infradead.org+hch@bombadil.srs.infradead.org Mon May 17 02:32:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4H7WG2t234824 for ; Mon, 17 May 2010 02:32:18 -0500 X-ASG-Debug-ID: 1274081673-74a600e10000-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 4B43734A410 for ; Mon, 17 May 2010 00:34:33 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id oinoHZYbFUXT7sg0 for ; Mon, 17 May 2010 00:34:33 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1ODuqO-0007Zu-9c; Mon, 17 May 2010 07:34:32 +0000 Date: Mon, 17 May 2010 03:34:32 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/12] xfs: Introduce delayed logging core code Subject: Re: [PATCH 09/12] xfs: Introduce delayed logging core code Message-ID: <20100517073432.GA28836@infradead.org> References: <1273210860-23414-1-git-send-email-david@fromorbit.com> <1273210860-23414-10-git-send-email-david@fromorbit.com> <20100510114435.GA27624@infradead.org> <20100510121628.GD7165@dastard> <20100517055101.GK8120@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100517055101.GK8120@dastard> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1274081674 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 17, 2010 at 03:51:01PM +1000, Dave Chinner wrote: > Unfortunately, it's still not a totally clean separation - either > way something has to be exported. I'd prefer not to export the CIL > context or the context lock outside xfs_log_cil.c, so that kind of > rules out moving xfs_log_commit_cil(). I moved a couple of things > from there back to xfs_trans_commit_cil(), but we still need > xfs_trans_item_committed() and xfs_trans_unreserve_and_mod_sb() > exported. That seems to be the cleanest I can come up with right > now... Ok let's go with that for now and make sure we have the delayed logging code in before the merge window closes. From dledford@redhat.com Mon May 17 16:26:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HLQKrO008787 for ; Mon, 17 May 2010 16:26:20 -0500 X-ASG-Debug-ID: 1274131716-08f902dc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp-auth.no-ip.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ED05213F1D5E for ; Mon, 17 May 2010 14:28:37 -0700 (PDT) Received: from smtp-auth.no-ip.com (smtp-auth.no-ip.com [204.16.252.94]) by cuda.sgi.com with ESMTP id Byn6TeREcvOMXfzN for ; Mon, 17 May 2010 14:28:37 -0700 (PDT) X-No-IP: xsintricity.com@noip-smtp X-No-IP: xsintricity.com@noip-smtp X-No-IP: xsintricity.com@noip-smtp X-No-IP: xsintricity.com@noip-smtp X-Report-Spam-To: abuse@no-ip.com Received: from firewall.xsintricity.com (adsl-068-209-206-004.sip.rdu.bellsouth.net [68.209.206.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: xsintricity.com@noip-smtp) by smtp-auth.no-ip.com (Postfix) with ESMTPSA id 18062B486C6; Mon, 17 May 2010 14:28:35 -0700 (PDT) Received: from firewall.xsintricity.com (firewall.xsintricity.com [172.31.0.1]) (authenticated bits=0) by firewall.xsintricity.com (8.14.3/8.14.3) with ESMTP id o4HLSUA4005943 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Mon, 17 May 2010 17:28:31 -0400 Message-ID: <4BF1B4FE.7020503@redhat.com> Date: Mon, 17 May 2010 17:28:30 -0400 From: Doug Ledford Organization: Red Hat, Inc. User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100413 Fedora/3.0.4-2.fc13 Lightning/1.0b2pre Thunderbird/3.0.4 MIME-Version: 1.0 To: Dave Chinner CC: Rainer Fuegenstein , xfs@oss.sgi.com, linux-raid@vger.kernel.org X-ASG-Orig-Subj: Re: xfs and raid5 - "Structure needs cleaning for directory open" Subject: Re: xfs and raid5 - "Structure needs cleaning for directory open" References: <20100510022033.GB7165@dastard> In-Reply-To: <20100510022033.GB7165@dastard> X-Enigmail-Version: 1.0.1 OpenPGP: id=CFBFF194 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig12D39D0C07117305641FFCF6" X-Barracuda-Connect: smtp-auth.no-ip.com[204.16.252.94] X-Barracuda-Start-Time: 1274131717 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.2, rules version 3.2.2.30121 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig12D39D0C07117305641FFCF6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On 05/09/2010 10:20 PM, Dave Chinner wrote: > On Sun, May 09, 2010 at 08:48:00PM +0200, Rainer Fuegenstein wrote: >> >> today in the morning some daemon processes terminated because of >> errors in the xfs file system on top of a software raid5, consisting >> of 4*1.5TB WD caviar green SATA disks. >=20 > Reminds me of a recent(-ish) md/dm readahead cancellation fix - that > would fit the symptoms of (btree corruption showing up under heavy IO > load but no corruption on disk. However, I can't seem to find any > references to it at the moment (can't remember the bug title), but > perhaps your distro doesn't have the fix in it? >=20 > Cheers, >=20 > Dave. That sounds plausible, as does hardware error. A memory bit flip under heavy load would cause the in memory data to be corrupt while the on disk data is good. By waiting to check it until later, the bad memory was flushed at some point and when the data was reloaded it came in ok this time. --=20 Doug Ledford GPG KeyID: CFBFF194 http://people.redhat.com/dledford Infiniband specific RPMs available at http://people.redhat.com/dledford/Infiniband --------------enig12D39D0C07117305641FFCF6 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEARECAAYFAkvxtP4ACgkQg6WylM+/8ZQ3DgCcDa1NZVSLv+48QBpuyuLJ27om qYMAnAwzuxKFke7Lf3x/Uev8uLw8qoP1 =m9de -----END PGP SIGNATURE----- --------------enig12D39D0C07117305641FFCF6-- From SRS0+WxkN+76+fromorbit.com=david@internode.on.net Mon May 17 16:43:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HLhOTV009503 for ; Mon, 17 May 2010 16:43:25 -0500 X-ASG-Debug-ID: 1274132739-4845004c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C0E66353296 for ; Mon, 17 May 2010 14:45:40 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id T0F1IkYZSuKmcrFU for ; Mon, 17 May 2010 14:45:40 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24596514-1927428 for multiple; Tue, 18 May 2010 07:15:34 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OE87w-0004zc-Kc; Tue, 18 May 2010 07:45:32 +1000 Date: Tue, 18 May 2010 07:45:32 +1000 From: Dave Chinner To: Doug Ledford Cc: Rainer Fuegenstein , xfs@oss.sgi.com, linux-raid@vger.kernel.org X-ASG-Orig-Subj: Re: xfs and raid5 - "Structure needs cleaning for directory open" Subject: Re: xfs and raid5 - "Structure needs cleaning for directory open" Message-ID: <20100517214532.GL8120@dastard> References: <20100510022033.GB7165@dastard> <4BF1B4FE.7020503@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <4BF1B4FE.7020503@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1274132741 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.2, rules version 3.2.2.30121 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 17, 2010 at 05:28:30PM -0400, Doug Ledford wrote: > On 05/09/2010 10:20 PM, Dave Chinner wrote: > > On Sun, May 09, 2010 at 08:48:00PM +0200, Rainer Fuegenstein wrote: > >> > >> today in the morning some daemon processes terminated because of > >> errors in the xfs file system on top of a software raid5, consisting > >> of 4*1.5TB WD caviar green SATA disks. > > > > Reminds me of a recent(-ish) md/dm readahead cancellation fix - that > > would fit the symptoms of (btree corruption showing up under heavy IO > > load but no corruption on disk. However, I can't seem to find any > > references to it at the moment (can't remember the bug title), but > > perhaps your distro doesn't have the fix in it? > > > > Cheers, > > > > Dave. > > That sounds plausible, as does hardware error. A memory bit flip under > heavy load would cause the in memory data to be corrupt while the on > disk data is good. The data dumps from the bad blocks weren't wrong by a single bit - they were unrecogniѕable garbage - so that it very unlikely to be a memory erro causing the problem. > By waiting to check it until later, the bad memory > was flushed at some point and when the data was reloaded it came in ok > this time. Yup - XFS needs to do a better job of catching this case - the prototype metadata checksumming patch caught most of these cases... Cheers, Dave. -- Dave Chinner david@fromorbit.com From dledford@redhat.com Mon May 17 17:16:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HMGFsJ010845 for ; Mon, 17 May 2010 17:16:16 -0500 X-ASG-Debug-ID: 1274134712-6cd300aa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp-auth.no-ip.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CF77E13F3547 for ; Mon, 17 May 2010 15:18:32 -0700 (PDT) Received: from smtp-auth.no-ip.com (smtp-auth.no-ip.com [204.16.252.94]) by cuda.sgi.com with ESMTP id 3YqF27YkFLpoJ8Tn for ; Mon, 17 May 2010 15:18:32 -0700 (PDT) X-No-IP: xsintricity.com@noip-smtp X-No-IP: xsintricity.com@noip-smtp X-No-IP: xsintricity.com@noip-smtp X-No-IP: xsintricity.com@noip-smtp X-Report-Spam-To: abuse@no-ip.com Received: from firewall.xsintricity.com (adsl-068-209-206-004.sip.rdu.bellsouth.net [68.209.206.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: xsintricity.com@noip-smtp) by smtp-auth.no-ip.com (Postfix) with ESMTPSA id 82B5CB481D6; Mon, 17 May 2010 15:18:31 -0700 (PDT) Received: from firewall.xsintricity.com (firewall.xsintricity.com [172.31.0.1]) (authenticated bits=0) by firewall.xsintricity.com (8.14.3/8.14.3) with ESMTP id o4HMISFI009066 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Mon, 17 May 2010 18:18:28 -0400 Message-ID: <4BF1C0B4.5090009@redhat.com> Date: Mon, 17 May 2010 18:18:28 -0400 From: Doug Ledford Organization: Red Hat, Inc. User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100413 Fedora/3.0.4-2.fc13 Lightning/1.0b2pre Thunderbird/3.0.4 MIME-Version: 1.0 To: Dave Chinner CC: Rainer Fuegenstein , xfs@oss.sgi.com, linux-raid@vger.kernel.org X-ASG-Orig-Subj: Re: xfs and raid5 - "Structure needs cleaning for directory open" Subject: Re: xfs and raid5 - "Structure needs cleaning for directory open" References: <20100510022033.GB7165@dastard> <4BF1B4FE.7020503@redhat.com> <20100517214532.GL8120@dastard> In-Reply-To: <20100517214532.GL8120@dastard> X-Enigmail-Version: 1.0.1 OpenPGP: id=CFBFF194 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig4EE3AC9ADF5C31DF579B67EA" X-Barracuda-Connect: smtp-auth.no-ip.com[204.16.252.94] X-Barracuda-Start-Time: 1274134712 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.2, rules version 3.2.2.30124 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig4EE3AC9ADF5C31DF579B67EA Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On 05/17/2010 05:45 PM, Dave Chinner wrote: > On Mon, May 17, 2010 at 05:28:30PM -0400, Doug Ledford wrote: >> On 05/09/2010 10:20 PM, Dave Chinner wrote: >>> On Sun, May 09, 2010 at 08:48:00PM +0200, Rainer Fuegenstein wrote: >>>> >>>> today in the morning some daemon processes terminated because of >>>> errors in the xfs file system on top of a software raid5, consisting= >>>> of 4*1.5TB WD caviar green SATA disks. >>> >>> Reminds me of a recent(-ish) md/dm readahead cancellation fix - that >>> would fit the symptoms of (btree corruption showing up under heavy IO= >>> load but no corruption on disk. However, I can't seem to find any >>> references to it at the moment (can't remember the bug title), but >>> perhaps your distro doesn't have the fix in it? >>> >>> Cheers, >>> >>> Dave. >> >> That sounds plausible, as does hardware error. A memory bit flip unde= r >> heavy load would cause the in memory data to be corrupt while the on >> disk data is good. >=20 > The data dumps from the bad blocks weren't wrong by a single bit - > they were unrecogni=D1=95able garbage - so that it very unlikely to be > a memory erro causing the problem. Not true. It can still be a single bit error but a single bit error higher up in the chain. Aka a single bit error in the scsi command to read various sectors, then you read in all sorts of wrong data and everything from there is totally whacked. >> By waiting to check it until later, the bad memory >> was flushed at some point and when the data was reloaded it came in ok= >> this time. >=20 > Yup - XFS needs to do a better job of catching this case - the > prototype metadata checksumming patch caught most of these cases... >=20 > Cheers, >=20 > Dave. --=20 Doug Ledford GPG KeyID: CFBFF194 http://people.redhat.com/dledford Infiniband specific RPMs available at http://people.redhat.com/dledford/Infiniband --------------enig4EE3AC9ADF5C31DF579B67EA Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEARECAAYFAkvxwLQACgkQg6WylM+/8ZQChgCfWmTFOjnepMDqZT8gVFbA3ndr ibQAnAkq0TVEgGm+CEHqmbO2+Ei8ilEp =snZS -----END PGP SIGNATURE----- --------------enig4EE3AC9ADF5C31DF579B67EA-- From SRS0+eHox+76+fromorbit.com=david@internode.on.net Mon May 17 18:02:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HN2iMu013419 for ; Mon, 17 May 2010 18:02:45 -0500 X-ASG-Debug-ID: 1274137558-6f2701300000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 92AE6145FA87 for ; Mon, 17 May 2010 16:05:59 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id 9NTDVUDoEQOjmGbl for ; Mon, 17 May 2010 16:05:59 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24523501-1927428 for multiple; Tue, 18 May 2010 08:34:55 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OE9Mj-000577-Ia; Tue, 18 May 2010 09:04:53 +1000 Date: Tue, 18 May 2010 09:04:53 +1000 From: Dave Chinner To: Doug Ledford Cc: Rainer Fuegenstein , xfs@oss.sgi.com, linux-raid@vger.kernel.org X-ASG-Orig-Subj: Re: xfs and raid5 - "Structure needs cleaning for directory open" Subject: Re: xfs and raid5 - "Structure needs cleaning for directory open" Message-ID: <20100517230453.GM8120@dastard> References: <20100510022033.GB7165@dastard> <4BF1B4FE.7020503@redhat.com> <20100517214532.GL8120@dastard> <4BF1C0B4.5090009@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <4BF1C0B4.5090009@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1274137560 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.2, rules version 3.2.2.30127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 17, 2010 at 06:18:28PM -0400, Doug Ledford wrote: > On 05/17/2010 05:45 PM, Dave Chinner wrote: > > On Mon, May 17, 2010 at 05:28:30PM -0400, Doug Ledford wrote: > >> On 05/09/2010 10:20 PM, Dave Chinner wrote: > >>> On Sun, May 09, 2010 at 08:48:00PM +0200, Rainer Fuegenstein wrote: > >>>> > >>>> today in the morning some daemon processes terminated because of > >>>> errors in the xfs file system on top of a software raid5, consisting > >>>> of 4*1.5TB WD caviar green SATA disks. > >>> > >>> Reminds me of a recent(-ish) md/dm readahead cancellation fix - that > >>> would fit the symptoms of (btree corruption showing up under heavy IO > >>> load but no corruption on disk. However, I can't seem to find any > >>> references to it at the moment (can't remember the bug title), but > >>> perhaps your distro doesn't have the fix in it? > >>> > >>> Cheers, > >>> > >>> Dave. > >> > >> That sounds plausible, as does hardware error. A memory bit flip under > >> heavy load would cause the in memory data to be corrupt while the on > >> disk data is good. > > > > The data dumps from the bad blocks weren't wrong by a single bit - > > they were unrecogniѕable garbage - so that it very unlikely to be > > a memory erro causing the problem. > > Not true. It can still be a single bit error but a single bit error > higher up in the chain. Aka a single bit error in the scsi command to > read various sectors, then you read in all sorts of wrong data and > everything from there is totally whacked. I didn't say it *couldn't be* a bit error, just it was _very unlikely_. Hardware errors that result only in repeated XFS btree corruption in memory or causing other errors in the system is something I've never seen, even on machines with known bad memory, HBAs, interconnects, etc. Applying Occam's Razor to this case indicates that it is going to be caused by a software problem. Yes, it's still possible that it's a hardware issue, just very, very unlikely. And if it is hardware and you can prove that it was the cause, then I suggest we all buy a lottery ticket.... ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+XsoM+76+fromorbit.com=dave@internode.on.net Mon May 17 18:22:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HNMKLb014368 for ; Mon, 17 May 2010 18:22:20 -0500 X-ASG-Debug-ID: 1274138675-795400f50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B668A13F358F for ; Mon, 17 May 2010 16:24:36 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id ZSYHPmr5GhRD4VGA for ; Mon, 17 May 2010 16:24:36 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24431203-1927428 for ; Tue, 18 May 2010 08:54:35 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OE9fl-00059R-Pi for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:33 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OE9fg-0000RU-Tx for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:28 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 01/12] xfs: Don't reuse the same transaction ID for duplicated transactions. Subject: [PATCH 01/12] xfs: Don't reuse the same transaction ID for duplicated transactions. Date: Tue, 18 May 2010 09:24:17 +1000 Message-Id: <1274138668-1662-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1274138677 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.2, rules version 3.2.2.30127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The transaction ID is written into the log as the unique identifier for transactions during recover. When duplicating a transaction, we reuse the log ticket, which means it has the same transaction ID as the previous transaction. Rather than regenerating a random transaction ID for the duplicated transaction, just add one to the current ID so that duplicated transaction can be easily spotted in the log and during recovery during problem diagnosis. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 3038dd5..687b220 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -360,6 +360,15 @@ xfs_log_reserve( ASSERT(flags & XFS_LOG_PERM_RESERV); internal_ticket = *ticket; + /* + * this is a new transaction on the ticket, so we need to + * change the transaction ID so that the next transaction has a + * different TID in the log. Just add one to the existing tid + * so that we can see chains of rolling transactions in the log + * easily. + */ + internal_ticket->t_tid++; + trace_xfs_log_reserve(log, internal_ticket); xlog_grant_push_ail(mp, internal_ticket->t_unit_res); -- 1.5.6.5 From SRS0+hxhx+76+fromorbit.com=dave@internode.on.net Mon May 17 18:22:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HNMKla014367 for ; Mon, 17 May 2010 18:22:20 -0500 X-ASG-Debug-ID: 1274138734-6f3101e90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 81CB79C4D46 for ; Mon, 17 May 2010 16:25:35 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id xsQV0PVWwK1DTSiZ for ; Mon, 17 May 2010 16:25:35 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24605596-1927428 for ; Tue, 18 May 2010 08:54:35 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OE9fm-00059b-3O for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:34 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OE9fh-0000Rg-7n for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:29 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 05/12] xfs: clean up log ticket overrun debug output Subject: [PATCH 05/12] xfs: clean up log ticket overrun debug output Date: Tue, 18 May 2010 09:24:21 +1000 Message-Id: <1274138668-1662-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1274138736 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.2, rules version 3.2.2.30127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Push the error message output when a ticket overrun is detected into the ticket printing functions. Also remove the debug version of the code as the production version will still panic just as effectively on a debug kernel via the panic mask being set. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_error.c | 2 +- fs/xfs/xfs_log.c | 19 +++++-------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index ef96175..047b8a8 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -170,7 +170,7 @@ xfs_cmn_err(int panic_tag, int level, xfs_mount_t *mp, char *fmt, ...) va_list ap; #ifdef DEBUG - xfs_panic_mask |= XFS_PTAG_SHUTDOWN_CORRUPT; + xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES); #endif if (xfs_panic_mask && (xfs_panic_mask & panic_tag) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 83be6a6..1efb303 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1645,6 +1645,10 @@ xlog_print_tic_res(xfs_mount_t *mp, xlog_ticket_t *ticket) "bad-rtype" : res_type_str[r_type-1]), ticket->t_res_arr[i].r_len); } + + xfs_cmn_err(XFS_PTAG_LOGRES, CE_ALERT, mp, + "xfs_log_write: reservation ran out. Need to up reservation"); + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); } /* @@ -1897,21 +1901,8 @@ xlog_write( *start_lsn = 0; len = xlog_write_calc_vec_length(ticket, log_vector); - if (ticket->t_curr_res < len) { + if (ticket->t_curr_res < len) xlog_print_tic_res(log->l_mp, ticket); -#ifdef DEBUG - xlog_panic( - "xfs_log_write: reservation ran out. Need to up reservation"); -#else - /* Customer configurable panic */ - xfs_cmn_err(XFS_PTAG_LOGRES, CE_ALERT, log->l_mp, - "xfs_log_write: reservation ran out. Need to up reservation"); - - /* If we did not panic, shutdown the filesystem */ - xfs_force_shutdown(log->l_mp, SHUTDOWN_CORRUPT_INCORE); -#endif - } - ticket->t_curr_res -= len; index = 0; -- 1.5.6.5 From SRS0+9z3f+76+fromorbit.com=dave@internode.on.net Mon May 17 18:22:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-3.8 required=5.0 tests=BAYES_00,FRT_ADOBE2, J_CHICKENPOX_64,J_CHICKENPOX_65,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HNMLtL014383 for ; Mon, 17 May 2010 18:22:21 -0500 X-ASG-Debug-ID: 1274138676-674d00ec0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7195A3536BE for ; Mon, 17 May 2010 16:24:37 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id Hf9BfyotMIN4AwAl for ; Mon, 17 May 2010 16:24:37 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24560327-1927428 for ; Tue, 18 May 2010 08:54:35 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OE9fm-00059X-1e for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:34 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OE9fh-0000Rc-41 for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:29 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 04/12] xfs: Clean up XFS_BLI_* flag namespace Subject: [PATCH 04/12] xfs: Clean up XFS_BLI_* flag namespace Date: Tue, 18 May 2010 09:24:20 +1000 Message-Id: <1274138668-1662-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1274138678 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.2, rules version 3.2.2.30127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Clean up the buffer log format (XFS_BLI_*) flags because they have a polluted namespace. They XFS_BLI_ prefix is used for both in-memory and on-disk flag feilds, but have overlapping values for different flags. Rename the buffer log format flags to use the XFS_BLF_* prefix to avoid confusing them with the in-memory XFS_BLI_* prefixed flags. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_super.c | 2 +- fs/xfs/quota/xfs_dquot.c | 6 ++-- fs/xfs/xfs_buf_item.c | 42 +++++++++++++++++++------------------- fs/xfs/xfs_buf_item.h | 14 ++++++------ fs/xfs/xfs_log_recover.c | 46 +++++++++++++++++++++--------------------- fs/xfs/xfs_log_recover.h | 2 +- fs/xfs/xfs_trans_buf.c | 28 ++++++++++++------------ 7 files changed, 70 insertions(+), 70 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index a43d09e..1e88c98 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1753,7 +1753,7 @@ xfs_init_zones(void) * but it is much faster. */ xfs_buf_item_zone = kmem_zone_init((sizeof(xfs_buf_log_item_t) + - (((XFS_MAX_BLOCKSIZE / XFS_BLI_CHUNK) / + (((XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK) / NBWORD) * sizeof(int))), "xfs_buf_item"); if (!xfs_buf_item_zone) goto out_destroy_trans_zone; diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index b89ec5d..585e763 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -344,9 +344,9 @@ xfs_qm_init_dquot_blk( for (i = 0; i < q->qi_dqperchunk; i++, d++, curid++) xfs_qm_dqinit_core(curid, type, d); xfs_trans_dquot_buf(tp, bp, - (type & XFS_DQ_USER ? XFS_BLI_UDQUOT_BUF : - ((type & XFS_DQ_PROJ) ? XFS_BLI_PDQUOT_BUF : - XFS_BLI_GDQUOT_BUF))); + (type & XFS_DQ_USER ? XFS_BLF_UDQUOT_BUF : + ((type & XFS_DQ_PROJ) ? XFS_BLF_PDQUOT_BUF : + XFS_BLF_GDQUOT_BUF))); xfs_trans_log_buf(tp, bp, 0, BBTOB(q->qi_dqchunklen) - 1); } diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 4cd5f61..bcbb661 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -64,7 +64,7 @@ xfs_buf_item_log_debug( nbytes = last - first + 1; bfset(bip->bli_logged, first, nbytes); for (x = 0; x < nbytes; x++) { - chunk_num = byte >> XFS_BLI_SHIFT; + chunk_num = byte >> XFS_BLF_SHIFT; word_num = chunk_num >> BIT_TO_WORD_SHIFT; bit_num = chunk_num & (NBWORD - 1); wordp = &(bip->bli_format.blf_data_map[word_num]); @@ -166,7 +166,7 @@ xfs_buf_item_size( * cancel flag in it. */ trace_xfs_buf_item_size_stale(bip); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); return 1; } @@ -197,9 +197,9 @@ xfs_buf_item_size( } else if (next_bit != last_bit + 1) { last_bit = next_bit; nvecs++; - } else if (xfs_buf_offset(bp, next_bit * XFS_BLI_CHUNK) != - (xfs_buf_offset(bp, last_bit * XFS_BLI_CHUNK) + - XFS_BLI_CHUNK)) { + } else if (xfs_buf_offset(bp, next_bit * XFS_BLF_CHUNK) != + (xfs_buf_offset(bp, last_bit * XFS_BLF_CHUNK) + + XFS_BLF_CHUNK)) { last_bit = next_bit; nvecs++; } else { @@ -261,7 +261,7 @@ xfs_buf_item_format( * cancel flag in it. */ trace_xfs_buf_item_format_stale(bip); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); bip->bli_format.blf_size = nvecs; return; } @@ -294,28 +294,28 @@ xfs_buf_item_format( * keep counting and scanning. */ if (next_bit == -1) { - buffer_offset = first_bit * XFS_BLI_CHUNK; + buffer_offset = first_bit * XFS_BLF_CHUNK; vecp->i_addr = xfs_buf_offset(bp, buffer_offset); - vecp->i_len = nbits * XFS_BLI_CHUNK; + vecp->i_len = nbits * XFS_BLF_CHUNK; vecp->i_type = XLOG_REG_TYPE_BCHUNK; nvecs++; break; } else if (next_bit != last_bit + 1) { - buffer_offset = first_bit * XFS_BLI_CHUNK; + buffer_offset = first_bit * XFS_BLF_CHUNK; vecp->i_addr = xfs_buf_offset(bp, buffer_offset); - vecp->i_len = nbits * XFS_BLI_CHUNK; + vecp->i_len = nbits * XFS_BLF_CHUNK; vecp->i_type = XLOG_REG_TYPE_BCHUNK; nvecs++; vecp++; first_bit = next_bit; last_bit = next_bit; nbits = 1; - } else if (xfs_buf_offset(bp, next_bit << XFS_BLI_SHIFT) != - (xfs_buf_offset(bp, last_bit << XFS_BLI_SHIFT) + - XFS_BLI_CHUNK)) { - buffer_offset = first_bit * XFS_BLI_CHUNK; + } else if (xfs_buf_offset(bp, next_bit << XFS_BLF_SHIFT) != + (xfs_buf_offset(bp, last_bit << XFS_BLF_SHIFT) + + XFS_BLF_CHUNK)) { + buffer_offset = first_bit * XFS_BLF_CHUNK; vecp->i_addr = xfs_buf_offset(bp, buffer_offset); - vecp->i_len = nbits * XFS_BLI_CHUNK; + vecp->i_len = nbits * XFS_BLF_CHUNK; vecp->i_type = XLOG_REG_TYPE_BCHUNK; /* You would think we need to bump the nvecs here too, but we do not * this number is used by recovery, and it gets confused by the boundary @@ -399,7 +399,7 @@ xfs_buf_item_unpin( ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); ASSERT(!(XFS_BUF_ISDELAYWRITE(bp))); ASSERT(XFS_BUF_ISSTALE(bp)); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); trace_xfs_buf_item_unpin_stale(bip); /* @@ -550,7 +550,7 @@ xfs_buf_item_unlock( */ if (bip->bli_flags & XFS_BLI_STALE) { trace_xfs_buf_item_unlock_stale(bip); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); if (!aborted) { atomic_dec(&bip->bli_refcount); return; @@ -707,12 +707,12 @@ xfs_buf_item_init( } /* - * chunks is the number of XFS_BLI_CHUNK size pieces + * chunks is the number of XFS_BLF_CHUNK size pieces * the buffer can be divided into. Make sure not to * truncate any pieces. map_size is the size of the * bitmap needed to describe the chunks of the buffer. */ - chunks = (int)((XFS_BUF_COUNT(bp) + (XFS_BLI_CHUNK - 1)) >> XFS_BLI_SHIFT); + chunks = (int)((XFS_BUF_COUNT(bp) + (XFS_BLF_CHUNK - 1)) >> XFS_BLF_SHIFT); map_size = (int)((chunks + NBWORD) >> BIT_TO_WORD_SHIFT); bip = (xfs_buf_log_item_t*)kmem_zone_zalloc(xfs_buf_item_zone, @@ -780,8 +780,8 @@ xfs_buf_item_log( /* * Convert byte offsets to bit numbers. */ - first_bit = first >> XFS_BLI_SHIFT; - last_bit = last >> XFS_BLI_SHIFT; + first_bit = first >> XFS_BLF_SHIFT; + last_bit = last >> XFS_BLF_SHIFT; /* * Calculate the total number of bits to be set. diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index df44545..8cbb82b 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -41,22 +41,22 @@ typedef struct xfs_buf_log_format { * This flag indicates that the buffer contains on disk inodes * and requires special recovery handling. */ -#define XFS_BLI_INODE_BUF 0x1 +#define XFS_BLF_INODE_BUF 0x1 /* * This flag indicates that the buffer should not be replayed * during recovery because its blocks are being freed. */ -#define XFS_BLI_CANCEL 0x2 +#define XFS_BLF_CANCEL 0x2 /* * This flag indicates that the buffer contains on disk * user or group dquots and may require special recovery handling. */ -#define XFS_BLI_UDQUOT_BUF 0x4 -#define XFS_BLI_PDQUOT_BUF 0x8 -#define XFS_BLI_GDQUOT_BUF 0x10 +#define XFS_BLF_UDQUOT_BUF 0x4 +#define XFS_BLF_PDQUOT_BUF 0x8 +#define XFS_BLF_GDQUOT_BUF 0x10 -#define XFS_BLI_CHUNK 128 -#define XFS_BLI_SHIFT 7 +#define XFS_BLF_CHUNK 128 +#define XFS_BLF_SHIFT 7 #define BIT_TO_WORD_SHIFT 5 #define NBWORD (NBBY * sizeof(unsigned int)) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 0de08e3..14a69ae 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1576,7 +1576,7 @@ xlog_recover_reorder_trans( switch (ITEM_TYPE(item)) { case XFS_LI_BUF: - if (!(buf_f->blf_flags & XFS_BLI_CANCEL)) { + if (!(buf_f->blf_flags & XFS_BLF_CANCEL)) { trace_xfs_log_recover_item_reorder_head(log, trans, item, pass); list_move(&item->ri_list, &trans->r_itemq); @@ -1638,7 +1638,7 @@ xlog_recover_do_buffer_pass1( /* * If this isn't a cancel buffer item, then just return. */ - if (!(flags & XFS_BLI_CANCEL)) { + if (!(flags & XFS_BLF_CANCEL)) { trace_xfs_log_recover_buf_not_cancel(log, buf_f); return; } @@ -1696,7 +1696,7 @@ xlog_recover_do_buffer_pass1( * Check to see whether the buffer being recovered has a corresponding * entry in the buffer cancel record table. If it does then return 1 * so that it will be cancelled, otherwise return 0. If the buffer is - * actually a buffer cancel item (XFS_BLI_CANCEL is set), then decrement + * actually a buffer cancel item (XFS_BLF_CANCEL is set), then decrement * the refcount on the entry in the table and remove it from the table * if this is the last reference. * @@ -1721,7 +1721,7 @@ xlog_check_buffer_cancelled( * There is nothing in the table built in pass one, * so this buffer must not be cancelled. */ - ASSERT(!(flags & XFS_BLI_CANCEL)); + ASSERT(!(flags & XFS_BLF_CANCEL)); return 0; } @@ -1733,7 +1733,7 @@ xlog_check_buffer_cancelled( * There is no corresponding entry in the table built * in pass one, so this buffer has not been cancelled. */ - ASSERT(!(flags & XFS_BLI_CANCEL)); + ASSERT(!(flags & XFS_BLF_CANCEL)); return 0; } @@ -1752,7 +1752,7 @@ xlog_check_buffer_cancelled( * one in the table and remove it if this is the * last reference. */ - if (flags & XFS_BLI_CANCEL) { + if (flags & XFS_BLF_CANCEL) { bcp->bc_refcount--; if (bcp->bc_refcount == 0) { if (prevp == NULL) { @@ -1772,7 +1772,7 @@ xlog_check_buffer_cancelled( * We didn't find a corresponding entry in the table, so * return 0 so that the buffer is NOT cancelled. */ - ASSERT(!(flags & XFS_BLI_CANCEL)); + ASSERT(!(flags & XFS_BLF_CANCEL)); return 0; } @@ -1874,8 +1874,8 @@ xlog_recover_do_inode_buffer( nbits = xfs_contig_bits(data_map, map_size, bit); ASSERT(nbits > 0); - reg_buf_offset = bit << XFS_BLI_SHIFT; - reg_buf_bytes = nbits << XFS_BLI_SHIFT; + reg_buf_offset = bit << XFS_BLF_SHIFT; + reg_buf_bytes = nbits << XFS_BLF_SHIFT; item_index++; } @@ -1889,7 +1889,7 @@ xlog_recover_do_inode_buffer( } ASSERT(item->ri_buf[item_index].i_addr != NULL); - ASSERT((item->ri_buf[item_index].i_len % XFS_BLI_CHUNK) == 0); + ASSERT((item->ri_buf[item_index].i_len % XFS_BLF_CHUNK) == 0); ASSERT((reg_buf_offset + reg_buf_bytes) <= XFS_BUF_COUNT(bp)); /* @@ -1955,9 +1955,9 @@ xlog_recover_do_reg_buffer( nbits = xfs_contig_bits(data_map, map_size, bit); ASSERT(nbits > 0); ASSERT(item->ri_buf[i].i_addr != NULL); - ASSERT(item->ri_buf[i].i_len % XFS_BLI_CHUNK == 0); + ASSERT(item->ri_buf[i].i_len % XFS_BLF_CHUNK == 0); ASSERT(XFS_BUF_COUNT(bp) >= - ((uint)bit << XFS_BLI_SHIFT)+(nbits<blf_flags & - (XFS_BLI_UDQUOT_BUF|XFS_BLI_PDQUOT_BUF|XFS_BLI_GDQUOT_BUF)) { + (XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) { if (item->ri_buf[i].i_addr == NULL) { cmn_err(CE_ALERT, "XFS: NULL dquot in %s.", __func__); @@ -1987,9 +1987,9 @@ xlog_recover_do_reg_buffer( } memcpy(xfs_buf_offset(bp, - (uint)bit << XFS_BLI_SHIFT), /* dest */ + (uint)bit << XFS_BLF_SHIFT), /* dest */ item->ri_buf[i].i_addr, /* source */ - nbits<blf_flags & XFS_BLI_UDQUOT_BUF) + if (buf_f->blf_flags & XFS_BLF_UDQUOT_BUF) type |= XFS_DQ_USER; - if (buf_f->blf_flags & XFS_BLI_PDQUOT_BUF) + if (buf_f->blf_flags & XFS_BLF_PDQUOT_BUF) type |= XFS_DQ_PROJ; - if (buf_f->blf_flags & XFS_BLI_GDQUOT_BUF) + if (buf_f->blf_flags & XFS_BLF_GDQUOT_BUF) type |= XFS_DQ_GROUP; /* * This type of quotas was turned off, so ignore this buffer @@ -2173,7 +2173,7 @@ xlog_recover_do_dquot_buffer( * here which overlaps that may be stale. * * When meta-data buffers are freed at run time we log a buffer item - * with the XFS_BLI_CANCEL bit set to indicate that previous copies + * with the XFS_BLF_CANCEL bit set to indicate that previous copies * of the buffer in the log should not be replayed at recovery time. * This is so that if the blocks covered by the buffer are reused for * file data before we crash we don't end up replaying old, freed @@ -2207,7 +2207,7 @@ xlog_recover_do_buffer_trans( if (pass == XLOG_RECOVER_PASS1) { /* * In this pass we're only looking for buf items - * with the XFS_BLI_CANCEL bit set. + * with the XFS_BLF_CANCEL bit set. */ xlog_recover_do_buffer_pass1(log, buf_f); return 0; @@ -2244,7 +2244,7 @@ xlog_recover_do_buffer_trans( mp = log->l_mp; buf_flags = XBF_LOCK; - if (!(flags & XFS_BLI_INODE_BUF)) + if (!(flags & XFS_BLF_INODE_BUF)) buf_flags |= XBF_MAPPED; bp = xfs_buf_read(mp->m_ddev_targp, blkno, len, buf_flags); @@ -2257,10 +2257,10 @@ xlog_recover_do_buffer_trans( } error = 0; - if (flags & XFS_BLI_INODE_BUF) { + if (flags & XFS_BLF_INODE_BUF) { error = xlog_recover_do_inode_buffer(mp, item, bp, buf_f); } else if (flags & - (XFS_BLI_UDQUOT_BUF|XFS_BLI_PDQUOT_BUF|XFS_BLI_GDQUOT_BUF)) { + (XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) { xlog_recover_do_dquot_buffer(mp, log, item, bp, buf_f); } else { xlog_recover_do_reg_buffer(mp, item, bp, buf_f); diff --git a/fs/xfs/xfs_log_recover.h b/fs/xfs/xfs_log_recover.h index 75d7492..1c55ccb 100644 --- a/fs/xfs/xfs_log_recover.h +++ b/fs/xfs/xfs_log_recover.h @@ -28,7 +28,7 @@ #define XLOG_RHASH(tid) \ ((((__uint32_t)tid)>>XLOG_RHASH_SHIFT) & (XLOG_RHASH_SIZE-1)) -#define XLOG_MAX_REGIONS_IN_ITEM (XFS_MAX_BLOCKSIZE / XFS_BLI_CHUNK / 2 + 1) +#define XLOG_MAX_REGIONS_IN_ITEM (XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK / 2 + 1) /* diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 9cd8090..3390c3e 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -114,7 +114,7 @@ _xfs_trans_bjoin( xfs_buf_item_init(bp, tp->t_mountp); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(!(bip->bli_flags & XFS_BLI_LOGGED)); if (reset_recur) bip->bli_recur = 0; @@ -511,7 +511,7 @@ xfs_trans_brelse(xfs_trans_t *tp, bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(bip->bli_item.li_type == XFS_LI_BUF); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(atomic_read(&bip->bli_refcount) > 0); /* @@ -619,7 +619,7 @@ xfs_trans_bhold(xfs_trans_t *tp, bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(atomic_read(&bip->bli_refcount) > 0); bip->bli_flags |= XFS_BLI_HOLD; trace_xfs_trans_bhold(bip); @@ -641,7 +641,7 @@ xfs_trans_bhold_release(xfs_trans_t *tp, bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT(bip->bli_flags & XFS_BLI_HOLD); bip->bli_flags &= ~XFS_BLI_HOLD; @@ -704,7 +704,7 @@ xfs_trans_log_buf(xfs_trans_t *tp, bip->bli_flags &= ~XFS_BLI_STALE; ASSERT(XFS_BUF_ISSTALE(bp)); XFS_BUF_UNSTALE(bp); - bip->bli_format.blf_flags &= ~XFS_BLI_CANCEL; + bip->bli_format.blf_flags &= ~XFS_BLF_CANCEL; } lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); @@ -762,8 +762,8 @@ xfs_trans_binval( ASSERT(!(XFS_BUF_ISDELAYWRITE(bp))); ASSERT(XFS_BUF_ISSTALE(bp)); ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); - ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_INODE_BUF)); - ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); + ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_INODE_BUF)); + ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); ASSERT(lidp->lid_flags & XFS_LID_DIRTY); ASSERT(tp->t_flags & XFS_TRANS_DIRTY); return; @@ -774,7 +774,7 @@ xfs_trans_binval( * in the buf log item. The STALE flag will be used in * xfs_buf_item_unpin() to determine if it should clean up * when the last reference to the buf item is given up. - * We set the XFS_BLI_CANCEL flag in the buf log format structure + * We set the XFS_BLF_CANCEL flag in the buf log format structure * and log the buf item. This will be used at recovery time * to determine that copies of the buffer in the log before * this should not be replayed. @@ -793,8 +793,8 @@ xfs_trans_binval( XFS_BUF_STALE(bp); bip->bli_flags |= XFS_BLI_STALE; bip->bli_flags &= ~(XFS_BLI_LOGGED | XFS_BLI_DIRTY); - bip->bli_format.blf_flags &= ~XFS_BLI_INODE_BUF; - bip->bli_format.blf_flags |= XFS_BLI_CANCEL; + bip->bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; + bip->bli_format.blf_flags |= XFS_BLF_CANCEL; memset((char *)(bip->bli_format.blf_data_map), 0, (bip->bli_format.blf_map_size * sizeof(uint))); lidp->lid_flags |= XFS_LID_DIRTY; @@ -826,7 +826,7 @@ xfs_trans_inode_buf( bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(atomic_read(&bip->bli_refcount) > 0); - bip->bli_format.blf_flags |= XFS_BLI_INODE_BUF; + bip->bli_format.blf_flags |= XFS_BLF_INODE_BUF; } /* @@ -908,9 +908,9 @@ xfs_trans_dquot_buf( ASSERT(XFS_BUF_ISBUSY(bp)); ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); - ASSERT(type == XFS_BLI_UDQUOT_BUF || - type == XFS_BLI_PDQUOT_BUF || - type == XFS_BLI_GDQUOT_BUF); + ASSERT(type == XFS_BLF_UDQUOT_BUF || + type == XFS_BLF_PDQUOT_BUF || + type == XFS_BLF_GDQUOT_BUF); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(atomic_read(&bip->bli_refcount) > 0); -- 1.5.6.5 From SRS0+ZzTJ+76+fromorbit.com=dave@internode.on.net Mon May 17 18:22:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HNMUkI014417 for ; Mon, 17 May 2010 18:22:30 -0500 X-ASG-Debug-ID: 1274138745-6f2101c10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D96439C4D48 for ; Mon, 17 May 2010 16:25:45 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id yDq5G1lXWsWbY0a6 for ; Mon, 17 May 2010 16:25:45 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24466475-1927428 for ; Tue, 18 May 2010 08:54:45 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OE9fl-00059S-SH for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:33 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OE9fg-0000RW-W6 for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:28 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 02/12] xfs: allow log ticket allocation to take allocation flags Subject: [PATCH 02/12] xfs: allow log ticket allocation to take allocation flags Date: Tue, 18 May 2010 09:24:18 +1000 Message-Id: <1274138668-1662-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1274138746 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.2, rules version 3.2.2.30127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Delayed logging currently requires ticket allocation to succeed, so we need to be able to sleep on allocation. It also should not allow memory allocation to recurse into the filesystem. hence we need to pass allocation flags directing the type of allocation the caller requires. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 687b220..83be6a6 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -88,11 +88,9 @@ STATIC void xlog_ungrant_log_space(xlog_t *log, /* local ticket functions */ -STATIC xlog_ticket_t *xlog_ticket_alloc(xlog_t *log, - int unit_bytes, - int count, - char clientid, - uint flags); +STATIC xlog_ticket_t *xlog_ticket_alloc(xlog_t *log, int unit_bytes, int count, + char clientid, uint flags, + int alloc_flags); #if defined(DEBUG) STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr); @@ -376,7 +374,8 @@ xfs_log_reserve( } else { /* may sleep if need to allocate more tickets */ internal_ticket = xlog_ticket_alloc(log, unit_bytes, cnt, - client, flags); + client, flags, + KM_SLEEP|KM_MAYFAIL); if (!internal_ticket) return XFS_ERROR(ENOMEM); internal_ticket->t_trans_type = t_type; @@ -3331,13 +3330,14 @@ xlog_ticket_alloc( int unit_bytes, int cnt, char client, - uint xflags) + uint xflags, + int alloc_flags) { struct xlog_ticket *tic; uint num_headers; int iclog_space; - tic = kmem_zone_zalloc(xfs_log_ticket_zone, KM_SLEEP|KM_MAYFAIL); + tic = kmem_zone_zalloc(xfs_log_ticket_zone, alloc_flags); if (!tic) return NULL; -- 1.5.6.5 From SRS0+hxhx+76+fromorbit.com=dave@internode.on.net Mon May 17 18:22:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HNMTFi014413 for ; Mon, 17 May 2010 18:22:29 -0500 X-ASG-Debug-ID: 1274138744-6f2901d30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4CAAF9C4D48 for ; Mon, 17 May 2010 16:25:45 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id WNLa5MA7kJEHILHZ for ; Mon, 17 May 2010 16:25:45 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24605609-1927428 for ; Tue, 18 May 2010 08:54:45 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OE9fl-00059Q-PI for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:33 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OE9fg-0000RQ-S7 for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:28 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/12] xfs: delayed logging V6 Subject: [PATCH 0/12] xfs: delayed logging V6 Date: Tue, 18 May 2010 09:24:16 +1000 Message-Id: <1274138668-1662-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1274138746 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-ASG-Whitelist: BODY (http://marc\.info/\?) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Folks, This is version 6 of the delayed logging series and is the first release candidate for incluѕion in the xfs-dev tree and 2.6.35-rc1. I won't repeat everything about what it is, just point you here: http://marc.info/?l=linux-xfs&m=126862777118946&w=2 for the description, and here: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/xfs.git delayed-logging for the current code. Note that this is a rebased branch, so you'll need to pull it again into a new branch to review. This version addresses review comments made to version 5. The patch series follows this mail to make it easier for people to respond to specific pieces of the code during review. I'm still making the entire patch set available through git, though. The changes are mostly small and isolated, so there isn't much change from the previous version: Version 6: 27 files changed, 2396 insertions(+), 512 deletions(-) Version 5: 27 files changed, 2457 insertions(+), 513 deletions(-) Version 4: 26 files changed, 2351 insertions(+), 510 deletions(-) Version 3: 28 files changed, 2366 insertions(+), 506 deletions(-) Version 2: 22 files changed, 2188 insertions(+), 377 deletions(-) Version 1: 19 files changed, 2594 insertions(+), 580 deletions(-) Changes for V6: o removed unneeded includes from busy extent changes that weren't completely cleaned up in v5. o moved xlog_tid_t definition to correct patch. o move transaction formatting into xlog_cil_format_items() to remove unbalanced use of CIL context lock during transaction commit. o move transaction freeing on successful commit to xfs_trans_commit_cil to avoid the need to export xfs_trans_free o cleanup xlog_cil_push exit paths o don't block xlog_cil_push waiting for context lock on background flushes o removed debugging help from inode allocation buffer patch Changes for V5: o fixed many typos in the desgin documentation - thanks to Nathan Scott for proof reading it. :) o found another transaction assert failure - un-reverting the change to transaction ID matching as the reason it avoided the assert failures is now known. (new commit for exporting the ticket ID). o added lots of comments explaining the reason for needing transaction ID matching w/ delayed logging. o added transaction ID to busy extent tracing o added overlap detection in busy extent inserts Changes for V4: o fixes duplicate transaction IDs on rolling transactions (new commit) o folded in a busy extent freeing cleanup from Christoph Hellwig o made API prefix consistent (xfs_alloc_busy_*) o combined xfs_alloc_mark_busy and xfs_alloc_busy_insert o reverted back to tracking transaction pointers in busy extents o removed exporting of transaction ID for busy extents o fixed an off-by-one in the extent range match in the busy extent search code that has been triggering assert failures o use list_splice_init() when splicing busy extents from the transaction to the checkpoint context to ensure we don't get transactions thinking they have busy extents to free after we've already attached them to the checkpoint. Changes for V3: o changed buffer log item reference counted model to be consistent for both logging modes o cleaned up XFS_BLI flags usage (new commit) o separated out log ticket overrun printing cleanup (new commit) o made sure "delaylog" option shows up in /proc/mounts o collapsed many of the intermediate commits together to make it easier to review o fixed inode buffer tagging issue that was causing shutdowns in log recovery in test 087 and 121 Changes for V2: o 22 files changed, 2188 insertions(+), 377 deletions(-) o fixed some memory leaks o fixed ticket allocation for checkpoints to use KM_NOFS o minor code cleanups o performed stress and scalability testing The following changes since commit 6ff75b78182c314112c1173edaab6c164c95d775: Christoph Hellwig (1): xfs: mark xfs_iomap_write_ helpers static are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/xfs.git delayed-logging Dave Chinner (12): xfs: Don't reuse the same transaction ID for duplicated transactions. xfs: allow log ticket allocation to take allocation flags xfs: modify buffer item reference counting xfs: Clean up XFS_BLI_* flag namespace xfs: clean up log ticket overrun debug output xfs: make the log ticket ID available outside the log infrastructure xfs: Improve scalability of busy extent tracking xfs: Delayed logging design documentation xfs: Introduce delayed logging core code xfs: forced unmounts need to push the CIL xfs: enable background pushing of the CIL xfs: Ensure inode allocation buffers are fully replayed .../filesystems/xfs-delayed-logging-design.txt | 819 ++++++++++++++++++++ fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_buf.c | 9 + fs/xfs/linux-2.6/xfs_quotaops.c | 1 + fs/xfs/linux-2.6/xfs_super.c | 12 +- fs/xfs/linux-2.6/xfs_trace.h | 83 ++- fs/xfs/quota/xfs_dquot.c | 6 +- fs/xfs/xfs_ag.h | 24 +- fs/xfs/xfs_alloc.c | 364 +++++++--- fs/xfs/xfs_alloc.h | 7 +- fs/xfs/xfs_alloc_btree.c | 2 +- fs/xfs/xfs_buf_item.c | 166 ++-- fs/xfs/xfs_buf_item.h | 18 +- fs/xfs/xfs_error.c | 2 +- fs/xfs/xfs_log.c | 120 +++- fs/xfs/xfs_log.h | 14 +- fs/xfs/xfs_log_cil.c | 726 +++++++++++++++++ fs/xfs/xfs_log_priv.h | 118 +++- fs/xfs/xfs_log_recover.c | 46 +- fs/xfs/xfs_log_recover.h | 2 +- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 146 +++- fs/xfs/xfs_trans.h | 44 +- fs/xfs/xfs_trans_buf.c | 46 +- fs/xfs/xfs_trans_item.c | 114 +--- fs/xfs/xfs_trans_priv.h | 15 +- fs/xfs/xfs_types.h | 2 + 27 files changed, 2396 insertions(+), 512 deletions(-) create mode 100644 Documentation/filesystems/xfs-delayed-logging-design.txt create mode 100644 fs/xfs/xfs_log_cil.c From SRS0+ERSN+76+fromorbit.com=dave@internode.on.net Mon May 17 18:22:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HNMUhs014425 for ; Mon, 17 May 2010 18:22:30 -0500 X-ASG-Debug-ID: 1274138686-794700e90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C798013F3591 for ; Mon, 17 May 2010 16:24:46 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id ErGM8bmrhCZPe4hy for ; Mon, 17 May 2010 16:24:46 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24730565-1927428 for ; Tue, 18 May 2010 08:54:45 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OE9fv-00059T-Tx for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:43 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OE9fh-0000RZ-29 for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:29 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 03/12] xfs: modify buffer item reference counting Subject: [PATCH 03/12] xfs: modify buffer item reference counting Date: Tue, 18 May 2010 09:24:19 +1000 Message-Id: <1274138668-1662-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1274138687 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.2, rules version 3.2.2.30127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The buffer log item reference counts used to take referenceѕ for every transaction, similar to the pin counting. This is symmetric (like the pin/unpin) with respect to transaction completion, but with dleayed logging becomes assymetric as the pinning becomes assymetric w.r.t. transaction completion. To make both cases the same, allow the buffer pinning to take a reference to the buffer log item and always drop the reference the transaction has on it when being unlocked. This is balanced correctly because the unpin operation always drops a reference to the log item. Hence reference counting becomes symmetric w.r.t. item pinning as well as w.r.t active transactions and as a result the reference counting model remain consistent between normal and delayed logging. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_buf_item.c | 110 ++++++++++++++++++++++-------------------------- 1 files changed, 50 insertions(+), 60 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 240340a..4cd5f61 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -341,10 +341,15 @@ xfs_buf_item_format( } /* - * This is called to pin the buffer associated with the buf log - * item in memory so it cannot be written out. Simply call bpin() - * on the buffer to do this. + * This is called to pin the buffer associated with the buf log item in memory + * so it cannot be written out. Simply call bpin() on the buffer to do this. + * + * We also always take a reference to the buffer log item here so that the bli + * is held while the item is pinned in memory. This means that we can + * unconditionally drop the reference count a transaction holds when the + * transaction is completed. */ + STATIC void xfs_buf_item_pin( xfs_buf_log_item_t *bip) @@ -356,6 +361,7 @@ xfs_buf_item_pin( ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT((bip->bli_flags & XFS_BLI_LOGGED) || (bip->bli_flags & XFS_BLI_STALE)); + atomic_inc(&bip->bli_refcount); trace_xfs_buf_item_pin(bip); xfs_bpin(bp); } @@ -489,20 +495,23 @@ xfs_buf_item_trylock( } /* - * Release the buffer associated with the buf log item. - * If there is no dirty logged data associated with the - * buffer recorded in the buf log item, then free the - * buf log item and remove the reference to it in the - * buffer. + * Release the buffer associated with the buf log item. If there is no dirty + * logged data associated with the buffer recorded in the buf log item, then + * free the buf log item and remove the reference to it in the buffer. * - * This call ignores the recursion count. It is only called - * when the buffer should REALLY be unlocked, regardless - * of the recursion count. + * This call ignores the recursion count. It is only called when the buffer + * should REALLY be unlocked, regardless of the recursion count. * - * If the XFS_BLI_HOLD flag is set in the buf log item, then - * free the log item if necessary but do not unlock the buffer. - * This is for support of xfs_trans_bhold(). Make sure the - * XFS_BLI_HOLD field is cleared if we don't free the item. + * We unconditionally drop the transaction's reference to the log item. If the + * item was logged, then another reference was taken when it was pinned, so we + * can safely drop the transaction reference now. This also allows us to avoid + * potential races with the unpin code freeing the bli by not referencing the + * bli after we've dropped the reference count. + * + * If the XFS_BLI_HOLD flag is set in the buf log item, then free the log item + * if necessary but do not unlock the buffer. This is for support of + * xfs_trans_bhold(). Make sure the XFS_BLI_HOLD field is cleared if we don't + * free the item. */ STATIC void xfs_buf_item_unlock( @@ -514,73 +523,54 @@ xfs_buf_item_unlock( bp = bip->bli_buf; - /* - * Clear the buffer's association with this transaction. - */ + /* Clear the buffer's association with this transaction. */ XFS_BUF_SET_FSPRIVATE2(bp, NULL); /* - * If this is a transaction abort, don't return early. - * Instead, allow the brelse to happen. - * Normally it would be done for stale (cancelled) buffers - * at unpin time, but we'll never go through the pin/unpin - * cycle if we abort inside commit. + * If this is a transaction abort, don't return early. Instead, allow + * the brelse to happen. Normally it would be done for stale + * (cancelled) buffers at unpin time, but we'll never go through the + * pin/unpin cycle if we abort inside commit. */ aborted = (bip->bli_item.li_flags & XFS_LI_ABORTED) != 0; /* - * If the buf item is marked stale, then don't do anything. - * We'll unlock the buffer and free the buf item when the - * buffer is unpinned for the last time. + * Before possibly freeing the buf item, determine if we should + * release the buffer at the end of this routine. + */ + hold = bip->bli_flags & XFS_BLI_HOLD; + + /* Clear the per transaction state. */ + bip->bli_flags &= ~(XFS_BLI_LOGGED | XFS_BLI_HOLD); + + /* + * If the buf item is marked stale, then don't do anything. We'll + * unlock the buffer and free the buf item when the buffer is unpinned + * for the last time. */ if (bip->bli_flags & XFS_BLI_STALE) { - bip->bli_flags &= ~XFS_BLI_LOGGED; trace_xfs_buf_item_unlock_stale(bip); ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); - if (!aborted) + if (!aborted) { + atomic_dec(&bip->bli_refcount); return; + } } - /* - * Drop the transaction's reference to the log item if - * it was not logged as part of the transaction. Otherwise - * we'll drop the reference in xfs_buf_item_unpin() when - * the transaction is really through with the buffer. - */ - if (!(bip->bli_flags & XFS_BLI_LOGGED)) { - atomic_dec(&bip->bli_refcount); - } else { - /* - * Clear the logged flag since this is per - * transaction state. - */ - bip->bli_flags &= ~XFS_BLI_LOGGED; - } - - /* - * Before possibly freeing the buf item, determine if we should - * release the buffer at the end of this routine. - */ - hold = bip->bli_flags & XFS_BLI_HOLD; trace_xfs_buf_item_unlock(bip); /* - * If the buf item isn't tracking any data, free it. - * Otherwise, if XFS_BLI_HOLD is set clear it. + * If the buf item isn't tracking any data, free it, otherwise drop the + * reference we hold to it. */ if (xfs_bitmap_empty(bip->bli_format.blf_data_map, - bip->bli_format.blf_map_size)) { + bip->bli_format.blf_map_size)) xfs_buf_item_relse(bp); - } else if (hold) { - bip->bli_flags &= ~XFS_BLI_HOLD; - } + else + atomic_dec(&bip->bli_refcount); - /* - * Release the buffer if XFS_BLI_HOLD was not set. - */ - if (!hold) { + if (!hold) xfs_buf_relse(bp); - } } /* -- 1.5.6.5 From SRS0+XsoM+76+fromorbit.com=dave@internode.on.net Mon May 17 18:22:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HNMWH0014452 for ; Mon, 17 May 2010 18:22:32 -0500 X-ASG-Debug-ID: 1274138688-792600f50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BBB4913F3593 for ; Mon, 17 May 2010 16:24:48 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id FpW7OVDWCqufQatZ for ; Mon, 17 May 2010 16:24:48 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24431211-1927428 for ; Tue, 18 May 2010 08:54:47 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OE9fw-0005A3-Jq for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:44 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OE9fr-0000Rz-OC for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 12/12] xfs: Ensure inode allocation buffers are fully replayed Subject: [PATCH 12/12] xfs: Ensure inode allocation buffers are fully replayed Date: Tue, 18 May 2010 09:24:28 +1000 Message-Id: <1274138668-1662-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1274138689 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.2, rules version 3.2.2.30127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner With delayed logging, we can get inode allocation buffers in the same transaction inode unlink buffers. We don't currently mark inode allocation buffers in the log, so inode unlink buffers take precedence over allocation buffers. The result is that when they are combined into the same checkpoint, only the unlinked inode chain fields are replayed, resulting in uninitialised inode buffers being detected when the next inode modification is replayed. To fix this, we need to ensure that we do not set the inode buffer flag in the buffer log item format flags if the inode allocation has not already hit the log. To avoid requiring a change to log recovery, we really need to make this a modification that relies only on in-memory sate. We can do this by checking during buffer log formatting (while the CIL cannot be flushed) if we are still in the same sequence when we commit the unlink transaction as the inode allocation transaction. If we are, then we do not add the inode buffer flag to the buffer log format item flags. This means the entire buffer will be replayed, not just the unlinked fields. We do this while CIL flusheѕ are locked out to ensure that we don't race with the sequence numbers changing and hence fail to put the inode buffer flag in the buffer format flags when we really need to. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_buf_item.c | 14 ++++++++++++++ fs/xfs/xfs_buf_item.h | 4 +++- fs/xfs/xfs_log.h | 1 + fs/xfs/xfs_log_cil.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_trans.h | 1 + fs/xfs/xfs_trans_buf.c | 20 ++++++++++---------- 6 files changed, 74 insertions(+), 11 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index bcbb661..02a8098 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -254,6 +254,20 @@ xfs_buf_item_format( vecp++; nvecs = 1; + /* + * If it is an inode buffer, transfer the in-memory state to the + * format flags and clear the in-memory state. We do not transfer + * this state if the inode buffer allocation has not yet been committed + * to the log as setting the XFS_BLI_INODE_BUF flag will prevent + * correct replay of the inode allocation. + */ + if (bip->bli_flags & XFS_BLI_INODE_BUF) { + if (!((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) && + xfs_log_item_in_current_chkpt(&bip->bli_item))) + bip->bli_format.blf_flags |= XFS_BLF_INODE_BUF; + bip->bli_flags &= ~XFS_BLI_INODE_BUF; + } + if (bip->bli_flags & XFS_BLI_STALE) { /* * The buffer is stale, so all we need to log diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 8cbb82b..f20bb47 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -69,6 +69,7 @@ typedef struct xfs_buf_log_format { #define XFS_BLI_LOGGED 0x08 #define XFS_BLI_INODE_ALLOC_BUF 0x10 #define XFS_BLI_STALE_INODE 0x20 +#define XFS_BLI_INODE_BUF 0x40 #define XFS_BLI_FLAGS \ { XFS_BLI_HOLD, "HOLD" }, \ @@ -76,7 +77,8 @@ typedef struct xfs_buf_log_format { { XFS_BLI_STALE, "STALE" }, \ { XFS_BLI_LOGGED, "LOGGED" }, \ { XFS_BLI_INODE_ALLOC_BUF, "INODE_ALLOC" }, \ - { XFS_BLI_STALE_INODE, "STALE_INODE" } + { XFS_BLI_STALE_INODE, "STALE_INODE" }, \ + { XFS_BLI_INODE_BUF, "INODE_BUF" } #ifdef __KERNEL__ diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 4a0c574..04c78e6 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -198,6 +198,7 @@ xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp); int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, struct xfs_log_vec *log_vector, xfs_lsn_t *commit_lsn, int flags); +bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); #endif diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 97ed647..ffb717f 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -200,6 +200,15 @@ xlog_cil_insert( ctx->nvecs += diff_iovecs; /* + * If this is the first time the item is being committed to the CIL, + * store the sequence number on the log item so we can tell + * in future commits whether this is the first checkpoint the item is + * being committed into. + */ + if (!item->li_seq) + item->li_seq = ctx->sequence; + + /* * Now transfer enough transaction reservation to the context ticket * for the checkpoint. The context ticket is special - the unit * reservation has to grow as well as the current reservation as we @@ -325,6 +334,10 @@ xlog_cil_free_logvec( * For more specific information about the order of operations in * xfs_log_commit_cil() please refer to the comments in * xfs_trans_commit_iclog(). + * + * Called with the context lock already held in read mode to lock out + * background commit, returns without it held once background commits are + * allowed again. */ int xfs_log_commit_cil( @@ -679,3 +692,35 @@ restart: return commit_lsn; } +/* + * Check if the current log item was first committed in this sequence. + * We can't rely on just the log item being in the CIL, we have to check + * the recorded commit sequence number. + * + * Note: for this to be used in a non-racy manner, it has to be called with + * CIL flushing locked out. As a result, it should only be used during the + * transaction commit process when deciding what to format into the item. + */ +bool +xfs_log_item_in_current_chkpt( + struct xfs_log_item *lip) +{ + struct xfs_cil_ctx *ctx; + + if (!(lip->li_mountp->m_flags & XFS_MOUNT_DELAYLOG)) + return false; + if (list_empty(&lip->li_cil)) + return false; + + ctx = lip->li_mountp->m_log->l_cilp->xc_ctx; + + /* + * li_seq is written on the first commit of a log item to record the + * first checkpoint it is written to. Hence if it is different to the + * current sequence, we're in a new checkpoint. + */ + if (XFS_LSN_CMP(lip->li_seq, ctx->sequence) != 0) + return false; + return true; +} + diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index b1ea20c..8c69e78 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -835,6 +835,7 @@ typedef struct xfs_log_item { /* delayed logging */ struct list_head li_cil; /* CIL pointers */ struct xfs_log_vec *li_lv; /* active log vector */ + xfs_lsn_t li_seq; /* CIL commit seq */ } xfs_log_item_t; #define XFS_LI_IN_AIL 0x1 diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 3390c3e..63d81a2 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -792,7 +792,7 @@ xfs_trans_binval( XFS_BUF_UNDELAYWRITE(bp); XFS_BUF_STALE(bp); bip->bli_flags |= XFS_BLI_STALE; - bip->bli_flags &= ~(XFS_BLI_LOGGED | XFS_BLI_DIRTY); + bip->bli_flags &= ~(XFS_BLI_INODE_BUF | XFS_BLI_LOGGED | XFS_BLI_DIRTY); bip->bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; bip->bli_format.blf_flags |= XFS_BLF_CANCEL; memset((char *)(bip->bli_format.blf_data_map), 0, @@ -802,16 +802,16 @@ xfs_trans_binval( } /* - * This call is used to indicate that the buffer contains on-disk - * inodes which must be handled specially during recovery. They - * require special handling because only the di_next_unlinked from - * the inodes in the buffer should be recovered. The rest of the - * data in the buffer is logged via the inodes themselves. + * This call is used to indicate that the buffer contains on-disk inodes which + * must be handled specially during recovery. They require special handling + * because only the di_next_unlinked from the inodes in the buffer should be + * recovered. The rest of the data in the buffer is logged via the inodes + * themselves. * - * All we do is set the XFS_BLI_INODE_BUF flag in the buffer's log - * format structure so that we'll know what to do at recovery time. + * All we do is set the XFS_BLI_INODE_BUF flag in the items flags so it can be + * transferred to the buffer's log format structure so that we'll know what to + * do at recovery time. */ -/* ARGSUSED */ void xfs_trans_inode_buf( xfs_trans_t *tp, @@ -826,7 +826,7 @@ xfs_trans_inode_buf( bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(atomic_read(&bip->bli_refcount) > 0); - bip->bli_format.blf_flags |= XFS_BLF_INODE_BUF; + bip->bli_flags |= XFS_BLI_INODE_BUF; } /* -- 1.5.6.5 From SRS0+ERSN+76+fromorbit.com=dave@internode.on.net Mon May 17 18:22:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HNMWWL014449 for ; Mon, 17 May 2010 18:22:32 -0500 X-ASG-Debug-ID: 1274138747-6f1b01ed0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B05839C4D57 for ; Mon, 17 May 2010 16:25:47 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id A9CDNsCa6iBkWRxy for ; Mon, 17 May 2010 16:25:47 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24730566-1927428 for ; Tue, 18 May 2010 08:54:47 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OE9fw-0005A0-IK for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:44 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OE9fr-0000Rx-MI for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 11/12] xfs: enable background pushing of the CIL Subject: [PATCH 11/12] xfs: enable background pushing of the CIL Date: Tue, 18 May 2010 09:24:27 +1000 Message-Id: <1274138668-1662-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1274138748 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.2, rules version 3.2.2.30127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner If we let the CIL grow without bound, it will grow large enough to violate recovery constraints (must be at least one complete transaction in the log at all times) or take forever to write out through the log buffers. Hence we need a check during asynchronous transactions as to whether the CIL needs to be pushed. We track the amount of log space the CIL consumes, so it is relatively simple to limit it on a pure size basis. Make the limit the minimum of just under half the log size (recovery constraint) or 8MB of log space (which is an awful lot of metadata). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log_cil.c | 29 +++++++++++++++++++++++++---- fs/xfs/xfs_log_priv.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index fc41bf2..97ed647 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -336,6 +336,7 @@ xfs_log_commit_cil( { struct log *log = mp->m_log; int log_flags = 0; + int push = 0; if (flags & XFS_TRANS_RELEASE_LOG_RES) log_flags = XFS_LOG_REL_PERM_RESERV; @@ -365,8 +366,20 @@ xfs_log_commit_cil( xfs_log_done(mp, tp->t_ticket, NULL, log_flags); xfs_trans_unreserve_and_mod_sb(tp); - /* background commit is allowed again */ + /* check for background commit before unlock */ + if (log->l_cilp->xc_ctx->space_used > XLOG_CIL_SPACE_LIMIT(log)) + push = 1; up_read(&log->l_cilp->xc_ctx_lock); + + /* + * We need to push CIL every so often so we don't cache more than we + * can fit in the log. The limit really is that a checkpoint can't be + * more than half the log (the current checkpoint is not allowed to + * overwrite the previous checkpoint), but commit latency and memory + * usage limit this to a smaller size in most cases. + */ + if (push) + xlog_cil_push(log, 0); return 0; } @@ -429,18 +442,25 @@ xlog_cil_push( if (!cil) return 0; - /* XXX: don't sleep for background? */ new_ctx = kmem_zalloc(sizeof(*new_ctx), KM_SLEEP|KM_NOFS); new_ctx->ticket = xlog_cil_ticket_alloc(log); - /* lock out transaction commit */ - down_write(&cil->xc_ctx_lock); + /* lock out transaction commit, but don't block on background push */ + if (!down_write_trylock(&cil->xc_ctx_lock)) { + if (!push_now) + goto out_free_ticket; + down_write(&cil->xc_ctx_lock); + } ctx = cil->xc_ctx; /* check if we've anything to push */ if (list_empty(&cil->xc_cil)) goto out_skip; + /* check for spurious background flush */ + if (!push_now && cil->xc_ctx->space_used < XLOG_CIL_SPACE_LIMIT(log)) + goto out_skip; + /* * pull all the log vectors off the items in the CIL, and * remove the items from the CIL. We don't need the CIL lock @@ -584,6 +604,7 @@ restart: out_skip: up_write(&cil->xc_ctx_lock); +out_free_ticket: xfs_log_ticket_put(new_ctx->ticket); kmem_free(new_ctx); return 0; diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 48d9208..8c07261 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -425,6 +425,51 @@ struct xfs_cil { }; /* + * The amount of log space we should the CIL to aggregate is difficult to size. + * Whatever we chose we have to make we can get a reservation for the log space + * effectively, that it is large enough to capture sufficient relogging to + * reduce log buffer IO significantly, but it is not too large for the log or + * induces too much latency when writing out through the iclogs. We track both + * space consumed and the number of vectors in the checkpoint context, so we + * need to decide which to use for limiting. + * + * Every log buffer we write out during a push needs a header reserved, which + * is at least one sector and more for v2 logs. Hence we need a reservation of + * at least 512 bytes per 32k of log space just for the LR headers. That means + * 16KB of reservation per megabyte of delayed logging space we will consume, + * plus various headers. The number of headers will vary based on the num of + * io vectors, so limiting on a specific number of vectors is going to result + * in transactions of varying size. IOWs, it is more consistent to track and + * limit space consumed in the log rather than by the number of objects being + * logged in order to prevent checkpoint ticket overruns. + * + * Further, use of static reservations through the log grant mechanism is + * problematic. It introduces a lot of complexity (e.g. reserve grant vs write + * grant) and a significant deadlock potential because regranting write space + * can block on log pushes. Hence if we have to regrant log space during a log + * push, we can deadlock. + * + * However, we can avoid this by use of a dynamic "reservation stealing" + * technique during transaction commit whereby unused reservation space in the + * transaction ticket is transferred to the CIL ctx commit ticket to cover the + * space needed by the checkpoint transaction. This means that we never need to + * specifically reserve space for the CIL checkpoint transaction, nor do we + * need to regrant space once the checkpoint completes. This also means the + * checkpoint transaction ticket is specific to the checkpoint context, rather + * than the CIL itself. + * + * With dynamic reservations, we can basically make up arbitrary limits for the + * checkpoint size so long as they don't violate any other size rules. Hence + * the initial maximum size for the checkpoint transaction will be set to a + * quarter of the log or 8MB, which ever is smaller. 8MB is an arbitrary limit + * right now based on the latency of writing out a large amount of data through + * the circular iclog buffers. + */ + +#define XLOG_CIL_SPACE_LIMIT(log) \ + (min((log->l_logsize >> 2), (8 * 1024 * 1024))) + +/* * The reservation head lsn is not made up of a cycle number and block number. * Instead, it uses a cycle number and byte number. Logs don't expect to * overflow 31 bits worth of byte offset, so using a byte number will mean -- 1.5.6.5 From SRS0+9z3f+76+fromorbit.com=dave@internode.on.net Mon May 17 18:22:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH, SUBJ_TICKET autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HNMeZn014519 for ; Mon, 17 May 2010 18:22:40 -0500 X-ASG-Debug-ID: 1274138755-6f2801c10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B765E9C4D7F for ; Mon, 17 May 2010 16:25:55 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id nZ1f6fWg3JifSLZC for ; Mon, 17 May 2010 16:25:55 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12987993-1927428 for ; Tue, 18 May 2010 08:54:55 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OE9fw-00059p-56 for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:44 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OE9fr-0000Ri-8e for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 06/12] xfs: make the log ticket ID available outside the log infrastructure Subject: [PATCH 06/12] xfs: make the log ticket ID available outside the log infrastructure Date: Tue, 18 May 2010 09:24:22 +1000 Message-Id: <1274138668-1662-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1274138756 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The ticket ID is needed to uniquely identify transactions when doing busy extent matching. Delayed logging changes the lifecycle of busy extents with respect to the transaction structure lifecycle. Hence we can no longer use the transaction structure as a means of determining the owner of the busy extent as it may be freed and reused while the busy extent is still active. This commit provides the infrastructure to access the xlog_tid_t held in the ticket from a transaction handle. This avoids the need for callers to peek into the transaction and log structures to find this out. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 7 +++++++ fs/xfs/xfs_log.h | 4 +++- fs/xfs/xfs_log_priv.h | 2 -- fs/xfs/xfs_types.h | 2 ++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 1efb303..19d0c5f 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -3312,6 +3312,13 @@ xfs_log_ticket_get( return ticket; } +xlog_tid_t +xfs_log_get_trans_ident( + struct xfs_trans *tp) +{ + return tp->t_ticket->t_tid; +} + /* * Allocate and initialise a new log ticket. */ diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 229d1f3..05f205a 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -19,7 +19,6 @@ #define __XFS_LOG_H__ /* get lsn fields */ - #define CYCLE_LSN(lsn) ((uint)((lsn)>>32)) #define BLOCK_LSN(lsn) ((uint)(lsn)) @@ -134,6 +133,7 @@ struct xlog_in_core; struct xlog_ticket; struct xfs_log_item; struct xfs_item_ops; +struct xfs_trans; void xfs_log_item_init(struct xfs_mount *mp, struct xfs_log_item *item, @@ -190,6 +190,8 @@ void xlog_iodone(struct xfs_buf *); struct xlog_ticket * xfs_log_ticket_get(struct xlog_ticket *ticket); void xfs_log_ticket_put(struct xlog_ticket *ticket); +xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp); + #endif diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 9cf6951..ac97bdd 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -152,8 +152,6 @@ static inline uint xlog_get_client_id(__be32 i) #define XLOG_RECOVERY_NEEDED 0x4 /* log was recovered */ #define XLOG_IO_ERROR 0x8 /* log hit an I/O error, and being shutdown */ -typedef __uint32_t xlog_tid_t; - #ifdef __KERNEL__ /* diff --git a/fs/xfs/xfs_types.h b/fs/xfs/xfs_types.h index b099045..3207752 100644 --- a/fs/xfs/xfs_types.h +++ b/fs/xfs/xfs_types.h @@ -75,6 +75,8 @@ typedef __uint32_t xfs_dahash_t; /* dir/attr hash value */ typedef __uint16_t xfs_prid_t; /* prid_t truncated to 16bits in XFS */ +typedef __uint32_t xlog_tid_t; /* transaction ID type */ + /* * These types are 64 bits on disk but are either 32 or 64 bits in memory. * Disk based types: -- 1.5.6.5 From SRS0+9z3f+76+fromorbit.com=dave@internode.on.net Mon May 17 18:22:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HNMcJU014509 for ; Mon, 17 May 2010 18:22:38 -0500 X-ASG-Debug-ID: 1274138692-795a00fd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9AFD113F3595 for ; Mon, 17 May 2010 16:24:52 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id KABYZbY3ApAd99bP for ; Mon, 17 May 2010 16:24:52 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12987985-1927428 for ; Tue, 18 May 2010 08:54:47 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OE9fw-00059q-6w for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:44 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OE9fr-0000Rm-AL for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 07/12] xfs: Improve scalability of busy extent tracking Subject: [PATCH 07/12] xfs: Improve scalability of busy extent tracking Date: Tue, 18 May 2010 09:24:23 +1000 Message-Id: <1274138668-1662-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1274138694 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean When we free a metadata extent, we record it in the per-AG busy extent array so that it is not re-used before the freeing transaction hits the disk. This array is fixed size, so when it overflows we make further allocation transactions synchronous because we cannot track more freed extents until those transactions hit the disk and are completed. Under heavy mixed allocation and freeing workloads with large log buffers, we can overflow this array quite easily. Further, the array is sparsely populated, which means that inserts need to search for a free slot, and array searches often have to search many more slots that are actually used to check all the busy extents. Quite inefficient, really. To enable this aspect of extent freeing to scale better, we need a structure that can grow dynamically. While in other areas of XFS we have used radix trees, the extents being freed are at random locations on disk so are better suited to being indexed by an rbtree. So, use a per-AG rbtree indexed by block number to track busy extents. This incures a memory allocation when marking an extent busy, but should not occur too often in low memory situations. This should scale to an arbitrary number of extents so should not be a limitation for features such as in-memory aggregation of transactions. However, there are still situations where we can't avoid allocating busy extents (such as allocation from the AGFL). To minimise the overhead of such occurences, we need to avoid doing a synchronous log force while holding the AGF locked to ensure that the previous transactions are safely on disk before we use the extent. We can do this by marking the transaction doing the allocation as synchronous rather issuing a log force. Because of the locking involved and the ordering of transactions, the synchronous transaction provides the same guarantees as a synchronous log force because it ensures that all the prior transactions are already on disk when the synchronous transaction hits the disk. i.e. it preserves the free->allocate order of the extent correctly in recovery. By doing this, we avoid holding the AGF locked while log writes are in progress, hence reducing the length of time the lock is held and therefore we increase the rate at which we can allocate and free from the allocation group, thereby increasing overall throughput. The only problem with this approach is that when a metadata buffer is marked stale (e.g. a directory block is removed), then buffer remains pinned and locked until the log goes to disk. The issue here is that if that stale buffer is reallocated in a subsequent transaction, the attempt to lock that buffer in the transaction will hang waiting the log to go to disk to unlock and unpin the buffer. Hence if someone tries to lock a pinned, stale, locked buffer we need to push on the log to get it unlocked ASAP. Effectively we are trading off a guaranteed log force for a much less common trigger for log force to occur. Ideally we should not reallocate busy extents. That is a much more complex fix to the problem as it involves direct intervention in the allocation btree searches in many places. This is left to a future set of modifications. Finally, now that we track busy extents in allocated memory, we don't need the descriptors in the transaction structure to point to them. We can replace the complex busy chunk infrastructure with a simple linked list of busy extents. This allows us to remove a large chunk of code, making the overall change a net reduction in code size. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_buf.c | 9 + fs/xfs/linux-2.6/xfs_quotaops.c | 1 + fs/xfs/linux-2.6/xfs_trace.h | 83 ++++++--- fs/xfs/xfs_ag.h | 24 ++- fs/xfs/xfs_alloc.c | 364 ++++++++++++++++++++++++++++----------- fs/xfs/xfs_alloc.h | 7 +- fs/xfs/xfs_alloc_btree.c | 2 +- fs/xfs/xfs_trans.c | 41 ++---- fs/xfs/xfs_trans.h | 35 +---- fs/xfs/xfs_trans_item.c | 109 ------------ fs/xfs/xfs_trans_priv.h | 4 - 11 files changed, 359 insertions(+), 320 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 6873afc..82678bf 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -37,6 +37,7 @@ #include "xfs_sb.h" #include "xfs_inum.h" +#include "xfs_log.h" #include "xfs_ag.h" #include "xfs_dmapi.h" #include "xfs_mount.h" @@ -850,6 +851,12 @@ xfs_buf_lock_value( * Note that this in no way locks the underlying pages, so it is only * useful for synchronizing concurrent use of buffer objects, not for * synchronizing independent access to the underlying pages. + * + * If we come across a stale, pinned, locked buffer, we know that we + * are being asked to lock a buffer that has been reallocated. Because + * it is pinned, we know that the log has not been pushed to disk and + * hence it will still be locked. Rather than sleeping until someone + * else pushes the log, push it ourselves before trying to get the lock. */ void xfs_buf_lock( @@ -857,6 +864,8 @@ xfs_buf_lock( { trace_xfs_buf_lock(bp, _RET_IP_); + if (atomic_read(&bp->b_pin_count) && (bp->b_flags & XBF_STALE)) + xfs_log_force(bp->b_mount, 0); if (atomic_read(&bp->b_io_remaining)) blk_run_address_space(bp->b_target->bt_mapping); down(&bp->b_sema); diff --git a/fs/xfs/linux-2.6/xfs_quotaops.c b/fs/xfs/linux-2.6/xfs_quotaops.c index 1947514..2e73688 100644 --- a/fs/xfs/linux-2.6/xfs_quotaops.c +++ b/fs/xfs/linux-2.6/xfs_quotaops.c @@ -19,6 +19,7 @@ #include "xfs_dmapi.h" #include "xfs_sb.h" #include "xfs_inum.h" +#include "xfs_log.h" #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_quota.h" diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 8a319cf..ff6bc79 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -1059,83 +1059,112 @@ TRACE_EVENT(xfs_bunmap, ); +#define XFS_BUSY_SYNC \ + { 0, "async" }, \ + { 1, "sync" } + TRACE_EVENT(xfs_alloc_busy, - TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, - xfs_extlen_t len, int slot), - TP_ARGS(mp, agno, agbno, len, slot), + TP_PROTO(struct xfs_trans *trans, xfs_agnumber_t agno, + xfs_agblock_t agbno, xfs_extlen_t len, int sync), + TP_ARGS(trans, agno, agbno, len, sync), TP_STRUCT__entry( __field(dev_t, dev) + __field(struct xfs_trans *, tp) + __field(int, tid) __field(xfs_agnumber_t, agno) __field(xfs_agblock_t, agbno) __field(xfs_extlen_t, len) - __field(int, slot) + __field(int, sync) ), TP_fast_assign( - __entry->dev = mp->m_super->s_dev; + __entry->dev = trans->t_mountp->m_super->s_dev; + __entry->tp = trans; + __entry->tid = trans->t_ticket->t_tid; __entry->agno = agno; __entry->agbno = agbno; __entry->len = len; - __entry->slot = slot; + __entry->sync = sync; ), - TP_printk("dev %d:%d agno %u agbno %u len %u slot %d", + TP_printk("dev %d:%d trans 0x%p tid 0x%x agno %u agbno %u len %u %s", MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->tp, + __entry->tid, __entry->agno, __entry->agbno, __entry->len, - __entry->slot) + __print_symbolic(__entry->sync, XFS_BUSY_SYNC)) ); -#define XFS_BUSY_STATES \ - { 0, "found" }, \ - { 1, "missing" } - TRACE_EVENT(xfs_alloc_unbusy, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, - int slot, int found), - TP_ARGS(mp, agno, slot, found), + xfs_agblock_t agbno, xfs_extlen_t len), + TP_ARGS(mp, agno, agbno, len), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_agnumber_t, agno) - __field(int, slot) - __field(int, found) + __field(xfs_agblock_t, agbno) + __field(xfs_extlen_t, len) ), TP_fast_assign( __entry->dev = mp->m_super->s_dev; __entry->agno = agno; - __entry->slot = slot; - __entry->found = found; + __entry->agbno = agbno; + __entry->len = len; ), - TP_printk("dev %d:%d agno %u slot %d %s", + TP_printk("dev %d:%d agno %u agbno %u len %u", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, - __entry->slot, - __print_symbolic(__entry->found, XFS_BUSY_STATES)) + __entry->agbno, + __entry->len) ); +#define XFS_BUSY_STATES \ + { 0, "missing" }, \ + { 1, "found" } + TRACE_EVENT(xfs_alloc_busysearch, - TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, - xfs_extlen_t len, xfs_lsn_t lsn), - TP_ARGS(mp, agno, agbno, len, lsn), + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t agbno, xfs_extlen_t len, int found), + TP_ARGS(mp, agno, agbno, len, found), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_agnumber_t, agno) __field(xfs_agblock_t, agbno) __field(xfs_extlen_t, len) - __field(xfs_lsn_t, lsn) + __field(int, found) ), TP_fast_assign( __entry->dev = mp->m_super->s_dev; __entry->agno = agno; __entry->agbno = agbno; __entry->len = len; - __entry->lsn = lsn; + __entry->found = found; ), - TP_printk("dev %d:%d agno %u agbno %u len %u force lsn 0x%llx", + TP_printk("dev %d:%d agno %u agbno %u len %u %s", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, __entry->agbno, __entry->len, + __print_symbolic(__entry->found, XFS_BUSY_STATES)) +); + +TRACE_EVENT(xfs_trans_commit_lsn, + TP_PROTO(struct xfs_trans *trans), + TP_ARGS(trans), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(struct xfs_trans *, tp) + __field(xfs_lsn_t, lsn) + ), + TP_fast_assign( + __entry->dev = trans->t_mountp->m_super->s_dev; + __entry->tp = trans; + __entry->lsn = trans->t_commit_lsn; + ), + TP_printk("dev %d:%d trans 0x%p commit_lsn 0x%llx", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->tp, __entry->lsn) ); diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index abb8222..401f364 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -175,14 +175,20 @@ typedef struct xfs_agfl { } xfs_agfl_t; /* - * Busy block/extent entry. Used in perag to mark blocks that have been freed - * but whose transactions aren't committed to disk yet. + * Busy block/extent entry. Indexed by a rbtree in perag to mark blocks that + * have been freed but whose transactions aren't committed to disk yet. + * + * Note that we use the transaction ID to record the transaction, not the + * transaction structure itself. See xfs_alloc_busy_insert() for details. */ -typedef struct xfs_perag_busy { - xfs_agblock_t busy_start; - xfs_extlen_t busy_length; - struct xfs_trans *busy_tp; /* transaction that did the free */ -} xfs_perag_busy_t; +struct xfs_busy_extent { + struct rb_node rb_node; /* ag by-bno indexed search tree */ + struct list_head list; /* transaction busy extent list */ + xfs_agnumber_t agno; + xfs_agblock_t bno; + xfs_extlen_t length; + xlog_tid_t tid; /* transaction that created this */ +}; /* * Per-ag incore structure, copies of information in agf and agi, @@ -216,7 +222,8 @@ typedef struct xfs_perag { xfs_agino_t pagl_leftrec; xfs_agino_t pagl_rightrec; #ifdef __KERNEL__ - spinlock_t pagb_lock; /* lock for pagb_list */ + spinlock_t pagb_lock; /* lock for pagb_tree */ + struct rb_root pagb_tree; /* ordered tree of busy extents */ atomic_t pagf_fstrms; /* # of filestreams active in this AG */ @@ -226,7 +233,6 @@ typedef struct xfs_perag { int pag_ici_reclaimable; /* reclaimable inodes */ #endif int pagb_count; /* pagb slots in use */ - xfs_perag_busy_t pagb_list[XFS_PAGB_NUM_SLOTS]; /* unstable blocks */ } xfs_perag_t; /* diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 94cddbf..f8d592b 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -46,11 +46,9 @@ #define XFSA_FIXUP_BNO_OK 1 #define XFSA_FIXUP_CNT_OK 2 -STATIC void -xfs_alloc_search_busy(xfs_trans_t *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len); +static int +xfs_alloc_busy_search(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t bno, xfs_extlen_t len); /* * Prototypes for per-ag allocation routines @@ -540,9 +538,16 @@ xfs_alloc_ag_vextent( be32_to_cpu(agf->agf_length)); xfs_alloc_log_agf(args->tp, args->agbp, XFS_AGF_FREEBLKS); - /* search the busylist for these blocks */ - xfs_alloc_search_busy(args->tp, args->agno, - args->agbno, args->len); + /* + * Search the busylist for these blocks and mark the + * transaction as synchronous if blocks are found. This + * avoids the need to block in due to a synchronous log + * force to ensure correct ordering as the synchronous + * transaction will guarantee that for us. + */ + if (xfs_alloc_busy_search(args->mp, args->agno, + args->agbno, args->len)) + xfs_trans_set_sync(args->tp); } if (!args->isfl) xfs_trans_mod_sb(args->tp, @@ -1693,7 +1698,7 @@ xfs_free_ag_extent( * when the iclog commits to disk. If a busy block is allocated, * the iclog is pushed up to the LSN that freed the block. */ - xfs_alloc_mark_busy(tp, agno, bno, len); + xfs_alloc_busy_insert(tp, agno, bno, len); return 0; error0: @@ -1993,10 +1998,17 @@ xfs_alloc_get_freelist( * and remain there until the freeing transaction is committed to * disk. Now that we have allocated blocks, this list must be * searched to see if a block is being reused. If one is, then - * the freeing transaction must be pushed to disk NOW by forcing - * to disk all iclogs up that transaction's LSN. - */ - xfs_alloc_search_busy(tp, be32_to_cpu(agf->agf_seqno), bno, 1); + * the freeing transaction must be pushed to disk before this + * transaction. + * + * We do this by setting the current transaction + * to a sync transaction which guarantees that the freeing transaction + * is on disk before this transaction. This is done instead of a + * synchronous log force here so that we don't sit and wait with + * the AGF locked in the transaction during the log force. + */ + if (xfs_alloc_busy_search(mp, be32_to_cpu(agf->agf_seqno), bno, 1)) + xfs_trans_set_sync(tp); return 0; } @@ -2201,7 +2213,7 @@ xfs_alloc_read_agf( be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]); spin_lock_init(&pag->pagb_lock); pag->pagb_count = 0; - memset(pag->pagb_list, 0, sizeof(pag->pagb_list)); + pag->pagb_tree = RB_ROOT; pag->pagf_init = 1; } #ifdef DEBUG @@ -2479,127 +2491,273 @@ error0: * list is reused, the transaction that freed it must be forced to disk * before continuing to use the block. * - * xfs_alloc_mark_busy - add to the per-ag busy list - * xfs_alloc_clear_busy - remove an item from the per-ag busy list + * xfs_alloc_busy_insert - add to the per-ag busy list + * xfs_alloc_busy_clear - remove an item from the per-ag busy list + * xfs_alloc_busy_search - search for a busy extent + */ + +/* + * Insert a new extent into the busy tree. + * + * This is straight forward, except that we can get overlaps with existing busy + * extents, and even duplicate busy extents. There are two main cases we have + * to handle here. + * + * The first case is a transaction that triggers a "free - allocate - free" + * cycle. This can occur during btree manipulations as a btree block is freed + * to the freelist, then allocated from the free list, then freed again. In + * this case, the second extnet free is what triggers the duplicate and as such + * the transaction IDs should match. Because the extent was allocated in this + * transaction, the transaction must be marked as synchronous. This is true for + * all cases where the free/alloc/free occurs in the one transaction, hence the + * addition of the ASSERT(tp->t_flags & XFS_TRANS_SYNC) to this case. This + * serves to catch violations of the second case quite effectively. + * + * The second case is where the free/alloc/free occur in different + * transactions. In this case, we can't mark the extent busy immediately + * because it is already tracked in a transaction that may be committing. When + * the log commit completes, the busy extent will be removed from the tree. If + * we allow this busy insert to continue using that busy extent structure, it + * can be freed before this transaction is safely in the log. Hence our only + * option in this case is to force the log to remove the existing busy extent + * from the list before we insert the new one with the current transaction ID. + * + * The problem we are trying to avoid in the free-alloc-free in separate + * transactions is most easily described with a timeline: + * + * Thread 1 Thread 2 Thread 3 xfslogd + * xact alloc + * free X + * mark busy + * commit xact + * free xact + * xact alloc + * alloc X + * busy search + * mark xact sync + * commit xact + * free xact + * force log + * checkpoint starts + * .... + * xact alloc + * free X + * mark busy + * finds match + * *** KABOOM! *** + * .... + * log IO completes + * unbusy 1:91909 + * checkpoint completes + * + * By issuing a log force in thread 3 @ "KABOOM", the thread will block until + * the checkpoint completes, and the busy extent it matched will have been + * removed from the tree when it is woken. Hence it can then continue safely. + * + * However, to ensure this matching process is robust, we need to use the + * transaction ID for identifying transaction, as delayed logging results in + * the busy extent and transaction lifecycles being different. i.e. the busy + * extent is active for a lot longer than the transaction. Hence the + * transaction structure can be freed and reallocated, then mark the same + * extent busy again in the new transaction. In this case the new transaction + * will have a different tid but can have the same address, and hence we need + * to check against the tid. + * + * Future: for delayed logging, we could avoid the log force is the extent was + * first freed in the current checkpoint sequence. This, however, requires the + * ability to pin the current checkpoint in memory until this transaction + * commits to ensure that both the original free and the current one combine + * logically into the one checkpoint. If the checkpoint sequences are + * different, however, we still need to wait on a log force. */ void -xfs_alloc_mark_busy(xfs_trans_t *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len) +xfs_alloc_busy_insert( + struct xfs_trans *tp, + xfs_agnumber_t agno, + xfs_agblock_t bno, + xfs_extlen_t len) { - xfs_perag_busy_t *bsy; + struct xfs_busy_extent *new; + struct xfs_busy_extent *busyp; struct xfs_perag *pag; - int n; + struct rb_node **rbp; + struct rb_node *parent; + xfs_agblock_t uend, bend; + int match; - pag = xfs_perag_get(tp->t_mountp, agno); - spin_lock(&pag->pagb_lock); - /* search pagb_list for an open slot */ - for (bsy = pag->pagb_list, n = 0; - n < XFS_PAGB_NUM_SLOTS; - bsy++, n++) { - if (bsy->busy_tp == NULL) { - break; - } + new = kmem_zalloc(sizeof(struct xfs_busy_extent), KM_MAYFAIL); + if (!new) { + /* + * No Memory! Since it is now not possible to track the free + * block, make this a synchronous transaction to insure that + * the block is not reused before this transaction commits. + */ + trace_xfs_alloc_busy(tp, agno, bno, len, 1); + xfs_trans_set_sync(tp); + return; } - trace_xfs_alloc_busy(tp->t_mountp, agno, bno, len, n); + new->agno = agno; + new->bno = bno; + new->length = len; + new->tid = xfs_log_get_trans_ident(tp); - if (n < XFS_PAGB_NUM_SLOTS) { - bsy = &pag->pagb_list[n]; - pag->pagb_count++; - bsy->busy_start = bno; - bsy->busy_length = len; - bsy->busy_tp = tp; - xfs_trans_add_busy(tp, agno, n); - } else { + INIT_LIST_HEAD(&new->list); + + /* trace before insert to be able to see failed inserts */ + trace_xfs_alloc_busy(tp, agno, bno, len, 0); + + pag = xfs_perag_get(tp->t_mountp, new->agno); + uend = bno + len - 1; +restart: + spin_lock(&pag->pagb_lock); + rbp = &pag->pagb_tree.rb_node; + parent = NULL; + busyp = NULL; + match = 0; + while (*rbp) { + parent = *rbp; + busyp = rb_entry(parent, struct xfs_busy_extent, rb_node); + bend = busyp->bno + busyp->length - 1; + + if (new->bno < busyp->bno) { + /* may overlap, but exact start block is lower */ + rbp = &(*rbp)->rb_left; + if (uend >= busyp->bno) { + if (busyp->tid != new->tid) + match = -1; + else if (match >= 0) + match = 1; + } + } else if (new->bno > busyp->bno) { + /* may overlap, but exact start block is higher */ + rbp = &(*rbp)->rb_right; + if (bno <= bend) { + if (busyp->tid != new->tid) + match = -1; + else if (match >= 0) + match = 1; + } + } else { + if (busyp->tid != new->tid) + match = -1; + else if (match >= 0) + match = 1; + break; + } + busyp = NULL; + } + if (match < 0) { + /* overlap marked busy in different transaction */ + spin_unlock(&pag->pagb_lock); + xfs_log_force(tp->t_mountp, XFS_LOG_SYNC); + goto restart; + } + if (match > 0) { /* - * The busy list is full! Since it is now not possible to - * track the free block, make this a synchronous transaction - * to insure that the block is not reused before this - * transaction commits. + * overlap marked busy in same transaction. Update if exact + * start block match, otherwise combine the busy extents into + * a single range. */ - xfs_trans_set_sync(tp); + if (busyp->bno == new->bno) { + busyp->length = max(busyp->length, new->length); + spin_unlock(&pag->pagb_lock); + ASSERT(tp->t_flags & XFS_TRANS_SYNC); + xfs_perag_put(pag); + kmem_free(new); + return; + } + rb_erase(&busyp->rb_node, &pag->pagb_tree); + new->length = max(busyp->bno + busyp->length, + new->bno + new->length) - + min(busyp->bno, new->bno); + new->bno = min(busyp->bno, new->bno); } + rb_link_node(&new->rb_node, parent, rbp); + rb_insert_color(&new->rb_node, &pag->pagb_tree); + + list_add(&new->list, &tp->t_busy); spin_unlock(&pag->pagb_lock); xfs_perag_put(pag); + kmem_free(busyp); } -void -xfs_alloc_clear_busy(xfs_trans_t *tp, - xfs_agnumber_t agno, - int idx) +/* + * Search for a busy extent within the range of the extent we are about to + * allocate. You need to be holding the busy extent tree lock when calling + * xfs_alloc_busy_search(). This function returns 0 for no overlapping busy + * extent, -1 for an overlapping but not exact busy extent, and 1 for an exact + * match. This is done so that a non-zero return indicates an overlap that + * will require a synchronous transaction, but it can still be + * used to distinguish between a partial or exact match. + */ +static int +xfs_alloc_busy_search( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_agblock_t bno, + xfs_extlen_t len) { struct xfs_perag *pag; - xfs_perag_busy_t *list; + struct rb_node *rbp; + xfs_agblock_t uend, bend; + struct xfs_busy_extent *busyp; + int match = 0; - ASSERT(idx < XFS_PAGB_NUM_SLOTS); - pag = xfs_perag_get(tp->t_mountp, agno); + pag = xfs_perag_get(mp, agno); spin_lock(&pag->pagb_lock); - list = pag->pagb_list; - trace_xfs_alloc_unbusy(tp->t_mountp, agno, idx, list[idx].busy_tp == tp); - - if (list[idx].busy_tp == tp) { - list[idx].busy_tp = NULL; - pag->pagb_count--; + uend = bno + len - 1; + rbp = pag->pagb_tree.rb_node; + + /* find closest start bno overlap */ + while (rbp) { + busyp = rb_entry(rbp, struct xfs_busy_extent, rb_node); + bend = busyp->bno + busyp->length - 1; + if (bno < busyp->bno) { + /* may overlap, but exact start block is lower */ + if (uend >= busyp->bno) + match = -1; + rbp = rbp->rb_left; + } else if (bno > busyp->bno) { + /* may overlap, but exact start block is higher */ + if (bno <= bend) + match = -1; + rbp = rbp->rb_right; + } else { + /* bno matches busyp, length determines exact match */ + match = (busyp->length == len) ? 1 : -1; + break; + } } - spin_unlock(&pag->pagb_lock); + trace_xfs_alloc_busysearch(mp, agno, bno, len, !!match); xfs_perag_put(pag); + return match; } - -/* - * If we find the extent in the busy list, force the log out to get the - * extent out of the busy list so the caller can use it straight away. - */ -STATIC void -xfs_alloc_search_busy(xfs_trans_t *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len) +void +xfs_alloc_busy_clear( + struct xfs_mount *mp, + struct xfs_busy_extent *busyp) { struct xfs_perag *pag; - xfs_perag_busy_t *bsy; - xfs_agblock_t uend, bend; - xfs_lsn_t lsn = 0; - int cnt; - pag = xfs_perag_get(tp->t_mountp, agno); - spin_lock(&pag->pagb_lock); - cnt = pag->pagb_count; + trace_xfs_alloc_unbusy(mp, busyp->agno, busyp->bno, + busyp->length); - /* - * search pagb_list for this slot, skipping open slots. We have to - * search the entire array as there may be multiple overlaps and - * we have to get the most recent LSN for the log force to push out - * all the transactions that span the range. - */ - uend = bno + len - 1; - for (cnt = 0; cnt < pag->pagb_count; cnt++) { - bsy = &pag->pagb_list[cnt]; - if (!bsy->busy_tp) - continue; - - bend = bsy->busy_start + bsy->busy_length - 1; - if (bno > bend || uend < bsy->busy_start) - continue; - - /* (start1,length1) within (start2, length2) */ - if (XFS_LSN_CMP(bsy->busy_tp->t_commit_lsn, lsn) > 0) - lsn = bsy->busy_tp->t_commit_lsn; - } + ASSERT(xfs_alloc_busy_search(mp, busyp->agno, busyp->bno, + busyp->length) == 1); + + list_del_init(&busyp->list); + + pag = xfs_perag_get(mp, busyp->agno); + spin_lock(&pag->pagb_lock); + rb_erase(&busyp->rb_node, &pag->pagb_tree); spin_unlock(&pag->pagb_lock); xfs_perag_put(pag); - trace_xfs_alloc_busysearch(tp->t_mountp, agno, bno, len, lsn); - /* - * If a block was found, force the log through the LSN of the - * transaction that freed the block - */ - if (lsn) - xfs_log_force_lsn(tp->t_mountp, lsn, XFS_LOG_SYNC); + kmem_free(busyp); } diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h index 599bffa..6d05199 100644 --- a/fs/xfs/xfs_alloc.h +++ b/fs/xfs/xfs_alloc.h @@ -22,6 +22,7 @@ struct xfs_buf; struct xfs_mount; struct xfs_perag; struct xfs_trans; +struct xfs_busy_extent; /* * Freespace allocation types. Argument to xfs_alloc_[v]extent. @@ -119,15 +120,13 @@ xfs_alloc_longest_free_extent(struct xfs_mount *mp, #ifdef __KERNEL__ void -xfs_alloc_mark_busy(xfs_trans_t *tp, +xfs_alloc_busy_insert(xfs_trans_t *tp, xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len); void -xfs_alloc_clear_busy(xfs_trans_t *tp, - xfs_agnumber_t ag, - int idx); +xfs_alloc_busy_clear(struct xfs_mount *mp, struct xfs_busy_extent *busyp); #endif /* __KERNEL__ */ diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index b726e10..83f4942 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -134,7 +134,7 @@ xfs_allocbt_free_block( * disk. If a busy block is allocated, the iclog is pushed up to the * LSN that freed the block. */ - xfs_alloc_mark_busy(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); + xfs_alloc_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); xfs_trans_agbtree_delta(cur->bc_tp, -1); return 0; } diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index be578ec..40d9595 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -44,6 +44,7 @@ #include "xfs_trans_priv.h" #include "xfs_trans_space.h" #include "xfs_inode_item.h" +#include "xfs_trace.h" kmem_zone_t *xfs_trans_zone; @@ -243,9 +244,8 @@ _xfs_trans_alloc( tp->t_type = type; tp->t_mountp = mp; tp->t_items_free = XFS_LIC_NUM_SLOTS; - tp->t_busy_free = XFS_LBC_NUM_SLOTS; xfs_lic_init(&(tp->t_items)); - XFS_LBC_INIT(&(tp->t_busy)); + INIT_LIST_HEAD(&tp->t_busy); return tp; } @@ -255,8 +255,13 @@ _xfs_trans_alloc( */ STATIC void xfs_trans_free( - xfs_trans_t *tp) + struct xfs_trans *tp) { + struct xfs_busy_extent *busyp, *n; + + list_for_each_entry_safe(busyp, n, &tp->t_busy, list) + xfs_alloc_busy_clear(tp->t_mountp, busyp); + atomic_dec(&tp->t_mountp->m_active_trans); xfs_trans_free_dqinfo(tp); kmem_zone_free(xfs_trans_zone, tp); @@ -285,9 +290,8 @@ xfs_trans_dup( ntp->t_type = tp->t_type; ntp->t_mountp = tp->t_mountp; ntp->t_items_free = XFS_LIC_NUM_SLOTS; - ntp->t_busy_free = XFS_LBC_NUM_SLOTS; xfs_lic_init(&(ntp->t_items)); - XFS_LBC_INIT(&(ntp->t_busy)); + INIT_LIST_HEAD(&ntp->t_busy); ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); ASSERT(tp->t_ticket != NULL); @@ -423,7 +427,6 @@ undo_blocks: return error; } - /* * Record the indicated change to the given field for application * to the file system's superblock when the transaction commits. @@ -930,26 +933,6 @@ xfs_trans_item_committed( IOP_UNPIN(lip); } -/* Clear all the per-AG busy list items listed in this transaction */ -static void -xfs_trans_clear_busy_extents( - struct xfs_trans *tp) -{ - xfs_log_busy_chunk_t *lbcp; - xfs_log_busy_slot_t *lbsp; - int i; - - for (lbcp = &tp->t_busy; lbcp != NULL; lbcp = lbcp->lbc_next) { - i = 0; - for (lbsp = lbcp->lbc_busy; i < lbcp->lbc_unused; i++, lbsp++) { - if (XFS_LBC_ISFREE(lbcp, i)) - continue; - xfs_alloc_clear_busy(tp, lbsp->lbc_ag, lbsp->lbc_idx); - } - } - xfs_trans_free_busy(tp); -} - /* * This is typically called by the LM when a transaction has been fully * committed to disk. It needs to unpin the items which have @@ -984,7 +967,6 @@ xfs_trans_committed( kmem_free(licp); } - xfs_trans_clear_busy_extents(tp); xfs_trans_free(tp); } @@ -1013,7 +995,6 @@ xfs_trans_uncommit( xfs_trans_unreserve_and_mod_dquots(tp); xfs_trans_free_items(tp, flags); - xfs_trans_free_busy(tp); xfs_trans_free(tp); } @@ -1075,6 +1056,8 @@ xfs_trans_commit_iclog( *commit_lsn = xfs_log_done(mp, tp->t_ticket, &commit_iclog, log_flags); tp->t_commit_lsn = *commit_lsn; + trace_xfs_trans_commit_lsn(tp); + if (nvec > XFS_TRANS_LOGVEC_COUNT) kmem_free(log_vector); @@ -1260,7 +1243,6 @@ out_unreserve: } current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); xfs_trans_free_items(tp, error ? XFS_TRANS_ABORT : 0); - xfs_trans_free_busy(tp); xfs_trans_free(tp); XFS_STATS_INC(xs_trans_empty); @@ -1339,7 +1321,6 @@ xfs_trans_cancel( current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); xfs_trans_free_items(tp, flags); - xfs_trans_free_busy(tp); xfs_trans_free(tp); } diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index c62beee..ff7e9e6 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -813,6 +813,7 @@ struct xfs_log_item_desc; struct xfs_mount; struct xfs_trans; struct xfs_dquot_acct; +struct xfs_busy_extent; typedef struct xfs_log_item { struct list_head li_ail; /* AIL pointers */ @@ -872,34 +873,6 @@ typedef struct xfs_item_ops { #define XFS_ITEM_PUSHBUF 3 /* - * This structure is used to maintain a list of block ranges that have been - * freed in the transaction. The ranges are listed in the perag[] busy list - * between when they're freed and the transaction is committed to disk. - */ - -typedef struct xfs_log_busy_slot { - xfs_agnumber_t lbc_ag; - ushort lbc_idx; /* index in perag.busy[] */ -} xfs_log_busy_slot_t; - -#define XFS_LBC_NUM_SLOTS 31 -typedef struct xfs_log_busy_chunk { - struct xfs_log_busy_chunk *lbc_next; - uint lbc_free; /* free slots bitmask */ - ushort lbc_unused; /* first unused */ - xfs_log_busy_slot_t lbc_busy[XFS_LBC_NUM_SLOTS]; -} xfs_log_busy_chunk_t; - -#define XFS_LBC_MAX_SLOT (XFS_LBC_NUM_SLOTS - 1) -#define XFS_LBC_FREEMASK ((1U << XFS_LBC_NUM_SLOTS) - 1) - -#define XFS_LBC_INIT(cp) ((cp)->lbc_free = XFS_LBC_FREEMASK) -#define XFS_LBC_CLAIM(cp, slot) ((cp)->lbc_free &= ~(1 << (slot))) -#define XFS_LBC_SLOT(cp, slot) (&((cp)->lbc_busy[(slot)])) -#define XFS_LBC_VACANCY(cp) (((cp)->lbc_free) & XFS_LBC_FREEMASK) -#define XFS_LBC_ISFREE(cp, slot) ((cp)->lbc_free & (1 << (slot))) - -/* * This is the type of function which can be given to xfs_trans_callback() * to be called upon the transaction's commit to disk. */ @@ -950,8 +923,7 @@ typedef struct xfs_trans { unsigned int t_items_free; /* log item descs free */ xfs_log_item_chunk_t t_items; /* first log item desc chunk */ xfs_trans_header_t t_header; /* header for in-log trans */ - unsigned int t_busy_free; /* busy descs free */ - xfs_log_busy_chunk_t t_busy; /* busy/async free blocks */ + struct list_head t_busy; /* list of busy extents */ unsigned long t_pflags; /* saved process flags state */ } xfs_trans_t; @@ -1025,9 +997,6 @@ int _xfs_trans_commit(xfs_trans_t *, void xfs_trans_cancel(xfs_trans_t *, int); int xfs_trans_ail_init(struct xfs_mount *); void xfs_trans_ail_destroy(struct xfs_mount *); -xfs_log_busy_slot_t *xfs_trans_add_busy(xfs_trans_t *tp, - xfs_agnumber_t ag, - xfs_extlen_t idx); extern kmem_zone_t *xfs_trans_zone; diff --git a/fs/xfs/xfs_trans_item.c b/fs/xfs/xfs_trans_item.c index eb3fc57..2937a1e 100644 --- a/fs/xfs/xfs_trans_item.c +++ b/fs/xfs/xfs_trans_item.c @@ -438,112 +438,3 @@ xfs_trans_unlock_chunk( return freed; } - - -/* - * This is called to add the given busy item to the transaction's - * list of busy items. It must find a free busy item descriptor - * or allocate a new one and add the item to that descriptor. - * The function returns a pointer to busy descriptor used to point - * to the new busy entry. The log busy entry will now point to its new - * descriptor with its ???? field. - */ -xfs_log_busy_slot_t * -xfs_trans_add_busy(xfs_trans_t *tp, xfs_agnumber_t ag, xfs_extlen_t idx) -{ - xfs_log_busy_chunk_t *lbcp; - xfs_log_busy_slot_t *lbsp; - int i=0; - - /* - * If there are no free descriptors, allocate a new chunk - * of them and put it at the front of the chunk list. - */ - if (tp->t_busy_free == 0) { - lbcp = (xfs_log_busy_chunk_t*) - kmem_alloc(sizeof(xfs_log_busy_chunk_t), KM_SLEEP); - ASSERT(lbcp != NULL); - /* - * Initialize the chunk, and then - * claim the first slot in the newly allocated chunk. - */ - XFS_LBC_INIT(lbcp); - XFS_LBC_CLAIM(lbcp, 0); - lbcp->lbc_unused = 1; - lbsp = XFS_LBC_SLOT(lbcp, 0); - - /* - * Link in the new chunk and update the free count. - */ - lbcp->lbc_next = tp->t_busy.lbc_next; - tp->t_busy.lbc_next = lbcp; - tp->t_busy_free = XFS_LIC_NUM_SLOTS - 1; - - /* - * Initialize the descriptor and the generic portion - * of the log item. - * - * Point the new slot at this item and return it. - * Also point the log item at its currently active - * descriptor and set the item's mount pointer. - */ - lbsp->lbc_ag = ag; - lbsp->lbc_idx = idx; - return lbsp; - } - - /* - * Find the free descriptor. It is somewhere in the chunklist - * of descriptors. - */ - lbcp = &tp->t_busy; - while (lbcp != NULL) { - if (XFS_LBC_VACANCY(lbcp)) { - if (lbcp->lbc_unused <= XFS_LBC_MAX_SLOT) { - i = lbcp->lbc_unused; - break; - } else { - /* out-of-order vacancy */ - cmn_err(CE_DEBUG, "OOO vacancy lbcp 0x%p\n", lbcp); - ASSERT(0); - } - } - lbcp = lbcp->lbc_next; - } - ASSERT(lbcp != NULL); - /* - * If we find a free descriptor, claim it, - * initialize it, and return it. - */ - XFS_LBC_CLAIM(lbcp, i); - if (lbcp->lbc_unused <= i) { - lbcp->lbc_unused = i + 1; - } - lbsp = XFS_LBC_SLOT(lbcp, i); - tp->t_busy_free--; - lbsp->lbc_ag = ag; - lbsp->lbc_idx = idx; - return lbsp; -} - - -/* - * xfs_trans_free_busy - * Free all of the busy lists from a transaction - */ -void -xfs_trans_free_busy(xfs_trans_t *tp) -{ - xfs_log_busy_chunk_t *lbcp; - xfs_log_busy_chunk_t *lbcq; - - lbcp = tp->t_busy.lbc_next; - while (lbcp != NULL) { - lbcq = lbcp->lbc_next; - kmem_free(lbcp); - lbcp = lbcq; - } - - XFS_LBC_INIT(&tp->t_busy); - tp->t_busy.lbc_unused = 0; -} diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 73e2ad3..901dc0f 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -38,10 +38,6 @@ struct xfs_log_item_desc *xfs_trans_next_item(struct xfs_trans *, void xfs_trans_free_items(struct xfs_trans *, int); void xfs_trans_unlock_items(struct xfs_trans *, xfs_lsn_t); -void xfs_trans_free_busy(xfs_trans_t *tp); -xfs_log_busy_slot_t *xfs_trans_add_busy(xfs_trans_t *tp, - xfs_agnumber_t ag, - xfs_extlen_t idx); /* * AIL traversal cursor. -- 1.5.6.5 From SRS0+hxhx+76+fromorbit.com=dave@internode.on.net Mon May 17 18:22:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HNMe9D014518 for ; Mon, 17 May 2010 18:22:40 -0500 X-ASG-Debug-ID: 1274138696-673c00e30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A8F3235370C for ; Mon, 17 May 2010 16:24:56 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id UiBhu21HA1Qeq1en for ; Mon, 17 May 2010 16:24:56 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24605628-1927428 for ; Tue, 18 May 2010 08:54:55 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OE9g6-00059y-F2 for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:54 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OE9fr-0000Ru-KL for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 10/12] xfs: forced unmounts need to push the CIL Subject: [PATCH 10/12] xfs: forced unmounts need to push the CIL Date: Tue, 18 May 2010 09:24:26 +1000 Message-Id: <1274138668-1662-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1274138697 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0013 1.0000 -2.0125 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.2, rules version 3.2.2.30127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner If the filesystem is being shut down and the there is no log error, the current code forces out the current log buffers. This code now needs to push the CIL before it forces out the log buffers to acheive the same result. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 027ebfe..5215abc 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -3688,6 +3688,11 @@ xlog_state_ioerror( * c. nothing new gets queued up after (a) and (b) are done. * d. if !logerror, flush the iclogs to disk, then seal them off * for business. + * + * Note: for delayed logging the !logerror case needs to flush the regions + * held in memory out to the iclogs before flushing them to disk. This needs + * to be done before the log is marked as shutdown, otherwise the flush to the + * iclogs will fail. */ int xfs_log_force_umount( @@ -3721,6 +3726,16 @@ xfs_log_force_umount( return 1; } retval = 0; + + /* + * Flush the in memory commit item list before marking the log as + * being shut down. We need to do it in this order to ensure all the + * completed transactions are flushed to disk with the xfs_log_force() + * call below. + */ + if (!logerror && (mp->m_flags & XFS_MOUNT_DELAYLOG)) + xlog_cil_push(log, 1); + /* * We must hold both the GRANT lock and the LOG lock, * before we mark the filesystem SHUTDOWN and wake -- 1.5.6.5 From SRS0+9z3f+76+fromorbit.com=dave@internode.on.net Mon May 17 18:22:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=BAYES_00, TVD_PH_BODY_ACCOUNTS_PRE autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HNMaCr014494 for ; Mon, 17 May 2010 18:22:37 -0500 X-ASG-Debug-ID: 1274138749-6f1a01de0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 687AB9C4D7C for ; Mon, 17 May 2010 16:25:49 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id UfAA5e8Y9B5A7aY2 for ; Mon, 17 May 2010 16:25:49 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24525804-1927428 for ; Tue, 18 May 2010 08:54:46 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OE9fw-00059v-Ca for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:44 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OE9fr-0000Ro-Cu for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 08/12] xfs: Delayed logging design documentation Subject: [PATCH 08/12] xfs: Delayed logging design documentation Date: Tue, 18 May 2010 09:24:24 +1000 Message-Id: <1274138668-1662-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1274138751 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3896 1.0000 -0.0273 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.03 X-Barracuda-Spam-Status: No, SCORE=-0.03 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.2, rules version 3.2.2.30127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Document the design of the delayed logging implementation. This includes assumptions made, dead ends followed, the reasoning behind the structuring of the code, the layout of various structures, how things fit together, traps and pit-falls avoided, etc. This is all too much to document in the code itself, so do it in a separate file. Signed-off-by: Dave Chinner --- .../filesystems/xfs-delayed-logging-design.txt | 819 ++++++++++++++++++++ 1 files changed, 819 insertions(+), 0 deletions(-) create mode 100644 Documentation/filesystems/xfs-delayed-logging-design.txt diff --git a/Documentation/filesystems/xfs-delayed-logging-design.txt b/Documentation/filesystems/xfs-delayed-logging-design.txt new file mode 100644 index 0000000..2b7ff2e --- /dev/null +++ b/Documentation/filesystems/xfs-delayed-logging-design.txt @@ -0,0 +1,819 @@ +XFS Delayed Logging Design +-------------------------- + +Introduction to Re-logging in XFS +--------------------------------- + +XFS logging is a combination of logical and physical logging. Some objects, +such as inodes and dquots, are logged in logical format where the details +logged are made up of the changes to in-core structures rather than on-disk +structures. Other objects - typically buffers - have their physical changes +logged. The reason for these differences is to reduce the amount of log space +required for objects that are frequently logged. Some parts of inodes are more +frequently logged than others, and inodes are typically more frequently logged +than any other object (except maybe the superblock buffer) so keeping the +amount of metadata logged low is of prime importance. + +The reason that this is such a concern is that XFS allows multiple separate +modifications to a single object to be carried in the log at any given time. +This allows the log to avoid needing to flush each change to disk before +recording a new change to the object. XFS does this via a method called +"re-logging". Conceptually, this is quite simple - all it requires is that any +new change to the object is recorded with a *new copy* of all the existing +changes in the new transaction that is written to the log. + +That is, if we have a sequence of changes A through to F, and the object was +written to disk after change D, we would see in the log the following series +of transactions, their contents and the log sequence number (LSN) of the +transaction: + + Transaction Contents LSN + A A X + B A+B X+n + C A+B+C X+n+m + D A+B+C+D X+n+m+o + + E E Y (> X+n+m+o) + F E+F Yٍ+p + +In other words, each time an object is relogged, the new transaction contains +the aggregation of all the previous changes currently held only in the log. + +This relogging technique also allows objects to be moved forward in the log so +that an object being relogged does not prevent the tail of the log from ever +moving forward. This can be seen in the table above by the changing +(increasing) LSN of each subsquent transaction - the LSN is effectively a +direct encoding of the location in the log of the transaction. + +This relogging is also used to implement long-running, multiple-commit +transactions. These transaction are known as rolling transactions, and require +a special log reservation known as a permanent transaction reservation. A +typical example of a rolling transaction is the removal of extents from an +inode which can only be done at a rate of two extents per transaction because +of reservation size limitations. Hence a rolling extent removal transaction +keeps relogging the inode and btree buffers as they get modified in each +removal operation. This keeps them moving forward in the log as the operation +progresses, ensuring that current operation never gets blocked by itself if the +log wraps around. + +Hence it can be seen that the relogging operation is fundamental to the correct +working of the XFS journalling subsystem. From the above description, most +people should be able to see why the XFS metadata operations writes so much to +the log - repeated operations to the same objects write the same changes to +the log over and over again. Worse is the fact that objects tend to get +dirtier as they get relogged, so each subsequent transaction is writing more +metadata into the log. + +Another feature of the XFS transaction subsystem is that most transactions are +asynchronous. That is, they don't commit to disk until either a log buffer is +filled (a log buffer can hold multiple transactions) or a synchronous operation +forces the log buffers holding the transactions to disk. This means that XFS is +doing aggregation of transactions in memory - batching them, if you like - to +minimise the impact of the log IO on transaction throughput. + +The limitation on asynchronous transaction throughput is the number and size of +log buffers made available by the log manager. By default there are 8 log +buffers available and the size of each is 32kB - the size can be increased up +to 256kB by use of a mount option. + +Effectively, this gives us the maximum bound of outstanding metadata changes +that can be made to the filesystem at any point in time - if all the log +buffers are full and under IO, then no more transactions can be committed until +the current batch completes. It is now common for a single current CPU core to +be to able to issue enough transactions to keep the log buffers full and under +IO permanently. Hence the XFS journalling subsystem can be considered to be IO +bound. + +Delayed Logging: Concepts +------------------------- + +The key thing to note about the asynchronous logging combined with the +relogging technique XFS uses is that we can be relogging changed objects +multiple times before they are committed to disk in the log buffers. If we +return to the previous relogging example, it is entirely possible that +transactions A through D are committed to disk in the same log buffer. + +That is, a single log buffer may contain multiple copies of the same object, +but only one of those copies needs to be there - the last one "D", as it +contains all the changes from the previous changes. In other words, we have one +necessary copy in the log buffer, and three stale copies that are simply +wasting space. When we are doing repeated operations on the same set of +objects, these "stale objects" can be over 90% of the space used in the log +buffers. It is clear that reducing the number of stale objects written to the +log would greatly reduce the amount of metadata we write to the log, and this +is the fundamental goal of delayed logging. + +From a conceptual point of view, XFS is already doing relogging in memory (where +memory == log buffer), only it is doing it extremely inefficiently. It is using +logical to physical formatting to do the relogging because there is no +infrastructure to keep track of logical changes in memory prior to physically +formatting the changes in a transaction to the log buffer. Hence we cannot avoid +accumulating stale objects in the log buffers. + +Delayed logging is the name we've given to keeping and tracking transactional +changes to objects in memory outside the log buffer infrastructure. Because of +the relogging concept fundamental to the XFS journalling subsystem, this is +actually relatively easy to do - all the changes to logged items are already +tracked in the current infrastructure. The big problem is how to accumulate +them and get them to the log in a consistent, recoverable manner. +Describing the problems and how they have been solved is the focus of this +document. + +One of the key changes that delayed logging makes to the operation of the +journalling subsystem is that it disassociates the amount of outstanding +metadata changes from the size and number of log buffers available. In other +words, instead of there only being a maximum of 2MB of transaction changes not +written to the log at any point in time, there may be a much greater amount +being accumulated in memory. Hence the potential for loss of metadata on a +crash is much greater than for the existing logging mechanism. + +It should be noted that this does not change the guarantee that log recovery +will result in a consistent filesystem. What it does mean is that as far as the +recovered filesystem is concerned, there may be many thousands of transactions +that simply did not occur as a result of the crash. This makes it even more +important that applications that care about their data use fsync() where they +need to ensure application level data integrity is maintained. + +It should be noted that delayed logging is not an innovative new concept that +warrants rigorous proofs to determine whether it is correct or not. The method +of accumulating changes in memory for some period before writing them to the +log is used effectively in many filesystems including ext3 and ext4. Hence +no time is spent in this document trying to convince the reader that the +concept is sound. Instead it is simply considered a "solved problem" and as +such implementing it in XFS is purely an exercise in software engineering. + +The fundamental requirements for delayed logging in XFS are simple: + + 1. Reduce the amount of metadata written to the log by at least + an order of magnitude. + 2. Supply sufficient statistics to validate Requirement #1. + 3. Supply sufficient new tracing infrastructure to be able to debug + problems with the new code. + 4. No on-disk format change (metadata or log format). + 5. Enable and disable with a mount option. + 6. No performance regressions for synchronous transaction workloads. + +Delayed Logging: Design +----------------------- + +Storing Changes + +The problem with accumulating changes at a logical level (i.e. just using the +existing log item dirty region tracking) is that when it comes to writing the +changes to the log buffers, we need to ensure that the object we are formatting +is not changing while we do this. This requires locking the object to prevent +concurrent modification. Hence flushing the logical changes to the log would +require us to lock every object, format them, and then unlock them again. + +This introduces lots of scope for deadlocks with transactions that are already +running. For example, a transaction has object A locked and modified, but needs +the delayed logging tracking lock to commit the transaction. However, the +flushing thread has the delayed logging tracking lock already held, and is +trying to get the lock on object A to flush it to the log buffer. This appears +to be an unsolvable deadlock condition, and it was solving this problem that +was the barrier to implementing delayed logging for so long. + +The solution is relatively simple - it just took a long time to recognise it. +Put simply, the current logging code formats the changes to each item into an +vector array that points to the changed regions in the item. The log write code +simply copies the memory these vectors point to into the log buffer during +transaction commit while the item is locked in the transaction. Instead of +using the log buffer as the destination of the formatting code, we can use an +allocated memory buffer big enough to fit the formatted vector. + +If we then copy the vector into the memory buffer and rewrite the vector to +point to the memory buffer rather than the object itself, we now have a copy of +the changes in a format that is compatible with the log buffer writing code. +that does not require us to lock the item to access. This formatting and +rewriting can all be done while the object is locked during transaction commit, +resulting in a vector that is transactionally consistent and can be accessed +without needing to lock the owning item. + +Hence we avoid the need to lock items when we need to flush outstanding +asynchronous transactions to the log. The differences between the existing +formatting method and the delayed logging formatting can be seen in the +diagram below. + +Current format log vector: + +Object +---------------------------------------------+ +Vector 1 +----+ +Vector 2 +----+ +Vector 3 +----------+ + +After formatting: + +Log Buffer +-V1-+-V2-+----V3----+ + +Delayed logging vector: + +Object +---------------------------------------------+ +Vector 1 +----+ +Vector 2 +----+ +Vector 3 +----------+ + +After formatting: + +Memory Buffer +-V1-+-V2-+----V3----+ +Vector 1 +----+ +Vector 2 +----+ +Vector 3 +----------+ + +The memory buffer and associated vector need to be passed as a single object, +but still need to be associated with the parent object so if the object is +relogged we can replace the current memory buffer with a new memory buffer that +contains the latest changes. + +The reason for keeping the vector around after we've formatted the memory +buffer is to support splitting vectors across log buffer boundaries correctly. +If we don't keep the vector around, we do not know where the region boundaries +are in the item, so we'd need a new encapsulation method for regions in the log +buffer writing (i.e. double encapsulation). This would be an on-disk format +change and as such is not desirable. It also means we'd have to write the log +region headers in the formatting stage, which is problematic as there is per +region state that needs to be placed into the headers during the log write. + +Hence we need to keep the vector, but by attaching the memory buffer to it and +rewriting the vector addresses to point at the memory buffer we end up with a +self-describing object that can be passed to the log buffer write code to be +handled in exactly the same manner as the existing log vectors are handled. +Hence we avoid needing a new on-disk format to handle items that have been +relogged in memory. + + +Tracking Changes + +Now that we can record transactional changes in memory in a form that allows +them to be used without limitations, we need to be able to track and accumulate +them so that they can be written to the log at some later point in time. The +log item is the natural place to store this vector and buffer, and also makes sense +to be the object that is used to track committed objects as it will always +exist once the object has been included in a transaction. + +The log item is already used to track the log items that have been written to +the log but not yet written to disk. Such log items are considered "active" +and as such are stored in the Active Item List (AIL) which is a LSN-ordered +double linked list. Items are inserted into this list during log buffer IO +completion, after which they are unpinned and can be written to disk. An object +that is in the AIL can be relogged, which causes the object to be pinned again +and then moved forward in the AIL when the log buffer IO completes for that +transaction. + +Essentially, this shows that an item that is in the AIL can still be modified +and relogged, so any tracking must be separate to the AIL infrastructure. As +such, we cannot reuse the AIL list pointers for tracking committed items, nor +can we store state in any field that is protected by the AIL lock. Hence the +committed item tracking needs it's own locks, lists and state fields in the log +item. + +Similar to the AIL, tracking of committed items is done through a new list +called the Committed Item List (CIL). The list tracks log items that have been +committed and have formatted memory buffers attached to them. It tracks objects +in transaction commit order, so when an object is relogged it is removed from +it's place in the list and re-inserted at the tail. This is entirely arbitrary +and done to make it easy for debugging - the last items in the list are the +ones that are most recently modified. Ordering of the CIL is not necessary for +transactional integrity (as discussed in the next section) so the ordering is +done for convenience/sanity of the developers. + + +Delayed Logging: Checkpoints + +When we have a log synchronisation event, commonly known as a "log force", +all the items in the CIL must be written into the log via the log buffers. +We need to write these items in the order that they exist in the CIL, and they +need to be written as an atomic transaction. The need for all the objects to be +written as an atomic transaction comes from the requirements of relogging and +log replay - all the changes in all the objects in a given transaction must +either be completely replayed during log recovery, or not replayed at all. If +a transaction is not replayed because it is not complete in the log, then +no later transactions should be replayed, either. + +To fulfill this requirement, we need to write the entire CIL in a single log +transaction. Fortunately, the XFS log code has no fixed limit on the size of a +transaction, nor does the log replay code. The only fundamental limit is that +the transaction cannot be larger than just under half the size of the log. The +reason for this limit is that to find the head and tail of the log, there must +be at least one complete transaction in the log at any given time. If a +transaction is larger than half the log, then there is the possibility that a +crash during the write of a such a transaction could partially overwrite the +only complete previous transaction in the log. This will result in a recovery +failure and an inconsistent filesystem and hence we must enforce the maximum +size of a checkpoint to be slightly less than a half the log. + +Apart from this size requirement, a checkpoint transaction looks no different +to any other transaction - it contains a transaction header, a series of +formatted log items and a commit record at the tail. From a recovery +perspective, the checkpoint transaction is also no different - just a lot +bigger with a lot more items in it. The worst case effect of this is that we +might need to tune the recovery transaction object hash size. + +Because the checkpoint is just another transaction and all the changes to log +items are stored as log vectors, we can use the existing log buffer writing +code to write the changes into the log. To do this efficiently, we need to +minimise the time we hold the CIL locked while writing the checkpoint +transaction. The current log write code enables us to do this easily with the +way it separates the writing of the transaction contents (the log vectors) from +the transaction commit record, but tracking this requires us to have a +per-checkpoint context that travels through the log write process through to +checkpoint completion. + +Hence a checkpoint has a context that tracks the state of the current +checkpoint from initiation to checkpoint completion. A new context is initiated +at the same time a checkpoint transaction is started. That is, when we remove +all the current items from the CIL during a checkpoint operation, we move all +those changes into the current checkpoint context. We then initialise a new +context and attach that to the CIL for aggregation of new transactions. + +This allows us to unlock the CIL immediately after transfer of all the +committed items and effectively allow new transactions to be issued while we +are formatting the checkpoint into the log. It also allows concurrent +checkpoints to be written into the log buffers in the case of log force heavy +workloads, just like the existing transaction commit code does. This, however, +requires that we strictly order the commit records in the log so that +checkpoint sequence order is maintained during log replay. + +To ensure that we can be writing an item into a checkpoint transaction at +the same time another transaction modifies the item and inserts the log item +into the new CIL, then checkpoint transaction commit code cannot use log items +to store the list of log vectors that need to be written into the transaction. +Hence log vectors need to be able to be chained together to allow them to be +detatched from the log items. That is, when the CIL is flushed the memory +buffer and log vector attached to each log item needs to be attached to the +checkpoint context so that the log item can be released. In diagrammatic form, +the CIL would look like this before the flush: + + CIL Head + | + V + Log Item <-> log vector 1 -> memory buffer + | -> vector array + V + Log Item <-> log vector 2 -> memory buffer + | -> vector array + V + ...... + | + V + Log Item <-> log vector N-1 -> memory buffer + | -> vector array + V + Log Item <-> log vector N -> memory buffer + -> vector array + +And after the flush the CIL head is empty, and the checkpoint context log +vector list would look like: + + Checkpoint Context + | + V + log vector 1 -> memory buffer + | -> vector array + | -> Log Item + V + log vector 2 -> memory buffer + | -> vector array + | -> Log Item + V + ...... + | + V + log vector N-1 -> memory buffer + | -> vector array + | -> Log Item + V + log vector N -> memory buffer + -> vector array + -> Log Item + +Once this transfer is done, the CIL can be unlocked and new transactions can +start, while the checkpoint flush code works over the log vector chain to +commit the checkpoint. + +Once the checkpoint is written into the log buffers, the checkpoint context is +attached to the log buffer that the commit record was written to along with a +completion callback. Log IO completion will call that callback, which can then +run transaction committed processing for the log items (i.e. insert into AIL +and unpin) in the log vector chain and then free the log vector chain and +checkpoint context. + +Discussion Point: I am uncertain as to whether the log item is the most +efficient way to track vectors, even though it seems like the natural way to do +it. The fact that we walk the log items (in the CIL) just to chain the log +vectors and break the link between the log item and the log vector means that +we take a cache line hit for the log item list modification, then another for +the log vector chaining. If we track by the log vectors, then we only need to +break the link between the log item and the log vector, which means we should +dirty only the log item cachelines. Normally I wouldn't be concerned about one +vs two dirty cachelines except for the fact I've seen upwards of 80,000 log +vectors in one checkpoint transaction. I'd guess this is a "measure and +compare" situation that can be done after a working and reviewed implementation +is in the dev tree.... + +Delayed Logging: Checkpoint Sequencing + +One of the key aspects of the XFS transaction subsystem is that it tags +committed transactions with the log sequence number of the transaction commit. +This allows transactions to be issued asynchronously even though there may be +future operations that cannot be completed until that transaction is fully +committed to the log. In the rare case that a dependent operation occurs (e.g. +re-using a freed metadata extent for a data extent), a special, optimised log +force can be issued to force the dependent transaction to disk immediately. + +To do this, transactions need to record the LSN of the commit record of the +transaction. This LSN comes directly from the log buffer the transaction is +written into. While this works just fine for the existing transaction +mechanism, it does not work for delayed logging because transactions are not +written directly into the log buffers. Hence some other method of sequencing +transactions is required. + +As discussed in the checkpoint section, delayed logging uses per-checkpoint +contexts, and as such it is simple to assign a sequence number to each +checkpoint. Because the switching of checkpoint contexts must be done +atomically, it is simple to ensure that each new context has a monotonically +increasing sequence number assigned to it without the need for an external +atomic counter - we can just take the current context sequence number and add +one to it for the new context. + +Then, instead of assigning a log buffer LSN to the transaction commit LSN +during the commit, we can assign the current checkpoint sequence. This allows +operations that track transactions that have not yet completed know what +checkpoint sequence needs to be committed before they can continue. As a +result, the code that forces the log to a specific LSN now needs to ensure that +the log forces to a specific checkpoint. + +To ensure that we can do this, we need to track all the checkpoint contexts +that are currently committing to the log. When we flush a checkpoint, the +context gets added to a "committing" list which can be searched. When a +checkpoint commit completes, it is removed from the committing list. Because +the checkpoint context records the LSN of the commit record for the checkpoint, +we can also wait on the log buffer that contains the commit record, thereby +using the existing log force mechanisms to execute synchronous forces. + +It should be noted that the synchronous forces may need to be extended with +mitigation algorithms similar to the current log buffer code to allow +aggregation of multiple synchronous transactions if there are already +synchronous transactions being flushed. Investigation of the performance of the +current design is needed before making any decisions here. + +The main concern with log forces is to ensure that all the previous checkpoints +are also committed to disk before the one we need to wait for. Therefore we +need to check that all the prior contexts in the committing list are also +complete before waiting on the one we need to complete. We do this +synchronisation in the log force code so that we don't need to wait anywhere +else for such serialisation - it only matters when we do a log force. + +The only remaining complexity is that a log force now also has to handle the +case where the forcing sequence number is the same as the current context. That +is, we need to flush the CIL and potentially wait for it to complete. This is a +simple addition to the existing log forcing code to check the sequence numbers +and push if required. Indeed, placing the current sequence checkpoint flush in +the log force code enables the current mechanism for issuing synchronous +transactions to remain untouched (i.e. commit an asynchronous transaction, then +force the log at the LSN of that transaction) and so the higher level code +behaves the same regardless of whether delayed logging is being used or not. + +Delayed Logging: Checkpoint Log Space Accounting + +The big issue for a checkpoint transaction is the log space reservation for the +transaction. We don't know how big a checkpoint transaction is going to be +ahead of time, nor how many log buffers it will take to write out, nor the +number of split log vector regions are going to be used. We can track the +amount of log space required as we add items to the commit item list, but we +still need to reserve the space in the log for the checkpoint. + +A typical transaction reserves enough space in the log for the worst case space +usage of the transaction. The reservation accounts for log record headers, +transaction and region headers, headers for split regions, buffer tail padding, +etc. as well as the actual space for all the changed metadata in the +transaction. While some of this is fixed overhead, much of it is dependent on +the size of the transaction and the number of regions being logged (the number +of log vectors in the transaction). + +An example of the differences would be logging directory changes versus logging +inode changes. If you modify lots of inode cores (e.g. chmod -R g+w *), then +there are lots of transactions that only contain an inode core and an inode log +format structure. That is, two vectors totaling roughly 150 bytes. If we modify +10,000 inodes, we have about 1.5MB of metadata to write in 20,000 vectors. Each +vector is 12 bytes, so the total to be logged is approximately 1.75MB. In +comparison, if we are logging full directory buffers, they are typically 4KB +each, so we in 1.5MB of directory buffers we'd have roughly 400 buffers and a +buffer format structure for each buffer - roughly 800 vectors or 1.51MB total +space. From this, it should be obvious that a static log space reservation is +not particularly flexible and is difficult to select the "optimal value" for +all workloads. + +Further, if we are going to use a static reservation, which bit of the entire +reservation does it cover? We account for space used by the transaction +reservation by tracking the space currently used by the object in the CIL and +then calculating the increase or decrease in space used as the object is +relogged. This allows for a checkpoint reservation to only have to account for +log buffer metadata used such as log header records. + +However, even using a static reservation for just the log metadata is +problematic. Typically log record headers use at least 16KB of log space per +1MB of log space consumed (512 bytes per 32k) and the reservation needs to be +large enough to handle arbitrary sized checkpoint transactions. This +reservation needs to be made before the checkpoint is started, and we need to +be able to reserve the space without sleeping. For a 8MB checkpoint, we need a +reservation of around 150KB, which is a non-trivial amount of space. + +A static reservation needs to manipulate the log grant counters - we can take a +permanent reservation on the space, but we still need to make sure we refresh +the write reservation (the actual space available to the transaction) after +every checkpoint transaction completion. Unfortunately, if this space is not +available when required, then the regrant code will sleep waiting for it. + +The problem with this is that it can lead to deadlocks as we may need to commit +checkpoints to be able to free up log space (refer back to the description of +rolling transactions for an example of this). Hence we *must* always have +space available in the log if we are to use static reservations, and that is +very difficult and complex to arrange. It is possible to do, but there is a +simpler way. + +The simpler way of doing this is tracking the entire log space used by the +items in the CIL and using this to dynamically calculate the amount of log +space required by the log metadata. If this log metadata space changes as a +result of a transaction commit inserting a new memory buffer into the CIL, then +the difference in space required is removed from the transaction that causes +the change. Transactions at this level will *always* have enough space +available in their reservation for this as they have already reserved the +maximal amount of log metadata space they require, and such a delta reservation +will always be less than or equal to the maximal amount in the reservation. + +Hence we can grow the checkpoint transaction reservation dynamically as items +are added to the CIL and avoid the need for reserving and regranting log space +up front. This avoids deadlocks and removes a blocking point from the +checkpoint flush code. + +As mentioned early, transactions can't grow to more than half the size of the +log. Hence as part of the reservation growing, we need to also check the size +of the reservation against the maximum allowed transaction size. If we reach +the maximum threshold, we need to push the CIL to the log. This is effectively +a "background flush" and is done on demand. This is identical to +a CIL push triggered by a log force, only that there is no waiting for the +checkpoint commit to complete. This background push is checked and executed by +transaction commit code. + +If the transaction subsystem goes idle while we still have items in the CIL, +they will be flushed by the periodic log force issued by the xfssyncd. This log +force will push the CIL to disk, and if the transaction subsystem stays idle, +allow the idle log to be covered (effectively marked clean) in exactly the same +manner that is done for the existing logging method. A discussion point is +whether this log force needs to be done more frequently than the current rate +which is once every 30s. + + +Delayed Logging: Log Item Pinning + +Currently log items are pinned during transaction commit while the items are +still locked. This happens just after the items are formatted, though it could +be done any time before the items are unlocked. The result of this mechanism is +that items get pinned once for every transaction that is committed to the log +buffers. Hence items that are relogged in the log buffers will have a pin count +for every outstanding transaction they were dirtied in. When each of these +transactions is completed, they will unpin the item once. As a result, the item +only becomes unpinned when all the transactions complete and there are no +pending transactions. Thus the pinning and unpinning of a log item is symmetric +as there is a 1:1 relationship with transaction commit and log item completion. + +For delayed logging, however, we have an assymetric transaction commit to +completion relationship. Every time an object is relogged in the CIL it goes +through the commit process without a corresponding completion being registered. +That is, we now have a many-to-one relationship between transaction commit and +log item completion. The result of this is that pinning and unpinning of the +log items becomes unbalanced if we retain the "pin on transaction commit, unpin +on transaction completion" model. + +To keep pin/unpin symmetry, the algorithm needs to change to a "pin on +insertion into the CIL, unpin on checkpoint completion". In other words, the +pinning and unpinning becomes symmetric around a checkpoint context. We have to +pin the object the first time it is inserted into the CIL - if it is already in +the CIL during a transaction commit, then we do not pin it again. Because there +can be multiple outstanding checkpoint contexts, we can still see elevated pin +counts, but as each checkpoint completes the pin count will retain the correct +value according to it's context. + +Just to make matters more slightly more complex, this checkpoint level context +for the pin count means that the pinning of an item must take place under the +CIL commit/flush lock. If we pin the object outside this lock, we cannot +guarantee which context the pin count is associated with. This is because of +the fact pinning the item is dependent on whether the item is present in the +current CIL or not. If we don't pin the CIL first before we check and pin the +object, we have a race with CIL being flushed between the check and the pin +(or not pinning, as the case may be). Hence we must hold the CIL flush/commit +lock to guarantee that we pin the items correctly. + +Delayed Logging: Concurrent Scalability + +A fundamental requirement for the CIL is that accesses through transaction +commits must scale to many concurrent commits. The current transaction commit +code does not break down even when there are transactions coming from 2048 +processors at once. The current transaction code does not go any faster than if +there was only one CPU using it, but it does not slow down either. + +As a result, the delayed logging transaction commit code needs to be designed +for concurrency from the ground up. It is obvious that there are serialisation +points in the design - the three important ones are: + + 1. Locking out new transaction commits while flushing the CIL + 2. Adding items to the CIL and updating item space accounting + 3. Checkpoint commit ordering + +Looking at the transaction commit and CIL flushing interactions, it is clear +that we have a many-to-one interaction here. That is, the only restriction on +the number of concurrent transactions that can be trying to commit at once is +the amount of space available in the log for their reservations. The practical +limit here is in the order of several hundred concurrent transactions for a +128MB log, which means that it is generally one per CPU in a machine. + +The amount of time a transaction commit needs to hold out a flush is a +relatively long period of time - the pinning of log items needs to be done +while we are holding out a CIL flush, so at the moment that means it is held +across the formatting of the objects into memory buffers (i.e. while memcpy()s +are in progress). Ultimately a two pass algorithm where the formatting is done +separately to the pinning of objects could be used to reduce the hold time of +the transaction commit side. + +Because of the number of potential transaction commit side holders, the lock +really needs to be a sleeping lock - if the CIL flush takes the lock, we do not +want every other CPU in the machine spinning on the CIL lock. Given that +flushing the CIL could involve walking a list of tens of thousands of log +items, it will get held for a significant time and so spin contention is a +significant concern. Preventing lots of CPUs spinning doing nothing is the +main reason for choosing a sleeping lock even though nothing in either the +transaction commit or CIL flush side sleeps with the lock held. + +It should also be noted that CIL flushing is also a relatively rare operation +compared to transaction commit for asynchronous transaction workloads - only +time will tell if using a read-write semaphore for exclusion will limit +transaction commit concurrency due to cache line bouncing of the lock on the +read side. + +The second serialisation point is on the transaction commit side where items +are inserted into the CIL. Because transactions can enter this code +concurrently, the CIL needs to be protected separately from the above +commit/flush exclusion. It also needs to be an exclusive lock but it is only +held for a very short time and so a spin lock is appropriate here. It is +possible that this lock will become a contention point, but given the short +hold time once per transaction I think that contention is unlikely. + +The final serialisation point is the checkpoint commit record ordering code +that is run as part of the checkpoint commit and log force sequencing. The code +path that triggers a CIL flush (i.e. whatever triggers the log force) will enter +an ordering loop after writing all the log vectors into the log buffers but +before writing the commit record. This loop walks the list of committing +checkpoints and needs to block waiting for checkpoints to complete their commit +record write. As a result it needs a lock and a wait variable. Log force +sequencing also requires the same lock, list walk, and blocking mechanism to +ensure completion of checkpoints. + +These two sequencing operations can use the mechanism even though the +events they are waiting for are different. The checkpoint commit record +sequencing needs to wait until checkpoint contexts contain a commit LSN +(obtained through completion of a commit record write) while log force +sequencing needs to wait until previous checkpoint contexts are removed from +the committing list (i.e. they've completed). A simple wait variable and +broadcast wakeups (thundering herds) has been used to implement these two +serialisation queues. They use the same lock as the CIL, too. If we see too +much contention on the CIL lock, or too many context switches as a result of +the broadcast wakeups these operations can be put under a new spinlock and +given separate wait lists to reduce lock contention and the number of processes +woken by the wrong event. + + +Lifecycle Changes + +The existing log item life cycle is as follows: + + 1. Transaction allocate + 2. Transaction reserve + 3. Lock item + 4. Join item to transaction + If not already attached, + Allocate log item + Attach log item to owner item + Attach log item to transaction + 5. Modify item + Record modifications in log item + 6. Transaction commit + Pin item in memory + Format item into log buffer + Write commit LSN into transaction + Unlock item + Attach transaction to log buffer + + + + + 7. Transaction completion + Mark log item committed + Insert log item into AIL + Write commit LSN into log item + Unpin log item + 8. AIL traversal + Lock item + Mark log item clean + Flush item to disk + + + + 9. Log item removed from AIL + Moves log tail + Item unlocked + +Essentially, steps 1-6 operate independently from step 7, which is also +independent of steps 8-9. An item can be locked in steps 1-6 or steps 8-9 +at the same time step 7 is occurring, but only steps 1-6 or 8-9 can occur +at the same time. If the log item is in the AIL or between steps 6 and 7 +and steps 1-6 are re-entered, then the item is relogged. Only when steps 8-9 +are entered and completed is the object considered clean. + +With delayed logging, there are new steps inserted into the life cycle: + + 1. Transaction allocate + 2. Transaction reserve + 3. Lock item + 4. Join item to transaction + If not already attached, + Allocate log item + Attach log item to owner item + Attach log item to transaction + 5. Modify item + Record modifications in log item + 6. Transaction commit + Pin item in memory if not pinned in CIL + Format item into log vector + buffer + Attach log vector and buffer to log item + Insert log item into CIL + Write CIL context sequence into transaction + Unlock item + + + + 7. CIL push + lock CIL flush + Chain log vectors and buffers together + Remove items from CIL + unlock CIL flush + write log vectors into log + sequence commit records + attach checkpoint context to log buffer + + + + + 8. Checkpoint completion + Mark log item committed + Insert item into AIL + Write commit LSN into log item + Unpin log item + 9. AIL traversal + Lock item + Mark log item clean + Flush item to disk + + 10. Log item removed from AIL + Moves log tail + Item unlocked + +From this, it can be seen that the only life cycle differences between the two +logging methods are in the middle of the life cycle - they still have the same +beginning and end and execution constraints. The only differences are in the +commiting of the log items to the log itself and the completion processing. +Hence delayed logging should not introduce any constraints on log item +behaviour, allocation or freeing that don't already exist. + +As a result of this zero-impact "insertion" of delayed logging infrastructure +and the design of the internal structures to avoid on disk format changes, we +can basically switch between delayed logging and the existing mechanism with a +mount option. Fundamentally, there is no reason why the log manager would not +be able to swap methods automatically and transparently depending on load +characteristics, but this should not be necessary if delayed logging works as +designed. + +Roadmap: + +2.6.35 Inclusion in mainline as an experimental mount option + => approximately 2-3 months to merge window + => needs to be in xfs-dev tree in 4-6 weeks + => code is nearing readiness for review + +2.6.37 Remove experimental tag from mount option + => should be roughly 6 months after initial merge + => enough time to: + => gain confidence and fix problems reported by early + adopters (a.k.a. guinea pigs) + => address worst performance regressions and undesired + behaviours + => start tuning/optimising code for parallelism + => start tuning/optimising algorithms consuming + excessive CPU time + +2.6.39 Switch default mount option to use delayed logging + => should be roughly 12 months after initial merge + => enough time to shake out remaining problems before next round of + enterprise distro kernel rebases + + + -- 1.5.6.5 From SRS0+9z3f+76+fromorbit.com=dave@internode.on.net Mon May 17 18:22:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_66,LOCAL_GNU_PATCH,TVD_PH_BODY_ACCOUNTS_PRE autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4HNMiaA014548 for ; Mon, 17 May 2010 18:22:44 -0500 X-ASG-Debug-ID: 1274138697-793000f90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 75DAD13F3598 for ; Mon, 17 May 2010 16:24:58 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id XsdiMGpYHI63aMVI for ; Mon, 17 May 2010 16:24:58 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24560354-1927428 for ; Tue, 18 May 2010 08:54:55 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OE9g6-0005AA-EF for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:54 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OE9fr-0000Rs-Ic for xfs@oss.sgi.com; Tue, 18 May 2010 09:24:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 09/12] xfs: Introduce delayed logging core code Subject: [PATCH 09/12] xfs: Introduce delayed logging core code Date: Tue, 18 May 2010 09:24:25 +1000 Message-Id: <1274138668-1662-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1274138699 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The delayed logging code only changes in-memory structures and as such can be enabled and disabled with a mount option. Add the mount option and emit a warning that this is an experimental feature that should not be used in production yet. We also need infrastructure to track committed items that have not yet been written to the log. This is what the Committed Item List (CIL) is for. The log item also needs to be extended to track the current log vector, the associated memory buffer and it's location in the Commit Item List. Extend the log item and log vector structures to enable this tracking. To maintain the current log format for transactions with delayed logging, we need to introduce a checkpoint transaction and a context for tracking each checkpoint from initiation to transaction completion. This includes adding a log ticket for tracking space log required/used by the context checkpoint. To track all the changes we need an io vector array per log item, rather than a single array for the entire transaction. Using the new log vector structure for this requires two passes - the first to allocate the log vector structures and chain them together, and the second to fill them out. This log vector chain can then be passed to the CIL for formatting, pinning and insertion into the CIL. Formatting of the log vector chain is relatively simple - it's just a loop over the iovecs on each log vector, but it is made slightly more complex because we re-write the iovec after the copy to point back at the memory buffer we just copied into. This code also needs to pin log items. If the log item is not already tracked in this checkpoint context, then it needs to be pinned. Otherwise it is already pinned and we don't need to pin it again. The only other complexity is calculating the amount of new log space the formatting has consumed. This needs to be accounted to the transaction in progress, and the accounting is made more complex becase we need also to steal space from it for log metadata in the checkpoint transaction. Calculate all this at insert time and update all the tickets, counters, etc correctly. Once we've formatted all the log items in the transaction, attach the busy extents to the checkpoint context so the busy extents live until checkpoint completion and can be processed at that point in time. Transactions can then be freed at this point in time. Now we need to issue checkpoints - we are tracking the amount of log space used by the items in the CIL, so we can trigger background checkpoints when the space usage gets to a certain threshold. Otherwise, checkpoints need ot be triggered when a log synchronisation point is reached - a log force event. Because the log write code already handles chained log vectors, writing the transaction is trivial, too. Construct a transaction header, add it to the head of the chain and write it into the log, then issue a commit record write. Then we can release the checkpoint log ticket and attach the context to the log buffer so it can be called during Io completion to complete the checkpoint. We also need to allow for synchronising multiple in-flight checkpoints. This is needed for two things - the first is to ensure that checkpoint commit records appear in the log in the correct sequence order (so they are replayed in the correct order). The second is so that xfs_log_force_lsn() operates correctly and only flushes and/or waits for the specific sequence it was provided with. To do this we need a wait variable and a list tracking the checkpoint commits in progress. We can walk this list and wait for the checkpoints to change state or complete easily, an this provides the necessary synchronisation for correct operation in both cases. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_super.c | 10 + fs/xfs/xfs_log.c | 64 +++- fs/xfs/xfs_log.h | 9 +- fs/xfs/xfs_log_cil.c | 660 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_log_priv.h | 71 +++++- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 105 +++++++- fs/xfs/xfs_trans.h | 8 +- fs/xfs/xfs_trans_item.c | 5 +- fs/xfs/xfs_trans_priv.h | 11 +- 11 files changed, 914 insertions(+), 31 deletions(-) create mode 100644 fs/xfs/xfs_log_cil.c diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index b4769e4..c8fb13f 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -77,6 +77,7 @@ xfs-y += xfs_alloc.o \ xfs_itable.o \ xfs_dfrag.o \ xfs_log.o \ + xfs_log_cil.o \ xfs_log_recover.o \ xfs_mount.o \ xfs_mru_cache.o \ diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 1e88c98..6a7c8c9 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -118,6 +118,8 @@ mempool_t *xfs_ioend_pool; #define MNTOPT_DMAPI "dmapi" /* DMI enabled (DMAPI / XDSM) */ #define MNTOPT_XDSM "xdsm" /* DMI enabled (DMAPI / XDSM) */ #define MNTOPT_DMI "dmi" /* DMI enabled (DMAPI / XDSM) */ +#define MNTOPT_DELAYLOG "delaylog" /* Delayed loging enabled */ +#define MNTOPT_NODELAYLOG "nodelaylog" /* Delayed loging disabled */ /* * Table driven mount option parser. @@ -373,6 +375,13 @@ xfs_parseargs( mp->m_flags |= XFS_MOUNT_DMAPI; } else if (!strcmp(this_char, MNTOPT_DMI)) { mp->m_flags |= XFS_MOUNT_DMAPI; + } else if (!strcmp(this_char, MNTOPT_DELAYLOG)) { + mp->m_flags |= XFS_MOUNT_DELAYLOG; + cmn_err(CE_WARN, + "Enabling EXPERIMENTAL delayed logging feature " + "- use at your own risk.\n"); + } else if (!strcmp(this_char, MNTOPT_NODELAYLOG)) { + mp->m_flags &= ~XFS_MOUNT_DELAYLOG; } else if (!strcmp(this_char, "ihashsize")) { cmn_err(CE_WARN, "XFS: ihashsize no longer used, option is deprecated."); @@ -534,6 +543,7 @@ xfs_showargs( { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, { XFS_MOUNT_DMAPI, "," MNTOPT_DMAPI }, { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, + { XFS_MOUNT_DELAYLOG, "," MNTOPT_DELAYLOG }, { 0, NULL } }; static struct proc_xfs_info xfs_info_unset[] = { diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 19d0c5f..027ebfe 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -54,9 +54,6 @@ STATIC xlog_t * xlog_alloc_log(xfs_mount_t *mp, STATIC int xlog_space_left(xlog_t *log, int cycle, int bytes); STATIC int xlog_sync(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_dealloc_log(xlog_t *log); -STATIC int xlog_write(struct log *log, struct xfs_log_vec *log_vector, - struct xlog_ticket *tic, xfs_lsn_t *start_lsn, - xlog_in_core_t **commit_iclog, uint flags); /* local state machine functions */ STATIC void xlog_state_done_syncing(xlog_in_core_t *iclog, int); @@ -86,12 +83,6 @@ STATIC int xlog_regrant_write_log_space(xlog_t *log, STATIC void xlog_ungrant_log_space(xlog_t *log, xlog_ticket_t *ticket); - -/* local ticket functions */ -STATIC xlog_ticket_t *xlog_ticket_alloc(xlog_t *log, int unit_bytes, int count, - char clientid, uint flags, - int alloc_flags); - #if defined(DEBUG) STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr); STATIC void xlog_verify_grant_head(xlog_t *log, int equals); @@ -460,6 +451,13 @@ xfs_log_mount( /* Normal transactions can now occur */ mp->m_log->l_flags &= ~XLOG_ACTIVE_RECOVERY; + /* + * Now the log has been fully initialised and we know were our + * space grant counters are, we can initialise the permanent ticket + * needed for delayed logging to work. + */ + xlog_cil_init_post_recovery(mp->m_log); + return 0; out_destroy_ail: @@ -666,6 +664,10 @@ xfs_log_item_init( item->li_ailp = mp->m_ail; item->li_type = type; item->li_ops = ops; + item->li_lv = NULL; + + INIT_LIST_HEAD(&item->li_ail); + INIT_LIST_HEAD(&item->li_cil); } /* @@ -1176,6 +1178,9 @@ xlog_alloc_log(xfs_mount_t *mp, *iclogp = log->l_iclog; /* complete ring */ log->l_iclog->ic_prev = prev_iclog; /* re-write 1st prev ptr */ + error = xlog_cil_init(log); + if (error) + goto out_free_iclog; return log; out_free_iclog: @@ -1502,6 +1507,8 @@ xlog_dealloc_log(xlog_t *log) xlog_in_core_t *iclog, *next_iclog; int i; + xlog_cil_destroy(log); + iclog = log->l_iclog; for (i=0; il_iclog_bufs; i++) { sv_destroy(&iclog->ic_force_wait); @@ -1544,8 +1551,10 @@ xlog_state_finish_copy(xlog_t *log, * print out info relating to regions written which consume * the reservation */ -STATIC void -xlog_print_tic_res(xfs_mount_t *mp, xlog_ticket_t *ticket) +void +xlog_print_tic_res( + struct xfs_mount *mp, + struct xlog_ticket *ticket) { uint i; uint ophdr_spc = ticket->t_res_num_ophdrs * (uint)sizeof(xlog_op_header_t); @@ -1877,7 +1886,7 @@ xlog_write_copy_finish( * we don't update ic_offset until the end when we know exactly how many * bytes have been written out. */ -STATIC int +int xlog_write( struct log *log, struct xfs_log_vec *log_vector, @@ -1901,9 +1910,26 @@ xlog_write( *start_lsn = 0; len = xlog_write_calc_vec_length(ticket, log_vector); - if (ticket->t_curr_res < len) + if (log->l_cilp) { + /* + * Region headers and bytes are already accounted for. + * We only need to take into account start records and + * split regions in this function. + */ + if (ticket->t_flags & XLOG_TIC_INITED) + ticket->t_curr_res -= sizeof(xlog_op_header_t); + + /* + * Commit record headers need to be accounted for. These + * come in as separate writes so are easy to detect. + */ + if (flags & (XLOG_COMMIT_TRANS | XLOG_UNMOUNT_TRANS)) + ticket->t_curr_res -= sizeof(xlog_op_header_t); + } else + ticket->t_curr_res -= len; + + if (ticket->t_curr_res < 0) xlog_print_tic_res(log->l_mp, ticket); - ticket->t_curr_res -= len; index = 0; lv = log_vector; @@ -2999,6 +3025,8 @@ _xfs_log_force( XFS_STATS_INC(xs_log_force); + xlog_cil_push(log, 1); + spin_lock(&log->l_icloglock); iclog = log->l_iclog; @@ -3148,6 +3176,12 @@ _xfs_log_force_lsn( XFS_STATS_INC(xs_log_force); + if (log->l_cilp) { + lsn = xlog_cil_push_lsn(log, lsn); + if (lsn == NULLCOMMITLSN) + return 0; + } + try_again: spin_lock(&log->l_icloglock); iclog = log->l_iclog; @@ -3322,7 +3356,7 @@ xfs_log_get_trans_ident( /* * Allocate and initialise a new log ticket. */ -STATIC xlog_ticket_t * +xlog_ticket_t * xlog_ticket_alloc( struct log *log, int unit_bytes, diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 05f205a..4a0c574 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -113,6 +113,9 @@ struct xfs_log_vec { struct xfs_log_vec *lv_next; /* next lv in build list */ int lv_niovecs; /* number of iovecs in lv */ struct xfs_log_iovec *lv_iovecp; /* iovec array */ + struct xfs_log_item *lv_item; /* owner */ + char *lv_buf; /* formatted buffer */ + int lv_buf_len; /* size of formatted buffer */ }; /* @@ -187,11 +190,15 @@ int xfs_log_need_covered(struct xfs_mount *mp); void xlog_iodone(struct xfs_buf *); -struct xlog_ticket * xfs_log_ticket_get(struct xlog_ticket *ticket); +struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket); void xfs_log_ticket_put(struct xlog_ticket *ticket); xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp); +int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, + struct xfs_log_vec *log_vector, + xfs_lsn_t *commit_lsn, int flags); + #endif diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c new file mode 100644 index 0000000..fc41bf2 --- /dev/null +++ b/fs/xfs/xfs_log_cil.c @@ -0,0 +1,660 @@ +/* + * Copyright (c) 2010 Red Hat, 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_log.h" +#include "xfs_inum.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_log_priv.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_dir2.h" +#include "xfs_dmapi.h" +#include "xfs_mount.h" +#include "xfs_error.h" +#include "xfs_alloc.h" + +/* + * Perform initial CIL structure initialisation. If the CIL is not + * enabled in this filesystem, ensure the log->l_cilp is null so + * we can check this conditional to determine if we are doing delayed + * logging or not. + */ +int +xlog_cil_init( + struct log *log) +{ + struct xfs_cil *cil; + struct xfs_cil_ctx *ctx; + + log->l_cilp = NULL; + if (!(log->l_mp->m_flags & XFS_MOUNT_DELAYLOG)) + return 0; + + cil = kmem_zalloc(sizeof(*cil), KM_SLEEP|KM_MAYFAIL); + if (!cil) + return ENOMEM; + + ctx = kmem_zalloc(sizeof(*ctx), KM_SLEEP|KM_MAYFAIL); + if (!ctx) { + kmem_free(cil); + return ENOMEM; + } + + INIT_LIST_HEAD(&cil->xc_cil); + INIT_LIST_HEAD(&cil->xc_committing); + spin_lock_init(&cil->xc_cil_lock); + init_rwsem(&cil->xc_ctx_lock); + sv_init(&cil->xc_commit_wait, SV_DEFAULT, "cilwait"); + + INIT_LIST_HEAD(&ctx->committing); + INIT_LIST_HEAD(&ctx->busy_extents); + ctx->sequence = 1; + ctx->cil = cil; + cil->xc_ctx = ctx; + + cil->xc_log = log; + log->l_cilp = cil; + return 0; +} + +void +xlog_cil_destroy( + struct log *log) +{ + if (!log->l_cilp) + return; + + if (log->l_cilp->xc_ctx) { + if (log->l_cilp->xc_ctx->ticket) + xfs_log_ticket_put(log->l_cilp->xc_ctx->ticket); + kmem_free(log->l_cilp->xc_ctx); + } + + ASSERT(list_empty(&log->l_cilp->xc_cil)); + kmem_free(log->l_cilp); +} + +/* + * Allocate a new ticket. Failing to get a new ticket makes it really hard to + * recover, so we don't allow failure here. Also, we allocate in a context that + * we don't want to be issuing transactions from, so we need to tell the + * allocation code this as well. + * + * We don't reserve any space for the ticket - we are going to steal whatever + * space we require from transactions as they commit. To ensure we reserve all + * the space required, we need to set the current reservation of the ticket to + * zero so that we know to steal the initial transaction overhead from the + * first transaction commit. + */ +static struct xlog_ticket * +xlog_cil_ticket_alloc( + struct log *log) +{ + struct xlog_ticket *tic; + + tic = xlog_ticket_alloc(log, 0, 1, XFS_TRANSACTION, 0, + KM_SLEEP|KM_NOFS); + tic->t_trans_type = XFS_TRANS_CHECKPOINT; + + /* + * set the current reservation to zero so we know to steal the basic + * transaction overhead reservation from the first transaction commit. + */ + tic->t_curr_res = 0; + return tic; +} + +/* + * After the first stage of log recovery is done, we know where the head and + * tail of the log are. We need this log initialisation done before we can + * initialise the first CIL checkpoint context. + * + * Here we allocate a log ticket to track space usage during a CIL push. This + * ticket is passed to xlog_write() directly so that we don't slowly leak log + * space by failing to account for space used by log headers and additional + * region headers for split regions. + */ +void +xlog_cil_init_post_recovery( + struct log *log) +{ + if (!log->l_cilp) + return; + + log->l_cilp->xc_ctx->ticket = xlog_cil_ticket_alloc(log); + log->l_cilp->xc_ctx->sequence = 1; + log->l_cilp->xc_ctx->commit_lsn = xlog_assign_lsn(log->l_curr_cycle, + log->l_curr_block); +} + +/* + * Insert the log item into the CIL and calculate the difference in space + * consumed by the item. Add the space to the checkpoint ticket and calculate + * if the change requires additional log metadata. If it does, take that space + * as well. Remove the amount of space we addded to the checkpoint ticket from + * the current transaction ticket so that the accounting works out correctly. + * + * If this is the first time the item is being placed into the CIL in this + * context, pin it so it can't be written to disk until the CIL is flushed to + * the iclog and the iclog written to disk. + */ +static void +xlog_cil_insert( + struct log *log, + struct xlog_ticket *ticket, + struct xfs_log_item *item, + struct xfs_log_vec *lv) +{ + struct xfs_cil *cil = log->l_cilp; + struct xfs_log_vec *old = lv->lv_item->li_lv; + struct xfs_cil_ctx *ctx = cil->xc_ctx; + int len; + int diff_iovecs; + int iclog_space; + + if (old) { + /* existing lv on log item, space used is a delta */ + ASSERT(!list_empty(&item->li_cil)); + ASSERT(old->lv_buf && old->lv_buf_len && old->lv_niovecs); + + len = lv->lv_buf_len - old->lv_buf_len; + diff_iovecs = lv->lv_niovecs - old->lv_niovecs; + kmem_free(old->lv_buf); + kmem_free(old); + } else { + /* new lv, must pin the log item */ + ASSERT(!lv->lv_item->li_lv); + ASSERT(list_empty(&item->li_cil)); + + len = lv->lv_buf_len; + diff_iovecs = lv->lv_niovecs; + IOP_PIN(lv->lv_item); + + } + len += diff_iovecs * sizeof(xlog_op_header_t); + + /* attach new log vector to log item */ + lv->lv_item->li_lv = lv; + + spin_lock(&cil->xc_cil_lock); + list_move_tail(&item->li_cil, &cil->xc_cil); + ctx->nvecs += diff_iovecs; + + /* + * Now transfer enough transaction reservation to the context ticket + * for the checkpoint. The context ticket is special - the unit + * reservation has to grow as well as the current reservation as we + * steal from tickets so we can correctly determine the space used + * during the transaction commit. + */ + if (ctx->ticket->t_curr_res == 0) { + /* first commit in checkpoint, steal the header reservation */ + ASSERT(ticket->t_curr_res >= ctx->ticket->t_unit_res + len); + ctx->ticket->t_curr_res = ctx->ticket->t_unit_res; + ticket->t_curr_res -= ctx->ticket->t_unit_res; + } + + /* do we need space for more log record headers? */ + iclog_space = log->l_iclog_size - log->l_iclog_hsize; + if (len > 0 && (ctx->space_used / iclog_space != + (ctx->space_used + len) / iclog_space)) { + int hdrs; + + hdrs = (len + iclog_space - 1) / iclog_space; + /* need to take into account split region headers, too */ + hdrs *= log->l_iclog_hsize + sizeof(struct xlog_op_header); + ctx->ticket->t_unit_res += hdrs; + ctx->ticket->t_curr_res += hdrs; + ticket->t_curr_res -= hdrs; + ASSERT(ticket->t_curr_res >= len); + } + ticket->t_curr_res -= len; + ctx->space_used += len; + + spin_unlock(&cil->xc_cil_lock); +} + +/* + * Format log item into a flat buffers + * + * For delayed logging, we need to hold a formatted buffer containing all the + * changes on the log item. This enables us to relog the item in memory and + * write it out asynchronously without needing to relock the object that was + * modified at the time it gets written into the iclog. + * + * This function builds a vector for the changes in each log item in the + * transaction. It then works out the length of the buffer needed for each log + * item, allocates them and formats the vector for the item into the buffer. + * The buffer is then attached to the log item are then inserted into the + * Committed Item List for tracking until the next checkpoint is written out. + * + * We don't set up region headers during this process; we simply copy the + * regions into the flat buffer. We can do this because we still have to do a + * formatting step to write the regions into the iclog buffer. Writing the + * ophdrs during the iclog write means that we can support splitting large + * regions across iclog boundares without needing a change in the format of the + * item/region encapsulation. + * + * Hence what we need to do now is change the rewrite the vector array to point + * to the copied region inside the buffer we just allocated. This allows us to + * format the regions into the iclog as though they are being formatted + * directly out of the objects themselves. + */ +static void +xlog_cil_format_items( + struct log *log, + struct xfs_log_vec *log_vector, + struct xlog_ticket *ticket, + xfs_lsn_t *start_lsn) +{ + struct xfs_log_vec *lv; + + if (start_lsn) + *start_lsn = log->l_cilp->xc_ctx->sequence; + + ASSERT(log_vector); + for (lv = log_vector; lv; lv = lv->lv_next) { + void *ptr; + int index; + int len = 0; + + /* build the vector array and calculate it's length */ + IOP_FORMAT(lv->lv_item, lv->lv_iovecp); + for (index = 0; index < lv->lv_niovecs; index++) + len += lv->lv_iovecp[index].i_len; + + lv->lv_buf_len = len; + lv->lv_buf = kmem_zalloc(lv->lv_buf_len, KM_SLEEP|KM_NOFS); + ptr = lv->lv_buf; + + for (index = 0; index < lv->lv_niovecs; index++) { + struct xfs_log_iovec *vec = &lv->lv_iovecp[index]; + + memcpy(ptr, vec->i_addr, vec->i_len); + vec->i_addr = ptr; + ptr += vec->i_len; + } + ASSERT(ptr == lv->lv_buf + lv->lv_buf_len); + + xlog_cil_insert(log, ticket, lv->lv_item, lv); + } +} + +static void +xlog_cil_free_logvec( + struct xfs_log_vec *log_vector) +{ + struct xfs_log_vec *lv; + + for (lv = log_vector; lv; ) { + struct xfs_log_vec *next = lv->lv_next; + kmem_free(lv->lv_buf); + kmem_free(lv); + lv = next; + } +} + +/* + * Commit a transaction with the given vector to the Committed Item List. + * + * To do this, we need to format the item, pin it in memory if required and + * account for the space used by the transaction. Once we have done that we + * need to release the unused reservation for the transaction, attach the + * transaction to the checkpoint context so we carry the busy extents through + * to checkpoint completion, and then unlock all the items in the transaction. + * + * For more specific information about the order of operations in + * xfs_log_commit_cil() please refer to the comments in + * xfs_trans_commit_iclog(). + */ +int +xfs_log_commit_cil( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_log_vec *log_vector, + xfs_lsn_t *commit_lsn, + int flags) +{ + struct log *log = mp->m_log; + int log_flags = 0; + + if (flags & XFS_TRANS_RELEASE_LOG_RES) + log_flags = XFS_LOG_REL_PERM_RESERV; + + if (XLOG_FORCED_SHUTDOWN(log)) { + xlog_cil_free_logvec(log_vector); + return XFS_ERROR(EIO); + } + + /* lock out background commit */ + down_read(&log->l_cilp->xc_ctx_lock); + xlog_cil_format_items(log, log_vector, tp->t_ticket, commit_lsn); + + /* check we didn't blow the reservation */ + if (tp->t_ticket->t_curr_res < 0) + xlog_print_tic_res(log->l_mp, tp->t_ticket); + + /* attach the transaction to the CIL if it has any busy extents */ + if (!list_empty(&tp->t_busy)) { + spin_lock(&log->l_cilp->xc_cil_lock); + list_splice_init(&tp->t_busy, + &log->l_cilp->xc_ctx->busy_extents); + spin_unlock(&log->l_cilp->xc_cil_lock); + } + + tp->t_commit_lsn = *commit_lsn; + xfs_log_done(mp, tp->t_ticket, NULL, log_flags); + xfs_trans_unreserve_and_mod_sb(tp); + + /* background commit is allowed again */ + up_read(&log->l_cilp->xc_ctx_lock); + return 0; +} + +/* + * Mark all items committed and clear busy extents. We free the log vector + * chains in a separate pass so that we unpin the log items as quickly as + * possible. + */ +static void +xlog_cil_committed( + void *args, + int abort) +{ + struct xfs_cil_ctx *ctx = args; + struct xfs_log_vec *lv; + int abortflag = abort ? XFS_LI_ABORTED : 0; + struct xfs_busy_extent *busyp, *n; + + /* unpin all the log items */ + for (lv = ctx->lv_chain; lv; lv = lv->lv_next ) { + xfs_trans_item_committed(lv->lv_item, ctx->start_lsn, + abortflag); + } + + list_for_each_entry_safe(busyp, n, &ctx->busy_extents, list) + xfs_alloc_busy_clear(ctx->cil->xc_log->l_mp, busyp); + + spin_lock(&ctx->cil->xc_cil_lock); + list_del(&ctx->committing); + spin_unlock(&ctx->cil->xc_cil_lock); + + xlog_cil_free_logvec(ctx->lv_chain); + kmem_free(ctx); +} + +/* + * Push the Committed Item List to the log. If the push_now flag is not set, + * then it is a background flush and so we can chose to ignore it. + */ +int +xlog_cil_push( + struct log *log, + int push_now) +{ + struct xfs_cil *cil = log->l_cilp; + struct xfs_log_vec *lv; + struct xfs_cil_ctx *ctx; + struct xfs_cil_ctx *new_ctx; + struct xlog_in_core *commit_iclog; + struct xlog_ticket *tic; + int num_lv; + int num_iovecs; + int len; + int error = 0; + struct xfs_trans_header thdr; + struct xfs_log_iovec lhdr; + struct xfs_log_vec lvhdr = { NULL }; + xfs_lsn_t commit_lsn; + + if (!cil) + return 0; + + /* XXX: don't sleep for background? */ + new_ctx = kmem_zalloc(sizeof(*new_ctx), KM_SLEEP|KM_NOFS); + new_ctx->ticket = xlog_cil_ticket_alloc(log); + + /* lock out transaction commit */ + down_write(&cil->xc_ctx_lock); + ctx = cil->xc_ctx; + + /* check if we've anything to push */ + if (list_empty(&cil->xc_cil)) + goto out_skip; + + /* + * pull all the log vectors off the items in the CIL, and + * remove the items from the CIL. We don't need the CIL lock + * here because it's only needed on the transaction commit + * side which is currently locked out by the flush lock. + */ + lv = NULL; + num_lv = 0; + num_iovecs = 0; + len = 0; + while (!list_empty(&cil->xc_cil)) { + struct xfs_log_item *item; + int i; + + item = list_first_entry(&cil->xc_cil, + struct xfs_log_item, li_cil); + list_del_init(&item->li_cil); + if (!ctx->lv_chain) + ctx->lv_chain = item->li_lv; + else + lv->lv_next = item->li_lv; + lv = item->li_lv; + item->li_lv = NULL; + + num_lv++; + num_iovecs += lv->lv_niovecs; + for (i = 0; i < lv->lv_niovecs; i++) + len += lv->lv_iovecp[i].i_len; + } + + /* + * initialise the new context and attach it to the CIL. Then attach + * the current context to the CIL committing lsit so it can be found + * during log forces to extract the commit lsn of the sequence that + * needs to be forced. + */ + INIT_LIST_HEAD(&new_ctx->committing); + INIT_LIST_HEAD(&new_ctx->busy_extents); + new_ctx->sequence = ctx->sequence + 1; + new_ctx->cil = cil; + cil->xc_ctx = new_ctx; + + /* + * The switch is now done, so we can drop the context lock and move out + * of a shared context. We can't just go straight to the commit record, + * though - we need to synchronise with previous and future commits so + * that the commit records are correctly ordered in the log to ensure + * that we process items during log IO completion in the correct order. + * + * For example, if we get an EFI in one checkpoint and the EFD in the + * next (e.g. due to log forces), we do not want the checkpoint with + * the EFD to be committed before the checkpoint with the EFI. Hence + * we must strictly order the commit records of the checkpoints so + * that: a) the checkpoint callbacks are attached to the iclogs in the + * correct order; and b) the checkpoints are replayed in correct order + * in log recovery. + * + * Hence we need to add this context to the committing context list so + * that higher sequences will wait for us to write out a commit record + * before they do. + */ + spin_lock(&cil->xc_cil_lock); + list_add(&ctx->committing, &cil->xc_committing); + spin_unlock(&cil->xc_cil_lock); + up_write(&cil->xc_ctx_lock); + + /* + * Build a checkpoint transaction header and write it to the log to + * begin the transaction. We need to account for the space used by the + * transaction header here as it is not accounted for in xlog_write(). + * + * The LSN we need to pass to the log items on transaction commit is + * the LSN reported by the first log vector write. If we use the commit + * record lsn then we can move the tail beyond the grant write head. + */ + tic = ctx->ticket; + thdr.th_magic = XFS_TRANS_HEADER_MAGIC; + thdr.th_type = XFS_TRANS_CHECKPOINT; + thdr.th_tid = tic->t_tid; + thdr.th_num_items = num_iovecs; + lhdr.i_addr = (xfs_caddr_t)&thdr; + lhdr.i_len = sizeof(xfs_trans_header_t); + lhdr.i_type = XLOG_REG_TYPE_TRANSHDR; + tic->t_curr_res -= lhdr.i_len + sizeof(xlog_op_header_t); + + lvhdr.lv_niovecs = 1; + lvhdr.lv_iovecp = &lhdr; + lvhdr.lv_next = ctx->lv_chain; + + error = xlog_write(log, &lvhdr, tic, &ctx->start_lsn, NULL, 0); + if (error) + goto out_abort; + + /* + * now that we've written the checkpoint into the log, strictly + * order the commit records so replay will get them in the right order. + */ +restart: + spin_lock(&cil->xc_cil_lock); + list_for_each_entry(new_ctx, &cil->xc_committing, committing) { + /* + * Higher sequences will wait for this one so skip them. + * Don't wait for own own sequence, either. + */ + if (new_ctx->sequence >= ctx->sequence) + continue; + if (!new_ctx->commit_lsn) { + /* + * It is still being pushed! Wait for the push to + * complete, then start again from the beginning. + */ + sv_wait(&cil->xc_commit_wait, 0, &cil->xc_cil_lock, 0); + goto restart; + } + } + spin_unlock(&cil->xc_cil_lock); + + commit_lsn = xfs_log_done(log->l_mp, tic, &commit_iclog, 0); + if (error || commit_lsn == -1) + goto out_abort; + + /* attach all the transactions w/ busy extents to iclog */ + ctx->log_cb.cb_func = xlog_cil_committed; + ctx->log_cb.cb_arg = ctx; + error = xfs_log_notify(log->l_mp, commit_iclog, &ctx->log_cb); + if (error) + goto out_abort; + + /* + * now the checkpoint commit is complete and we've attached the + * callbacks to the iclog we can assign the commit LSN to the context + * and wake up anyone who is waiting for the commit to complete. + */ + spin_lock(&cil->xc_cil_lock); + ctx->commit_lsn = commit_lsn; + sv_broadcast(&cil->xc_commit_wait); + spin_unlock(&cil->xc_cil_lock); + + /* release the hounds! */ + return xfs_log_release_iclog(log->l_mp, commit_iclog); + +out_skip: + up_write(&cil->xc_ctx_lock); + xfs_log_ticket_put(new_ctx->ticket); + kmem_free(new_ctx); + return 0; + +out_abort: + xlog_cil_committed(ctx, XFS_LI_ABORTED); + return XFS_ERROR(EIO); +} + +/* + * Conditionally push the CIL based on the sequence passed in. + * + * We only need to push if we haven't already pushed the sequence + * number given. Hence the only time we will trigger a push here is + * if the push sequence is the same as the current context. + * + * We return the current commit lsn to allow the callers to determine if a + * iclog flush is necessary following this call. + * + * XXX: Initially, just push the CIL unconditionally and return whatever + * commit lsn is there. It'll be empty, so this is broken for now. + */ +xfs_lsn_t +xlog_cil_push_lsn( + struct log *log, + xfs_lsn_t push_seq) +{ + struct xfs_cil *cil = log->l_cilp; + struct xfs_cil_ctx *ctx; + xfs_lsn_t commit_lsn = NULLCOMMITLSN; + +restart: + down_write(&cil->xc_ctx_lock); + ASSERT(push_seq <= cil->xc_ctx->sequence); + + /* check to see if we need to force out the current context */ + if (push_seq == cil->xc_ctx->sequence) { + up_write(&cil->xc_ctx_lock); + xlog_cil_push(log, 1); + goto restart; + } + + /* + * See if we can find a previous sequence still committing. + * We can drop the flush lock as soon as we have the cil lock + * because we are now only comparing contexts protected by + * the cil lock. + * + * We need to wait for all previous sequence commits to complete + * before allowing the force of push_seq to go ahead. Hence block + * on commits for those as well. + */ + spin_lock(&cil->xc_cil_lock); + up_write(&cil->xc_ctx_lock); + list_for_each_entry(ctx, &cil->xc_committing, committing) { + if (ctx->sequence > push_seq) + continue; + if (!ctx->commit_lsn) { + /* + * It is still being pushed! Wait for the push to + * complete, then start again from the beginning. + */ + sv_wait(&cil->xc_commit_wait, 0, &cil->xc_cil_lock, 0); + goto restart; + } + if (ctx->sequence != push_seq) + continue; + /* found it! */ + commit_lsn = ctx->commit_lsn; + } + spin_unlock(&cil->xc_cil_lock); + return commit_lsn; +} + diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index ac97bdd..48d9208 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -377,6 +377,54 @@ typedef struct xlog_in_core { } xlog_in_core_t; /* + * The CIL context is used to aggregate per-transaction details as well be + * passed to the iclog for checkpoint post-commit processing. After being + * passed to the iclog, another context needs to be allocated for tracking the + * next set of transactions to be aggregated into a checkpoint. + */ +struct xfs_cil; + +struct xfs_cil_ctx { + struct xfs_cil *cil; + xfs_lsn_t sequence; /* chkpt sequence # */ + xfs_lsn_t start_lsn; /* first LSN of chkpt commit */ + xfs_lsn_t commit_lsn; /* chkpt commit record lsn */ + struct xlog_ticket *ticket; /* chkpt ticket */ + int nvecs; /* number of regions */ + int space_used; /* aggregate size of regions */ + struct list_head busy_extents; /* busy extents in chkpt */ + struct xfs_log_vec *lv_chain; /* logvecs being pushed */ + xfs_log_callback_t log_cb; /* completion callback hook. */ + struct list_head committing; /* ctx committing list */ +}; + +/* + * Committed Item List structure + * + * This structure is used to track log items that have been committed but not + * yet written into the log. It is used only when the delayed logging mount + * option is enabled. + * + * This structure tracks the list of committing checkpoint contexts so + * we can avoid the problem of having to hold out new transactions during a + * flush until we have a the commit record LSN of the checkpoint. We can + * traverse the list of committing contexts in xlog_cil_push_lsn() to find a + * sequence match and extract the commit LSN directly from there. If the + * checkpoint is still in the process of committing, we can block waiting for + * the commit LSN to be determined as well. This should make synchronous + * operations almost as efficient as the old logging methods. + */ +struct xfs_cil { + struct log *xc_log; + struct list_head xc_cil; + spinlock_t xc_cil_lock; + struct xfs_cil_ctx *xc_ctx; + struct rw_semaphore xc_ctx_lock; + struct list_head xc_committing; + sv_t xc_commit_wait; +}; + +/* * The reservation head lsn is not made up of a cycle number and block number. * Instead, it uses a cycle number and byte number. Logs don't expect to * overflow 31 bits worth of byte offset, so using a byte number will mean @@ -386,6 +434,7 @@ typedef struct log { /* The following fields don't need locking */ struct xfs_mount *l_mp; /* mount point */ struct xfs_ail *l_ailp; /* AIL log is working with */ + struct xfs_cil *l_cilp; /* CIL log is working with */ struct xfs_buf *l_xbuf; /* extra buffer for log * wrapping */ struct xfs_buftarg *l_targ; /* buftarg of log */ @@ -436,14 +485,17 @@ typedef struct log { #define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) - /* common routines */ extern xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); extern int xlog_recover(xlog_t *log); extern int xlog_recover_finish(xlog_t *log); extern void xlog_pack_data(xlog_t *log, xlog_in_core_t *iclog, int); -extern kmem_zone_t *xfs_log_ticket_zone; +extern kmem_zone_t *xfs_log_ticket_zone; +struct xlog_ticket *xlog_ticket_alloc(struct log *log, int unit_bytes, + int count, char client, uint xflags, + int alloc_flags); + static inline void xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes) @@ -453,6 +505,21 @@ xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes) *off += bytes; } +void xlog_print_tic_res(struct xfs_mount *mp, struct xlog_ticket *ticket); +int xlog_write(struct log *log, struct xfs_log_vec *log_vector, + struct xlog_ticket *tic, xfs_lsn_t *start_lsn, + xlog_in_core_t **commit_iclog, uint flags); + +/* + * Committed Item List interfaces + */ +int xlog_cil_init(struct log *log); +void xlog_cil_init_post_recovery(struct log *log); +void xlog_cil_destroy(struct log *log); + +int xlog_cil_push(struct log *log, int push_now); +xfs_lsn_t xlog_cil_push_lsn(struct log *log, xfs_lsn_t push_sequence); + /* * Unmount record type is used as a pseudo transaction type for the ticket. * It's value must be outside the range of XFS_TRANS_* values. diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 9ff48a1..1d2c7ee 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -268,6 +268,7 @@ typedef struct xfs_mount { #define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops must be synchronous except for space allocations */ +#define XFS_MOUNT_DELAYLOG (1ULL << 1) /* delayed logging is enabled */ #define XFS_MOUNT_DMAPI (1ULL << 2) /* dmapi is enabled */ #define XFS_MOUNT_WAS_CLEAN (1ULL << 3) #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 40d9595..929fcd6 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -253,7 +253,7 @@ _xfs_trans_alloc( * Free the transaction structure. If there is more clean up * to do when the structure is freed, add it here. */ -STATIC void +static void xfs_trans_free( struct xfs_trans *tp) { @@ -655,7 +655,7 @@ xfs_trans_apply_sb_deltas( * XFS_TRANS_SB_DIRTY will not be set when the transaction is updated but we * still need to update the incore superblock with the changes. */ -STATIC void +void xfs_trans_unreserve_and_mod_sb( xfs_trans_t *tp) { @@ -883,7 +883,7 @@ xfs_trans_fill_vecs( * they could be immediately flushed and we'd have to race with the flusher * trying to pull the item from the AIL as we add it. */ -static void +void xfs_trans_item_committed( struct xfs_log_item *lip, xfs_lsn_t commit_lsn, @@ -994,7 +994,7 @@ xfs_trans_uncommit( xfs_trans_unreserve_and_mod_sb(tp); xfs_trans_unreserve_and_mod_dquots(tp); - xfs_trans_free_items(tp, flags); + xfs_trans_free_items(tp, NULLCOMMITLSN, flags); xfs_trans_free(tp); } @@ -1144,6 +1144,93 @@ xfs_trans_commit_iclog( return xfs_log_release_iclog(mp, commit_iclog); } +/* + * Walk the log items and allocate log vector structures for + * each item large enough to fit all the vectors they require. + * Note that this format differs from the old log vector format in + * that there is no transaction header in these log vectors. + */ +STATIC struct xfs_log_vec * +xfs_trans_alloc_log_vecs( + xfs_trans_t *tp) +{ + xfs_log_item_desc_t *lidp; + struct xfs_log_vec *lv = NULL; + struct xfs_log_vec *ret_lv = NULL; + + lidp = xfs_trans_first_item(tp); + + /* Bail out if we didn't find a log item. */ + if (!lidp) { + ASSERT(0); + return NULL; + } + + while (lidp != NULL) { + struct xfs_log_vec *new_lv; + + /* Skip items which aren't dirty in this transaction. */ + if (!(lidp->lid_flags & XFS_LID_DIRTY)) { + lidp = xfs_trans_next_item(tp, lidp); + continue; + } + + /* Skip items that do not have any vectors for writing */ + lidp->lid_size = IOP_SIZE(lidp->lid_item); + if (!lidp->lid_size) { + lidp = xfs_trans_next_item(tp, lidp); + continue; + } + + new_lv = kmem_zalloc(sizeof(*new_lv) + + lidp->lid_size * sizeof(struct xfs_log_iovec), + KM_SLEEP); + + /* The allocated iovec region lies beyond the log vector. */ + new_lv->lv_iovecp = (struct xfs_log_iovec *)&new_lv[1]; + new_lv->lv_niovecs = lidp->lid_size; + new_lv->lv_item = lidp->lid_item; + if (!ret_lv) + ret_lv = new_lv; + else + lv->lv_next = new_lv; + lv = new_lv; + lidp = xfs_trans_next_item(tp, lidp); + } + + return ret_lv; +} + +static int +xfs_trans_commit_cil( + struct xfs_mount *mp, + struct xfs_trans *tp, + xfs_lsn_t *commit_lsn, + int flags) +{ + struct xfs_log_vec *log_vector; + int error; + + /* + * Get each log item to allocate a vector structure for + * the log item to to pass to the log write code. The + * CIL commit code will format the vector and save it away. + */ + log_vector = xfs_trans_alloc_log_vecs(tp); + if (!log_vector) + return ENOMEM; + + error = xfs_log_commit_cil(mp, tp, log_vector, commit_lsn, flags); + if (error) + return error; + + current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + + /* xfs_trans_free_items() unlocks them first */ + xfs_trans_free_items(tp, *commit_lsn, 0); + xfs_trans_free(tp); + return 0; +} /* * xfs_trans_commit @@ -1204,7 +1291,11 @@ _xfs_trans_commit( xfs_trans_apply_sb_deltas(tp); xfs_trans_apply_dquot_deltas(tp); - error = xfs_trans_commit_iclog(mp, tp, &commit_lsn, flags); + if (mp->m_flags & XFS_MOUNT_DELAYLOG) + error = xfs_trans_commit_cil(mp, tp, &commit_lsn, flags); + else + error = xfs_trans_commit_iclog(mp, tp, &commit_lsn, flags); + if (error == ENOMEM) { xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); error = XFS_ERROR(EIO); @@ -1242,7 +1333,7 @@ out_unreserve: error = XFS_ERROR(EIO); } current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); - xfs_trans_free_items(tp, error ? XFS_TRANS_ABORT : 0); + xfs_trans_free_items(tp, NULLCOMMITLSN, error ? XFS_TRANS_ABORT : 0); xfs_trans_free(tp); XFS_STATS_INC(xs_trans_empty); @@ -1320,7 +1411,7 @@ xfs_trans_cancel( /* mark this thread as no longer being in a transaction */ current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); - xfs_trans_free_items(tp, flags); + xfs_trans_free_items(tp, NULLCOMMITLSN, flags); xfs_trans_free(tp); } diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index ff7e9e6..b1ea20c 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -106,7 +106,8 @@ typedef struct xfs_trans_header { #define XFS_TRANS_GROWFSRT_FREE 39 #define XFS_TRANS_SWAPEXT 40 #define XFS_TRANS_SB_COUNT 41 -#define XFS_TRANS_TYPE_MAX 41 +#define XFS_TRANS_CHECKPOINT 42 +#define XFS_TRANS_TYPE_MAX 42 /* new transaction types need to be reflected in xfs_logprint(8) */ #define XFS_TRANS_TYPES \ @@ -148,6 +149,7 @@ typedef struct xfs_trans_header { { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ { XFS_TRANS_SB_COUNT, "SB_COUNT" }, \ + { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ { XFS_TRANS_DUMMY1, "DUMMY1" }, \ { XFS_TRANS_DUMMY2, "DUMMY2" }, \ { XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" } @@ -829,6 +831,10 @@ typedef struct xfs_log_item { /* buffer item iodone */ /* callback func */ struct xfs_item_ops *li_ops; /* function list */ + + /* delayed logging */ + struct list_head li_cil; /* CIL pointers */ + struct xfs_log_vec *li_lv; /* active log vector */ } xfs_log_item_t; #define XFS_LI_IN_AIL 0x1 diff --git a/fs/xfs/xfs_trans_item.c b/fs/xfs/xfs_trans_item.c index 2937a1e..f11d37d 100644 --- a/fs/xfs/xfs_trans_item.c +++ b/fs/xfs/xfs_trans_item.c @@ -299,6 +299,7 @@ xfs_trans_next_item(xfs_trans_t *tp, xfs_log_item_desc_t *lidp) void xfs_trans_free_items( xfs_trans_t *tp, + xfs_lsn_t commit_lsn, int flags) { xfs_log_item_chunk_t *licp; @@ -311,7 +312,7 @@ xfs_trans_free_items( * Special case the embedded chunk so we don't free it below. */ if (!xfs_lic_are_all_free(licp)) { - (void) xfs_trans_unlock_chunk(licp, 1, abort, NULLCOMMITLSN); + (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn); xfs_lic_all_free(licp); licp->lic_unused = 0; } @@ -322,7 +323,7 @@ xfs_trans_free_items( */ while (licp != NULL) { ASSERT(!xfs_lic_are_all_free(licp)); - (void) xfs_trans_unlock_chunk(licp, 1, abort, NULLCOMMITLSN); + (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn); next_licp = licp->lic_next; kmem_free(licp); licp = next_licp; diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 901dc0f..c6e4f2c 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -35,9 +35,14 @@ struct xfs_log_item_desc *xfs_trans_find_item(struct xfs_trans *, struct xfs_log_item_desc *xfs_trans_first_item(struct xfs_trans *); struct xfs_log_item_desc *xfs_trans_next_item(struct xfs_trans *, struct xfs_log_item_desc *); -void xfs_trans_free_items(struct xfs_trans *, int); -void xfs_trans_unlock_items(struct xfs_trans *, - xfs_lsn_t); + +void xfs_trans_unlock_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn); +void xfs_trans_free_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn, + int flags); + +void xfs_trans_item_committed(struct xfs_log_item *lip, + xfs_lsn_t commit_lsn, int aborted); +void xfs_trans_unreserve_and_mod_sb(struct xfs_trans *tp); /* * AIL traversal cursor. -- 1.5.6.5 From bigbeerjr@gmail.com Mon May 17 19:06:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4I060aN016568 for ; Mon, 17 May 2010 19:06:01 -0500 X-ASG-Debug-ID: 1274141356-6f21033f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f187.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 80C0B9C4949 for ; Mon, 17 May 2010 17:09:16 -0700 (PDT) Received: from mail-qy0-f187.google.com (mail-qy0-f187.google.com [209.85.221.187]) by cuda.sgi.com with ESMTP id LDoO4ImY6Ps9mVAj for ; Mon, 17 May 2010 17:09:16 -0700 (PDT) Received: by qyk17 with SMTP id 17so7304176qyk.12 for ; Mon, 17 May 2010 17:08:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=IxgxHpdo3zpZQA/iPCBnYQIDi3Vko2dJrqBVdtvd3Gk=; b=d44huhgObBJNPcNn9RAKkzTa/dyQRDMhreDpsp+9NkJ6Mfir4ofBgdwkvIxSwI0DzQ 1SgYshVMF0O8kiFrB6bZCvh3LRr8TiQo6oCgrOWAfBbqqjDytakr6li+C7rcHEvpIMc1 F0SqZQY+biA1b+5Ji4aLw+SgZUqF0++cr+1HA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=RmHPCWAmX4/FRhbODfbAdfAhatUURErH3ifyXKILGG/mRELztMxo6ATqKrINkyHM9l wvZQfe2rOfHZG3wb/HJ8U8Fl/pyTG5pndJQA+zAvjIHmH3NR5NX9WhP6vnExOMWyTQ8F P/5NEz7emQjP9WxuOxP8TY+xM4+Gi6w5BEXOY= MIME-Version: 1.0 Received: by 10.224.39.76 with SMTP id f12mr3274809qae.304.1274141296514; Mon, 17 May 2010 17:08:16 -0700 (PDT) Received: by 10.224.67.85 with HTTP; Mon, 17 May 2010 17:08:16 -0700 (PDT) Date: Mon, 17 May 2010 17:08:16 -0700 Message-ID: X-ASG-Orig-Subj: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel From: big beer To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-qy0-f187.google.com[209.85.221.187] X-Barracuda-Start-Time: 1274141357 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30130 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello list, I seem to find myself in the unlucky situation of having myself some hixfs filesystems I'm trying to migrate off of. Some background on hixfs (as I understand it). At some point in the past, prior to purchasing a NAS company, Hitachi decided that they could make their own NAS solution using linux/LVM/XFS. They give you a little integrated 2.4 linux blade in one of their storage subsystems with a nice (circa yr 2000) web frontend to manage samba and nfs serving. The disks that are presented to this little guy are encapsulated in LVM and formatted lv's with a variant of XFS that is shown as hixfs on the machine. You get a very limited shell on this guy and you have to run everything through sudo if you want cli access (which is heavily limited). I'm in the process of trying to get off said solution and am running into some issues getting the file system on this black box to be mounted/recognized on a standard 2.6 linux host. Here is some output from some xfs tools: box ~ # xfs_check /dev/vghorclu00/lvARRAY2 xfs_check: unexpected XFS SB magic number 0x48584653 bad superblock magic number 48584653, giving up box ~ # xfs_repair -v /dev/vghorclu00/lvARRAY2 Phase 1 - find and verify superblock... bad primary superblock - bad magic number !!! attempting to find secondary superblock... Sorry, could not find valid secondary superblock Exiting now. box ~ # xfs_db /dev/vghorclu00/lvARRAY2 xfs_db: unexpected XFS SB magic number 0x48584653 xfs_db> sb 0 xfs_db> p magicnum = 0x48584653 blocksize = 4096 dblocks = 136437760 rblocks = 0 rextents = 0 uuid = bc354b71-ad02-4e47-b27a-428060c18622 logstart = 68157444 rootino = 128 rbmino = 129 rsumino = 130 rextsize = 16 agblocks = 1048576 agcount = 131 rbmblocks = 0 logblocks = 1280 versionnum = 0x20d4 sectsize = 512 inodesize = 256 inopblock = 16 fname = "\000\000\000\000\000\000\000\000\000\000\000\000" blocklog = 12 sectlog = 9 inodelog = 8 inopblog = 4 agblklog = 20 rextslog = 0 inprogress = 0 imax_pct = 25 icount = 9486016 ifree = 3138839 fdblocks = 14074682 frextents = 0 uquotino = 131 gquotino = 132 qflags = 0 flags = 0 shared_vn = 0 inoalignmt = 2 unit = 0 width = 0 dirblklog = 0 logsectlog = 0 logsectsize = 0 logsunit = 0 features2 = 0 bad_features2 = 0 xfs_db> I would like to be able to get this FS mounted on a box that supports vanilla XFS. I'm hoping that Hitachi has done something like change the magic number so that the normal user land tools will just bail. I've got a way to make quick copies of this FS so I am fair game to experiment on it. I've made some calls to Hitachi to find out what the deal is, so far no one there has been very helpful, nor provided me with any insight to getting these mounted. I'm thinking that since XFS is GPL'd and they made extensions to it, and sold it, they should at least provide source for their user land tools/kernel module for the FS. Unless they licensed it from SGI? I should note that on their black box solution they've got a different set of user land tools all prefixed with "hi" (hixfs_db, hixfs_repair, etc). While I do have ways to grab their userland tools, the kernel module is for 2.4 so I don't think I'll have much luck just c&p everything over. If anyone has any ideas on what to do, and/or where to start, I'd greatly appreciate it. Thanks! From stan@hardwarefreak.com Mon May 17 20:20:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4I1KNOd019533 for ; Mon, 17 May 2010 20:20:23 -0500 X-ASG-Debug-ID: 1274145819-04d800160000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 801499CA951 for ; Mon, 17 May 2010 18:23:40 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id sywS6crmH4zhLchO for ; Mon, 17 May 2010 18:23:40 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id C34D46C264 for ; Mon, 17 May 2010 20:22:39 -0500 (CDT) Message-ID: <4BF1EC44.7070803@hardwarefreak.com> Date: Mon, 17 May 2010 20:24:20 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274145820 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3592 1.0000 -0.1210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.48 X-Barracuda-Spam-Status: No, SCORE=0.48 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30133 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean big beer put forth on 5/17/2010 7:08 PM: > If anyone has any ideas on what to do, and/or where to start, I'd > greatly appreciate it. Why are you avoiding the obvious solution in favor of hacking? -- Stan From bigbeerjr@gmail.com Mon May 17 22:38:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4I3cR8x025397 for ; Mon, 17 May 2010 22:38:28 -0500 X-ASG-Debug-ID: 1274154044-230f02fa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f193.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 78ACF13F634F for ; Mon, 17 May 2010 20:40:44 -0700 (PDT) Received: from mail-qy0-f193.google.com (mail-qy0-f193.google.com [209.85.221.193]) by cuda.sgi.com with ESMTP id iGbP66Zpzh4ZYawO for ; Mon, 17 May 2010 20:40:44 -0700 (PDT) Received: by qyk31 with SMTP id 31so8832811qyk.25 for ; Mon, 17 May 2010 20:40:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type; bh=6UzfvxV41DRdVewkLwdN6IL0yXRaUNDcj9//8YT0jBg=; b=R/H21IiF3LYNeaHvEQCmXwNEMzZ7CxnnJrDiNt3c9d8LUF7B4aU69B21JuAkskhKGO tipdA+Yq4LJWgqP8d8pb/X1J/4ufSNY8Rd3AXSrmiv3BYxHsioFXAclM5MJjqNjcFT/3 lo0aG+tlvATYB3CkdJvKgJPuEMXqZJsQX8pNs= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; b=Vum8PLTtVRiEDkjpo94vwEND6B1WeSGO69vyULq0I0lxQNIiltQf3rq0JWTYmVAo4Z NEt+KHUNhMYoACTfhJoESNwnLMrpxVDI88TzDxU2yS9mNAsx1j//h7MfwFjmn3jnjwOh tQfQN1k1SBXopLyvM5ImCuz5DSIL5ukYGrM9E= MIME-Version: 1.0 Received: by 10.224.86.214 with SMTP id t22mr3447228qal.29.1274153654047; Mon, 17 May 2010 20:34:14 -0700 (PDT) Received: by 10.224.67.85 with HTTP; Mon, 17 May 2010 20:34:14 -0700 (PDT) In-Reply-To: <4BF1EC44.7070803@hardwarefreak.com> References: <4BF1EC44.7070803@hardwarefreak.com> Date: Mon, 17 May 2010 20:34:14 -0700 Message-ID: X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel From: big beer To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-qy0-f193.google.com[209.85.221.193] X-Barracuda-Start-Time: 1274154045 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30139 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean >On Mon, May 17, 2010 at 6:24 PM, Stan Hoeppner wrote: > big beer put forth on 5/17/2010 7:08 PM: > >> If anyone has any ideas on what to do, and/or where to start, I'd >> greatly appreciate it. > > Why are you avoiding the obvious solution in favor of hacking? > > -- > Stan > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > Sending back to the list this time instead of Stan directly (Sorry Stan) :) The obvious solution for me would be a backup or rsync. Unfortunately both of those have issues with this particular setup. Using a backup over the network to migrate will be way too slow (days). There are way too many files to index and this poor little nas box is already falling over with cpu load from daily activities. I can quickly make a mirror on the storage, and move it over to another larger host quickly (minutes). Mounting the FS on another machine will greatly improve the time and accuracy, as I won't have to worry about inconsistencies as it's a block level copy. The black-box solution is also very painful to work with, no gcc, no automake, no rsync, etc. I would also think that for some reason I can't think of, it would be nice to have support for this version of XFS be available for free for others. Some other poor sap might find some value. So I went and changed the magic number to 0x58465342 by dumping the 1st 512 bytes off the volume, editing, and writing back, now I'm getting "Can't verify primary superblock". Using xfs_db to look at the other superblocks indeed still shows HXFS. Any advise how I can find/dump/re-write one of the other superblocks? I'd like to see if I can change another one of them if xfs_repair will run. Thanks! From sandeen@sandeen.net Mon May 17 22:45:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4I3jIEO025776 for ; Mon, 17 May 2010 22:45:19 -0500 X-ASG-Debug-ID: 1274154452-02d700d20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 435F013F6953 for ; Mon, 17 May 2010 20:47:35 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id vElklb8xb5UZ3Nio for ; Mon, 17 May 2010 20:47:35 -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 mail.sandeen.net (Postfix) with ESMTP id 54BF541039A1; Mon, 17 May 2010 22:47:31 -0500 (CDT) Message-ID: <4BF20DD3.50006@sandeen.net> Date: Mon, 17 May 2010 22:47:31 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: big beer CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1274154456 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30139 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean big beer wrote: > Hello list, > > I seem to find myself in the unlucky situation of having myself some > hixfs filesystems I'm trying to migrate off of. > Some background on hixfs (as I understand it). > At some point in the past, prior to purchasing a NAS company, Hitachi > decided that they could make their own NAS solution using > linux/LVM/XFS. They give you a little integrated 2.4 linux blade in > one of their storage subsystems with a nice (circa yr 2000) web > frontend to manage samba and nfs serving. The disks that are presented > to this little guy are encapsulated in LVM and formatted lv's with a > variant of XFS that is shown as hixfs on the machine. You get a very > limited shell on this guy and you have to run everything through sudo > if you want cli access (which is heavily limited). > > I'm in the process of trying to get off said solution and am running > into some issues getting the file system on this black box to be > mounted/recognized on a standard 2.6 linux host. > > Here is some output from some xfs tools: > > box ~ # xfs_check /dev/vghorclu00/lvARRAY2 > xfs_check: unexpected XFS SB magic number 0x48584653 > bad superblock magic number 48584653, giving up 'HXFS' - heh. (58 46 53 42 'XFSB' is the proper magic) > box ~ # xfs_repair -v /dev/vghorclu00/lvARRAY2 > Phase 1 - find and verify superblock... > bad primary superblock - bad magic number !!! > > attempting to find secondary superblock... Sorry, could not find valid > secondary superblock > Exiting now. > > box ~ # xfs_db /dev/vghorclu00/lvARRAY2 > xfs_db: unexpected XFS SB magic number 0x48584653 ... > I would like to be able to get this FS mounted on a box that supports > vanilla XFS. > I'm hoping that Hitachi has done something like change the magic > number so that the normal user land tools will just bail. I've got a > way to make quick copies of this FS so I am fair game to experiment on > it. > > I've made some calls to Hitachi to find out what the deal is, so far > no one there has been very helpful, nor provided me with any insight > to getting these mounted. I'm thinking that since XFS is GPL'd and > they made extensions to it, and sold it, they should at least provide > source for their user land tools/kernel module for the FS. Unless they > licensed it from SGI? I can't speak to that, I dunno. > I should note that on their black box solution they've got a different > set of user land tools all prefixed with "hi" (hixfs_db, hixfs_repair, > etc). While I do have ways to grab their userland tools, the kernel > module is for 2.4 so I don't think I'll have much luck just c&p > everything over. > > If anyone has any ideas on what to do, and/or where to start, I'd > greatly appreciate it. > > Thanks! *shrug* could try rewriting the magic with xfs_db and then having your way with it, see if that works. Or, just copy off this "solution" onto a new filesystem? :) -Eric From SRS0+8qpr+77+fromorbit.com=david@internode.on.net Mon May 17 23:19:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4I4JH9F027289 for ; Mon, 17 May 2010 23:19:18 -0500 X-ASG-Debug-ID: 1274156493-278400530000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1D1B713F6816 for ; Mon, 17 May 2010 21:21:34 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id UbKxcwA1GCyUT5kW for ; Mon, 17 May 2010 21:21:34 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24565107-1927428 for multiple; Tue, 18 May 2010 13:51:32 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OEEJ9-0005SF-1G; Tue, 18 May 2010 14:21:31 +1000 Date: Tue, 18 May 2010 14:21:30 +1000 From: Dave Chinner To: big beer Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Message-ID: <20100518042130.GC2150@dastard> References: <4BF1EC44.7070803@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1274156495 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.2, rules version 3.2.2.30143 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 17, 2010 at 08:34:14PM -0700, big beer wrote: > >On Mon, May 17, 2010 at 6:24 PM, Stan Hoeppner wrote: > > big beer put forth on 5/17/2010 7:08 PM: > > > >> If anyone has any ideas on what to do, and/or where to start, I'd > >> greatly appreciate it. > > > > Why are you avoiding the obvious solution in favor of hacking? > > The obvious solution for me would be a backup or rsync. Unfortunately > both of those have issues with this particular setup. > > Using a backup over the network to migrate will be way too slow > (days). There are way too many files to index and this poor little nas > box is already falling over with cpu load from daily activities. I can > quickly make a mirror on the storage, and move it over to another > larger host quickly (minutes). Mounting the FS on another machine will > greatly improve the time and accuracy, as I won't have to worry about > inconsistencies as it's a block level copy. > > The black-box solution is also very painful to work with, no gcc, no > automake, no rsync, etc. > I would also think that for some reason I can't think of, it would be > nice to have support for this version of XFS be available for free for > others. Some other poor sap might find some value. > > So I went and changed the magic number to 0x58465342 by dumping the > 1st 512 bytes off the volume, editing, and writing back, now I'm > getting "Can't verify primary superblock". Using xfs_db to look at the > other superblocks indeed still shows HXFS. Any advise how I can > find/dump/re-write one of the other superblocks? I'd like to see if I > can change another one of them if xfs_repair will run. There's no guarantee that mainline tools will work on this filesystem. As a matter of principle, I'd be asking Hitachi for the source code to their kernel module and userland tools and they are required by the GPL to do supply it on request. If we have the source code then any hidden surprises (i.e more than superblock magic number changes) can be dealt with Start by running 'xfs_check -F ' on an unmodified image of the filesystem. This will ignore bad superblock magic numbers. If this does not find any significant problems or stuff it doesn't understand, then it _might_ be safe to modify each secondary superblock and run a modern xfs_repair on. If you get this far modify the secondary superblocks by finding the disk address of each superblock with xfs_db: # for i in `seq 0 1 3`; do sudo xfs_db -x -c "sb $i" -c daddr /dev/vda; done current daddr is 0 current daddr is 2097152 current daddr is 4194304 current daddr is 6291456 # Just replace the "seq 0 1 3" with "seq 0 1 " to suite your filesystem and "/dev/vda" with your block device. And they can then be read via: # dd if=/dev/vda of=sb_1.img bs=512 skip=2097152 count=1 modified, and then written by # dd of=/dev/vda if=sb_1.img bs=512 seek=2097152 count=1 [ /me still wonders WTF the dd maintainers were thinking when they removed iseek/oseek in favour of skip/seek - I use it these all the time and I still have to look up the man page every time to make sure I'm seeking on the correct stream... ] Assuming everything is OK at this point, run 'xfs_repair -n ' first (no modify mode), and if it doesn't report anything uncorrectable, then run without the '-n'. Good luck! Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Mon May 17 23:21:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4I4LBm7027461 for ; Mon, 17 May 2010 23:21:11 -0500 X-ASG-Debug-ID: 1274156607-27bf00590000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7CD6C13F3EBE for ; Mon, 17 May 2010 21:23:28 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id rnMXnfrZrUBLe0vH for ; Mon, 17 May 2010 21:23:28 -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 mail.sandeen.net (Postfix) with ESMTP id 8747041039A1; Mon, 17 May 2010 23:23:27 -0500 (CDT) Message-ID: <4BF2163F.5070908@sandeen.net> Date: Mon, 17 May 2010 23:23:27 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: big beer CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel References: <4BF1EC44.7070803@hardwarefreak.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1274156608 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30143 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean big beer wrote: > So I went and changed the magic number to 0x58465342 by dumping the > 1st 512 bytes off the volume, editing, and writing back, now I'm > getting "Can't verify primary superblock". Using xfs_db to look at the > other superblocks indeed still shows HXFS. Any advise how I can > find/dump/re-write one of the other superblocks? I'd like to see if I > can change another one of them if xfs_repair will run. You can select each superblock and write it. xfs_db -x /dev/blah xfs_db> sb 1 xfs_db> write magicnum 0x58465342 xfs_db> sb 2 xfs_db> write magicnum 0x58465342 ... this could be scripted with -c -c I don't know if they changed anything other than the magic though, so you get to keep all pieces if it breaks! -Eric From stan@hardwarefreak.com Mon May 17 23:33:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4I4XeuN028089 for ; Mon, 17 May 2010 23:33:41 -0500 X-ASG-Debug-ID: 1274157417-7a3a00c60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 63AB89CB22B for ; Mon, 17 May 2010 21:36:57 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id bS4jqM7B3QXffBpM for ; Mon, 17 May 2010 21:36:57 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 129256C2B1 for ; Mon, 17 May 2010 23:35:57 -0500 (CDT) Message-ID: <4BF219A6.4010900@hardwarefreak.com> Date: Mon, 17 May 2010 23:37:58 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel References: <4BF1EC44.7070803@hardwarefreak.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274157418 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30144 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean big beer put forth on 5/17/2010 10:34 PM: >> On Mon, May 17, 2010 at 6:24 PM, Stan Hoeppner wrote: >> big beer put forth on 5/17/2010 7:08 PM: >> >>> If anyone has any ideas on what to do, and/or where to start, I'd >>> greatly appreciate it. >> >> Why are you avoiding the obvious solution in favor of hacking? >> > Sending back to the list this time instead of Stan directly (Sorry Stan) :) No problem. I love my Tbird "reply-to-list" option. :) > The obvious solution for me would be a backup or rsync. Unfortunately > both of those have issues with this particular setup. > > Using a backup over the network to migrate will be way too slow > (days). There are way too many files to index and this poor little nas > box is already falling over with cpu load from daily activities. I can > quickly make a mirror on the storage, and move it over to another > larger host quickly (minutes). Mounting the FS on another machine will > greatly improve the time and accuracy, as I won't have to worry about > inconsistencies as it's a block level copy. > The black-box solution is also very painful to work with, no gcc, no > automake, no rsync, etc. > I would also think that for some reason I can't think of, it would be > nice to have support for this version of XFS be available for free for > others. Some other poor sap might find some value. > > So I went and changed the magic number to 0x58465342 by dumping the > 1st 512 bytes off the volume, editing, and writing back, now I'm > getting "Can't verify primary superblock". Using xfs_db to look at the > other superblocks indeed still shows HXFS. Any advise how I can > find/dump/re-write one of the other superblocks? I'd like to see if I > can change another one of them if xfs_repair will run. Seems to me you're taking some big chances with live data. One wrong turn and you could hose the FS and lose all the data, yes? I'd rather give you recommendations not related to this current path you're taking. Would you please provide the model or part number of this Hitachi NAS so I can get an idea of what exactly it is you're dealing with, and possibly offer other solutions? Maybe someone else here can help you pull this off via XFS. I can't. But I'll gladly spend some time researching other possible solutions, mainly getting a high capacity drive connected so you can do a cp -a or tar and be done with this overnight, in a data-safe manner. -- Stan From Jabir_M@pmc-sierra.com Mon May 17 23:43:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_LOTS_OF_MONEY autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4I4h8ux028631 for ; Mon, 17 May 2010 23:43:12 -0500 X-ASG-Debug-ID: 1274157984-7a2b01110000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bby1mta02.pmc-sierra.bc.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 62F179CB4E7 for ; Mon, 17 May 2010 21:46:24 -0700 (PDT) Received: from bby1mta02.pmc-sierra.bc.ca (bby1mta02.pmc-sierra.com [216.241.235.117]) by cuda.sgi.com with ESMTP id slYPqngSTd5FTX3l for ; Mon, 17 May 2010 21:46:24 -0700 (PDT) Received: from bby1mta02.pmc-sierra.bc.ca (localhost.pmc-sierra.bc.ca [127.0.0.1]) by localhost (Postfix) with SMTP id 8157A8E0083 for ; Mon, 17 May 2010 21:45:23 -0700 (PDT) Received: from bby1exg02.pmc_nt.nt.pmc-sierra.bc.ca (BBY1EXG02.pmc-sierra.bc.ca [216.241.231.167]) by bby1mta02.pmc-sierra.bc.ca (Postfix) with SMTP id 74EAF8E007A for ; Mon, 17 May 2010 21:45:23 -0700 (PDT) Received: from BBY1EXM11.pmc_nt.nt.pmc-sierra.bc.ca ([216.241.231.157]) by bby1exg02.pmc_nt.nt.pmc-sierra.bc.ca with Microsoft SMTPSVC(6.0.3790.4675); Mon, 17 May 2010 21:45:23 -0700 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-ASG-Orig-Subj: xfs crash Subject: xfs crash Date: Mon, 17 May 2010 21:45:23 -0700 Message-ID: X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: xfs crash Thread-Index: Acr2RO0dlZxIg7+XSeaMY6UR1ubj+g== From: "Jabir M" To: X-OriginalArrivalTime: 18 May 2010 04:45:23.0100 (UTC) FILETIME=[ED2F75C0:01CAF644] X-Barracuda-Connect: bby1mta02.pmc-sierra.com[216.241.235.117] X-Barracuda-Start-Time: 1274157984 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.02 X-Barracuda-Spam-Status: No, SCORE=-1.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, BSF_RULE_7582B X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30144 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi all, I am using xfs file system on a MIPS based processor having = linux-2.6.24. when executed a script to copy an mp4 file of 1GB upto 30 = instances on back ground. xfs crashed displaying the following log. = Please suggest me a solution. CPU 1 Unable to handle kernel paging request at virtual address = 00000006, epc =3D=3D 803375e8, ra =3D=3D 803375d4 Oops[#1]: Cpu 1 $ 0 : 00000000 00000000 00000000 00000025 $ 4 : 8f1c383c 00000038 00000038 0000003b $ 8 : 00000002 00000400 0000000a 00000400 $12 : 00000000 8054c5c0 0000123c 00000000 $16 : 8f1c383c 8d2c936c 00000038 0000003b $20 : 87738000 00000000 00000000 00000000 $24 : 8f39b1d0 8036ca64 $28 : 8f0ea000 8f0eb428 8fb18900 803375d4 Hi : 00000000 Lo : 00001104 epc : 803375e8 xfs_trans_log_buf+0xa0/0xe0 Not tainted ra : 803375d4 xfs_trans_log_buf+0x8c/0xe0 Status: 1100c303 KERNEL EXL IE Cause : 00800008 BadVA : 00000006 PrId : 00019548 (MIPS 34K) Modules linked in: block2mtd Process cp (pid: 1407, threadinfo=3D8f0ea000, task=3D8f89b648) Stack : 00000000 03a70c78 8f0ca480 8d2c936c 8f017400 8d2c936c 8f336200 = 00000001 8f08ee98 802e2858 00000008 00014005 8f3362c0 8f3362c0 8f0eb468 = 8f0eb46c 00000038 0000003b 00000000 87738010 00000001 802e7a18 00000001 = 00000000 8f08ee08 00000001 00000024 00000000 8064eec0 8f08ee30 8f017400 = 80300ea4 00004004 80337af0 00000200 00001104 003a5fc3 03a70c78 00000008 = 00000000 ... Call Trace: [<803375e8>] xfs_trans_log_buf+0xa0/0xe0 [<802e2858>] xfs_alloc_log_agf+0x58/0x6c [<802e7a18>] xfs_alloc_delrec+0x4b8/0xba4 [<802e814c>] xfs_alloc_delete+0x48/0xec [<802e1e84>] xfs_alloc_fixup_trees+0x8c/0x46c [<802e4004>] xfs_alloc_ag_vextent_near+0x42c/0xae8 [<802e47fc>] xfs_alloc_ag_vextent+0x13c/0x1a4 [<802e51d4>] xfs_alloc_vextent+0x3d4/0x490 [<802f6930>] xfs_bmap_btalloc+0x66c/0xabc [<802fac58>] xfs_bmapi+0xd48/0x13f8 [<803215d8>] xfs_iomap_write_allocate+0x178/0x59c [<80320408>] xfs_iomap+0x40c/0x468 [<8034570c>] xfs_map_blocks+0x48/0xac [<80346928>] xfs_page_state_convert+0x658/0x910 [<80346f28>] xfs_vm_writepage+0x84/0x20c [<8016987c>] __writepage+0x1c/0x88 [<8016a6a8>] write_cache_pages+0x300/0x418 [<8016a828>] do_writepages+0x44/0x78 [<801abf80>] __writeback_single_inode+0xa0/0x488 [<801ac934>] sync_sb_inodes+0x318/0x470 [<801acddc>] writeback_inodes+0x9c/0x160 [<8016b3bc>] balance_dirty_pages_ratelimited_nr+0x278/0x3c8 [<80163e64>] generic_file_buffered_write+0x1fc/0x758 [<8034f8fc>] xfs_write+0x680/0x934 [<80184608>] do_sync_write+0xe0/0x168 [<80185298>] sys_write+0x58/0xc0 [<8010bed0>] stack_done+0x20/0x3c Code: 02402821 34630001 ae230060 <90470006> 2403fff7 02603021 = 34e70001 00e33824 a0470006 Thanks Jabir From SRS0+8qpr+77+fromorbit.com=david@internode.on.net Tue May 18 01:00:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4I60RDT034283 for ; Tue, 18 May 2010 01:00:28 -0500 X-ASG-Debug-ID: 1274162622-7a31030c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 360F49CB8FE for ; Mon, 17 May 2010 23:03:43 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id z7EKkaGNY4WcskA2 for ; Mon, 17 May 2010 23:03:43 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24912210-1927428 for multiple; Tue, 18 May 2010 15:32:41 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OEFt1-0005YQ-Vy; Tue, 18 May 2010 16:02:40 +1000 Date: Tue, 18 May 2010 16:02:39 +1000 From: Dave Chinner To: Jabir M Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs crash Subject: Re: xfs crash Message-ID: <20100518060239.GD2150@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1274162625 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.2, rules version 3.2.2.30146 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 17, 2010 at 09:45:23PM -0700, Jabir M wrote: > > Hi all, > > I am using xfs file system on a MIPS based processor having > linux-2.6.24. when executed a script to copy an mp4 file of 1GB > upto 30 instances on back ground. xfs crashed displaying the > following log. Please suggest me a solution. I'd suggest upgrading your kernel to somethign recent - there were lots of fixes between 2.6.24 and 2.6.28 for allocation problems under this sort of workload.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From michael.monnerie@is.it-management.at Tue May 18 02:51:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4I7pdLD039182 for ; Tue, 18 May 2010 02:51:40 -0500 X-ASG-Debug-ID: 1274169295-64a303970000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A55EA9CBCBB for ; Tue, 18 May 2010 00:54:55 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id cO9e9bQ3vZBKKdOz for ; Tue, 18 May 2010 00:54:55 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id D09D2800139 for ; Tue, 18 May 2010 09:53:52 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 7C61C83C804 for ; Tue, 18 May 2010 09:53:52 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: xfs_repair 3.1.1 doesnt repair broken filesystem Subject: xfs_repair 3.1.1 doesnt repair broken filesystem Date: Tue, 18 May 2010 09:53:47 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1702446.OcipcPCo6O"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005180953.51892@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1274169296 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.2, rules version 3.2.2.30154 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1702446.OcipcPCo6O Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable I do a repair on a broken filesystem, which reports no problems. Then I=20 mount and "ls -l", and you can easily see all those broken entries,=20 which should be directories. They are not repaired. What could I do? # xfs_repair -v /dev/bigbak/bigbak =20 Phase 1 - find and verify superblock... = =20 - block cache size set to 8536 entries = =20 Phase 2 - using internal log = =20 - zero log... = =20 XFS: totally zeroed log = =20 zero_log: head block 0 tail block 0 = =20 - scan filesystem freespace and inode maps... = =20 - found root inode chunk = =20 Phase 3 - for each AG... = =20 - scan and clear agi unlinked lists... = =20 - process known inodes and perform inode discovery... = =20 - agno =3D 0 = =20 - agno =3D 1 = =20 - agno =3D 2 = =20 - agno =3D 3 = =20 - agno =3D 4 = =20 - agno =3D 5 = =20 - agno =3D 6 = =20 - agno =3D 7 = =20 - agno =3D 8 = =20 - agno =3D 9 = =20 - agno =3D 10 = =20 - agno =3D 11 = =20 - agno =3D 12 = =20 - agno =3D 13 = =20 - agno =3D 14 = =20 - agno =3D 15 = =20 - agno =3D 16 = =20 - agno =3D 17 = =20 - agno =3D 18 = =20 - agno =3D 19 = =20 - agno =3D 20 = =20 - agno =3D 21 = =20 - agno =3D 22 = =20 - agno =3D 23 = =20 - agno =3D 24 = =20 - agno =3D 25 = =20 - agno =3D 26 = =20 - agno =3D 27 = =20 - agno =3D 28 = =20 - agno =3D 29 = =20 - agno =3D 30 = =20 - agno =3D 31 = =20 - process newly discovered inodes... = =20 Phase 4 - check for duplicate blocks... = =20 - setting up duplicate extent list... = =20 - check for inodes claiming duplicate blocks... = =20 - agno =3D 0 = =20 - agno =3D 1 = =20 - agno =3D 2 = =20 - agno =3D 3 = =20 - agno =3D 4 = =20 - agno =3D 5 = =20 - agno =3D 6 = =20 - agno =3D 7 = =20 - agno =3D 8 = =20 - agno =3D 9 = =20 - agno =3D 10 = =20 - agno =3D 11 = =20 - agno =3D 12 = =20 - agno =3D 13 = =20 - agno =3D 14 = =20 - agno =3D 15 = =20 - agno =3D 16 = =20 - agno =3D 17 = =20 - agno =3D 18 = =20 - agno =3D 19 = =20 - agno =3D 20 = =20 - agno =3D 21 = =20 - agno =3D 22 = =20 - agno =3D 23 = =20 - agno =3D 24 = =20 - agno =3D 25 = =20 - agno =3D 26 = =20 - agno =3D 27 = =20 - agno =3D 28 = =20 - agno =3D 29 = =20 - agno =3D 30 = =20 - agno =3D 31 = =20 Phase 5 - rebuild AG headers and trees... = =20 - agno =3D 0 = =20 - agno =3D 1 = =20 - agno =3D 2 = =20 - agno =3D 3 = =20 - agno =3D 4 = =20 - agno =3D 5 = =20 - agno =3D 6 = =20 - agno =3D 7 = =20 - agno =3D 8 = =20 - agno =3D 9 = =20 - agno =3D 10 = =20 - agno =3D 11 = =20 - agno =3D 12 = =20 - agno =3D 13 = =20 - agno =3D 14 = =20 - agno =3D 15 = =20 - agno =3D 16 = =20 - agno =3D 17 = =20 - agno =3D 18 = =20 - agno =3D 19 = =20 - agno =3D 20 = =20 - agno =3D 21 = =20 - agno =3D 22 = =20 - agno =3D 23 = =20 - agno =3D 24 = =20 - agno =3D 25 = =20 - agno =3D 26 = =20 - agno =3D 27 = =20 - agno =3D 28 = =20 - agno =3D 29 = =20 - agno =3D 30 = =20 - agno =3D 31 = =20 - reset superblock... = =20 Phase 6 - check inode connectivity... = =20 - resetting contents of realtime bitmap and summary inodes = =20 - traversing filesystem ... = =20 - agno =3D 0 = =20 - agno =3D 1 = =20 - agno =3D 2 = =20 - agno =3D 3 = =20 - agno =3D 4 = =20 - agno =3D 5 = =20 - agno =3D 6 = =20 - agno =3D 7 = =20 - agno =3D 8 = =20 - agno =3D 9 = =20 - agno =3D 10 = =20 - agno =3D 11 = =20 - agno =3D 12 = =20 - agno =3D 13 = =20 - agno =3D 14 = =20 - agno =3D 15 = =20 - agno =3D 16 = =20 - agno =3D 17 = =20 - agno =3D 18 = =20 - agno =3D 19 = =20 - agno =3D 20 = =20 - agno =3D 21 = =20 - agno =3D 22 = =20 - agno =3D 23 = =20 - agno =3D 24 = =20 - agno =3D 25 = =20 - agno =3D 26 = =20 - agno =3D 27 = =20 - agno =3D 28 = =20 - agno =3D 29 = =20 - agno =3D 30 = =20 - agno =3D 31 = =20 - traversal finished ... = =20 - moving disconnected inodes to lost+found ... = =20 Phase 7 - verify and correct link counts... = =20 XFS_REPAIR Summary Tue May 18 09:50:35 2010 Phase Start End Duration Phase 1: 05/18 09:48:12 05/18 09:48:12 =20 Phase 2: 05/18 09:48:12 05/18 09:48:44 32 seconds Phase 3: 05/18 09:48:44 05/18 09:49:39 55 seconds Phase 4: 05/18 09:49:39 05/18 09:49:54 15 seconds Phase 5: 05/18 09:49:54 05/18 09:49:54 =20 Phase 6: 05/18 09:49:54 05/18 09:50:35 41 seconds Phase 7: 05/18 09:50:35 05/18 09:50:35 =20 Total run time: 2 minutes, 23 seconds done # mount /dev/bigbak/bigbak /disks/bigbak/ # l /disks/bigbak/ ls: Zugriff auf /disks/bigbak/lama nicht m=C3=B6glich: Das Argument ist=20 ung=C3=BCltig ls: Zugriff auf /disks/bigbak/maza nicht m=C3=B6glich: Das Argument ist=20 ung=C3=BCltig ls: Zugriff auf /disks/bigbak/paan nicht m=C3=B6glich: Das Argument ist=20 ung=C3=BCltig ls: Zugriff auf /disks/bigbak/public nicht m=C3=B6glich: Das Argument ist=20 ung=C3=BCltig ls: Zugriff auf /disks/bigbak/tmp nicht m=C3=B6glich: Das Argument ist=20 ung=C3=BCltig ls: Zugriff auf /disks/bigbak/upload nicht m=C3=B6glich: Das Argument ist=20 ung=C3=BCltig ls: Zugriff auf /disks/bigbak/vop nicht m=C3=B6glich: Das Argument ist=20 ung=C3=BCltig ls: Zugriff auf /disks/bigbak/zmi nicht m=C3=B6glich: Das Argument ist=20 ung=C3=BCltig insgesamt 20 drwxrwx--- 14 root 1000 4096 12. Mai 09:36 ./ drwxr-xr-x 7 root root 184 17. Mai 12:40 ../ drwx------ 6 1007 nogroup 4096 9. Jan 15:51 anse/ =2Drw-r--r-- 1 root root 155 12. Mai 09:42 du.20100512 =2Drwx------ 1 root root 141 26. M=C3=A4r 14:51 find-inode.sh* drwx------ 2 1006 nogroup 68 23. Nov 15:15 hope/ drwxrwxr-x+ 4 1007 nogroup 49 29. Nov 12:32 itm/ drwx------ 2 1002 nogroup 68 23. Nov 15:14 jog/ ??????????? ? ? ? ? ? lama ??????????? ? ? ? ? ? maza ??????????? ? ? ? ? ? paan ??????????? ? ? ? ? ? public ??????????? ? ? ? ? ? tmp ??????????? ? ? ? ? ? upload ??????????? ? ? ? ? ? vop ??????????? ? ? ? ? ? zmi =2D-=20 mit freundlichen Gr=C3=BCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=C3=A4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart1702446.OcipcPCo6O Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkvyR48ACgkQzhSR9xwSCbTxrwCcCSZfnOi1Q+A6WPWfNcCfXMh+ 7mEAoO9CdzVJSIwkM/uQ9J71u/lAvmbC =4SgW -----END PGP SIGNATURE----- --nextPart1702446.OcipcPCo6O-- From eflorac@intellique.com Tue May 18 05:14:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4IAESLt046005 for ; Tue, 18 May 2010 05:14:28 -0500 X-ASG-Debug-ID: 1274177800-536b009c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CBABA1DF208A for ; Tue, 18 May 2010 03:16:44 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id F1vIaRPTvnHaF06K for ; Tue, 18 May 2010 03:16:44 -0700 (PDT) Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by smtp4-g21.free.fr (Postfix) with ESMTP id C34734C810E; Tue, 18 May 2010 12:16:38 +0200 (CEST) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP; Tue, 18 May 2010 12:16:37 +0200 (CEST) Date: Tue, 18 May 2010 12:16:25 +0200 From: Emmanuel Florac To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair 3.1.1 doesnt repair broken filesystem Subject: Re: xfs_repair 3.1.1 doesnt repair broken filesystem Message-ID: <20100518121625.41050392@harpe.intellique.com> In-Reply-To: <201005180953.51892@zmi.at> References: <201005180953.51892@zmi.at> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/q21y55Dpc8WJYoKm5a0EYyx"; protocol="application/pgp-signature" X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1274177805 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.2, rules version 3.2.2.30162 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --Sig_/q21y55Dpc8WJYoKm5a0EYyx Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Le Tue, 18 May 2010 09:53:47 +0200 Michael Monnerie =E9crivait: > I do a repair on a broken filesystem, which reports no problems. Then > I mount and "ls -l", and you can easily see all those broken entries,=20 > which should be directories. They are not repaired. What could I do? What is your xfs_repair version? (-V option). I guess 3.0.1 or more should be better. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ --Sig_/q21y55Dpc8WJYoKm5a0EYyx Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkvyaPkACgkQX3jQXNUicVb15wCgilcCEHyzetg4NoJ2OPO8Yadd COoAoJ25GwdFU2Na9HTu74UMVfVDFQhX =Gch2 -----END PGP SIGNATURE----- --Sig_/q21y55Dpc8WJYoKm5a0EYyx-- From default_user@email.it Tue May 18 05:59:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4IAxaj9047915 for ; Tue, 18 May 2010 05:59:37 -0500 X-ASG-Debug-ID: 1274180573-201801700000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.isti.cnr.it (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9727B1096E9F for ; Tue, 18 May 2010 04:02:54 -0700 (PDT) Received: from mx2.isti.cnr.it (mx2.isti.cnr.it [194.119.192.4]) by cuda.sgi.com with ESMTP id keqGEc0EXigriZ8O for ; Tue, 18 May 2010 04:02:54 -0700 (PDT) Received: from conversionlocal.isti.cnr.it by mx.isti.cnr.it (PMDF V6.5 #31825) id <01NN9GNEFGPCE7Y8WH@mx.isti.cnr.it> for xfs@oss.sgi.com; Tue, 18 May 2010 13:01:04 +0100 Received: from [10.0.50.145] (firewall-itb.itb.cnr.it [155.253.6.254]) by mx.isti.cnr.it (PMDF V6.5 #31826) with ESMTPSA id <01NN9GNCB8K6E4A13Y@mx.isti.cnr.it>; Tue, 18 May 2010 13:01:01 +0200 Date: Tue, 18 May 2010 13:01:47 +0200 From: Default User X-ASG-Orig-Subj: Re: xfs_repair 3.1.1 doesnt repair broken filesystem Subject: Re: xfs_repair 3.1.1 doesnt repair broken filesystem In-reply-to: <201005180953.51892@zmi.at> To: Michael Monnerie Cc: xfs@oss.sgi.com Message-id: <4BF2739B.6000509@email.it> MIME-version: 1.0 Content-type: text/plain; charset=UTF-8; format=flowed Content-transfer-encoding: 7bit User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100404 Thunderbird/3.0.4 X-INSM-ip-source: 155.253.6.254 Auth Done References: <201005180953.51892@zmi.at> X-Barracuda-Connect: mx2.isti.cnr.it[194.119.192.4] X-Barracuda-Start-Time: 1274180574 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0541 1.0000 -1.6741 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.67 X-Barracuda-Spam-Status: No, SCORE=-1.67 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.2, rules version 3.2.2.30165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 05/18/2010 09:53 AM, Michael Monnerie wrote: > I do a repair on a broken filesystem, which reports no problems. Then I > mount and "ls -l", and you can easily see all those broken entries, > which should be directories. They are not repaired. What could I do? > I think you have created the filesystem with -o inode64 and now you are remounting it without -o inode64. After you created one file or directory with the inode64 option you NEED to always specify inode64 option at subsequent mounts or you won't be able to access such files/directories. (Not sure if forgetting to use the option can even cause data corruption upon write. Might inode32 writes overwrite the inaccessible inode64 files/dirs? XFS developers might know this.) From michael.monnerie@is.it-management.at Tue May 18 06:40:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4IBe2NM049688 for ; Tue, 18 May 2010 06:40:03 -0500 X-ASG-Debug-ID: 1274183001-1ff703390000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0D22B1569EBE for ; Tue, 18 May 2010 04:43:21 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id MTWSPIsJvf4MnqK4 for ; Tue, 18 May 2010 04:43:21 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id ED5DD800183 for ; Tue, 18 May 2010 13:42:17 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id AA35D83C804 for ; Tue, 18 May 2010 13:42:17 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair 3.1.1 doesnt repair broken filesystem [solved] Subject: Re: xfs_repair 3.1.1 doesnt repair broken filesystem [solved] Date: Tue, 18 May 2010 13:42:13 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: <201005180953.51892@zmi.at> <4BF2739B.6000509@email.it> In-Reply-To: <4BF2739B.6000509@email.it> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart2856337.8KJTd9OaXF"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005181342.17267@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1274183002 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0022 1.0000 -2.0067 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.2, rules version 3.2.2.30168 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart2856337.8KJTd9OaXF Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Dienstag, 18. Mai 2010 Default User wrote: > I think you have created the filesystem with -o inode64 and now you > are remounting it without -o inode64. > After you created one file or directory with the inode64 option you > NEED to always specify inode64 option at subsequent mounts or you > won't be able to access such files/directories. > (Not sure if forgetting to use the option can even cause data > corruption upon write. Might inode32 writes overwrite the > inaccessible inode64 files/dirs? XFS developers might know this.) =20 Ah! You're absolutely right, inode64 did the trick. Isn't it a kind of bug? Of course normally you would mount filesystems=20 from fstab, but for a temporary one like this I didn't do that. Still,=20 having xfs issuing not even a warning smells like a bug, even if they=20 might say it's a "feature by design". So if you have an external 2TB drive from a friend and mount it on your=20 PC, you can't tell if inode64 was used or not? And if you mount without=20 that option you could destroy contents? In my case it was "easy" to see=20 there are fs problems, but what if such inodes are only used in subdirs?=20 Even with this "easy seeable" problem I didn't have the idea of a=20 missing inode64 option. =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart2856337.8KJTd9OaXF Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkvyfRkACgkQzhSR9xwSCbTwRgCfUCWGWPAa1dSS+16LUNEOK3WU JaQAn0qHvhEM0HivopFFfDwBXa+ERebv =CDQb -----END PGP SIGNATURE----- --nextPart2856337.8KJTd9OaXF-- From michael.monnerie@is.it-management.at Tue May 18 06:48:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_27, J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4IBm1rm050049 for ; Tue, 18 May 2010 06:48:01 -0500 X-ASG-Debug-ID: 1274183416-56fa02290000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E375013F7D28 for ; Tue, 18 May 2010 04:50:17 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id YBipEnrhcSxUnZsk for ; Tue, 18 May 2010 04:50:17 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 1863F800139 for ; Tue, 18 May 2010 13:50:16 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id C87A883C804 for ; Tue, 18 May 2010 13:50:15 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: rsync from xfs to nfs+xfs and ACL problems Subject: rsync from xfs to nfs+xfs and ACL problems Date: Tue, 18 May 2010 13:50:15 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart2098071.Zbsv3MNRes"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005181350.15308@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1274183418 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.2, rules version 3.2.2.30168 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart2098071.Zbsv3MNRes Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Hello, I'm trying to rsync from an xfs with ACLs set to another server=20 which has an xfs filesystem. I mounted the nfs using=20 rw,noatime,nodiratime,acl,rsize=3D65536,wsize=3D65536,nfsvers=3D3,proto=3Dt= cp,mountproto=3Dtcp and I get these errors: rsync: rsync_xal_set: lsetxattr("anse/Software=20 ANDY/Bfort.exe","trusted.SGI_ACL_FILE") failed: Operation not supported=20 (95) rsync: rsync_xal_set: lsetxattr("anse/Software=20 ANDY/CWShredLast.exe","trusted.SGI_ACL_FILE") failed: Operation not=20 supported (95) rsync: rsync_xal_set: lsetxattr("anse/Software=20 ANDY/CWSysinfo_130.zip","trusted.SGI_ACL_FILE") failed: Operation not=20 supported (95) Does it mean I can't sync ACLs? How could I do it? I need a full backup=20 including ACLs, as I want to move all data and then restore. =2D-=20 mit freundlichen Gr=C3=BCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=C3=A4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart2098071.Zbsv3MNRes Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkvyfvcACgkQzhSR9xwSCbSsUwCffAXnbVJir09oRG6YK+CRBXC8 sBcAoN+fDHsAoh5w3H1GGPAO4pgIJ27w =Lvrs -----END PGP SIGNATURE----- --nextPart2098071.Zbsv3MNRes-- From SRS0+8qpr+77+fromorbit.com=david@internode.on.net Tue May 18 07:31:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_27, J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4ICVVfF051902 for ; Tue, 18 May 2010 07:31:32 -0500 X-ASG-Debug-ID: 1274186089-016f002f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BAEFC156A34D for ; Tue, 18 May 2010 05:34:49 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id ErYCKpPI4h8iosr0 for ; Tue, 18 May 2010 05:34:49 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24656147-1927428 for multiple; Tue, 18 May 2010 22:03:37 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OELyq-0005zZ-L0; Tue, 18 May 2010 22:33:04 +1000 Date: Tue, 18 May 2010 22:33:04 +1000 From: Dave Chinner To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: rsync from xfs to nfs+xfs and ACL problems Subject: Re: rsync from xfs to nfs+xfs and ACL problems Message-ID: <20100518123304.GH2150@dastard> References: <201005181350.15308@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201005181350.15308@zmi.at> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1274186091 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0004 1.0000 -2.0184 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.2, rules version 3.2.2.30169 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 18, 2010 at 01:50:15PM +0200, Michael Monnerie wrote: > Hello, I'm trying to rsync from an xfs with ACLs set to another server > which has an xfs filesystem. I mounted the nfs using > rw,noatime,nodiratime,acl,rsize=65536,wsize=65536,nfsvers=3,proto=tcp,mountproto=tcp > and I get these errors: > > rsync: rsync_xal_set: lsetxattr("anse/Software > ANDY/Bfort.exe","trusted.SGI_ACL_FILE") failed: Operation not supported > (95) > rsync: rsync_xal_set: lsetxattr("anse/Software > ANDY/CWShredLast.exe","trusted.SGI_ACL_FILE") failed: Operation not > supported (95) > rsync: rsync_xal_set: lsetxattr("anse/Software > ANDY/CWSysinfo_130.zip","trusted.SGI_ACL_FILE") failed: Operation not > supported (95) > > Does it mean I can't sync ACLs? How could I do it? I need a full backup > including ACLs, as I want to move all data and then restore. NFSv3 doesn't support ACLs, IIRC. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bigbeerjr@gmail.com Tue May 18 10:16:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4IFGlPK058973 for ; Tue, 18 May 2010 10:16:47 -0500 X-ASG-Debug-ID: 1274196006-33fd03db0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f187.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8FAA9156A674 for ; Tue, 18 May 2010 08:20:06 -0700 (PDT) Received: from mail-qy0-f187.google.com (mail-qy0-f187.google.com [209.85.221.187]) by cuda.sgi.com with ESMTP id aGcrRWifbr7w5SFn for ; Tue, 18 May 2010 08:20:06 -0700 (PDT) Received: by qyk17 with SMTP id 17so8288031qyk.12 for ; Tue, 18 May 2010 08:19:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type :content-transfer-encoding; bh=JbcLOuyyHoG5H8t8NEcJkkjrKq2xnLYHVxAqySxSOdQ=; b=cOBRIvwodNt8g0uFe/O0TnAfhzp8ci4MIH2vXtAXbQ4gRPKYctI/WqmXaBC+ez4Z2R fbjgC6At3iRZ75df1PrKJsyNDSFhk4+M08Ow7iC6RXJd4CZ0uFUYzTlWKsyghuL7wOs0 +6TR38GcKjr2HfGcgtXw6WX1oxUS7Xg/ZSyas= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; b=YeOrEGmdndUGx/hG272yE/qnBAlh/x7ulzSENBgMrhsBB/WKXXylLIqd4WLDt98dqy AbeBnj+HlQvt63/CHZBGsoW+R7dzU6wFBLJRXqECJ1crKTecquB5xaBZqbOnb4bos14c ILpXoe9pEsEm277RojNRp1w+O7cmXQ/QmGaJk= MIME-Version: 1.0 Received: by 10.224.7.195 with SMTP id e3mr3769249qae.180.1274195941181; Tue, 18 May 2010 08:19:01 -0700 (PDT) Received: by 10.224.67.85 with HTTP; Tue, 18 May 2010 08:19:01 -0700 (PDT) In-Reply-To: <4BF219A6.4010900@hardwarefreak.com> References: <4BF1EC44.7070803@hardwarefreak.com> <4BF219A6.4010900@hardwarefreak.com> Date: Tue, 18 May 2010 08:19:01 -0700 Message-ID: X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel From: big beer To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-qy0-f187.google.com[209.85.221.187] X-Barracuda-Start-Time: 1274196007 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30179 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 17, 2010 at 9:37 PM, Stan Hoeppner wro= te: > big beer put forth on 5/17/2010 10:34 PM: >>> On Mon, May 17, 2010 at 6:24 PM, Stan Hoeppner = wrote: >>> big beer put forth on 5/17/2010 7:08 PM: >>> >>>> If anyone has any ideas on what to do, and/or where to start, I'd >>>> greatly appreciate it. >>> >>> Why are you avoiding the obvious solution in favor of hacking? >>> >> Sending back to the list this time instead of Stan directly (Sorry Stan)= :) > > No problem. =A0I love my Tbird "reply-to-list" option. :) > >> The obvious solution for me would be a backup or rsync. Unfortunately >> both of those have issues with this particular setup. >> >> Using a backup over the network to migrate will be way too slow >> (days). There are way too many files to index and this poor little nas >> box is already falling over with cpu load from daily activities. I can >> quickly make a mirror on the storage, and move it over to another >> larger host quickly (minutes). Mounting the FS on another machine will >> greatly improve the time and accuracy, as I won't have to worry about >> inconsistencies as it's a block level copy. > >> The black-box solution is also very painful to work with, no gcc, no >> automake, no rsync, etc. >> I would also think that for some reason I can't think of, it would be >> nice to have support for this version of XFS be available for free for >> others. Some other poor sap might find some value. >> >> So I went and changed the magic number to 0x58465342 by dumping the >> 1st 512 bytes off the volume, editing, and writing back, now I'm >> getting "Can't verify primary superblock". Using xfs_db to look at the >> other superblocks indeed still shows HXFS. Any advise how I can >> find/dump/re-write one of the other superblocks? I'd like to see if I >> can change another one of them if xfs_repair will run. > > Seems to me you're taking some big chances with live data. =A0One wrong t= urn > and you could hose the FS and lose all the data, yes? =A0I'd rather give = you > recommendations not related to this current path you're taking. =A0Would = you > please provide the model or part number of this Hitachi NAS so I can get = an > idea of what exactly it is you're dealing with, and possibly offer other > solutions? > > Maybe someone else here can help you pull this off via XFS. =A0I can't. = =A0But > I'll gladly spend some time researching other possible solutions, mainly > getting a high capacity drive connected so you can do a cp -a or tar and = be > done with this overnight, in a data-safe manner. > > -- > Stan > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > It's called a eNAS, but it's really just 2 linux 2.4 blades (debian woody), with failsafe (think heartbeat), LVM, custom XFS, samba, nfs, and a pile of sudo available scripts that are 700 and a web based gui to manage it. I though about moving it via another FS on the NAS and then connecting it to my target migration host also. The only exposed connections on the hardware are ethernet, and it's integrated in the storage subsystem. I'd have to call a tech to even come take it out. So I'm limited to something that is fiber attached to the sub-system, ok that's fine, just means no USB disk or the like. The real problem is that since I don't have root there is no way to create or mount any other devices that contain another FS. The restrictive GUI/scripts automatically creates and mounts FS's with their modified XFS version, and there are no options to do otherwise. I'm playing it "safe" by taking a block level copy of the luns that are exposed to this thing, and then presenting the copy over to my target host. I'm not brave enough to totally trash live data. I'm going to give some of the suggestions a go with a fresh copy of the data and see what comes of it. Of course the 1st thing I did was call Hitachi support and ask them what the deal is, dropping words like "GPL" and "license bound to distribute", but to no avail. Of course I'm dealing with low level support people that more than likely didn't work for the big H when this thing was built. I've escalated through the channels I have available to me. We'll see what comes of it. From benjamin.a.lau@gmail.com Tue May 18 11:41:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4IGfm2C062155 for ; Tue, 18 May 2010 11:41:48 -0500 X-ASG-Debug-ID: 1274201044-587602720000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-iw0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 682EB13FA1D5 for ; Tue, 18 May 2010 09:44:04 -0700 (PDT) Received: from mail-iw0-f181.google.com (mail-iw0-f181.google.com [209.85.214.181]) by cuda.sgi.com with ESMTP id yQ8xTh7CmqLIaD6g for ; Tue, 18 May 2010 09:44:04 -0700 (PDT) Received: by iwn33 with SMTP id 33so971480iwn.26 for ; Tue, 18 May 2010 09:44:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type :content-transfer-encoding; bh=7bMNlpFYItLYG11EygTIWwvHSpNUIK8coO6USFYm/CY=; b=SRckKfIsq4LuHwpV45Dly+eVQj0JzBIFZsYdvoA4cgySsisaKPhfRDTzK/0dg8gFaz UOnTLqMDjnSBiWvVA48Mtf7Fops6+8uIzGa20U1J18p+DgOhhaD9StgWg4/upHCnd12+ vecsuoz93LmvETk+tgKCXE4H69vKn8pp0P1Qc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; b=HBWJcuA/IXOUIIRAnj1t0gYcZDThyiW83uLeRxpSvXr3taW96Pg9tHWFPQEjZl0hxQ oIOj7+Fuqe19p0yT0cHh0p+f3WDOVBGkg/cfzVIkcDGf7jg30sLFGZsSWuuEiENgGj2d ge9/td2/14qP3kPnPySqLTZ2fMHQpYgqGyflM= MIME-Version: 1.0 Received: by 10.231.148.143 with SMTP id p15mr2238222ibv.15.1274201044111; Tue, 18 May 2010 09:44:04 -0700 (PDT) Received: by 10.231.206.148 with HTTP; Tue, 18 May 2010 09:44:04 -0700 (PDT) In-Reply-To: References: <4BF1EC44.7070803@hardwarefreak.com> <4BF219A6.4010900@hardwarefreak.com> Date: Tue, 18 May 2010 09:44:04 -0700 Message-ID: X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel From: Benjamin Lau To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-iw0-f181.google.com[209.85.214.181] X-Barracuda-Start-Time: 1274201045 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30182 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I think this is the document you might be looking for: http://www.hds.com/assets/pdf/open-source-licenses-applicable-to-hds-produc= ts.pdf This outlines all of the licenses for the various bits of Hitachi Data Systems for the FOSS components. V. NAS File Sharing Contact information: Project Manager NAS File Sharing Hitachi Data Systems 750 Central Expressway Santa Clara, California 95050 Please note that the source code for the NAS File Sharing kernel is available for download at: http://www.hitachi.co.jp/products/it/storagesolutions/ techsupport/download/index.html. Other GPL source code in the NAS File Sharing product is available by request. Unfortunately that link seems to give back a 404 (I understand a smidgen of Japanese. So you may have no choice but to contact them in a more direct manner. But it looks like they had the code posted someplace at some point in the past. Hope that helps, Ben On Tue, May 18, 2010 at 8:19 AM, big beer wrote: > On Mon, May 17, 2010 at 9:37 PM, Stan Hoeppner w= rote: >> big beer put forth on 5/17/2010 10:34 PM: >>>> On Mon, May 17, 2010 at 6:24 PM, Stan Hoeppner wrote: >>>> big beer put forth on 5/17/2010 7:08 PM: >>>> >>>>> If anyone has any ideas on what to do, and/or where to start, I'd >>>>> greatly appreciate it. >>>> >>>> Why are you avoiding the obvious solution in favor of hacking? >>>> >>> Sending back to the list this time instead of Stan directly (Sorry Stan= ) :) >> >> No problem. =A0I love my Tbird "reply-to-list" option. :) >> >>> The obvious solution for me would be a backup or rsync. Unfortunately >>> both of those have issues with this particular setup. >>> >>> Using a backup over the network to migrate will be way too slow >>> (days). There are way too many files to index and this poor little nas >>> box is already falling over with cpu load from daily activities. I can >>> quickly make a mirror on the storage, and move it over to another >>> larger host quickly (minutes). Mounting the FS on another machine will >>> greatly improve the time and accuracy, as I won't have to worry about >>> inconsistencies as it's a block level copy. >> >>> The black-box solution is also very painful to work with, no gcc, no >>> automake, no rsync, etc. >>> I would also think that for some reason I can't think of, it would be >>> nice to have support for this version of XFS be available for free for >>> others. Some other poor sap might find some value. >>> >>> So I went and changed the magic number to 0x58465342 by dumping the >>> 1st 512 bytes off the volume, editing, and writing back, now I'm >>> getting "Can't verify primary superblock". Using xfs_db to look at the >>> other superblocks indeed still shows HXFS. Any advise how I can >>> find/dump/re-write one of the other superblocks? I'd like to see if I >>> can change another one of them if xfs_repair will run. >> >> Seems to me you're taking some big chances with live data. =A0One wrong = turn >> and you could hose the FS and lose all the data, yes? =A0I'd rather give= you >> recommendations not related to this current path you're taking. =A0Would= you >> please provide the model or part number of this Hitachi NAS so I can get= an >> idea of what exactly it is you're dealing with, and possibly offer other >> solutions? >> >> Maybe someone else here can help you pull this off via XFS. =A0I can't. = =A0But >> I'll gladly spend some time researching other possible solutions, mainly >> getting a high capacity drive connected so you can do a cp -a or tar and= be >> done with this overnight, in a data-safe manner. >> >> -- >> Stan >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >> > > > It's called a eNAS, but it's really just 2 linux 2.4 blades (debian > woody), with failsafe (think heartbeat), LVM, custom XFS, samba, nfs, > and a pile of sudo available scripts that are 700 and a web based gui > to manage it. > > I though about moving it via another FS on the NAS and then connecting > it to my target migration host also. The only exposed connections on > the hardware are ethernet, and it's integrated in the storage > subsystem. I'd have to call a tech =A0to even come take it out. So I'm > limited to something that is fiber attached to the sub-system, ok > that's fine, just means no USB disk or the like. The real problem is > that since I don't have root there is no way to create or mount any > other devices that contain another FS. The restrictive GUI/scripts > automatically creates and mounts FS's with their modified XFS version, > and there are no options to do otherwise. > > I'm playing it "safe" by taking a block level copy of the luns that > are exposed to this thing, and then presenting the copy over to my > target host. I'm not brave enough to totally trash live data. I'm > going to give some of the suggestions a go with a fresh copy of the > data and see what comes of it. > > Of course the 1st thing I did was call Hitachi support and ask them > what the deal is, dropping words like "GPL" and "license bound to > distribute", but to no avail. Of course I'm dealing with low level > support people that more than likely didn't work for the big H when > this thing was built. I've escalated through the channels I have > available to me. > > We'll see what comes of it. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From eflorac@intellique.com Tue May 18 11:49:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4IGnuGi062551 for ; Tue, 18 May 2010 11:49:56 -0500 X-ASG-Debug-ID: 1274201527-519002e10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A289913F9460 for ; Tue, 18 May 2010 09:52:11 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id bEDEGnAe6LDGD36H for ; Tue, 18 May 2010 09:52:11 -0700 (PDT) Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by smtp4-g21.free.fr (Postfix) with ESMTP id 02F834C80F8; Tue, 18 May 2010 18:52:05 +0200 (CEST) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP; Tue, 18 May 2010 18:52:04 +0200 (CEST) Date: Tue, 18 May 2010 18:52:04 +0200 From: Emmanuel Florac To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: rsync from xfs to nfs+xfs and ACL problems Subject: Re: rsync from xfs to nfs+xfs and ACL problems Message-ID: <20100518185204.186258c0@harpe.intellique.com> In-Reply-To: <201005181350.15308@zmi.at> References: <201005181350.15308@zmi.at> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/G6itQV1tEoqSE0p2KtcbUCo"; protocol="application/pgp-signature" X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1274201533 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.2, rules version 3.2.2.30185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --Sig_/G6itQV1tEoqSE0p2KtcbUCo Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Le Tue, 18 May 2010 13:50:15 +0200 Michael Monnerie =E9crivait: > Does it mean I can't sync ACLs? How could I do it? I need a full > backup including ACLs, as I want to move all data and then restore. Use nfs4 instead, should be fine. Exports structure is different. The simple way is to simply add "fsid=3D0" in /etc/exports : /mnt/whatever *(fsid=3D0,rw,async,no_root_squash,no_subtree_check) Restart your nfs daemons, then mount (notice the / instead of /mnt/whatever ) : mount -t nfs4 server:/ /mnt/nfsmount regards, --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ --Sig_/G6itQV1tEoqSE0p2KtcbUCo Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkvyxbQACgkQX3jQXNUicVZpZACglubOu26W1DE40MahKILYXLcV d2wAnAmPXdWmZgdNbXWE7O7eNGxe1cm8 =viE9 -----END PGP SIGNATURE----- --Sig_/G6itQV1tEoqSE0p2KtcbUCo-- From roger@filmlight.ltd.uk Tue May 18 11:55:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4IGtQ0X062954 for ; Tue, 18 May 2010 11:55:26 -0500 X-ASG-Debug-ID: 1274201860-6cc100230000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from a.mx.filmlight.ltd.uk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id ECDE43565C1 for ; Tue, 18 May 2010 09:57:40 -0700 (PDT) Received: from a.mx.filmlight.ltd.uk (alto.filmlight.ltd.uk [77.107.81.250]) by cuda.sgi.com with SMTP id 1Wd1rOP4oiiZz57A for ; Tue, 18 May 2010 09:57:40 -0700 (PDT) Received: (qmail 6283 invoked from network); 18 May 2010 16:57:39 -0000 Received: from montana.filmlight.ltd.uk (HELO ?10.44.0.177?) (roger@10.44.0.177) by a.mx.filmlight.ltd.uk with ESMTPA; 18 May 2010 16:57:39 -0000 X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel From: Roger Willcocks To: Benjamin Lau Cc: xfs@oss.sgi.com In-Reply-To: References: <4BF1EC44.7070803@hardwarefreak.com> <4BF219A6.4010900@hardwarefreak.com> Content-Type: text/plain Date: Tue, 18 May 2010 17:57:37 +0100 Message-Id: <1274201857.17233.144.camel@montana.filmlight.ltd.uk> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-8.el5_2.2) Content-Transfer-Encoding: 7bit X-Barracuda-Connect: alto.filmlight.ltd.uk[77.107.81.250] X-Barracuda-Start-Time: 1274201861 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.2, rules version 3.2.2.30185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The '-' character in the url in the pdf is a literal: http://www.hitachi.co.jp/products/it/storage-solutions/techsupport/download/index.html the page points to: http://www2.hitachi.co.jp/products/it/rsd/download/kernel-src-05-00-02.tgz On Tue, 2010-05-18 at 09:44 -0700, Benjamin Lau wrote: > I think this is the document you might be looking for: > http://www.hds.com/assets/pdf/open-source-licenses-applicable-to-hds-products.pdf > > This outlines all of the licenses for the various bits of Hitachi Data > Systems for the FOSS components. > > V. NAS File Sharing > Contact information: > Project Manager > NAS File Sharing > Hitachi Data Systems > 750 Central Expressway > Santa Clara, California 95050 > > Please note that the source code for the NAS File Sharing kernel is > available for > download at: http://www.hitachi.co.jp/products/it/storagesolutions/ > techsupport/download/index.html. Other GPL source code in the NAS File > Sharing product is available by request. > > Unfortunately that link seems to give back a 404 (I understand a > smidgen of Japanese. So you may have no choice but to contact them in > a more direct manner. But it looks like they had the code posted > someplace at some point in the past. > > Hope that helps, > > Ben > > On Tue, May 18, 2010 at 8:19 AM, big beer wrote: > > On Mon, May 17, 2010 at 9:37 PM, Stan Hoeppner wrote: > >> big beer put forth on 5/17/2010 10:34 PM: > >>>> On Mon, May 17, 2010 at 6:24 PM, Stan Hoeppner wrote: > >>>> big beer put forth on 5/17/2010 7:08 PM: > >>>> > >>>>> If anyone has any ideas on what to do, and/or where to start, I'd > >>>>> greatly appreciate it. > >>>> > >>>> Why are you avoiding the obvious solution in favor of hacking? > >>>> > >>> Sending back to the list this time instead of Stan directly (Sorry Stan) :) > >> > >> No problem. I love my Tbird "reply-to-list" option. :) > >> > >>> The obvious solution for me would be a backup or rsync. Unfortunately > >>> both of those have issues with this particular setup. > >>> > >>> Using a backup over the network to migrate will be way too slow > >>> (days). There are way too many files to index and this poor little nas > >>> box is already falling over with cpu load from daily activities. I can > >>> quickly make a mirror on the storage, and move it over to another > >>> larger host quickly (minutes). Mounting the FS on another machine will > >>> greatly improve the time and accuracy, as I won't have to worry about > >>> inconsistencies as it's a block level copy. > >> > >>> The black-box solution is also very painful to work with, no gcc, no > >>> automake, no rsync, etc. > >>> I would also think that for some reason I can't think of, it would be > >>> nice to have support for this version of XFS be available for free for > >>> others. Some other poor sap might find some value. > >>> > >>> So I went and changed the magic number to 0x58465342 by dumping the > >>> 1st 512 bytes off the volume, editing, and writing back, now I'm > >>> getting "Can't verify primary superblock". Using xfs_db to look at the > >>> other superblocks indeed still shows HXFS. Any advise how I can > >>> find/dump/re-write one of the other superblocks? I'd like to see if I > >>> can change another one of them if xfs_repair will run. > >> > >> Seems to me you're taking some big chances with live data. One wrong turn > >> and you could hose the FS and lose all the data, yes? I'd rather give you > >> recommendations not related to this current path you're taking. Would you > >> please provide the model or part number of this Hitachi NAS so I can get an > >> idea of what exactly it is you're dealing with, and possibly offer other > >> solutions? > >> > >> Maybe someone else here can help you pull this off via XFS. I can't. But > >> I'll gladly spend some time researching other possible solutions, mainly > >> getting a high capacity drive connected so you can do a cp -a or tar and be > >> done with this overnight, in a data-safe manner. > >> > >> -- > >> Stan > >> > >> _______________________________________________ > >> xfs mailing list > >> xfs@oss.sgi.com > >> http://oss.sgi.com/mailman/listinfo/xfs > >> > > > > > > It's called a eNAS, but it's really just 2 linux 2.4 blades (debian > > woody), with failsafe (think heartbeat), LVM, custom XFS, samba, nfs, > > and a pile of sudo available scripts that are 700 and a web based gui > > to manage it. > > > > I though about moving it via another FS on the NAS and then connecting > > it to my target migration host also. The only exposed connections on > > the hardware are ethernet, and it's integrated in the storage > > subsystem. I'd have to call a tech to even come take it out. So I'm > > limited to something that is fiber attached to the sub-system, ok > > that's fine, just means no USB disk or the like. The real problem is > > that since I don't have root there is no way to create or mount any > > other devices that contain another FS. The restrictive GUI/scripts > > automatically creates and mounts FS's with their modified XFS version, > > and there are no options to do otherwise. > > > > I'm playing it "safe" by taking a block level copy of the luns that > > are exposed to this thing, and then presenting the copy over to my > > target host. I'm not brave enough to totally trash live data. I'm > > going to give some of the suggestions a go with a fresh copy of the > > data and see what comes of it. > > > > Of course the 1st thing I did was call Hitachi support and ask them > > what the deal is, dropping words like "GPL" and "license bound to > > distribute", but to no avail. Of course I'm dealing with low level > > support people that more than likely didn't work for the big H when > > this thing was built. I've escalated through the channels I have > > available to me. > > > > We'll see what comes of it. > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Roger Willcocks From 3tszySxcKA8Ewpjhzh3lihsi1tz-uvylws5nvvnsl.jvt4mzvzz.znp.jvt@photos-server.bounces.google.com Tue May 18 12:19:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=BAYES_99,MIME_8BIT_HEADER, T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4IHJfVL064678 for ; Tue, 18 May 2010 12:19:42 -0500 X-ASG-Debug-ID: 1274203318-5d9803150000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-gx0-f233.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 51C5C1400319 for ; Tue, 18 May 2010 10:21:58 -0700 (PDT) Received: from mail-gx0-f233.google.com (mail-gx0-f233.google.com [209.85.217.233]) by cuda.sgi.com with ESMTP id ef4a9wJSD9hyDsje for ; Tue, 18 May 2010 10:21:58 -0700 (PDT) Received: by gxk13 with SMTP id 13so1072234gxk.0 for ; Tue, 18 May 2010 10:21:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=beta; h=domainkey-signature:mime-version:received:reply-to:message-id:date :subject:from:to:content-type; bh=Y/R84ADnLpGIVLmeflhR6dYROBBFaak7VLWckFhJyP8=; b=mbZu7e7Kl98vPEValLcRZb9AxlzMM+VlFyvEgAZ7rwjd195PaCJH1BKdTLE0CUvkfr +ExMrX+Y3UIDE8ZzlslQ== DomainKey-Signature: a=rsa-sha1; c=nofws; d=google.com; s=beta; h=mime-version:reply-to:message-id:date:subject:from:to:content-type; b=ZgiBqv800+81jkHopg2nSmvR5Z/QsMtsJOH//7wH+wYW5CCxheo18iMeL+6TSO0otp rzoSnhUshvJ6vkm6zg4w== MIME-Version: 1.0 Received: by 10.90.41.36 with SMTP id o36mt4437732ago.8.1274203318172; Tue, 18 May 2010 10:21:58 -0700 (PDT) Reply-To: jqb <5703197@qq.com> Message-ID: <0016361e7be026be0a0486e194ee@google.com> Date: Tue, 18 May 2010 17:21:58 +0000 X-ASG-Orig-Subj: =?GB2312?B?sbu2r9a7xNy4+MjL0aHU8aOs1ve2r8Tjv8nS1NGh1PGx8A==?= =?GB2312?B?yMs=?= Subject: =?GB2312?B?sbu2r9a7xNy4+MjL0aHU8aOs1ve2r8Tjv8nS1NGh1PGx8A==?= =?GB2312?B?yMs=?= From: Picasa Web Albums To: xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=0016361e7be0295c8b0486e19440 X-Barracuda-Connect: mail-gx0-f233.google.com[209.85.217.233] X-Barracuda-Start-Time: 1274203319 X-Barracuda-Bayes: INNOCENT GLOBAL 0.6524 1.0000 1.0369 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.56 X-Barracuda-Spam-Status: No, SCORE=1.56 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, MIME_BASE64_TEXT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30186 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.52 MIME_BASE64_TEXT RAW: Message text disguised using base64 encoding X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0016361e7be0295c8b0486e19440 Content-Type: text/plain; charset=GB2312; format=flowed; delsp=yes Content-Transfer-Encoding: base64 sbu2r9a7xNy4+MjL0aHU8aOs1ve2r8Tjv8nS1NGh1PGx8MjLDQogICAgIL/Nu6fXytS0yse/zbun v6q3otbY0qq1xLXa0ruyvaOsz9bU2ta70qrK5MjrsvrGt7nYvPy0yqOsDQrSu7fW1tPL0cv3MTAw MLj2v827p8341b6jrLDruPbQocqxv8nS1LDR1eIxMDAwuPbN+NW+tcTTys/ko6wNCr/Nu6fBqs+1 0MXPosCtyKHPwsC0oaMxMbj2zajTw8vRy/fS/cfmo6wxODC24Lj2ufq80rXEtbG12MvRDQrL99L9 x+ajrDc21tbT79HUo6wzMDC24Lj2x/jT8svRy/ejrNXrttTQ1MvRy/fEv7Hqv827p9fK1LShow0K DQq157uwo7owNzU1LTI3NjYyNzQ0IDE4OTI2NzUxMjI3o6jW7M/IyfqjqQ0KUVGjujEzNzIzNTcw OTGjqNHdyr7V5sq10Ke5+6OpDQo= --0016361e7be0295c8b0486e19440 Content-Type: image/jpeg; name="@H@W$2(RVC`8T)O]MO0KZE7.jpg" Content-Disposition: attachment; filename="@H@W$2(RVC`8T)O]MO0KZE7.jpg" Content-Transfer-Encoding: base64 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 QDTTTQH/2Q== --0016361e7be0295c8b0486e19440-- From cwilson@blackducksoftware.com Tue May 18 14:26:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4IJQ43P071153 for ; Tue, 18 May 2010 14:26:05 -0500 X-ASG-Debug-ID: 1274210901-51bd00be0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from exchange.blackducksoftware.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3EBA2357198 for ; Tue, 18 May 2010 12:28:21 -0700 (PDT) Received: from exchange.blackducksoftware.com (68.233.172.16.static.rev.colospace.com [68.233.172.16]) by cuda.sgi.com with ESMTP id laHyDzNYJRngfb4K for ; Tue, 18 May 2010 12:28:21 -0700 (PDT) Received: from BDSEXCH2K7CLS.blackducksoftware.com ([10.9.8.116]) by exdirector.blackducksoftware.com ([10.9.8.114]) with mapi; Tue, 18 May 2010 15:28:21 -0400 From: Colin Wilson To: "xfs@oss.sgi.com" Date: Tue, 18 May 2010 15:28:20 -0400 X-ASG-Orig-Subj: xfs_repair memory usage and stopping on "Traversing filesystem..." Subject: xfs_repair memory usage and stopping on "Traversing filesystem..." Thread-Topic: xfs_repair memory usage and stopping on "Traversing filesystem..." Thread-Index: Acr2wEZGr2l1YEHiRRS92KZsyF+P8w== Message-ID: <00FB97ED-C684-4B81-B623-AB7EBD7B7091@blackducksoftware.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: 68.233.172.16.static.rev.colospace.com[68.233.172.16] X-Barracuda-Start-Time: 1274210902 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.2, rules version 3.2.2.30191 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello all, I seem to be having the same problem as Tomasz had in this post to the mai= ling list: http://oss.sgi.com/archives/xfs/2009-07/msg00082.html . Eric ul= timately suggested running xfs_repair with the '-P' and '-o bhash=3D1024' f= lags to get past this problem and described what he thought the underlieing= problem was as such: > "This looks like some of the caching that xfs_repair does is mis-sized, > and it gets stuck when it's unable to find a slot for a new node to > cache. IMHO that's still a bug that I'd like to work out. If it gets > stuck this way, it'd probably be better to exit, and suggest a larger > hash size." Currently my file system is ~50 TB in size with ~40TB in use and when I do= the repair memory usage ends up between 10 and 11 GB used for most of the = check . The system currently has 12GB of ram not including swap. Is this = expected behavior? My concern is setting bhash too large and causing xfs_r= epair to swap for long periods of time. It already takes a few days to get= to Phase 6 in the repair. I am currently running Debian Lenny(5.0.4) with xfsprogs 2.9.8 with linux = kernel 2.6.26. I've briefly looked through the change logs for newer versi= on of xfsprogs and noticed that there were a few updates mentioning better = memory performance or management so upgrading to a newer version may be al= l I need. Has the bug Eric mentions been fixed in a later version of xfspr= ogs? What is your suggestion as to my best course of action to get this xf= s-repair to complete in a timely manor without using up all the ram in my s= ystem? Thanks xfs_info dump: # xfs_info /u1/ meta-data=3D/dev/mapper/sangroup-sandisk isize=3D256 agcount=3D821, agsi= ze=3D15258784 blks =3D sectsz=3D512 attr=3D0 data =3D bsize=3D4096 blocks=3D12514290688, ima= xpct=3D25 =3D sunit=3D0 swidth=3D0 blks naming =3Dversion 2 bsize=3D4096 =20 log =3Dinternal bsize=3D4096 blocks=3D32768, version= =3D1 =3D sectsz=3D512 sunit=3D0 blks, lazy-coun= t=3D0 realtime =3Dnone extsz=3D65536 blocks=3D0, rtextents=3D0 --Colin Colin Wilson Linux Systems Administrator T +1.781.810.1331 F +1.781.891.5145 cwilson@blackducksoftware.com http://www.blackducksoftware.com From bigbeerjr@gmail.com Tue May 18 17:40:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_45,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4IMek3j079979 for ; Tue, 18 May 2010 17:40:47 -0500 X-ASG-Debug-ID: 1274222583-3b68003f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f195.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5E4301DF20B1 for ; Tue, 18 May 2010 15:43:03 -0700 (PDT) Received: from mail-qy0-f195.google.com (mail-qy0-f195.google.com [209.85.221.195]) by cuda.sgi.com with ESMTP id OL9ynhP40SHnBi5f for ; Tue, 18 May 2010 15:43:03 -0700 (PDT) Received: by qyk33 with SMTP id 33so9897755qyk.24 for ; Tue, 18 May 2010 15:43:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type :content-transfer-encoding; bh=PwCCnhQhnOJQVvGLDhpGOPtYjBm/7WXHwWEHIVTnEco=; b=iTzxfFeawWSGmNUn1leBE0bcGHFkm3Y8+Tf5w8hi4/S79Oi+TbdP5XOl76RxZkTf52 7EH9DwgQUcMt/6cWmEKS6BWRKBaLixqLmGtaLPDDK58GzoyqxudeBbV/158ojgjAO7kw nMcqwnMr6Xd3QdA9EUhDlIcnILgPLLAkYXhd4= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; b=czqSzH+j3gpbLmxLHu2FOqZ1avAgXq52Bm/9vtHeTpR1VvrwVXbMxukqNwHZQy9eyP ADD3Coq6tKWQZOln0xDV358Z16nfJddVEAeLLWuborl2pYSJXXbeAtrrMu03qmbrgSm5 Rd88ELDoF+vIC1fZBXgrrrGUbblLLePpvZJdM= MIME-Version: 1.0 Received: by 10.224.40.80 with SMTP id j16mr4255965qae.41.1274222582782; Tue, 18 May 2010 15:43:02 -0700 (PDT) Received: by 10.224.67.85 with HTTP; Tue, 18 May 2010 15:43:02 -0700 (PDT) In-Reply-To: <1274201857.17233.144.camel@montana.filmlight.ltd.uk> References: <4BF1EC44.7070803@hardwarefreak.com> <4BF219A6.4010900@hardwarefreak.com> <1274201857.17233.144.camel@montana.filmlight.ltd.uk> Date: Tue, 18 May 2010 15:43:02 -0700 Message-ID: X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel From: big beer To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-qy0-f195.google.com[209.85.221.195] X-Barracuda-Start-Time: 1274222584 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30202 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 18, 2010 at 9:57 AM, Roger Willcocks w= rote: > The '-' character in the url in the pdf is a literal: > > http://www.hitachi.co.jp/products/it/storage-solutions/techsupport/downlo= ad/index.html > > the page points to: > > http://www2.hitachi.co.jp/products/it/rsd/download/kernel-src-05-00-02.tg= z > > > > On Tue, 2010-05-18 at 09:44 -0700, Benjamin Lau wrote: >> I think this is the document you might be looking for: >> http://www.hds.com/assets/pdf/open-source-licenses-applicable-to-hds-pro= ducts.pdf >> >> This outlines all of the licenses for the various bits of Hitachi Data >> Systems for the FOSS components. >> >> V. NAS File Sharing >> Contact information: >> Project Manager >> NAS File Sharing >> Hitachi Data Systems >> 750 Central Expressway >> Santa Clara, California 95050 >> >> Please note that the source code for the NAS File Sharing kernel is >> available for >> download at: http://www.hitachi.co.jp/products/it/storagesolutions/ >> techsupport/download/index.html. Other GPL source code in the NAS File >> Sharing product is available by request. >> >> Unfortunately that link seems to give back a 404 (I understand a >> smidgen of Japanese. So you may have no choice but to contact them in >> a more direct manner. =A0But it looks like they had the code posted >> someplace at some point in the past. >> >> Hope that helps, >> >> Ben >> >> On Tue, May 18, 2010 at 8:19 AM, big beer wrote: >> > On Mon, May 17, 2010 at 9:37 PM, Stan Hoeppner wrote: >> >> big beer put forth on 5/17/2010 10:34 PM: >> >>>> On Mon, May 17, 2010 at 6:24 PM, Stan Hoeppner wrote: >> >>>> big beer put forth on 5/17/2010 7:08 PM: >> >>>> >> >>>>> If anyone has any ideas on what to do, and/or where to start, I'd >> >>>>> greatly appreciate it. >> >>>> >> >>>> Why are you avoiding the obvious solution in favor of hacking? >> >>>> >> >>> Sending back to the list this time instead of Stan directly (Sorry S= tan) :) >> >> >> >> No problem. =A0I love my Tbird "reply-to-list" option. :) >> >> >> >>> The obvious solution for me would be a backup or rsync. Unfortunatel= y >> >>> both of those have issues with this particular setup. >> >>> >> >>> Using a backup over the network to migrate will be way too slow >> >>> (days). There are way too many files to index and this poor little n= as >> >>> box is already falling over with cpu load from daily activities. I c= an >> >>> quickly make a mirror on the storage, and move it over to another >> >>> larger host quickly (minutes). Mounting the FS on another machine wi= ll >> >>> greatly improve the time and accuracy, as I won't have to worry abou= t >> >>> inconsistencies as it's a block level copy. >> >> >> >>> The black-box solution is also very painful to work with, no gcc, no >> >>> automake, no rsync, etc. >> >>> I would also think that for some reason I can't think of, it would b= e >> >>> nice to have support for this version of XFS be available for free f= or >> >>> others. Some other poor sap might find some value. >> >>> >> >>> So I went and changed the magic number to 0x58465342 by dumping the >> >>> 1st 512 bytes off the volume, editing, and writing back, now I'm >> >>> getting "Can't verify primary superblock". Using xfs_db to look at t= he >> >>> other superblocks indeed still shows HXFS. Any advise how I can >> >>> find/dump/re-write one of the other superblocks? I'd like to see if = I >> >>> can change another one of them if xfs_repair will run. >> >> >> >> Seems to me you're taking some big chances with live data. =A0One wro= ng turn >> >> and you could hose the FS and lose all the data, yes? =A0I'd rather g= ive you >> >> recommendations not related to this current path you're taking. =A0Wo= uld you >> >> please provide the model or part number of this Hitachi NAS so I can = get an >> >> idea of what exactly it is you're dealing with, and possibly offer ot= her >> >> solutions? >> >> >> >> Maybe someone else here can help you pull this off via XFS. =A0I can'= t. =A0But >> >> I'll gladly spend some time researching other possible solutions, mai= nly >> >> getting a high capacity drive connected so you can do a cp -a or tar = and be >> >> done with this overnight, in a data-safe manner. >> >> >> >> -- >> >> Stan >> >> >> >> _______________________________________________ >> >> xfs mailing list >> >> xfs@oss.sgi.com >> >> http://oss.sgi.com/mailman/listinfo/xfs >> >> >> > >> > >> > It's called a eNAS, but it's really just 2 linux 2.4 blades (debian >> > woody), with failsafe (think heartbeat), LVM, custom XFS, samba, nfs, >> > and a pile of sudo available scripts that are 700 and a web based gui >> > to manage it. >> > >> > I though about moving it via another FS on the NAS and then connecting >> > it to my target migration host also. The only exposed connections on >> > the hardware are ethernet, and it's integrated in the storage >> > subsystem. I'd have to call a tech =A0to even come take it out. So I'm >> > limited to something that is fiber attached to the sub-system, ok >> > that's fine, just means no USB disk or the like. The real problem is >> > that since I don't have root there is no way to create or mount any >> > other devices that contain another FS. The restrictive GUI/scripts >> > automatically creates and mounts FS's with their modified XFS version, >> > and there are no options to do otherwise. >> > >> > I'm playing it "safe" by taking a block level copy of the luns that >> > are exposed to this thing, and then presenting the copy over to my >> > target host. I'm not brave enough to totally trash live data. I'm >> > going to give some of the suggestions a go with a fresh copy of the >> > data and see what comes of it. >> > >> > Of course the 1st thing I did was call Hitachi support and ask them >> > what the deal is, dropping words like "GPL" and "license bound to >> > distribute", but to no avail. Of course I'm dealing with low level >> > support people that more than likely didn't work for the big H when >> > this thing was built. I've escalated through the channels I have >> > available to me. >> > >> > We'll see what comes of it. >> > >> > _______________________________________________ >> > xfs mailing list >> > xfs@oss.sgi.com >> > http://oss.sgi.com/mailman/listinfo/xfs >> > >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > -- > Roger Willcocks > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > After changing the magic number on the 1st 6 superblocks and a 6 hour xfs_repair wait I can mount the FS. There are only a couple of things in lost+found, more than likely because I made my copy as the FS was still being written to. Now time to do some md5sum'ing across both copies to see if everything is A-OK. I'll have to try to take a cold copy of it and start over again to see if I get some better results. Strangely enough I was told by Hitachi that they licensed XFS from SGI, so they don't have any GPL code to give back. From stan@hardwarefreak.com Tue May 18 18:29:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4INTeop083310 for ; Tue, 18 May 2010 18:29:41 -0500 X-ASG-Debug-ID: 1274225581-425e01c80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5A18112998F5 for ; Tue, 18 May 2010 16:33:01 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id AlYuHaxoH556MLN5 for ; Tue, 18 May 2010 16:33:01 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 2E8A76C2B0 for ; Tue, 18 May 2010 18:31:56 -0500 (CDT) Message-ID: <4BF3241C.5080001@hardwarefreak.com> Date: Tue, 18 May 2010 18:34:52 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel References: <4BF1EC44.7070803@hardwarefreak.com> <4BF219A6.4010900@hardwarefreak.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274225583 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30204 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean big beer put forth on 5/18/2010 10:19 AM: > It's called a eNAS, but it's really just 2 linux 2.4 blades (debian > woody), with failsafe (think heartbeat), LVM, custom XFS, samba, nfs, > and a pile of sudo available scripts that are 700 and a web based gui > to manage it. > > I though about moving it via another FS on the NAS and then connecting > it to my target migration host also. The only exposed connections on > the hardware are ethernet, and it's integrated in the storage > subsystem. I'd have to call a tech to even come take it out. So I'm > limited to something that is fiber attached to the sub-system, ok > that's fine, just means no USB disk or the like. The real problem is > that since I don't have root there is no way to create or mount any > other devices that contain another FS. The restrictive GUI/scripts > automatically creates and mounts FS's with their modified XFS version, > and there are no options to do otherwise. > > I'm playing it "safe" by taking a block level copy of the luns that > are exposed to this thing, and then presenting the copy over to my > target host. I'm not brave enough to totally trash live data. I'm > going to give some of the suggestions a go with a fresh copy of the > data and see what comes of it. Ahh, ok. We're not talking about some cheap single box NAS appliance here with 4-10 local disks, but a blade "appliance" which connects via FC to SAN LUNs on back end arrays. And lemme guess, the sales guy pitched "flexibility" as a main selling point. A poor rich man's NetApp so to speak. Sounds like a decent setup. Except for the fact that protocols change, along with Samba features. It is flexible, except in the way you currently need it to be. Agreed, you're not taking chances. I didn't comprehend previously what exactly you were doing. Thanks for the explanation. Snapshotting the LUNs is obviously a very safe method. > Of course the 1st thing I did was call Hitachi support and ask them > what the deal is, dropping words like "GPL" and "license bound to > distribute", but to no avail. Of course I'm dealing with low level > support people that more than likely didn't work for the big H when > this thing was built. I've escalated through the channels I have > available to me. Well, they've done what they can to lock you into their NAS solution... Is the actual blade hardware that terribly slow? If not, do they offer a new "firmware" load for that blade bringing it up to a Hitachi proprietary 2.6.x kernel with a much newer Samba/NFS/etc? I know you'd rather whip up a solution yourself with standard FOSS stuff, but maybe this would be a viable option for now if they offer it. Given the blade's age they probably don't offer anything to upgrade it. Can't hurt to ask. > We'll see what comes of it. Any chance you can build a system from an old Woody installation set that closely matches what's on the NAS? Then copy over their hacked proprietary HIXFS modules, mount the HIXFS LUNs and copy everything to an EXT2 formatted LUN? If you can get this far you're home free. I guess the hard part will be getting access to those modules and libraries since you can't login as root... -- Stan From jack@suse.cz Tue May 18 18:34:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4INY7ss083570 for ; Tue, 18 May 2010 18:34:09 -0500 X-ASG-Debug-ID: 1274225850-1a08034b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DC4891299E78 for ; Tue, 18 May 2010 16:37:30 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id cchkvuCdp7vUJWev for ; Tue, 18 May 2010 16:37:30 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id E09DC90847; Wed, 19 May 2010 01:36:24 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 85DEF2B1B4C; Wed, 19 May 2010 01:36:19 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: hch@infradead.org X-ASG-Orig-Subj: Quota tests for XFSQA Subject: Quota tests for XFSQA Date: Wed, 19 May 2010 01:36:13 +0200 Message-Id: <1274225776-26987-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274225850 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, in this series are three tests I have written (basically gathered from various scripts) for XFSQA. The test quota accounting and also limits basic enforcement for VFS quotas (i.e. mainly ext? filesystems). Could the tests be included? I'd like to add two more tests (fsstress running under 'nobody' with quota limits tightly set so that we get often EDQUOT failures) and a test where setquota would be stressing addition and removal of quota structures. Hopefully I'll get to it later this week. Honza From jack@suse.cz Tue May 18 18:34:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4INY9Ow083582 for ; Tue, 18 May 2010 18:34:10 -0500 X-ASG-Debug-ID: 1274225787-3b6c00ed0000-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 B422C13F6CA9 for ; Tue, 18 May 2010 16:36:27 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id vjgR2TDBPK3EGFVJ for ; Tue, 18 May 2010 16:36:27 -0700 (PDT) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 6B8498A908; Wed, 19 May 2010 01:36:26 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 5D86F2B1B4F; Wed, 19 May 2010 01:36:21 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Kara X-ASG-Orig-Subj: [PATCH 3/3] Add quota test with fsstress Subject: [PATCH 3/3] Add quota test with fsstress Date: Wed, 19 May 2010 01:36:16 +0200 Message-Id: <1274225776-26987-4-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274225776-26987-1-git-send-email-jack@suse.cz> References: <1274225776-26987-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274225787 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.2, rules version 3.2.2.30204 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Run fsstress and verify that quota accounting is correct after it finishes. Signed-off-by: Jan Kara --- 232 | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 232.out | 6 +++ group | 1 + 3 files changed, 124 insertions(+), 0 deletions(-) create mode 100755 232 create mode 100644 232.out diff --git a/232 b/232 new file mode 100755 index 0000000..064f07b --- /dev/null +++ b/232 @@ -0,0 +1,117 @@ +#! /bin/bash +# FSQA Test No. 232 +# +# Run fsstress with quotas enabled and verify accounted quotas in the end +# +# Derived from test 231 +#----------------------------------------------------------------------- +# Copyright (c) 2006 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +FSX_FILE_SIZE=64000000 +FSX_ARGS="-q -l $FSX_FILE_SIZE -o 65536 -S 191110531 -N 100000" + +filter_scratch() +{ + perl -ne " +s,$SCRATCH_MNT,[SCR_MNT],; +s,$SCRATCH_DEV,[SCR_DEV],; + print;" +} + +check_usage() +{ + quotaon -f -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } { print; }' | sort >$tmp.orig + quotacheck -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } { print; }' | sort >$tmp.checked + quotaon -u -g $SCRATCH_MNT 2>/dev/null + diff $tmp.orig $tmp.checked +} + +_filter_num() +{ + tee -a $here/$seq.full |\ + sed -e 's/[0-9][0-9]* inodes/I inodes/g' \ + -e 's/[0-9][0-9]* paths/P paths/g' \ + -e 's/seed = [0-9][0-9]*/seed = S/' +} + +_fsstress() +{ + echo "" + echo "Testing fsstress" + echo "" + + out=$SCRATCH_MNT/fsstress.$$ + count=2000 + args="-n $count -d $out -p 7" + + echo "fsstress $args" | sed -e "s#$out#outdir#" + if ! $FSSTRESS_PROG $args | _filter_num + then + echo " fsstress $args returned $?" + cat $tmp.out | tee -a $here/$seq.full + status=1 + fi +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch +_require_quota + +umount $SCRATCH_DEV 2>/dev/null +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +chmod 777 $SCRATCH_MNT +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon -u -g $SCRATCH_MNT 2>/dev/null + +if ! _fsstress; then + umount $SCRATCH_DEV 2>/dev/null + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +umount $SCRATCH_DEV 2>/dev/null +status=0 +exit diff --git a/232.out b/232.out new file mode 100644 index 0000000..744192e --- /dev/null +++ b/232.out @@ -0,0 +1,6 @@ +QA output created by 232 + +Testing fsstress + +fsstress -n 2000 -d outdir -p 7 +seed = S diff --git a/group b/group index 6b59c69..c8cd774 100644 --- a/group +++ b/group @@ -345,3 +345,4 @@ deprecated 229 auto rw 230 auto quota quick 231 auto quota +232 auto quota -- 1.6.4.2 From jack@suse.cz Tue May 18 18:34:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_LOTS_OF_MONEY autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4INYAdM083586 for ; Tue, 18 May 2010 18:34:10 -0500 X-ASG-Debug-ID: 1274225787-0e77010c0000-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 0DE523542AB for ; Tue, 18 May 2010 16:36:27 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id sS0IS7AUMR3r5Yxh for ; Tue, 18 May 2010 16:36:27 -0700 (PDT) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 707B18AD27; Wed, 19 May 2010 01:36:26 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 1606A2B1B4C; Wed, 19 May 2010 01:36:21 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Kara X-ASG-Orig-Subj: [PATCH 1/3] Test basic quota enforcement Subject: [PATCH 1/3] Test basic quota enforcement Date: Wed, 19 May 2010 01:36:14 +0200 Message-Id: <1274225776-26987-2-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274225776-26987-1-git-send-email-jack@suse.cz> References: <1274225776-26987-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274225788 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.2, rules version 3.2.2.30204 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Add a test which checks whether basic quota enforcement works. Signed-off-by: Jan Kara --- 230 | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 230.out | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ group | 1 + 3 files changed, 281 insertions(+), 0 deletions(-) create mode 100755 230 create mode 100644 230.out diff --git a/230 b/230 new file mode 100755 index 0000000..e4ef657 --- /dev/null +++ b/230 @@ -0,0 +1,149 @@ +#! /bin/bash +# FS QA Test No. 230 +# +# Simple quota enforcement test. +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Jan Kara. All Rights Reserved. +# +# Based on test 219, +# Copyright (c) 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +filter_scratch() +{ + perl -ne " +s,$SCRATCH_MNT,[SCR_MNT],; +s,$SCRATCH_DEV,[SCR_DEV],; + print;" +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux #IRIX +_require_scratch +_require_quota + +test_files() +{ + echo; echo "### create files, setting up ownership (type=$type)" + rm -f $SCRATCH_MNT/file{1,2,3,4} + touch $SCRATCH_MNT/file{1,2} + chown $user $SCRATCH_MNT/file{1,2} + chgrp $group $SCRATCH_MNT/file{1,2} + chmod 777 $SCRATCH_MNT +} + +test_enforcement() +{ + echo "### some buffered IO (type=$type)" + echo "--- initiating IO..." >>$seq.full + # Firstly fit below block soft limit + sudo -u $user $XFS_IO_PROG -F -c 'pwrite 0 4096' -c 'fsync' \ + $SCRATCH_MNT/file1 2>&1 >>$seq.full | tee -a $seq.full + repquota -$type -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } { print; }' + # Secondly overcome block soft limit + sudo -u $user $XFS_IO_PROG -F -c 'pwrite 0 4097' -c 'fsync' \ + $SCRATCH_MNT/file1 2>&1 >>$seq.full | tee -a $seq.full + repquota -$type -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } { print; }' + # Now try to overcome block hardlimit + sudo -u $user $XFS_IO_PROG -F -c 'pwrite 0 4097' -c 'fsync' \ + $SCRATCH_MNT/file2 2>&1 >>$seq.full | tee -a $seq.full + repquota -$type -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } { print; }' + # Now sleep for grace time and check that softlimit got enforced + sleep $grace + sudo -u $user $XFS_IO_PROG -F -c 'truncate 0' -c 'pwrite 0 1' \ + $SCRATCH_MNT/file2 2>&1 >>$seq.full | tee -a $seq.full + repquota -$type -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } { print; }' + # And now the softlimit test for inodes + sudo -u $user touch $SCRATCH_MNT/file3 2>&1 >>$seq.full | + tee -a $seq.full + repquota -$type -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } { print; }' + # Try to exceed inode hardlimit + sudo -u $user touch $SCRATCH_MNT/file4 $SCRATCH_MNT/file5 2>&1 \ + >>$seq.full | tee -a $seq.full + repquota -$type -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } { print; }' + # Wait and check grace time enforcement + rm -f $SCRATCH_MNT/file4 >>$seq.full 2>&1 + sleep $grace + sudo -u $user touch $SCRATCH_MNT/file4 2>&1 >>$seq.full | + tee -a $seq.full + repquota -$type -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } { print; }' + echo "--- completed IO ($type)" >>$seq.full +} + +# real QA test starts here +rm -f $seq.full + +user=nobody +group=`sudo -u $user id -g` +grace=2 + +umount $SCRATCH_DEV 2>/dev/null +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon $SCRATCH_MNT 2>/dev/null +setquota -u $user 4 12 2 4 $SCRATCH_MNT +setquota -u -t $grace $grace $SCRATCH_MNT +setquota -g $group 4 12 2 4 $SCRATCH_MNT +setquota -g -t $grace $grace $SCRATCH_MNT +umount $SCRATCH_DEV + +echo; echo "### test user limit enforcement" +export MOUNT_OPTIONS="-o usrquota" +_qmount +quotaon $SCRATCH_MNT 2>/dev/null +type=u +test_files +test_enforcement +umount $SCRATCH_DEV 2>/dev/null + +echo; echo "### test group limit enforcement" +export MOUNT_OPTIONS="-o grpquota" +_qmount +quotaon $SCRATCH_MNT 2>/dev/null +type=g +test_files +test_enforcement +umount $SCRATCH_DEV 2>/dev/null + +status=0 +exit diff --git a/230.out b/230.out new file mode 100644 index 0000000..ee1b5ec --- /dev/null +++ b/230.out @@ -0,0 +1,131 @@ +QA output created by 230 + +### test user limit enforcement + +### create files, setting up ownership (type=u) +### some buffered IO (type=u) +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65534 -- 4 4 12 2 2 4 + + +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65534 +- 8 4 12 00:00 2 2 4 + + +pwrite64: Disk quota exceeded +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65534 +- 12 4 12 00:00 2 2 4 + + +pwrite64: Disk quota exceeded +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65534 +- 8 4 12 none 2 2 4 + + +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65534 ++ 8 4 12 none 3 2 4 00:00 + + +touch: cannot touch `/local/test1/file5': Disk quota exceeded +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65534 ++ 8 4 12 none 4 2 4 00:00 + + +touch: cannot touch `/local/test1/file4': Disk quota exceeded +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65534 ++ 8 4 12 none 3 2 4 none + + + +### test group limit enforcement + +### create files, setting up ownership (type=g) +### some buffered IO (type=g) +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65533 -- 4 4 12 2 2 4 + + +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65533 +- 8 4 12 00:00 2 2 4 + + +pwrite64: Disk quota exceeded +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65533 +- 12 4 12 00:00 2 2 4 + + +pwrite64: Disk quota exceeded +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65533 +- 8 4 12 none 2 2 4 + + +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65533 ++ 8 4 12 none 3 2 4 00:00 + + +touch: cannot touch `/local/test1/file5': Disk quota exceeded +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65533 ++ 8 4 12 none 4 2 4 00:00 + + +touch: cannot touch `/local/test1/file4': Disk quota exceeded +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +#65533 ++ 8 4 12 none 3 2 4 none + + diff --git a/group b/group index 2c1ac50..441e0e9 100644 --- a/group +++ b/group @@ -343,3 +343,4 @@ deprecated 227 auto fsr 228 rw auto prealloc quick 229 auto rw +230 auto quota quick -- 1.6.4.2 From jack@suse.cz Tue May 18 18:34:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4INY9ek083581 for ; Tue, 18 May 2010 18:34:10 -0500 X-ASG-Debug-ID: 1274225851-425901860000-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 74A7D1299E78 for ; Tue, 18 May 2010 16:37:31 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id lBeDIWIHeluvnUGg for ; Tue, 18 May 2010 16:37:31 -0700 (PDT) Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 6B8CF8ACEB; Wed, 19 May 2010 01:36:26 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 2C0532B16FF; Wed, 19 May 2010 01:36:21 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Kara X-ASG-Orig-Subj: [PATCH 2/3] Add test of quota accounting using fsx Subject: [PATCH 2/3] Add test of quota accounting using fsx Date: Wed, 19 May 2010 01:36:15 +0200 Message-Id: <1274225776-26987-3-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274225776-26987-1-git-send-email-jack@suse.cz> References: <1274225776-26987-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274225852 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.2, rules version 3.2.2.30204 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Run fsx (and also several fsx threads in parallel) and verify that quota accounting is correct after they finish. Signed-off-by: Jan Kara --- 231 | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 231.out | 10 +++++ group | 1 + 3 files changed, 149 insertions(+), 0 deletions(-) create mode 100755 231 create mode 100644 231.out diff --git a/231 b/231 new file mode 100755 index 0000000..fd4dac2 --- /dev/null +++ b/231 @@ -0,0 +1,138 @@ +#! /bin/bash +# FSQA Test No. 231 +# +# Run fsx with quotas enabled and verify accounted quotas in the end +# +# Derived from test 127 +#----------------------------------------------------------------------- +# Copyright (c) 2006 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +FSX_FILE_SIZE=64000000 +FSX_ARGS="-q -l $FSX_FILE_SIZE -o 65536 -S 191110531 -N 100000" + +filter_scratch() +{ + perl -ne " +s,$SCRATCH_MNT,[SCR_MNT],; +s,$SCRATCH_DEV,[SCR_DEV],; + print;" +} + +check_usage() +{ + quotaon -f -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } { print; }' >$tmp.orig + quotacheck -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } { print; }' >$tmp.checked + quotaon -u -g $SCRATCH_MNT 2>/dev/null + diff $tmp.orig $tmp.checked +} + +_fsx() +{ + tasks=$1 + echo "=== FSX Standard Mode, Memory Mapping, $tasks Tasks ===" + for (( i = 1; i <= $tasks; i++ )); do + sudo -u nobody ltp/fsx $FSX_ARGS $SCRATCH_MNT/fsx_file$i \ + >$tmp.output$i 2>&1 & + done + + for (( i = 1; i <= $tasks; i++ )); do + if ! wait %$i; then + cat $tmp.output$i + wait + return 1 + fi + $XFS_IO_PROG -F -c 'fsync' $SCRATCH_MNT/fsx_file$i + cat $tmp.output$i + done + return 0 +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch +_require_quota + +umount $SCRATCH_DEV 2>/dev/null +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +chmod 777 $SCRATCH_MNT +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon -u -g $SCRATCH_MNT 2>/dev/null + +if ! _fsx 1; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +if ! _fsx 4; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +#flush cache after write +FSX_ARGS="-f $FSX_ARGS" +if ! _fsx 1; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +umount $SCRATCH_DEV 2>/dev/null +status=0 +exit diff --git a/231.out b/231.out new file mode 100644 index 0000000..2f2d072 --- /dev/null +++ b/231.out @@ -0,0 +1,10 @@ +QA output created by 231 +=== FSX Standard Mode, Memory Mapping, 1 Tasks === +All operations completed A-OK! +=== FSX Standard Mode, Memory Mapping, 4 Tasks === +All operations completed A-OK! +All operations completed A-OK! +All operations completed A-OK! +All operations completed A-OK! +=== FSX Standard Mode, Memory Mapping, 1 Tasks === +All operations completed A-OK! diff --git a/group b/group index 441e0e9..6b59c69 100644 --- a/group +++ b/group @@ -344,3 +344,4 @@ deprecated 228 rw auto prealloc quick 229 auto rw 230 auto quota quick +231 auto quota -- 1.6.4.2 From SRS0+O8fi+78+fromorbit.com=david@internode.on.net Tue May 18 19:16:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_34 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4J0Gw0B086070 for ; Tue, 18 May 2010 19:16:58 -0500 X-ASG-Debug-ID: 1274228419-428103450000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9F1729E06DF for ; Tue, 18 May 2010 17:20:19 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id q254cZOQkjCYAVDT for ; Tue, 18 May 2010 17:20:19 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24880615-1927428 for multiple; Wed, 19 May 2010 09:49:13 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OEX0B-0006qN-PN; Wed, 19 May 2010 10:19:11 +1000 Date: Wed, 19 May 2010 10:19:11 +1000 From: Dave Chinner To: Colin Wilson Cc: "xfs@oss.sgi.com" X-ASG-Orig-Subj: Re: xfs_repair memory usage and stopping on "Traversing filesystem..." Subject: Re: xfs_repair memory usage and stopping on "Traversing filesystem..." Message-ID: <20100519001911.GJ2150@dastard> References: <00FB97ED-C684-4B81-B623-AB7EBD7B7091@blackducksoftware.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <00FB97ED-C684-4B81-B623-AB7EBD7B7091@blackducksoftware.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1274228420 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.2, rules version 3.2.2.30207 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 18, 2010 at 03:28:20PM -0400, Colin Wilson wrote: > Hello all, I seem to be having the same problem as Tomasz had in > this post to the mailing list: > http://oss.sgi.com/archives/xfs/2009-07/msg00082.html . Eric > ultimately suggested running xfs_repair with the '-P' and '-o > bhash=1024' flags to get past this problem and described what he > thought the underlieing problem was as such: > > > "This looks like some of the caching that xfs_repair does is > > mis-sized, and it gets stuck when it's unable to find a slot for > > a new node to cache. IMHO that's still a bug that I'd like to > > work out. If it gets stuck this way, it'd probably be better to > > exit, and suggest a larger hash size." > > Currently my file system is ~50 TB in size with ~40TB in use and > when I do the repair memory usage ends up between 10 and 11 GB > used for most of the check. The system currently has 12GB of ram > not including swap. Is this expected behavior? Given you are running v2.9.8, I'd say yes, and one of your problems is that repair is swapping as the base memory footprint is likely to be in the order of 40-50GB RAM for xfs_repair. I just ran xfs_check on an empty 51TB filesystem w/ 821 AGs to get an idea of how much RAM an older xfs_repair will use (as it have 3.1.2 installed on my test machines). It is allocating about 115GB of virtual memory space before consuming all the RAM+swap in the machine before being OOM-killed. > My concern is > setting bhash too large and causing xfs_repair to swap for long > periods of time. It already takes a few days to get to Phase 6 in > the repair. Must be swapping, then... > I am currently running Debian Lenny(5.0.4) with xfsprogs 2.9.8 > with linux kernel 2.6.26. I've briefly looked through the change > logs for newer version of xfsprogs and noticed that there were a > few updates mentioning better memory performance or management so > upgrading to a newer version may be all I need. Yup, there were major memory usage reductions in xfs-repair in 3.1.0. Looking at the same empty filesystem as above the base xfs_repair memory footprint is a few tens of megabytes of RAM. That will definitely balloon to a few GB as the filesytem metadata is read in and cached, but i doubt it will get anywhere near what 2.9.8 requires and so should be much faster. Hence I'd start by upgrading to 3.1.2 and running with the default options first to see whether it is faster and whether it hangs or not before going any further. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+l3vJ+78+fromorbit.com=david@internode.on.net Tue May 18 19:53:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_LOTS_OF_MONEY autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4J0rc6M088033 for ; Tue, 18 May 2010 19:53:38 -0500 X-ASG-Debug-ID: 1274230554-0e7c02010000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 545973581CF for ; Tue, 18 May 2010 17:55:55 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id D17RhcmaK4SBQlPu for ; Tue, 18 May 2010 17:55:55 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24587953-1927428 for multiple; Wed, 19 May 2010 10:25:37 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OEXZP-0006sU-Bg; Wed, 19 May 2010 10:55:35 +1000 Date: Wed, 19 May 2010 10:55:35 +1000 From: Dave Chinner To: Jan Kara Cc: xfs@oss.sgi.com, hch@infradead.org X-ASG-Orig-Subj: Re: [PATCH 1/3] Test basic quota enforcement Subject: Re: [PATCH 1/3] Test basic quota enforcement Message-ID: <20100519005535.GK2150@dastard> References: <1274225776-26987-1-git-send-email-jack@suse.cz> <1274225776-26987-2-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274225776-26987-2-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1274230556 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.2, rules version 3.2.2.30210 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 19, 2010 at 01:36:14AM +0200, Jan Kara wrote: > Add a test which checks whether basic quota enforcement works. Couple of quick things: - we have ${qa_user} for running stuff under a specific user - sudo is not installed or configured for this sort of usage on many systems - typically su is used instead (e.g. see test 193) > +# real QA test starts here > +rm -f $seq.full > + > +user=nobody > +group=`sudo -u $user id -g` > +grace=2 > + > +umount $SCRATCH_DEV 2>/dev/null The scratch device should already be unmounted. if it isn't something went wrong in a previous test and unmounting it here isn't going to help. > +_scratch_mkfs >> $seq.full 2>&1 > +_scratch_mount "-o usrquota,grpquota" > +quotacheck -u -g $SCRATCH_MNT 2>/dev/null > +quotaon $SCRATCH_MNT 2>/dev/null > +setquota -u $user 4 12 2 4 $SCRATCH_MNT > +setquota -u -t $grace $grace $SCRATCH_MNT > +setquota -g $group 4 12 2 4 $SCRATCH_MNT > +setquota -g -t $grace $grace $SCRATCH_MNT > +umount $SCRATCH_DEV > + > +echo; echo "### test user limit enforcement" > +export MOUNT_OPTIONS="-o usrquota" > +_qmount That will overwrite any mount options specified on the command line. perhaps better is to use: scratch_mount -o usrquota Cheers, Dave. -- Dave Chinner david@fromorbit.com From bounce3-59042-10426-28913016-kb2tj@b2.acast.ca Tue May 18 21:10:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4J2ADIV092070 for ; Tue, 18 May 2010 21:10:13 -0500 X-ASG-Debug-ID: 1274235149-6d9e00850000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from acast.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 22CCF13F32E8 for ; Tue, 18 May 2010 19:12:29 -0700 (PDT) Received: from acast.ca (peer1.acast.ca [64.34.141.99]) by cuda.sgi.com with SMTP id GCfmiA6UH9ImFEfc for ; Tue, 18 May 2010 19:12:29 -0700 (PDT) Received: (qmail 18112 invoked by uid 1007); 19 May 2010 01:40:22 -0000 Date: 19 May 2010 01:40:22 -0000 Message-ID: <20100519014022.18111.qmail@acast.ca> To: "linux-xfs" From: "Sensor Expert" X-ASG-Orig-Subj: Monitor and measure contact surface pressure accurately and inexpensively Subject: Monitor and measure contact surface pressure accurately and inexpensively MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_ACST_YAWC_XKBAX_FF64Q_ULKM9_R6EFD" X-Barracuda-Connect: peer1.acast.ca[64.34.141.99] X-Barracuda-Start-Time: 1274235150 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_SC7_SA_HREF_WWW_MISMATCH, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30213 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC7_SA_HREF_WWW_MISMATCH BODY: Custom Phishing Mismatch 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. ------=_ACST_YAWC_XKBAX_FF64Q_ULKM9_R6EFD Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Pressurex pressure indicating sensor film can reveal pressure distribution = and magnitude between any two contacting or impacting surfaces. This thin p= lastic sensor film is placed at the actual contact surfaces and instantaneo= usly and permanently captures the pressure profile by changing color. Simil= ar in concept to Litmus paper, the color Pressurex turns is also directly p= roportional to the amount of force applied and can be quantified. Pressurex can be used in many applications including in a bolted joint inte= rface, composite layup, heat sealing and lamination presses; it can act as = a force sensing resistor, and it can measure surface pressure distribution = whether it is used as an impact force sensor, seat pressure sensor, as a st= rain gauge or even as nip impression paper. If you would like to receive a sample of Pressurex, simply click on only on= e of the buttons below to indicate the pressure range most suitable to your= application and we'll gladly send one out to you. Please be sure to includ= e complete contact info and a full mailing address. Micro 2 - 20 PSI (0.14 - 1.4 kg/cm=B2) Ultra Low 28 - 85 PSI (2 - 6 kg/cm=B2) Super Low 70 - 350 PSI (5 - 25 kg/cm=B2) Low 350 - 1,400 PSI (25 - 100 kg/cm=B2) Medium 1,400 - 7,100 PSI (100 - 500 kg/cm=B2) High 7,100 - 18,500 PSI (500 - 1,300 kg/cm=B2) Super High 18,500 - 43,200 PSI (1,300 - 3,000 kg/cm=B2) Click here for product brochure Sensor Expert (USA) =95 Tel: (973) 884-1755 =95 Fax: (973) 884-1699= =95 samples@sensorexpert.com =95 www.sensorexpert.com http://www.sensorexpert.com ------=_ACST_YAWC_XKBAX_FF64Q_ULKM9_R6EFD Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Untitled Document

Pressurex pressure indicating sensor f= ilm can reveal pressure distribution and magnitude between any two contacti= ng or impacting surfaces. This thin plastic sensor film is placed at the ac= tual contact surfaces and instantaneously and permanently captures the pres= sure profile by changing color. Similar in concept to Litmus paper, the col= or Pressurex turns is also directly proportional to the amount of force app= lied and can be quantified.

Pressurex can be used in many= applications including in a bolted joint interface, composite layup, heat = sealing and lamination presses; it can act as a force sensing resistor, and= it can measure surface pressure distribution whether it is used as an impa= ct force sensor, seat pressure sensor, as a strain gauge or even as nip imp= ression paper.

If you would like to receive a sample of Pressurex, simply click on only o= ne of the buttons below to indicate the pressure range most suitable to you= r application and we'll gladly send one out to you. Please be sure to inclu= de complete contact info and a full mailing address.
  Micro 2 - 20 PSI (0.14 - 1.4 = kg/cm²)
  Ultra Low 28 - 85 PSI (2 - 6 kg/cm²)
  Super Low 70 - 350 PSI (5 - 25 kg/cm²)
  Low 350 - 1,400 PSI (25 - 100 kg/cm²= )
  Medium 1,400 - 7,100 PSI (100 - 500 kg/cm&su= p2;)
  High 7,100 - 18,500 PSI (500 - 1,300 kg/cm= ²)
  Super High 18,500 - 43,200 PSI (1,300 - 3,000 kg= /cm²)
Sensor Expert (USA)   •   Tel: (973) 884-1755   •   Fax: (973) 884-1699   •   samples@sensor= expert.com  •   www.senso= rexpert.com
3D"" ------=_ACST_YAWC_XKBAX_FF64Q_ULKM9_R6EFD-- From sandeen@sandeen.net Tue May 18 21:13:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4J2DT2V092284 for ; Tue, 18 May 2010 21:13:29 -0500 X-ASG-Debug-ID: 1274235411-402602e50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9FB6812998E3 for ; Tue, 18 May 2010 19:16:51 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id J8rwsjvpNlmkCNa8 for ; Tue, 18 May 2010 19:16:51 -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 mail.sandeen.net (Postfix) with ESMTP id AB0044968911; Tue, 18 May 2010 21:15:45 -0500 (CDT) Message-ID: <4BF349D1.6050408@sandeen.net> Date: Tue, 18 May 2010 21:15:45 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Dave Chinner CC: Colin Wilson , "xfs@oss.sgi.com" X-ASG-Orig-Subj: Re: xfs_repair memory usage and stopping on "Traversing filesystem..." Subject: Re: xfs_repair memory usage and stopping on "Traversing filesystem..." References: <00FB97ED-C684-4B81-B623-AB7EBD7B7091@blackducksoftware.com> <20100519001911.GJ2150@dastard> In-Reply-To: <20100519001911.GJ2150@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1274235412 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0207 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30214 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner wrote: > Hence I'd start by upgrading to 3.1.2 and running with the default > options first to see whether it is faster and whether it hangs or > not before going any further. If it still hangs, collecting an xfs_metadump of the fs would be useful for investigating the problem. But, I think I fixed that (the options you mentioned were workarounds for the bug I eventually fixed, IIRC) Thanks, -Eric > Cheers, > > Dave. From stan@hardwarefreak.com Tue May 18 23:16:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4J4G8qT098701 for ; Tue, 18 May 2010 23:16:08 -0500 X-ASG-Debug-ID: 1274242706-6d8902490000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A71E3358DA2 for ; Tue, 18 May 2010 21:18:26 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id SIDRAOmWZucoWcuZ for ; Tue, 18 May 2010 21:18:26 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id C2E1A6C2B0 for ; Tue, 18 May 2010 23:18:25 -0500 (CDT) Message-ID: <4BF366C9.9050300@hardwarefreak.com> Date: Tue, 18 May 2010 23:19:21 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel References: <4BF1EC44.7070803@hardwarefreak.com> <4BF219A6.4010900@hardwarefreak.com> <1274201857.17233.144.camel@montana.filmlight.ltd.uk> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274242706 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3802 1.0000 -0.0542 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=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30220 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean big beer put forth on 5/18/2010 5:43 PM: > Strangely enough I was told by Hitachi that they licensed XFS from > SGI, so they don't have any GPL code to give back. IIRC (and IANAL) any version of XFS, with the exception of CXFS, running on Linux is GPL'd code. There is no such beast as non GPL XFS on Linux. For that SGI licensing statement to be true, they've have to be running XFS on IRIX, which means they'd need an IRIX license as well. Not to mention that IRIX only runs on MIPS hardware, and only SGI MIPS hardware. This HDS storage blade is x86. It seems whoever told you that is misinformed or is being disingenuous in order to avoid assisting you. -- Stan From BATV+3478df1fd675c5a5ef2d+2460+infradead.org+hch@bombadil.srs.infradead.org Wed May 19 02:46:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4J7kS8d112643 for ; Wed, 19 May 2010 02:46:33 -0500 X-ASG-Debug-ID: 1274255392-360801da0000-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 F3C8713F4D2B for ; Wed, 19 May 2010 00:49:53 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id 4nDMl0toliDC0GDn for ; Wed, 19 May 2010 00:49:53 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OEe1F-0003IZ-LL for xfs@oss.sgi.com; Wed, 19 May 2010 07:48:45 +0000 Date: Wed, 19 May 2010 03:48:45 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v2] xfs: cleanup log reservation calculactions Subject: Re: [PATCH v2] xfs: cleanup log reservation calculactions Message-ID: <20100519074845.GA12649@infradead.org> References: <20100504135348.GA18991@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100504135348.GA18991@infradead.org> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1274255393 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean ping? On Tue, May 04, 2010 at 09:53:48AM -0400, Christoph Hellwig wrote: > > Instead of having small helper functions calling big macros do the > calculations for the log reservations directly in the functions. These > are mostly 1:1 from the macros execept that the macros kept the quota > calculations in their callers. > > Signed-off-by: Christoph Hellwig > > Index: xfs/fs/xfs/xfs_trans.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-04 15:47:36.143004267 +0200 > +++ xfs/fs/xfs/xfs_trans.c 2010-05-04 15:49:00.118253812 +0200 > @@ -49,134 +49,489 @@ > > kmem_zone_t *xfs_trans_zone; > > + > +/* > + * Various log reservation values. > + * > + * These are based on the size of the file system block because that is what > + * most transactions manipulate. Each adds in an additional 128 bytes per > + * item logged to try to account for the overhead of the transaction mechanism. > + * > + * Note: Most of the reservations underestimate the number of allocation > + * groups into which they could free extents in the xfs_bmap_finish() call. > + * This is because the number in the worst case is quite high and quite > + * unusual. In order to fix this we need to change xfs_bmap_finish() to free > + * extents in only a single AG at a time. This will require changes to the > + * EFI code as well, however, so that the EFI for the extents not freed is > + * logged again in each transaction. See SGI PV #261917. > + * > + * Reservation functions here avoid a huge stack in xfs_trans_init due to > + * register overflow from temporaries in the calculations. > + */ > + > + > /* > - * Reservation functions here avoid a huge stack in xfs_trans_init > - * due to register overflow from temporaries in the calculations. > + * In a write transaction we can allocate a maximum of 2 > + * extents. This gives: > + * the inode getting the new extents: inode size > + * the inode's bmap btree: max depth * block size > + * the agfs of the ags from which the extents are allocated: 2 * sector > + * the superblock free block counter: sector size > + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size > + * And the bmap_finish transaction can free bmap blocks in a join: > + * the agfs of the ags containing the blocks: 2 * sector size > + * the agfls of the ags containing the blocks: 2 * sector size > + * the super block free block counter: sector size > + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size > */ > STATIC uint > -xfs_calc_write_reservation(xfs_mount_t *mp) > +xfs_calc_write_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_WRITE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); > + return XFS_DQUOT_LOGRES(mp) + > + MAX((mp->m_sb.sb_inodesize + > + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + > + 2 * mp->m_sb.sb_sectsize + > + mp->m_sb.sb_sectsize + > + XFS_ALLOCFREE_LOG_RES(mp, 2) + > + 128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + > + XFS_ALLOCFREE_LOG_COUNT(mp, 2))), > + (2 * mp->m_sb.sb_sectsize + > + 2 * mp->m_sb.sb_sectsize + > + mp->m_sb.sb_sectsize + > + XFS_ALLOCFREE_LOG_RES(mp, 2) + > + 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); > } > > +/* > + * In truncating a file we free up to two extents at once. We can modify: > + * the inode being truncated: inode size > + * the inode's bmap btree: (max depth + 1) * block size > + * And the bmap_finish transaction can free the blocks and bmap blocks: > + * the agf for each of the ags: 4 * sector size > + * the agfl for each of the ags: 4 * sector size > + * the super block to reflect the freed blocks: sector size > + * worst case split in allocation btrees per extent assuming 4 extents: > + * 4 exts * 2 trees * (2 * max depth - 1) * block size > + * the inode btree: max depth * blocksize > + * the allocation btrees: 2 trees * (max depth - 1) * block size > + */ > STATIC uint > -xfs_calc_itruncate_reservation(xfs_mount_t *mp) > +xfs_calc_itruncate_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_ITRUNCATE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); > + return XFS_DQUOT_LOGRES(mp) + > + MAX((mp->m_sb.sb_inodesize + > + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + > + 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), > + (4 * mp->m_sb.sb_sectsize + > + 4 * mp->m_sb.sb_sectsize + > + mp->m_sb.sb_sectsize + > + XFS_ALLOCFREE_LOG_RES(mp, 4) + > + 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + > + 128 * 5 + > + XFS_ALLOCFREE_LOG_RES(mp, 1) + > + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + > + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); > } > > +/* > + * In renaming a files we can modify: > + * the four inodes involved: 4 * inode size > + * the two directory btrees: 2 * (max depth + v2) * dir block size > + * the two directory bmap btrees: 2 * max depth * block size > + * And the bmap_finish transaction can free dir and bmap blocks (two sets > + * of bmap blocks) giving: > + * the agf for the ags in which the blocks live: 3 * sector size > + * the agfl for the ags in which the blocks live: 3 * sector size > + * the superblock for the free block count: sector size > + * the allocation btrees: 3 exts * 2 trees * (2 * max depth - 1) * block size > + */ > STATIC uint > -xfs_calc_rename_reservation(xfs_mount_t *mp) > +xfs_calc_rename_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_RENAME_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); > + return XFS_DQUOT_LOGRES(mp) + > + MAX((4 * mp->m_sb.sb_inodesize + > + 2 * XFS_DIROP_LOG_RES(mp) + > + 128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp))), > + (3 * mp->m_sb.sb_sectsize + > + 3 * mp->m_sb.sb_sectsize + > + mp->m_sb.sb_sectsize + > + XFS_ALLOCFREE_LOG_RES(mp, 3) + > + 128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))); > } > > +/* > + * For creating a link to an inode: > + * the parent directory inode: inode size > + * the linked inode: inode size > + * the directory btree could split: (max depth + v2) * dir block size > + * the directory bmap btree could join or split: (max depth + v2) * blocksize > + * And the bmap_finish transaction can free some bmap blocks giving: > + * the agf for the ag in which the blocks live: sector size > + * the agfl for the ag in which the blocks live: sector size > + * the superblock for the free block count: sector size > + * the allocation btrees: 2 trees * (2 * max depth - 1) * block size > + */ > STATIC uint > -xfs_calc_link_reservation(xfs_mount_t *mp) > +xfs_calc_link_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_LINK_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); > + return XFS_DQUOT_LOGRES(mp) + > + MAX((mp->m_sb.sb_inodesize + > + mp->m_sb.sb_inodesize + > + XFS_DIROP_LOG_RES(mp) + > + 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), > + (mp->m_sb.sb_sectsize + > + mp->m_sb.sb_sectsize + > + mp->m_sb.sb_sectsize + > + XFS_ALLOCFREE_LOG_RES(mp, 1) + > + 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); > } > > +/* > + * For removing a directory entry we can modify: > + * the parent directory inode: inode size > + * the removed inode: inode size > + * the directory btree could join: (max depth + v2) * dir block size > + * the directory bmap btree could join or split: (max depth + v2) * blocksize > + * And the bmap_finish transaction can free the dir and bmap blocks giving: > + * the agf for the ag in which the blocks live: 2 * sector size > + * the agfl for the ag in which the blocks live: 2 * sector size > + * the superblock for the free block count: sector size > + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size > + */ > STATIC uint > -xfs_calc_remove_reservation(xfs_mount_t *mp) > +xfs_calc_remove_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_REMOVE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); > + return XFS_DQUOT_LOGRES(mp) + > + MAX((mp->m_sb.sb_inodesize + > + mp->m_sb.sb_inodesize + > + XFS_DIROP_LOG_RES(mp) + > + 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), > + (2 * mp->m_sb.sb_sectsize + > + 2 * mp->m_sb.sb_sectsize + > + mp->m_sb.sb_sectsize + > + XFS_ALLOCFREE_LOG_RES(mp, 2) + > + 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); > } > > +/* > + * For symlink we can modify: > + * the parent directory inode: inode size > + * the new inode: inode size > + * the inode btree entry: 1 block > + * the directory btree: (max depth + v2) * dir block size > + * the directory inode's bmap btree: (max depth + v2) * block size > + * the blocks for the symlink: 1 kB > + * Or in the first xact we allocate some inodes giving: > + * the agi and agf of the ag getting the new inodes: 2 * sectorsize > + * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize > + * the inode btree: max depth * blocksize > + * the allocation btrees: 2 trees * (2 * max depth - 1) * block size > + */ > STATIC uint > -xfs_calc_symlink_reservation(xfs_mount_t *mp) > +xfs_calc_symlink_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_SYMLINK_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); > + return XFS_DQUOT_LOGRES(mp) + > + MAX((mp->m_sb.sb_inodesize + > + mp->m_sb.sb_inodesize + > + XFS_FSB_TO_B(mp, 1) + > + XFS_DIROP_LOG_RES(mp) + > + 1024 + > + 128 * (4 + XFS_DIROP_LOG_COUNT(mp))), > + (2 * mp->m_sb.sb_sectsize + > + XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + > + XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + > + XFS_ALLOCFREE_LOG_RES(mp, 1) + > + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + > + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); > } > > +/* > + * For create we can modify: > + * the parent directory inode: inode size > + * the new inode: inode size > + * the inode btree entry: block size > + * the superblock for the nlink flag: sector size > + * the directory btree: (max depth + v2) * dir block size > + * the directory inode's bmap btree: (max depth + v2) * block size > + * Or in the first xact we allocate some inodes giving: > + * the agi and agf of the ag getting the new inodes: 2 * sectorsize > + * the superblock for the nlink flag: sector size > + * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize > + * the inode btree: max depth * blocksize > + * the allocation btrees: 2 trees * (max depth - 1) * block size > + */ > STATIC uint > -xfs_calc_create_reservation(xfs_mount_t *mp) > +xfs_calc_create_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_CREATE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); > + return XFS_DQUOT_LOGRES(mp) + > + MAX((mp->m_sb.sb_inodesize + > + mp->m_sb.sb_inodesize + > + mp->m_sb.sb_sectsize + > + XFS_FSB_TO_B(mp, 1) + > + XFS_DIROP_LOG_RES(mp) + > + 128 * (3 + XFS_DIROP_LOG_COUNT(mp))), > + (3 * mp->m_sb.sb_sectsize + > + XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + > + XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + > + XFS_ALLOCFREE_LOG_RES(mp, 1) + > + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + > + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); > } > > +/* > + * Making a new directory is the same as creating a new file. > + */ > STATIC uint > -xfs_calc_mkdir_reservation(xfs_mount_t *mp) > +xfs_calc_mkdir_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_MKDIR_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); > + return xfs_calc_create_reservation(mp); > } > > +/* > + * In freeing an inode we can modify: > + * the inode being freed: inode size > + * the super block free inode counter: sector size > + * the agi hash list and counters: sector size > + * the inode btree entry: block size > + * the on disk inode before ours in the agi hash list: inode cluster size > + * the inode btree: max depth * blocksize > + * the allocation btrees: 2 trees * (max depth - 1) * block size > + */ > STATIC uint > -xfs_calc_ifree_reservation(xfs_mount_t *mp) > +xfs_calc_ifree_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_IFREE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); > + return XFS_DQUOT_LOGRES(mp) + > + mp->m_sb.sb_inodesize + > + mp->m_sb.sb_sectsize + > + mp->m_sb.sb_sectsize + > + XFS_FSB_TO_B(mp, 1) + > + MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), > + XFS_INODE_CLUSTER_SIZE(mp)) + > + 128 * 5 + > + XFS_ALLOCFREE_LOG_RES(mp, 1) + > + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + > + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); > } > > +/* > + * When only changing the inode we log the inode and possibly the superblock > + * We also add a bit of slop for the transaction stuff. > + */ > STATIC uint > -xfs_calc_ichange_reservation(xfs_mount_t *mp) > +xfs_calc_ichange_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_ICHANGE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); > + return XFS_DQUOT_LOGRES(mp) + > + mp->m_sb.sb_inodesize + > + mp->m_sb.sb_sectsize + > + 512; > + > } > > +/* > + * Growing the data section of the filesystem. > + * superblock > + * agi and agf > + * allocation btrees > + */ > STATIC uint > -xfs_calc_growdata_reservation(xfs_mount_t *mp) > +xfs_calc_growdata_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_GROWDATA_LOG_RES(mp); > + return mp->m_sb.sb_sectsize * 3 + > + XFS_ALLOCFREE_LOG_RES(mp, 1) + > + 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); > } > > +/* > + * Growing the rt section of the filesystem. > + * In the first set of transactions (ALLOC) we allocate space to the > + * bitmap or summary files. > + * superblock: sector size > + * agf of the ag from which the extent is allocated: sector size > + * bmap btree for bitmap/summary inode: max depth * blocksize > + * bitmap/summary inode: inode size > + * allocation btrees for 1 block alloc: 2 * (2 * maxdepth - 1) * blocksize > + */ > STATIC uint > -xfs_calc_growrtalloc_reservation(xfs_mount_t *mp) > +xfs_calc_growrtalloc_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_GROWRTALLOC_LOG_RES(mp); > + return 2 * mp->m_sb.sb_sectsize + > + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + > + mp->m_sb.sb_inodesize + > + XFS_ALLOCFREE_LOG_RES(mp, 1) + > + 128 * (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + > + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); > } > > +/* > + * Growing the rt section of the filesystem. > + * In the second set of transactions (ZERO) we zero the new metadata blocks. > + * one bitmap/summary block: blocksize > + */ > STATIC uint > -xfs_calc_growrtzero_reservation(xfs_mount_t *mp) > +xfs_calc_growrtzero_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_GROWRTZERO_LOG_RES(mp); > + return mp->m_sb.sb_blocksize + 128; > } > > +/* > + * Growing the rt section of the filesystem. > + * In the third set of transactions (FREE) we update metadata without > + * allocating any new blocks. > + * superblock: sector size > + * bitmap inode: inode size > + * summary inode: inode size > + * one bitmap block: blocksize > + * summary blocks: new summary size > + */ > STATIC uint > -xfs_calc_growrtfree_reservation(xfs_mount_t *mp) > +xfs_calc_growrtfree_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_GROWRTFREE_LOG_RES(mp); > + return mp->m_sb.sb_sectsize + > + 2 * mp->m_sb.sb_inodesize + > + mp->m_sb.sb_blocksize + > + mp->m_rsumsize + > + 128 * 5; > } > > +/* > + * Logging the inode modification timestamp on a synchronous write. > + * inode > + */ > STATIC uint > -xfs_calc_swrite_reservation(xfs_mount_t *mp) > +xfs_calc_swrite_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_SWRITE_LOG_RES(mp); > + return mp->m_sb.sb_inodesize + 128; > } > > +/* > + * Logging the inode mode bits when writing a setuid/setgid file > + * inode > + */ > STATIC uint > xfs_calc_writeid_reservation(xfs_mount_t *mp) > { > - return XFS_CALC_WRITEID_LOG_RES(mp); > + return mp->m_sb.sb_inodesize + 128; > } > > +/* > + * Converting the inode from non-attributed to attributed. > + * the inode being converted: inode size > + * agf block and superblock (for block allocation) > + * the new block (directory sized) > + * bmap blocks for the new directory block > + * allocation btrees > + */ > STATIC uint > -xfs_calc_addafork_reservation(xfs_mount_t *mp) > +xfs_calc_addafork_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_ADDAFORK_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); > + return XFS_DQUOT_LOGRES(mp) + > + mp->m_sb.sb_inodesize + > + mp->m_sb.sb_sectsize * 2 + > + mp->m_dirblksize + > + XFS_FSB_TO_B(mp, XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + > + XFS_ALLOCFREE_LOG_RES(mp, 1) + > + 128 * (4 + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1 + > + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); > } > > +/* > + * Removing the attribute fork of a file > + * the inode being truncated: inode size > + * the inode's bmap btree: max depth * block size > + * And the bmap_finish transaction can free the blocks and bmap blocks: > + * the agf for each of the ags: 4 * sector size > + * the agfl for each of the ags: 4 * sector size > + * the super block to reflect the freed blocks: sector size > + * worst case split in allocation btrees per extent assuming 4 extents: > + * 4 exts * 2 trees * (2 * max depth - 1) * block size > + */ > STATIC uint > -xfs_calc_attrinval_reservation(xfs_mount_t *mp) > +xfs_calc_attrinval_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_ATTRINVAL_LOG_RES(mp); > + return MAX((mp->m_sb.sb_inodesize + > + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + > + 128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))), > + (4 * mp->m_sb.sb_sectsize + > + 4 * mp->m_sb.sb_sectsize + > + mp->m_sb.sb_sectsize + > + XFS_ALLOCFREE_LOG_RES(mp, 4) + > + 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))); > } > > +/* > + * Setting an attribute. > + * the inode getting the attribute > + * the superblock for allocations > + * the agfs extents are allocated from > + * the attribute btree * max depth > + * the inode allocation btree > + * Since attribute transaction space is dependent on the size of the attribute, > + * the calculation is done partially at mount time and partially at runtime. > + */ > STATIC uint > -xfs_calc_attrset_reservation(xfs_mount_t *mp) > +xfs_calc_attrset_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_ATTRSET_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); > + return XFS_DQUOT_LOGRES(mp) + > + mp->m_sb.sb_inodesize + > + mp->m_sb.sb_sectsize + > + XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + > + 128 * (2 + XFS_DA_NODE_MAXDEPTH); > } > > +/* > + * Removing an attribute. > + * the inode: inode size > + * the attribute btree could join: max depth * block size > + * the inode bmap btree could join or split: max depth * block size > + * And the bmap_finish transaction can free the attr blocks freed giving: > + * the agf for the ag in which the blocks live: 2 * sector size > + * the agfl for the ag in which the blocks live: 2 * sector size > + * the superblock for the free block count: sector size > + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size > + */ > STATIC uint > -xfs_calc_attrrm_reservation(xfs_mount_t *mp) > +xfs_calc_attrrm_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_ATTRRM_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); > + return XFS_DQUOT_LOGRES(mp) + > + MAX((mp->m_sb.sb_inodesize + > + XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + > + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + > + 128 * (1 + XFS_DA_NODE_MAXDEPTH + > + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), > + (2 * mp->m_sb.sb_sectsize + > + 2 * mp->m_sb.sb_sectsize + > + mp->m_sb.sb_sectsize + > + XFS_ALLOCFREE_LOG_RES(mp, 2) + > + 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); > } > > +/* > + * Clearing a bad agino number in an agi hash bucket. > + */ > STATIC uint > -xfs_calc_clear_agi_bucket_reservation(xfs_mount_t *mp) > +xfs_calc_clear_agi_bucket_reservation( > + struct xfs_mount *mp) > { > - return XFS_CALC_CLEAR_AGI_BUCKET_LOG_RES(mp); > + return mp->m_sb.sb_sectsize + 128; > } > > /* > @@ -185,11 +540,10 @@ xfs_calc_clear_agi_bucket_reservation(xf > */ > void > xfs_trans_init( > - xfs_mount_t *mp) > + struct xfs_mount *mp) > { > - xfs_trans_reservations_t *resp; > + struct xfs_trans_reservations *resp = &mp->m_reservations; > > - resp = &(mp->m_reservations); > resp->tr_write = xfs_calc_write_reservation(mp); > resp->tr_itruncate = xfs_calc_itruncate_reservation(mp); > resp->tr_rename = xfs_calc_rename_reservation(mp); > Index: xfs/fs/xfs/xfs_trans.h > =================================================================== > --- xfs.orig/fs/xfs/xfs_trans.h 2010-05-04 15:47:36.150003848 +0200 > +++ xfs/fs/xfs/xfs_trans.h 2010-05-04 15:47:55.115254931 +0200 > @@ -300,24 +300,6 @@ xfs_lic_desc_to_chunk(xfs_log_item_desc_ > > > /* > - * Various log reservation values. > - * These are based on the size of the file system block > - * because that is what most transactions manipulate. > - * Each adds in an additional 128 bytes per item logged to > - * try to account for the overhead of the transaction mechanism. > - * > - * Note: > - * Most of the reservations underestimate the number of allocation > - * groups into which they could free extents in the xfs_bmap_finish() > - * call. This is because the number in the worst case is quite high > - * and quite unusual. In order to fix this we need to change > - * xfs_bmap_finish() to free extents in only a single AG at a time. > - * This will require changes to the EFI code as well, however, so that > - * the EFI for the extents not freed is logged again in each transaction. > - * See bug 261917. > - */ > - > -/* > * Per-extent log reservation for the allocation btree changes > * involved in freeing or allocating an extent. > * 2 trees * (2 blocks/level * max depth - 1) * block size > @@ -341,429 +323,36 @@ xfs_lic_desc_to_chunk(xfs_log_item_desc_ > (XFS_DAENTER_BLOCKS(mp, XFS_DATA_FORK) + \ > XFS_DAENTER_BMAPS(mp, XFS_DATA_FORK) + 1) > > -/* > - * In a write transaction we can allocate a maximum of 2 > - * extents. This gives: > - * the inode getting the new extents: inode size > - * the inode's bmap btree: max depth * block size > - * the agfs of the ags from which the extents are allocated: 2 * sector > - * the superblock free block counter: sector size > - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size > - * And the bmap_finish transaction can free bmap blocks in a join: > - * the agfs of the ags containing the blocks: 2 * sector size > - * the agfls of the ags containing the blocks: 2 * sector size > - * the super block free block counter: sector size > - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size > - */ > -#define XFS_CALC_WRITE_LOG_RES(mp) \ > - (MAX( \ > - ((mp)->m_sb.sb_inodesize + \ > - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + \ > - (2 * (mp)->m_sb.sb_sectsize) + \ > - (mp)->m_sb.sb_sectsize + \ > - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ > - (128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))),\ > - ((2 * (mp)->m_sb.sb_sectsize) + \ > - (2 * (mp)->m_sb.sb_sectsize) + \ > - (mp)->m_sb.sb_sectsize + \ > - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ > - (128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))))) > > #define XFS_WRITE_LOG_RES(mp) ((mp)->m_reservations.tr_write) > - > -/* > - * In truncating a file we free up to two extents at once. We can modify: > - * the inode being truncated: inode size > - * the inode's bmap btree: (max depth + 1) * block size > - * And the bmap_finish transaction can free the blocks and bmap blocks: > - * the agf for each of the ags: 4 * sector size > - * the agfl for each of the ags: 4 * sector size > - * the super block to reflect the freed blocks: sector size > - * worst case split in allocation btrees per extent assuming 4 extents: > - * 4 exts * 2 trees * (2 * max depth - 1) * block size > - * the inode btree: max depth * blocksize > - * the allocation btrees: 2 trees * (max depth - 1) * block size > - */ > -#define XFS_CALC_ITRUNCATE_LOG_RES(mp) \ > - (MAX( \ > - ((mp)->m_sb.sb_inodesize + \ > - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + \ > - (128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)))), \ > - ((4 * (mp)->m_sb.sb_sectsize) + \ > - (4 * (mp)->m_sb.sb_sectsize) + \ > - (mp)->m_sb.sb_sectsize + \ > - XFS_ALLOCFREE_LOG_RES(mp, 4) + \ > - (128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4))) + \ > - (128 * 5) + \ > - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ > - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels + \ > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) > - > #define XFS_ITRUNCATE_LOG_RES(mp) ((mp)->m_reservations.tr_itruncate) > - > -/* > - * In renaming a files we can modify: > - * the four inodes involved: 4 * inode size > - * the two directory btrees: 2 * (max depth + v2) * dir block size > - * the two directory bmap btrees: 2 * max depth * block size > - * And the bmap_finish transaction can free dir and bmap blocks (two sets > - * of bmap blocks) giving: > - * the agf for the ags in which the blocks live: 3 * sector size > - * the agfl for the ags in which the blocks live: 3 * sector size > - * the superblock for the free block count: sector size > - * the allocation btrees: 3 exts * 2 trees * (2 * max depth - 1) * block size > - */ > -#define XFS_CALC_RENAME_LOG_RES(mp) \ > - (MAX( \ > - ((4 * (mp)->m_sb.sb_inodesize) + \ > - (2 * XFS_DIROP_LOG_RES(mp)) + \ > - (128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp)))), \ > - ((3 * (mp)->m_sb.sb_sectsize) + \ > - (3 * (mp)->m_sb.sb_sectsize) + \ > - (mp)->m_sb.sb_sectsize + \ > - XFS_ALLOCFREE_LOG_RES(mp, 3) + \ > - (128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))))) > - > #define XFS_RENAME_LOG_RES(mp) ((mp)->m_reservations.tr_rename) > - > -/* > - * For creating a link to an inode: > - * the parent directory inode: inode size > - * the linked inode: inode size > - * the directory btree could split: (max depth + v2) * dir block size > - * the directory bmap btree could join or split: (max depth + v2) * blocksize > - * And the bmap_finish transaction can free some bmap blocks giving: > - * the agf for the ag in which the blocks live: sector size > - * the agfl for the ag in which the blocks live: sector size > - * the superblock for the free block count: sector size > - * the allocation btrees: 2 trees * (2 * max depth - 1) * block size > - */ > -#define XFS_CALC_LINK_LOG_RES(mp) \ > - (MAX( \ > - ((mp)->m_sb.sb_inodesize + \ > - (mp)->m_sb.sb_inodesize + \ > - XFS_DIROP_LOG_RES(mp) + \ > - (128 * (2 + XFS_DIROP_LOG_COUNT(mp)))), \ > - ((mp)->m_sb.sb_sectsize + \ > - (mp)->m_sb.sb_sectsize + \ > - (mp)->m_sb.sb_sectsize + \ > - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ > - (128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) > - > #define XFS_LINK_LOG_RES(mp) ((mp)->m_reservations.tr_link) > - > -/* > - * For removing a directory entry we can modify: > - * the parent directory inode: inode size > - * the removed inode: inode size > - * the directory btree could join: (max depth + v2) * dir block size > - * the directory bmap btree could join or split: (max depth + v2) * blocksize > - * And the bmap_finish transaction can free the dir and bmap blocks giving: > - * the agf for the ag in which the blocks live: 2 * sector size > - * the agfl for the ag in which the blocks live: 2 * sector size > - * the superblock for the free block count: sector size > - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size > - */ > -#define XFS_CALC_REMOVE_LOG_RES(mp) \ > - (MAX( \ > - ((mp)->m_sb.sb_inodesize + \ > - (mp)->m_sb.sb_inodesize + \ > - XFS_DIROP_LOG_RES(mp) + \ > - (128 * (2 + XFS_DIROP_LOG_COUNT(mp)))), \ > - ((2 * (mp)->m_sb.sb_sectsize) + \ > - (2 * (mp)->m_sb.sb_sectsize) + \ > - (mp)->m_sb.sb_sectsize + \ > - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ > - (128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))))) > - > #define XFS_REMOVE_LOG_RES(mp) ((mp)->m_reservations.tr_remove) > - > -/* > - * For symlink we can modify: > - * the parent directory inode: inode size > - * the new inode: inode size > - * the inode btree entry: 1 block > - * the directory btree: (max depth + v2) * dir block size > - * the directory inode's bmap btree: (max depth + v2) * block size > - * the blocks for the symlink: 1 kB > - * Or in the first xact we allocate some inodes giving: > - * the agi and agf of the ag getting the new inodes: 2 * sectorsize > - * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize > - * the inode btree: max depth * blocksize > - * the allocation btrees: 2 trees * (2 * max depth - 1) * block size > - */ > -#define XFS_CALC_SYMLINK_LOG_RES(mp) \ > - (MAX( \ > - ((mp)->m_sb.sb_inodesize + \ > - (mp)->m_sb.sb_inodesize + \ > - XFS_FSB_TO_B(mp, 1) + \ > - XFS_DIROP_LOG_RES(mp) + \ > - 1024 + \ > - (128 * (4 + XFS_DIROP_LOG_COUNT(mp)))), \ > - (2 * (mp)->m_sb.sb_sectsize + \ > - XFS_FSB_TO_B((mp), XFS_IALLOC_BLOCKS((mp))) + \ > - XFS_FSB_TO_B((mp), (mp)->m_in_maxlevels) + \ > - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ > - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels + \ > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) > - > #define XFS_SYMLINK_LOG_RES(mp) ((mp)->m_reservations.tr_symlink) > - > -/* > - * For create we can modify: > - * the parent directory inode: inode size > - * the new inode: inode size > - * the inode btree entry: block size > - * the superblock for the nlink flag: sector size > - * the directory btree: (max depth + v2) * dir block size > - * the directory inode's bmap btree: (max depth + v2) * block size > - * Or in the first xact we allocate some inodes giving: > - * the agi and agf of the ag getting the new inodes: 2 * sectorsize > - * the superblock for the nlink flag: sector size > - * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize > - * the inode btree: max depth * blocksize > - * the allocation btrees: 2 trees * (max depth - 1) * block size > - */ > -#define XFS_CALC_CREATE_LOG_RES(mp) \ > - (MAX( \ > - ((mp)->m_sb.sb_inodesize + \ > - (mp)->m_sb.sb_inodesize + \ > - (mp)->m_sb.sb_sectsize + \ > - XFS_FSB_TO_B(mp, 1) + \ > - XFS_DIROP_LOG_RES(mp) + \ > - (128 * (3 + XFS_DIROP_LOG_COUNT(mp)))), \ > - (3 * (mp)->m_sb.sb_sectsize + \ > - XFS_FSB_TO_B((mp), XFS_IALLOC_BLOCKS((mp))) + \ > - XFS_FSB_TO_B((mp), (mp)->m_in_maxlevels) + \ > - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ > - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels + \ > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) > - > #define XFS_CREATE_LOG_RES(mp) ((mp)->m_reservations.tr_create) > - > -/* > - * Making a new directory is the same as creating a new file. > - */ > -#define XFS_CALC_MKDIR_LOG_RES(mp) XFS_CALC_CREATE_LOG_RES(mp) > - > #define XFS_MKDIR_LOG_RES(mp) ((mp)->m_reservations.tr_mkdir) > - > -/* > - * In freeing an inode we can modify: > - * the inode being freed: inode size > - * the super block free inode counter: sector size > - * the agi hash list and counters: sector size > - * the inode btree entry: block size > - * the on disk inode before ours in the agi hash list: inode cluster size > - * the inode btree: max depth * blocksize > - * the allocation btrees: 2 trees * (max depth - 1) * block size > - */ > -#define XFS_CALC_IFREE_LOG_RES(mp) \ > - ((mp)->m_sb.sb_inodesize + \ > - (mp)->m_sb.sb_sectsize + \ > - (mp)->m_sb.sb_sectsize + \ > - XFS_FSB_TO_B((mp), 1) + \ > - MAX((__uint16_t)XFS_FSB_TO_B((mp), 1), XFS_INODE_CLUSTER_SIZE(mp)) + \ > - (128 * 5) + \ > - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ > - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels + \ > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) > - > - > #define XFS_IFREE_LOG_RES(mp) ((mp)->m_reservations.tr_ifree) > - > -/* > - * When only changing the inode we log the inode and possibly the superblock > - * We also add a bit of slop for the transaction stuff. > - */ > -#define XFS_CALC_ICHANGE_LOG_RES(mp) ((mp)->m_sb.sb_inodesize + \ > - (mp)->m_sb.sb_sectsize + 512) > - > #define XFS_ICHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_ichange) > - > -/* > - * Growing the data section of the filesystem. > - * superblock > - * agi and agf > - * allocation btrees > - */ > -#define XFS_CALC_GROWDATA_LOG_RES(mp) \ > - ((mp)->m_sb.sb_sectsize * 3 + \ > - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ > - (128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) > - > #define XFS_GROWDATA_LOG_RES(mp) ((mp)->m_reservations.tr_growdata) > - > -/* > - * Growing the rt section of the filesystem. > - * In the first set of transactions (ALLOC) we allocate space to the > - * bitmap or summary files. > - * superblock: sector size > - * agf of the ag from which the extent is allocated: sector size > - * bmap btree for bitmap/summary inode: max depth * blocksize > - * bitmap/summary inode: inode size > - * allocation btrees for 1 block alloc: 2 * (2 * maxdepth - 1) * blocksize > - */ > -#define XFS_CALC_GROWRTALLOC_LOG_RES(mp) \ > - (2 * (mp)->m_sb.sb_sectsize + \ > - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + \ > - (mp)->m_sb.sb_inodesize + \ > - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ > - (128 * \ > - (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + \ > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) > - > #define XFS_GROWRTALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_growrtalloc) > - > -/* > - * Growing the rt section of the filesystem. > - * In the second set of transactions (ZERO) we zero the new metadata blocks. > - * one bitmap/summary block: blocksize > - */ > -#define XFS_CALC_GROWRTZERO_LOG_RES(mp) \ > - ((mp)->m_sb.sb_blocksize + 128) > - > #define XFS_GROWRTZERO_LOG_RES(mp) ((mp)->m_reservations.tr_growrtzero) > - > -/* > - * Growing the rt section of the filesystem. > - * In the third set of transactions (FREE) we update metadata without > - * allocating any new blocks. > - * superblock: sector size > - * bitmap inode: inode size > - * summary inode: inode size > - * one bitmap block: blocksize > - * summary blocks: new summary size > - */ > -#define XFS_CALC_GROWRTFREE_LOG_RES(mp) \ > - ((mp)->m_sb.sb_sectsize + \ > - 2 * (mp)->m_sb.sb_inodesize + \ > - (mp)->m_sb.sb_blocksize + \ > - (mp)->m_rsumsize + \ > - (128 * 5)) > - > #define XFS_GROWRTFREE_LOG_RES(mp) ((mp)->m_reservations.tr_growrtfree) > - > -/* > - * Logging the inode modification timestamp on a synchronous write. > - * inode > - */ > -#define XFS_CALC_SWRITE_LOG_RES(mp) \ > - ((mp)->m_sb.sb_inodesize + 128) > - > #define XFS_SWRITE_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) > - > /* > * Logging the inode timestamps on an fsync -- same as SWRITE > * as long as SWRITE logs the entire inode core > */ > #define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) > - > -/* > - * Logging the inode mode bits when writing a setuid/setgid file > - * inode > - */ > -#define XFS_CALC_WRITEID_LOG_RES(mp) \ > - ((mp)->m_sb.sb_inodesize + 128) > - > #define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) > - > -/* > - * Converting the inode from non-attributed to attributed. > - * the inode being converted: inode size > - * agf block and superblock (for block allocation) > - * the new block (directory sized) > - * bmap blocks for the new directory block > - * allocation btrees > - */ > -#define XFS_CALC_ADDAFORK_LOG_RES(mp) \ > - ((mp)->m_sb.sb_inodesize + \ > - (mp)->m_sb.sb_sectsize * 2 + \ > - (mp)->m_dirblksize + \ > - XFS_FSB_TO_B(mp, (XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1)) + \ > - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ > - (128 * (4 + (XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + \ > - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) > - > #define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) > - > -/* > - * Removing the attribute fork of a file > - * the inode being truncated: inode size > - * the inode's bmap btree: max depth * block size > - * And the bmap_finish transaction can free the blocks and bmap blocks: > - * the agf for each of the ags: 4 * sector size > - * the agfl for each of the ags: 4 * sector size > - * the super block to reflect the freed blocks: sector size > - * worst case split in allocation btrees per extent assuming 4 extents: > - * 4 exts * 2 trees * (2 * max depth - 1) * block size > - */ > -#define XFS_CALC_ATTRINVAL_LOG_RES(mp) \ > - (MAX( \ > - ((mp)->m_sb.sb_inodesize + \ > - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + \ > - (128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)))), \ > - ((4 * (mp)->m_sb.sb_sectsize) + \ > - (4 * (mp)->m_sb.sb_sectsize) + \ > - (mp)->m_sb.sb_sectsize + \ > - XFS_ALLOCFREE_LOG_RES(mp, 4) + \ > - (128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))))) > - > #define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_reservations.tr_attrinval) > - > -/* > - * Setting an attribute. > - * the inode getting the attribute > - * the superblock for allocations > - * the agfs extents are allocated from > - * the attribute btree * max depth > - * the inode allocation btree > - * Since attribute transaction space is dependent on the size of the attribute, > - * the calculation is done partially at mount time and partially at runtime. > - */ > -#define XFS_CALC_ATTRSET_LOG_RES(mp) \ > - ((mp)->m_sb.sb_inodesize + \ > - (mp)->m_sb.sb_sectsize + \ > - XFS_FSB_TO_B((mp), XFS_DA_NODE_MAXDEPTH) + \ > - (128 * (2 + XFS_DA_NODE_MAXDEPTH))) > - > #define XFS_ATTRSET_LOG_RES(mp, ext) \ > ((mp)->m_reservations.tr_attrset + \ > (ext * (mp)->m_sb.sb_sectsize) + \ > (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ > (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) > - > -/* > - * Removing an attribute. > - * the inode: inode size > - * the attribute btree could join: max depth * block size > - * the inode bmap btree could join or split: max depth * block size > - * And the bmap_finish transaction can free the attr blocks freed giving: > - * the agf for the ag in which the blocks live: 2 * sector size > - * the agfl for the ag in which the blocks live: 2 * sector size > - * the superblock for the free block count: sector size > - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size > - */ > -#define XFS_CALC_ATTRRM_LOG_RES(mp) \ > - (MAX( \ > - ((mp)->m_sb.sb_inodesize + \ > - XFS_FSB_TO_B((mp), XFS_DA_NODE_MAXDEPTH) + \ > - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + \ > - (128 * (1 + XFS_DA_NODE_MAXDEPTH + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)))), \ > - ((2 * (mp)->m_sb.sb_sectsize) + \ > - (2 * (mp)->m_sb.sb_sectsize) + \ > - (mp)->m_sb.sb_sectsize + \ > - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ > - (128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))))) > - > #define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) > - > -/* > - * Clearing a bad agino number in an agi hash bucket. > - */ > -#define XFS_CALC_CLEAR_AGI_BUCKET_LOG_RES(mp) \ > - ((mp)->m_sb.sb_sectsize + 128) > - > #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs ---end quoted text--- From BATV+3478df1fd675c5a5ef2d+2460+infradead.org+hch@bombadil.srs.infradead.org Wed May 19 02:47:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_61, J_CHICKENPOX_64,J_CHICKENPOX_66,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4J7laEH112719 for ; Wed, 19 May 2010 02:47:36 -0500 X-ASG-Debug-ID: 1274255460-360201f50000-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 6D29213F4E1C for ; Wed, 19 May 2010 00:51:01 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id D3JqFoeGgQHpb9ES for ; Wed, 19 May 2010 00:51:01 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OEe2L-0003OT-NY for xfs@oss.sgi.com; Wed, 19 May 2010 07:49:53 +0000 Date: Wed, 19 May 2010 03:49:53 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH v2] xfs: simplify log item descriptor tracking Subject: [PATCH v2] xfs: simplify log item descriptor tracking Message-ID: <20100519074953.GB12649@infradead.org> References: <20100504140011.GA20656@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100504140011.GA20656@infradead.org> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1274255461 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Currently we track log item descriptor belonging to a transaction using a complex opencoded chunk allocator. This code has been there since day one and seems to work around the lack of an efficient slab allocator. This patch replaces it with dynamically allocated log item descriptors from a dedicated slab pool, linked to the transaction by a linked list. This allows to greatly simplify the log item descriptor tracking to the point where it's just a couple hundred lines in xfs_trans.c instead of a separate file. The external API has also been simplified while we're at it - the xfs_trans_add_item and xfs_trans_del_item functions to add/ delete items from a transaction have been simplified to the bare minium, and the xfs_trans_find_item function is replaced with a direct dereference of the li_desc field. All debug code walking the list of log items in a transaction is down to a simple list_for_each_entry. Note that we could easily use a singly linked list here instead of the double linked list from list.h as the fastpath only does deletion from sequential traversal. But given that we don't have one available as a library function yet I use the list.h functions for simplicity. [the patch applies ontop of Dave's delayed-logging branch] Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/quota/xfs_trans_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c 2010-05-10 18:54:16.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_trans_dquot.c 2010-05-18 13:33:36.905253890 +0200 @@ -59,16 +59,14 @@ xfs_trans_dqjoin( xfs_trans_t *tp, xfs_dquot_t *dqp) { - xfs_dq_logitem_t *lp = &dqp->q_logitem; - ASSERT(dqp->q_transp != tp); ASSERT(XFS_DQ_IS_LOCKED(dqp)); - ASSERT(lp->qli_dquot == dqp); + ASSERT(dqp->q_logitem.qli_dquot == dqp); /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)(lp)); + xfs_trans_add_item(tp, &dqp->q_logitem.qli_item); /* * Initialize i_transp so we can later determine if this dquot is @@ -93,16 +91,11 @@ xfs_trans_log_dquot( xfs_trans_t *tp, xfs_dquot_t *dqp) { - xfs_log_item_desc_t *lidp; - ASSERT(dqp->q_transp == tp); ASSERT(XFS_DQ_IS_LOCKED(dqp)); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)(&dqp->q_logitem)); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + dqp->q_logitem.qli_item.li_desc->lid_flags |= XFS_LID_DIRTY; } /* @@ -874,9 +867,8 @@ xfs_trans_get_qoff_item( /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)q); - - return (q); + xfs_trans_add_item(tp, &q->qql_item); + return q; } @@ -890,13 +882,8 @@ xfs_trans_log_quotaoff_item( xfs_trans_t *tp, xfs_qoff_logitem_t *qlp) { - xfs_log_item_desc_t *lidp; - - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)qlp); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + qlp->qql_item.li_desc->lid_flags |= XFS_LID_DIRTY; } STATIC void Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2010-05-18 13:05:04.000000000 +0200 +++ xfs/fs/xfs/xfs_buf_item.c 2010-05-18 13:33:36.905253890 +0200 @@ -461,13 +461,10 @@ xfs_buf_item_unpin_remove( * occurs later in the xfs_trans_uncommit() will try to * reference the buffer which we no longer have a hold on. */ - struct xfs_log_item_desc *lidp; - ASSERT(XFS_BUF_VALUSEMA(bip->bli_buf) <= 0); trace_xfs_buf_item_unpin_stale(bip); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)bip); - xfs_trans_free_item(tp, lidp); + xfs_trans_del_item(&bip->bli_item); /* * Since the transaction no longer refers to the buffer, the Index: xfs/fs/xfs/xfs_extfree_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_extfree_item.c 2010-05-10 18:54:16.000000000 +0200 +++ xfs/fs/xfs/xfs_extfree_item.c 2010-05-18 13:33:36.912254239 +0200 @@ -132,18 +132,18 @@ STATIC void xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) { struct xfs_ail *ailp = efip->efi_item.li_ailp; - xfs_log_item_desc_t *lidp; spin_lock(&ailp->xa_lock); if (efip->efi_flags & XFS_EFI_CANCELED) { + struct xfs_log_item *lip = &efip->efi_item; + /* * free the xaction descriptor pointing to this item */ - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *) efip); - xfs_trans_free_item(tp, lidp); + xfs_trans_del_item(lip); /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); + xfs_trans_ail_delete(ailp, lip); xfs_efi_item_free(efip); } else { efip->efi_flags |= XFS_EFI_COMMITTED; Index: xfs/fs/xfs/xfs_trans_buf.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_buf.c 2010-05-18 13:05:04.117004274 +0200 +++ xfs/fs/xfs/xfs_trans_buf.c 2010-05-18 13:33:36.916254170 +0200 @@ -51,36 +51,17 @@ xfs_trans_buf_item_match( xfs_daddr_t blkno, int len) { - xfs_log_item_chunk_t *licp; - xfs_log_item_desc_t *lidp; - xfs_buf_log_item_t *blip; - int i; + struct xfs_log_item_desc *lidp; + struct xfs_buf_log_item *blip; len = BBTOB(len); - for (licp = &tp->t_items; licp != NULL; licp = licp->lic_next) { - if (xfs_lic_are_all_free(licp)) { - ASSERT(licp == &tp->t_items); - ASSERT(licp->lic_next == NULL); - return NULL; - } - - for (i = 0; i < licp->lic_unused; i++) { - /* - * Skip unoccupied slots. - */ - if (xfs_lic_isfree(licp, i)) - continue; - - lidp = xfs_lic_slot(licp, i); - blip = (xfs_buf_log_item_t *)lidp->lid_item; - if (blip->bli_item.li_type != XFS_LI_BUF) - continue; - - if (XFS_BUF_TARGET(blip->bli_buf) == target && - XFS_BUF_ADDR(blip->bli_buf) == blkno && - XFS_BUF_COUNT(blip->bli_buf) == len) - return blip->bli_buf; - } + list_for_each_entry(lidp, &tp->t_items, lid_trans) { + blip = (struct xfs_buf_log_item *)lidp->lid_item; + if (blip->bli_item.li_type == XFS_LI_BUF && + XFS_BUF_TARGET(blip->bli_buf) == target && + XFS_BUF_ADDR(blip->bli_buf) == blkno && + XFS_BUF_COUNT(blip->bli_buf) == len) + return blip->bli_buf; } return NULL; @@ -127,7 +108,7 @@ _xfs_trans_bjoin( /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t *)bip); + xfs_trans_add_item(tp, &bip->bli_item); /* * Initialize b_fsprivate2 so we can find it with incore_match() @@ -483,7 +464,6 @@ xfs_trans_brelse(xfs_trans_t *tp, { xfs_buf_log_item_t *bip; xfs_log_item_t *lip; - xfs_log_item_desc_t *lidp; /* * Default to a normal brelse() call if the tp is NULL. @@ -514,13 +494,6 @@ xfs_trans_brelse(xfs_trans_t *tp, ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(atomic_read(&bip->bli_refcount) > 0); - /* - * Find the item descriptor pointing to this buffer's - * log item. It must be there. - */ - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); - ASSERT(lidp != NULL); - trace_xfs_trans_brelse(bip); /* @@ -536,7 +509,7 @@ xfs_trans_brelse(xfs_trans_t *tp, * If the buffer is dirty within this transaction, we can't * release it until we commit. */ - if (lidp->lid_flags & XFS_LID_DIRTY) + if (bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY) return; /* @@ -553,7 +526,7 @@ xfs_trans_brelse(xfs_trans_t *tp, /* * Free up the log item descriptor tracking the released item. */ - xfs_trans_free_item(tp, lidp); + xfs_trans_del_item(&bip->bli_item); /* * Clear the hold flag in the buf log item if it is set. @@ -665,7 +638,6 @@ xfs_trans_log_buf(xfs_trans_t *tp, uint last) { xfs_buf_log_item_t *bip; - xfs_log_item_desc_t *lidp; ASSERT(XFS_BUF_ISBUSY(bp)); ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); @@ -707,11 +679,8 @@ xfs_trans_log_buf(xfs_trans_t *tp, bip->bli_format.blf_flags &= ~XFS_BLF_CANCEL; } - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY; bip->bli_flags |= XFS_BLI_LOGGED; xfs_buf_item_log(bip, first, last); } @@ -740,7 +709,6 @@ xfs_trans_binval( xfs_trans_t *tp, xfs_buf_t *bp) { - xfs_log_item_desc_t *lidp; xfs_buf_log_item_t *bip; ASSERT(XFS_BUF_ISBUSY(bp)); @@ -748,8 +716,6 @@ xfs_trans_binval( ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); - ASSERT(lidp != NULL); ASSERT(atomic_read(&bip->bli_refcount) > 0); trace_xfs_trans_binval(bip); @@ -764,7 +730,7 @@ xfs_trans_binval( ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_INODE_BUF)); ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); - ASSERT(lidp->lid_flags & XFS_LID_DIRTY); + ASSERT(bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY); ASSERT(tp->t_flags & XFS_TRANS_DIRTY); return; } @@ -797,7 +763,7 @@ xfs_trans_binval( bip->bli_format.blf_flags |= XFS_BLF_CANCEL; memset((char *)(bip->bli_format.blf_data_map), 0, (bip->bli_format.blf_map_size * sizeof(uint))); - lidp->lid_flags |= XFS_LID_DIRTY; + bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY; tp->t_flags |= XFS_TRANS_DIRTY; } Index: xfs/fs/xfs/xfs_trans_extfree.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_extfree.c 2010-05-10 18:54:16.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_extfree.c 2010-05-18 13:33:36.917261293 +0200 @@ -49,9 +49,8 @@ xfs_trans_get_efi(xfs_trans_t *tp, /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)efip); - - return (efip); + xfs_trans_add_item(tp, &efip->efi_item); + return efip; } /* @@ -65,15 +64,11 @@ xfs_trans_log_efi_extent(xfs_trans_t *t xfs_fsblock_t start_block, xfs_extlen_t ext_len) { - xfs_log_item_desc_t *lidp; uint next_extent; xfs_extent_t *extp; - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)efip); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + efip->efi_item.li_desc->lid_flags |= XFS_LID_DIRTY; next_extent = efip->efi_next_extent; ASSERT(next_extent < efip->efi_format.efi_nextents); @@ -106,9 +101,8 @@ xfs_trans_get_efd(xfs_trans_t *tp, /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)efdp); - - return (efdp); + xfs_trans_add_item(tp, &efdp->efd_item); + return efdp; } /* @@ -122,15 +116,11 @@ xfs_trans_log_efd_extent(xfs_trans_t *t xfs_fsblock_t start_block, xfs_extlen_t ext_len) { - xfs_log_item_desc_t *lidp; uint next_extent; xfs_extent_t *extp; - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)efdp); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + efdp->efd_item.li_desc->lid_flags |= XFS_LID_DIRTY; next_extent = efdp->efd_next_extent; ASSERT(next_extent < efdp->efd_format.efd_nextents); Index: xfs/fs/xfs/xfs_trans_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_inode.c 2010-05-10 18:54:16.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_inode.c 2010-05-18 13:33:36.922253890 +0200 @@ -93,7 +93,7 @@ xfs_trans_ijoin( /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)(iip)); + xfs_trans_add_item(tp, &iip->ili_item); xfs_trans_inode_broot_debug(ip); @@ -149,17 +149,12 @@ xfs_trans_log_inode( xfs_inode_t *ip, uint flags) { - xfs_log_item_desc_t *lidp; - ASSERT(ip->i_transp == tp); ASSERT(ip->i_itemp != NULL); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)(ip->i_itemp)); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + ip->i_itemp->ili_item.li_desc->lid_flags |= XFS_LID_DIRTY; /* * Always OR in the bits from the ili_last_fields field. Index: xfs/fs/xfs/xfs_trans_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_item.c 2010-05-18 13:05:04.000000000 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,441 +0,0 @@ -/* - * Copyright (c) 2000-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_log.h" -#include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h" -/* XXX: from here down needed until struct xfs_trans has its own ailp */ -#include "xfs_bit.h" -#include "xfs_buf_item.h" -#include "xfs_sb.h" -#include "xfs_ag.h" -#include "xfs_dir2.h" -#include "xfs_dmapi.h" -#include "xfs_mount.h" - -STATIC int xfs_trans_unlock_chunk(xfs_log_item_chunk_t *, - int, int, xfs_lsn_t); - -/* - * This is called to add the given log item to the transaction's - * list of log items. It must find a free log item descriptor - * or allocate a new one and add the item to that descriptor. - * The function returns a pointer to item descriptor used to point - * to the new item. The log item will now point to its new descriptor - * with its li_desc field. - */ -xfs_log_item_desc_t * -xfs_trans_add_item(xfs_trans_t *tp, xfs_log_item_t *lip) -{ - xfs_log_item_desc_t *lidp; - xfs_log_item_chunk_t *licp; - int i=0; - - /* - * If there are no free descriptors, allocate a new chunk - * of them and put it at the front of the chunk list. - */ - if (tp->t_items_free == 0) { - licp = (xfs_log_item_chunk_t*) - kmem_alloc(sizeof(xfs_log_item_chunk_t), KM_SLEEP); - ASSERT(licp != NULL); - /* - * Initialize the chunk, and then - * claim the first slot in the newly allocated chunk. - */ - xfs_lic_init(licp); - xfs_lic_claim(licp, 0); - licp->lic_unused = 1; - xfs_lic_init_slot(licp, 0); - lidp = xfs_lic_slot(licp, 0); - - /* - * Link in the new chunk and update the free count. - */ - licp->lic_next = tp->t_items.lic_next; - tp->t_items.lic_next = licp; - tp->t_items_free = XFS_LIC_NUM_SLOTS - 1; - - /* - * Initialize the descriptor and the generic portion - * of the log item. - * - * Point the new slot at this item and return it. - * Also point the log item at its currently active - * descriptor and set the item's mount pointer. - */ - lidp->lid_item = lip; - lidp->lid_flags = 0; - lidp->lid_size = 0; - lip->li_desc = lidp; - lip->li_mountp = tp->t_mountp; - lip->li_ailp = tp->t_mountp->m_ail; - return lidp; - } - - /* - * Find the free descriptor. It is somewhere in the chunklist - * of descriptors. - */ - licp = &tp->t_items; - while (licp != NULL) { - if (xfs_lic_vacancy(licp)) { - if (licp->lic_unused <= XFS_LIC_MAX_SLOT) { - i = licp->lic_unused; - ASSERT(xfs_lic_isfree(licp, i)); - break; - } - for (i = 0; i <= XFS_LIC_MAX_SLOT; i++) { - if (xfs_lic_isfree(licp, i)) - break; - } - ASSERT(i <= XFS_LIC_MAX_SLOT); - break; - } - licp = licp->lic_next; - } - ASSERT(licp != NULL); - /* - * If we find a free descriptor, claim it, - * initialize it, and return it. - */ - xfs_lic_claim(licp, i); - if (licp->lic_unused <= i) { - licp->lic_unused = i + 1; - xfs_lic_init_slot(licp, i); - } - lidp = xfs_lic_slot(licp, i); - tp->t_items_free--; - lidp->lid_item = lip; - lidp->lid_flags = 0; - lidp->lid_size = 0; - lip->li_desc = lidp; - lip->li_mountp = tp->t_mountp; - lip->li_ailp = tp->t_mountp->m_ail; - return lidp; -} - -/* - * Free the given descriptor. - * - * This requires setting the bit in the chunk's free mask corresponding - * to the given slot. - */ -void -xfs_trans_free_item(xfs_trans_t *tp, xfs_log_item_desc_t *lidp) -{ - uint slot; - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t **licpp; - - slot = xfs_lic_desc_to_slot(lidp); - licp = xfs_lic_desc_to_chunk(lidp); - xfs_lic_relse(licp, slot); - lidp->lid_item->li_desc = NULL; - tp->t_items_free++; - - /* - * If there are no more used items in the chunk and this is not - * the chunk embedded in the transaction structure, then free - * the chunk. First pull it from the chunk list and then - * free it back to the heap. We didn't bother with a doubly - * linked list here because the lists should be very short - * and this is not a performance path. It's better to save - * the memory of the extra pointer. - * - * Also decrement the transaction structure's count of free items - * by the number in a chunk since we are freeing an empty chunk. - */ - if (xfs_lic_are_all_free(licp) && (licp != &(tp->t_items))) { - licpp = &(tp->t_items.lic_next); - while (*licpp != licp) { - ASSERT(*licpp != NULL); - licpp = &((*licpp)->lic_next); - } - *licpp = licp->lic_next; - kmem_free(licp); - tp->t_items_free -= XFS_LIC_NUM_SLOTS; - } -} - -/* - * This is called to find the descriptor corresponding to the given - * log item. It returns a pointer to the descriptor. - * The log item MUST have a corresponding descriptor in the given - * transaction. This routine does not return NULL, it panics. - * - * The descriptor pointer is kept in the log item's li_desc field. - * Just return it. - */ -/*ARGSUSED*/ -xfs_log_item_desc_t * -xfs_trans_find_item(xfs_trans_t *tp, xfs_log_item_t *lip) -{ - ASSERT(lip->li_desc != NULL); - - return lip->li_desc; -} - - -/* - * Return a pointer to the first descriptor in the chunk list. - * This does not return NULL if there are none, it panics. - * - * The first descriptor must be in either the first or second chunk. - * This is because the only chunk allowed to be empty is the first. - * All others are freed when they become empty. - * - * At some point this and xfs_trans_next_item() should be optimized - * to quickly look at the mask to determine if there is anything to - * look at. - */ -xfs_log_item_desc_t * -xfs_trans_first_item(xfs_trans_t *tp) -{ - xfs_log_item_chunk_t *licp; - int i; - - licp = &tp->t_items; - /* - * If it's not in the first chunk, skip to the second. - */ - if (xfs_lic_are_all_free(licp)) { - licp = licp->lic_next; - } - - /* - * Return the first non-free descriptor in the chunk. - */ - ASSERT(!xfs_lic_are_all_free(licp)); - for (i = 0; i < licp->lic_unused; i++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - - return xfs_lic_slot(licp, i); - } - cmn_err(CE_WARN, "xfs_trans_first_item() -- no first item"); - return NULL; -} - - -/* - * Given a descriptor, return the next descriptor in the chunk list. - * This returns NULL if there are no more used descriptors in the list. - * - * We do this by first locating the chunk in which the descriptor resides, - * and then scanning forward in the chunk and the list for the next - * used descriptor. - */ -/*ARGSUSED*/ -xfs_log_item_desc_t * -xfs_trans_next_item(xfs_trans_t *tp, xfs_log_item_desc_t *lidp) -{ - xfs_log_item_chunk_t *licp; - int i; - - licp = xfs_lic_desc_to_chunk(lidp); - - /* - * First search the rest of the chunk. The for loop keeps us - * from referencing things beyond the end of the chunk. - */ - for (i = (int)xfs_lic_desc_to_slot(lidp) + 1; i < licp->lic_unused; i++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - - return xfs_lic_slot(licp, i); - } - - /* - * Now search the next chunk. It must be there, because the - * next chunk would have been freed if it were empty. - * If there is no next chunk, return NULL. - */ - if (licp->lic_next == NULL) { - return NULL; - } - - licp = licp->lic_next; - ASSERT(!xfs_lic_are_all_free(licp)); - for (i = 0; i < licp->lic_unused; i++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - - return xfs_lic_slot(licp, i); - } - ASSERT(0); - /* NOTREACHED */ - return NULL; /* keep gcc quite */ -} - -/* - * This is called to unlock all of the items of a transaction and to free - * all the descriptors of that transaction. - * - * It walks the list of descriptors and unlocks each item. It frees - * each chunk except that embedded in the transaction as it goes along. - */ -void -xfs_trans_free_items( - xfs_trans_t *tp, - xfs_lsn_t commit_lsn, - int flags) -{ - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t *next_licp; - int abort; - - abort = flags & XFS_TRANS_ABORT; - licp = &tp->t_items; - /* - * Special case the embedded chunk so we don't free it below. - */ - if (!xfs_lic_are_all_free(licp)) { - (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn); - xfs_lic_all_free(licp); - licp->lic_unused = 0; - } - licp = licp->lic_next; - - /* - * Unlock each item in each chunk and free the chunks. - */ - while (licp != NULL) { - ASSERT(!xfs_lic_are_all_free(licp)); - (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn); - next_licp = licp->lic_next; - kmem_free(licp); - licp = next_licp; - } - - /* - * Reset the transaction structure's free item count. - */ - tp->t_items_free = XFS_LIC_NUM_SLOTS; - tp->t_items.lic_next = NULL; -} - - - -/* - * This is called to unlock the items associated with a transaction. - * Items which were not logged should be freed. - * Those which were logged must still be tracked so they can be unpinned - * when the transaction commits. - */ -void -xfs_trans_unlock_items(xfs_trans_t *tp, xfs_lsn_t commit_lsn) -{ - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t *next_licp; - xfs_log_item_chunk_t **licpp; - int freed; - - freed = 0; - licp = &tp->t_items; - - /* - * Special case the embedded chunk so we don't free. - */ - if (!xfs_lic_are_all_free(licp)) { - freed = xfs_trans_unlock_chunk(licp, 0, 0, commit_lsn); - } - licpp = &(tp->t_items.lic_next); - licp = licp->lic_next; - - /* - * Unlock each item in each chunk, free non-dirty descriptors, - * and free empty chunks. - */ - while (licp != NULL) { - ASSERT(!xfs_lic_are_all_free(licp)); - freed += xfs_trans_unlock_chunk(licp, 0, 0, commit_lsn); - next_licp = licp->lic_next; - if (xfs_lic_are_all_free(licp)) { - *licpp = next_licp; - kmem_free(licp); - freed -= XFS_LIC_NUM_SLOTS; - } else { - licpp = &(licp->lic_next); - } - ASSERT(*licpp == next_licp); - licp = next_licp; - } - - /* - * Fix the free descriptor count in the transaction. - */ - tp->t_items_free += freed; -} - -/* - * Unlock each item pointed to by a descriptor in the given chunk. - * Stamp the commit lsn into each item if necessary. - * Free descriptors pointing to items which are not dirty if freeing_chunk - * is zero. If freeing_chunk is non-zero, then we need to unlock all - * items in the chunk. - * - * Return the number of descriptors freed. - */ -STATIC int -xfs_trans_unlock_chunk( - xfs_log_item_chunk_t *licp, - int freeing_chunk, - int abort, - xfs_lsn_t commit_lsn) -{ - xfs_log_item_desc_t *lidp; - xfs_log_item_t *lip; - int i; - int freed; - - freed = 0; - lidp = licp->lic_descs; - for (i = 0; i < licp->lic_unused; i++, lidp++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - lip = lidp->lid_item; - lip->li_desc = NULL; - - if (commit_lsn != NULLCOMMITLSN) - IOP_COMMITTING(lip, commit_lsn); - if (abort) - lip->li_flags |= XFS_LI_ABORTED; - IOP_UNLOCK(lip); - - /* - * Free the descriptor if the item is not dirty - * within this transaction and the caller is not - * going to just free the entire thing regardless. - */ - if (!(freeing_chunk) && - (!(lidp->lid_flags & XFS_LID_DIRTY) || abort)) { - xfs_lic_relse(licp, i); - freed++; - } - } - - return freed; -} Index: xfs/fs/xfs/xfs_trans_priv.h =================================================================== --- xfs.orig/fs/xfs/xfs_trans_priv.h 2010-05-18 13:05:04.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_priv.h 2010-05-19 09:45:07.901285597 +0200 @@ -23,22 +23,8 @@ struct xfs_log_item_desc; struct xfs_mount; struct xfs_trans; -/* - * From xfs_trans_item.c - */ -struct xfs_log_item_desc *xfs_trans_add_item(struct xfs_trans *, - struct xfs_log_item *); -void xfs_trans_free_item(struct xfs_trans *, - struct xfs_log_item_desc *); -struct xfs_log_item_desc *xfs_trans_find_item(struct xfs_trans *, - struct xfs_log_item *); -struct xfs_log_item_desc *xfs_trans_first_item(struct xfs_trans *); -struct xfs_log_item_desc *xfs_trans_next_item(struct xfs_trans *, - struct xfs_log_item_desc *); - -void xfs_trans_unlock_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn); -void xfs_trans_free_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn, - int flags); +void xfs_trans_add_item(struct xfs_trans *, struct xfs_log_item *); +void xfs_trans_del_item(struct xfs_log_item *); void xfs_trans_item_committed(struct xfs_log_item *lip, xfs_lsn_t commit_lsn, int aborted); Index: xfs/fs/xfs/Makefile =================================================================== --- xfs.orig/fs/xfs/Makefile 2010-05-18 13:05:04.000000000 +0200 +++ xfs/fs/xfs/Makefile 2010-05-18 13:33:36.930274843 +0200 @@ -87,7 +87,6 @@ xfs-y += xfs_alloc.o \ xfs_trans_buf.o \ xfs_trans_extfree.o \ xfs_trans_inode.o \ - xfs_trans_item.o \ xfs_utils.o \ xfs_vnodeops.o \ xfs_rw.o \ Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2010-05-18 13:05:04.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-05-18 13:33:36.936142841 +0200 @@ -1757,6 +1757,12 @@ xfs_init_zones(void) if (!xfs_trans_zone) goto out_destroy_ifork_zone; + xfs_log_item_desc_zone = + kmem_zone_init(sizeof(struct xfs_log_item_desc), + "xfs_log_item_desc"); + if (!xfs_log_item_desc_zone) + goto out_destroy_trans_zone; + /* * The size of the zone allocated buf log item is the maximum * size possible under XFS. This wastes a little bit of memory, @@ -1766,7 +1772,7 @@ xfs_init_zones(void) (((XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK) / NBWORD) * sizeof(int))), "xfs_buf_item"); if (!xfs_buf_item_zone) - goto out_destroy_trans_zone; + goto out_destroy_log_item_desc_zone; xfs_efd_zone = kmem_zone_init((sizeof(xfs_efd_log_item_t) + ((XFS_EFD_MAX_FAST_EXTENTS - 1) * @@ -1803,6 +1809,8 @@ xfs_init_zones(void) kmem_zone_destroy(xfs_efd_zone); out_destroy_buf_item_zone: kmem_zone_destroy(xfs_buf_item_zone); + out_destroy_log_item_desc_zone: + kmem_zone_destroy(xfs_log_item_desc_zone); out_destroy_trans_zone: kmem_zone_destroy(xfs_trans_zone); out_destroy_ifork_zone: @@ -1833,6 +1841,7 @@ xfs_destroy_zones(void) kmem_zone_destroy(xfs_efi_zone); kmem_zone_destroy(xfs_efd_zone); kmem_zone_destroy(xfs_buf_item_zone); + kmem_zone_destroy(xfs_log_item_desc_zone); kmem_zone_destroy(xfs_trans_zone); kmem_zone_destroy(xfs_ifork_zone); kmem_zone_destroy(xfs_dabuf_zone); Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-05-10 18:54:16.000000000 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2010-05-18 13:33:36.941004135 +0200 @@ -5882,43 +5882,18 @@ xfs_bmap_get_bp( bp = NULL; if (!bp) { /* Chase down all the log items to see if the bp is there */ - xfs_log_item_chunk_t *licp; - xfs_trans_t *tp; + struct xfs_log_item_desc *lidp; + struct xfs_buf_log_item *bip; - tp = cur->bc_tp; - licp = &tp->t_items; - while (!bp && licp != NULL) { - if (xfs_lic_are_all_free(licp)) { - licp = licp->lic_next; - continue; - } - for (i = 0; i < licp->lic_unused; i++) { - xfs_log_item_desc_t *lidp; - xfs_log_item_t *lip; - xfs_buf_log_item_t *bip; - xfs_buf_t *lbp; - - if (xfs_lic_isfree(licp, i)) { - continue; - } - - lidp = xfs_lic_slot(licp, i); - lip = lidp->lid_item; - if (lip->li_type != XFS_LI_BUF) - continue; - - bip = (xfs_buf_log_item_t *)lip; - lbp = bip->bli_buf; - - if (XFS_BUF_ADDR(lbp) == bno) { - bp = lbp; - break; /* Found it */ - } - } - licp = licp->lic_next; + list_for_each_entry(lidp, &cur->bc_tp->t_items, lid_trans) { + bip = (struct xfs_buf_log_item *)lidp->lid_item; + if (bip->bli_item.li_type == XFS_LI_BUF && + XFS_BUF_ADDR(bip->bli_buf) == bno) + return bip->bli_buf; } } - return(bp); + + return bp; } STATIC void Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-18 13:33:23.000000000 +0200 +++ xfs/fs/xfs/xfs_trans.c 2010-05-19 09:45:42.469005392 +0200 @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (C) 2010 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -47,6 +48,7 @@ #include "xfs_trace.h" kmem_zone_t *xfs_trans_zone; +kmem_zone_t *xfs_log_item_desc_zone; /* @@ -597,8 +599,7 @@ _xfs_trans_alloc( tp->t_magic = XFS_TRANS_MAGIC; tp->t_type = type; tp->t_mountp = mp; - tp->t_items_free = XFS_LIC_NUM_SLOTS; - xfs_lic_init(&(tp->t_items)); + INIT_LIST_HEAD(&tp->t_items); INIT_LIST_HEAD(&tp->t_busy); return tp; } @@ -643,8 +644,7 @@ xfs_trans_dup( ntp->t_magic = XFS_TRANS_MAGIC; ntp->t_type = tp->t_type; ntp->t_mountp = tp->t_mountp; - ntp->t_items_free = XFS_LIC_NUM_SLOTS; - xfs_lic_init(&(ntp->t_items)); + INIT_LIST_HEAD(&ntp->t_items); INIT_LIST_HEAD(&ntp->t_busy); ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); @@ -1124,6 +1124,108 @@ xfs_trans_unreserve_and_mod_sb( } /* + * Add the given log item to the transaction's list of log items. + * + * The log item will now point to its new descriptor with its li_desc field. + */ +void +xfs_trans_add_item( + struct xfs_trans *tp, + struct xfs_log_item *lip) +{ + struct xfs_log_item_desc *lidp; + + ASSERT(lip->li_mountp = tp->t_mountp); + ASSERT(lip->li_ailp = tp->t_mountp->m_ail); + + lidp = kmem_zone_zalloc(xfs_log_item_desc_zone, KM_SLEEP); + + lidp->lid_item = lip; + lidp->lid_flags = 0; + lidp->lid_size = 0; + list_add_tail(&lidp->lid_trans, &tp->t_items); + + lip->li_desc = lidp; +} + +STATIC void +xfs_trans_free_item_desc( + struct xfs_log_item_desc *lidp) +{ + list_del_init(&lidp->lid_trans); + kmem_zone_free(xfs_log_item_desc_zone, lidp); +} + +/* + * Unlink and free the given descriptor. + */ +void +xfs_trans_del_item( + struct xfs_log_item *lip) +{ + xfs_trans_free_item_desc(lip->li_desc); + lip->li_desc = NULL; +} + +/* + * Unlock all of the items of a transaction and free all the descriptors + * of that transaction. + */ +STATIC void +xfs_trans_free_items( + struct xfs_trans *tp, + xfs_lsn_t commit_lsn, + int flags) +{ + struct xfs_log_item_desc *lidp, *next; + + list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) { + struct xfs_log_item *lip = lidp->lid_item; + + lip->li_desc = NULL; + + if (commit_lsn != NULLCOMMITLSN) + IOP_COMMITTING(lip, commit_lsn); + if (flags & XFS_TRANS_ABORT) + lip->li_flags |= XFS_LI_ABORTED; + IOP_UNLOCK(lip); + + xfs_trans_free_item_desc(lidp); + } +} + +/* + * Unlock the items associated with a transaction. + * + * Items which were not logged should be freed. Those which were logged must + * still be tracked so they can be unpinned when the transaction commits. + */ +STATIC void +xfs_trans_unlock_items( + struct xfs_trans *tp, + xfs_lsn_t commit_lsn) +{ + struct xfs_log_item_desc *lidp, *next; + + list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) { + struct xfs_log_item *lip = lidp->lid_item; + + lip->li_desc = NULL; + + if (commit_lsn != NULLCOMMITLSN) + IOP_COMMITTING(lip, commit_lsn); + IOP_UNLOCK(lip); + + /* + * Free the descriptor if the item is not dirty + * within this transaction. + */ + if (!(lidp->lid_flags & XFS_LID_DIRTY)) + xfs_trans_free_item_desc(lidp); + } +} + +/* * Total up the number of log iovecs needed to commit this * transaction. The transaction itself needs one for the * transaction header. Ask each dirty item in turn how many @@ -1134,30 +1236,27 @@ xfs_trans_count_vecs( struct xfs_trans *tp) { int nvecs; - xfs_log_item_desc_t *lidp; + struct xfs_log_item_desc *lidp; nvecs = 1; - lidp = xfs_trans_first_item(tp); - ASSERT(lidp != NULL); /* In the non-debug case we need to start bailing out if we * didn't find a log_item here, return zero and let trans_commit * deal with it. */ - if (lidp == NULL) + if (list_empty(&tp->t_items)) { + ASSERT(0); return 0; + } - while (lidp != NULL) { + list_for_each_entry(lidp, &tp->t_items, lid_trans) { /* * Skip items which aren't dirty in this transaction. */ - if (!(lidp->lid_flags & XFS_LID_DIRTY)) { - lidp = xfs_trans_next_item(tp, lidp); + if (!(lidp->lid_flags & XFS_LID_DIRTY)) continue; - } lidp->lid_size = IOP_SIZE(lidp->lid_item); nvecs += lidp->lid_size; - lidp = xfs_trans_next_item(tp, lidp); } return nvecs; @@ -1177,7 +1276,7 @@ xfs_trans_fill_vecs( struct xfs_trans *tp, struct xfs_log_iovec *log_vector) { - xfs_log_item_desc_t *lidp; + struct xfs_log_item_desc *lidp; struct xfs_log_iovec *vecp; uint nitems; @@ -1188,14 +1287,11 @@ xfs_trans_fill_vecs( vecp = log_vector + 1; nitems = 0; - lidp = xfs_trans_first_item(tp); - ASSERT(lidp); - while (lidp) { + ASSERT(!list_empty(&tp->t_items)); + list_for_each_entry(lidp, &tp->t_items, lid_trans) { /* Skip items which aren't dirty in this transaction. */ - if (!(lidp->lid_flags & XFS_LID_DIRTY)) { - lidp = xfs_trans_next_item(tp, lidp); + if (!(lidp->lid_flags & XFS_LID_DIRTY)) continue; - } /* * The item may be marked dirty but not log anything. This can @@ -1206,7 +1302,6 @@ xfs_trans_fill_vecs( IOP_FORMAT(lidp->lid_item, vecp); vecp += lidp->lid_size; IOP_PIN(lidp->lid_item); - lidp = xfs_trans_next_item(tp, lidp); } /* @@ -1301,24 +1396,15 @@ xfs_trans_committed( struct xfs_trans *tp, int abortflag) { - xfs_log_item_desc_t *lidp; - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t *next_licp; + struct xfs_log_item_desc *lidp, *next; /* Call the transaction's completion callback if there is one. */ if (tp->t_callback != NULL) tp->t_callback(tp, tp->t_callarg); - for (lidp = xfs_trans_first_item(tp); - lidp != NULL; - lidp = xfs_trans_next_item(tp, lidp)) { + list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) { xfs_trans_item_committed(lidp->lid_item, tp->t_lsn, abortflag); - } - - /* free the item chunks, ignoring the embedded chunk */ - for (licp = tp->t_items.lic_next; licp != NULL; licp = next_licp) { - next_licp = licp->lic_next; - kmem_free(licp); + xfs_trans_free_item_desc(lidp); } xfs_trans_free(tp); @@ -1333,11 +1419,9 @@ xfs_trans_uncommit( struct xfs_trans *tp, uint flags) { - xfs_log_item_desc_t *lidp; + struct xfs_log_item_desc *lidp; - for (lidp = xfs_trans_first_item(tp); - lidp != NULL; - lidp = xfs_trans_next_item(tp, lidp)) { + list_for_each_entry(lidp, &tp->t_items, lid_trans) { /* * Unpin all but those that aren't dirty. */ @@ -1508,33 +1592,28 @@ STATIC struct xfs_log_vec * xfs_trans_alloc_log_vecs( xfs_trans_t *tp) { - xfs_log_item_desc_t *lidp; + struct xfs_log_item_desc *lidp; struct xfs_log_vec *lv = NULL; struct xfs_log_vec *ret_lv = NULL; - lidp = xfs_trans_first_item(tp); /* Bail out if we didn't find a log item. */ - if (!lidp) { + if (list_empty(&tp->t_items)) { ASSERT(0); return NULL; } - while (lidp != NULL) { + list_for_each_entry(lidp, &tp->t_items, lid_trans) { struct xfs_log_vec *new_lv; /* Skip items which aren't dirty in this transaction. */ - if (!(lidp->lid_flags & XFS_LID_DIRTY)) { - lidp = xfs_trans_next_item(tp, lidp); + if (!(lidp->lid_flags & XFS_LID_DIRTY)) continue; - } /* Skip items that do not have any vectors for writing */ lidp->lid_size = IOP_SIZE(lidp->lid_item); - if (!lidp->lid_size) { - lidp = xfs_trans_next_item(tp, lidp); + if (!lidp->lid_size) continue; - } new_lv = kmem_zalloc(sizeof(*new_lv) + lidp->lid_size * sizeof(struct xfs_log_iovec), @@ -1549,7 +1628,6 @@ xfs_trans_alloc_log_vecs( else lv->lv_next = new_lv; lv = new_lv; - lidp = xfs_trans_next_item(tp, lidp); } return ret_lv; @@ -1708,12 +1786,6 @@ xfs_trans_cancel( int flags) { int log_flags; -#ifdef DEBUG - xfs_log_item_chunk_t *licp; - xfs_log_item_desc_t *lidp; - xfs_log_item_t *lip; - int i; -#endif xfs_mount_t *mp = tp->t_mountp; /* @@ -1732,21 +1804,11 @@ xfs_trans_cancel( xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); } #ifdef DEBUG - if (!(flags & XFS_TRANS_ABORT)) { - licp = &(tp->t_items); - while (licp != NULL) { - lidp = licp->lic_descs; - for (i = 0; i < licp->lic_unused; i++, lidp++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - - lip = lidp->lid_item; - if (!XFS_FORCED_SHUTDOWN(mp)) - ASSERT(!(lip->li_type == XFS_LI_EFD)); - } - licp = licp->lic_next; - } + if (!(flags & XFS_TRANS_ABORT) && !XFS_FORCED_SHUTDOWN(mp)) { + struct xfs_log_item_desc *lidp; + + list_for_each_entry(lidp, &tp->t_items, lid_trans) + ASSERT(!(lidp->lid_item->li_type == XFS_LI_EFD)); } #endif xfs_trans_unreserve_and_mod_sb(tp); Index: xfs/fs/xfs/xfs_trans.h =================================================================== --- xfs.orig/fs/xfs/xfs_trans.h 2010-05-18 13:33:23.000000000 +0200 +++ xfs/fs/xfs/xfs_trans.h 2010-05-18 13:33:36.962253471 +0200 @@ -161,105 +161,14 @@ typedef struct xfs_trans_header { * the amount of space needed to log the item it describes * once we get to commit processing (see xfs_trans_commit()). */ -typedef struct xfs_log_item_desc { +struct xfs_log_item_desc { struct xfs_log_item *lid_item; - ushort lid_size; - unsigned char lid_flags; - unsigned char lid_index; -} xfs_log_item_desc_t; + ushort lid_size; + unsigned char lid_flags; + struct list_head lid_trans; +}; #define XFS_LID_DIRTY 0x1 -#define XFS_LID_PINNED 0x2 - -/* - * This structure is used to maintain a chunk list of log_item_desc - * structures. The free field is a bitmask indicating which descriptors - * in this chunk's array are free. The unused field is the first value - * not used since this chunk was allocated. - */ -#define XFS_LIC_NUM_SLOTS 15 -typedef struct xfs_log_item_chunk { - struct xfs_log_item_chunk *lic_next; - ushort lic_free; - ushort lic_unused; - xfs_log_item_desc_t lic_descs[XFS_LIC_NUM_SLOTS]; -} xfs_log_item_chunk_t; - -#define XFS_LIC_MAX_SLOT (XFS_LIC_NUM_SLOTS - 1) -#define XFS_LIC_FREEMASK ((1 << XFS_LIC_NUM_SLOTS) - 1) - - -/* - * Initialize the given chunk. Set the chunk's free descriptor mask - * to indicate that all descriptors are free. The caller gets to set - * lic_unused to the right value (0 matches all free). The - * lic_descs.lid_index values are set up as each desc is allocated. - */ -static inline void xfs_lic_init(xfs_log_item_chunk_t *cp) -{ - cp->lic_free = XFS_LIC_FREEMASK; -} - -static inline void xfs_lic_init_slot(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_descs[slot].lid_index = (unsigned char)(slot); -} - -static inline int xfs_lic_vacancy(xfs_log_item_chunk_t *cp) -{ - return cp->lic_free & XFS_LIC_FREEMASK; -} - -static inline void xfs_lic_all_free(xfs_log_item_chunk_t *cp) -{ - cp->lic_free = XFS_LIC_FREEMASK; -} - -static inline int xfs_lic_are_all_free(xfs_log_item_chunk_t *cp) -{ - return ((cp->lic_free & XFS_LIC_FREEMASK) == XFS_LIC_FREEMASK); -} - -static inline int xfs_lic_isfree(xfs_log_item_chunk_t *cp, int slot) -{ - return (cp->lic_free & (1 << slot)); -} - -static inline void xfs_lic_claim(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_free &= ~(1 << slot); -} - -static inline void xfs_lic_relse(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_free |= 1 << slot; -} - -static inline xfs_log_item_desc_t * -xfs_lic_slot(xfs_log_item_chunk_t *cp, int slot) -{ - return &(cp->lic_descs[slot]); -} - -static inline int xfs_lic_desc_to_slot(xfs_log_item_desc_t *dp) -{ - return (uint)dp->lid_index; -} - -/* - * Calculate the address of a chunk given a descriptor pointer: - * dp - dp->lid_index give the address of the start of the lic_descs array. - * From this we subtract the offset of the lic_descs field in a chunk. - * All of this yields the address of the chunk, which is - * cast to a chunk pointer. - */ -static inline xfs_log_item_chunk_t * -xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp) -{ - return (xfs_log_item_chunk_t*) \ - (((xfs_caddr_t)((dp) - (dp)->lid_index)) - \ - (xfs_caddr_t)(((xfs_log_item_chunk_t*)0)->lic_descs)); -} #define XFS_TRANS_MAGIC 0x5452414E /* 'TRAN' */ /* @@ -516,8 +425,7 @@ typedef struct xfs_trans { int64_t t_rblocks_delta;/* superblock rblocks change */ int64_t t_rextents_delta;/* superblocks rextents chg */ int64_t t_rextslog_delta;/* superblocks rextslog chg */ - unsigned int t_items_free; /* log item descs free */ - xfs_log_item_chunk_t t_items; /* first log item desc chunk */ + struct list_head t_items; /* log item descriptors */ xfs_trans_header_t t_header; /* header for in-log trans */ struct list_head t_busy; /* list of busy extents */ unsigned long t_pflags; /* saved process flags state */ @@ -595,6 +503,7 @@ int xfs_trans_ail_init(struct xfs_mount void xfs_trans_ail_destroy(struct xfs_mount *); extern kmem_zone_t *xfs_trans_zone; +extern kmem_zone_t *xfs_log_item_desc_zone; #endif /* __KERNEL__ */ From michael.monnerie@is.it-management.at Wed May 19 06:02:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JB2RFe123783 for ; Wed, 19 May 2010 06:02:28 -0500 X-ASG-Debug-ID: 1274267084-115401c50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 110A235994F for ; Wed, 19 May 2010 04:04:44 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id EV84sd4SCl6yMaXs for ; Wed, 19 May 2010 04:04:44 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id F3A05800184; Wed, 19 May 2010 13:04:42 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id B254283C804; Wed, 19 May 2010 13:04:42 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: rsync from xfs to nfs+xfs and ACL problems Subject: Re: rsync from xfs to nfs+xfs and ACL problems Date: Wed, 19 May 2010 13:04:37 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) Cc: Dave Chinner References: <201005181350.15308@zmi.at> <20100518123304.GH2150@dastard> In-Reply-To: <20100518123304.GH2150@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1795516.piKT4rThn2"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005191304.42314@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1274267085 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.2, rules version 3.2.2.30246 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1795516.piKT4rThn2 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Dienstag, 18. Mai 2010 Dave Chinner wrote: > NFSv3 doesn't support ACLs, IIRC. Thank you for the hint. I remounted with nfs4 now: type nfs4 (rw,noatime,nodiratime,rsize=3D65536,wsize=3D65536,tcp,intr,acl) And now I get this on "rsync -aPvHAX": rsync: chown "somedir/Cen731n.afm" failed: Invalid argument (22) rsync: chown "somedir/Teil2" failed: Invalid argument (22) rsync: rsync_xal_set:=20 lsetxattr("somedir/Teil2/IMAGE.CCD","trusted.SGI_ACL_FILE") failed:=20 Operation not supported (95) I changed again and defined an rsync module on the target, making a=20 direct rsync and no more shown errors. Still, what is causing the tons=20 of errors when rsyncing to nfs+xfs, no matter if nfs3 or nfs4? I looked=20 manually at some files and it seems everything was copied well, despite=20 the errors. Could inode64 be a problem here? =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart1795516.piKT4rThn2 Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkvzxcoACgkQzhSR9xwSCbQJ2QCgykEjbJPDt7dHhvwY9HmcwHQy Az8An3PiSjCv/Qq7L+qNo46cfwwg87Jp =rQQD -----END PGP SIGNATURE----- --nextPart1795516.piKT4rThn2-- From BATV+3478df1fd675c5a5ef2d+2460+infradead.org+hch@bombadil.srs.infradead.org Wed May 19 06:18:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JBIIBU124660 for ; Wed, 19 May 2010 06:18:18 -0500 X-ASG-Debug-ID: 1274268103-274903b90000-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 87A2A9E5E33 for ; Wed, 19 May 2010 04:21:43 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id iPlDyZxCFjv7oCNY for ; Wed, 19 May 2010 04:21:43 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OEhKE-0008Kd-IX; Wed, 19 May 2010 11:20:34 +0000 Date: Wed, 19 May 2010 07:20:34 -0400 From: Christoph Hellwig To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: rsync from xfs to nfs+xfs and ACL problems Subject: Re: rsync from xfs to nfs+xfs and ACL problems Message-ID: <20100519112034.GA29064@infradead.org> References: <201005181350.15308@zmi.at> <20100518123304.GH2150@dastard> <201005191304.42314@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201005191304.42314@zmi.at> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1274268104 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 19, 2010 at 01:04:37PM +0200, Michael Monnerie wrote: > I changed again and defined an rsync module on the target, making a > direct rsync and no more shown errors. Still, what is causing the tons > of errors when rsyncing to nfs+xfs, no matter if nfs3 or nfs4? I looked > manually at some files and it seems everything was copied well, despite > the errors. XFS stores ACLs different than other Linux filesystems because it's on-disk compatible to IRIX. While the other filesystems store the ACL in the same format that is used for the user interface XFS stores it in a separate trusted extended attribute. rsync should and traditionally has ignored those attributes, but it seems something in rsync changed recently so that it tries to copy these attributes in the trusted.* namespace, which fails on NFS. From Jabir_M@pmc-sierra.com Wed May 19 06:24:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_LOTS_OF_MONEY autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JBO1Pk124936 for ; Wed, 19 May 2010 06:24:02 -0500 X-ASG-Debug-ID: 1274268377-175902390000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bby1mta02.pmc-sierra.bc.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BF50C1DF30E8 for ; Wed, 19 May 2010 04:26:17 -0700 (PDT) Received: from bby1mta02.pmc-sierra.bc.ca (bby1mta02.pmc-sierra.com [216.241.235.117]) by cuda.sgi.com with ESMTP id m4l5Z2lJDAp8x3uh for ; Wed, 19 May 2010 04:26:17 -0700 (PDT) Received: from bby1mta02.pmc-sierra.bc.ca (localhost.pmc-sierra.bc.ca [127.0.0.1]) by localhost (Postfix) with SMTP id 1B1A98E004E; Wed, 19 May 2010 04:26:16 -0700 (PDT) Received: from bby1exg02.pmc_nt.nt.pmc-sierra.bc.ca (BBY1EXG02.pmc-sierra.bc.ca [216.241.231.167]) by bby1mta02.pmc-sierra.bc.ca (Postfix) with SMTP id 02D868E003C; Wed, 19 May 2010 04:26:16 -0700 (PDT) Received: from BBY1EXM11.pmc_nt.nt.pmc-sierra.bc.ca ([216.241.231.157]) by bby1exg02.pmc_nt.nt.pmc-sierra.bc.ca with Microsoft SMTPSVC(6.0.3790.4675); Wed, 19 May 2010 04:26:16 -0700 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01CAF746.1730419D" X-ASG-Orig-Subj: RE: xfs crash Subject: RE: xfs crash Date: Wed, 19 May 2010 04:26:14 -0700 Message-ID: X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: xfs crash Thread-Index: Acr2T8BveWIHVazPQD6A1jeaDwweaQA9TwV0 References: <20100518060239.GD2150@dastard> From: "Jabir M" To: "Dave Chinner" Cc: X-OriginalArrivalTime: 19 May 2010 11:26:16.0012 (UTC) FILETIME=[184050C0:01CAF746] X-Barracuda-Connect: bby1mta02.pmc-sierra.com[216.241.235.117] X-Barracuda-Start-Time: 1274268377 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.02 X-Barracuda-Spam-Status: No, SCORE=-1.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, BSF_RULE_7582B X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30247 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. ------_=_NextPart_001_01CAF746.1730419D Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable -----Original Message----- From: Dave Chinner [mailto:david@fromorbit.com] Sent: Tue 5/18/2010 11:32 AM To: Jabir M Cc: xfs@oss.sgi.com Subject: Re: xfs crash =20 On Mon, May 17, 2010 at 09:45:23PM -0700, Jabir M wrote: >=20 > Hi all, >=20 > I am using xfs file system on a MIPS based processor having > linux-2.6.24. when executed a script to copy an mp4 file of 1GB > upto 30 instances on back ground. xfs crashed displaying the > following log. Please suggest me a solution. I'd suggest upgrading your kernel to somethign recent - there were lots of fixes between 2.6.24 and 2.6.28 for allocation problems under this sort of workload.... Cheers, Dave. --=20 Dave Chinner david@fromorbit.com Since I am working on an embedded platform it is very hard to ugrade the = whole kernel. Can i modify some files related to xfs from the newer = version? if so which version can i choose? which and all files need to = be modified? Is there any patch available for this issue? Thanks, Jabir ------_=_NextPart_001_01CAF746.1730419D Content-Type: text/plain; name="xfs_error.txt" Content-Transfer-Encoding: base64 Content-Description: xfs_error.txt Content-Disposition: attachment; filename="xfs_error.txt" Q1BVIDEgVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5nIHJlcXVlc3QgYXQgdmlydHVhbCBh ZGRyZXNzIDAwMDAwMDA2LCBlcGMgPT0gODAzMzc1ZTgsIHJhID09IDgwMzM3NWQ0Ck9vcHNbIzFd OgpDcHUgMQokIDAgICA6IDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDI1CiQgNCAg IDogOGYxYzM4M2MgMDAwMDAwMzggMDAwMDAwMzggMDAwMDAwM2IKJCA4ICAgOiAwMDAwMDAwMiAw MDAwMDQwMCAwMDAwMDAwYSAwMDAwMDQwMAokMTIgICA6IDAwMDAwMDAwIDgwNTRjNWMwIDAwMDAx MjNjIDAwMDAwMDAwCiQxNiAgIDogOGYxYzM4M2MgOGQyYzkzNmMgMDAwMDAwMzggMDAwMDAwM2IK JDIwICAgOiA4NzczODAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMAokMjQgICA6IDhmMzli MWQwIDgwMzZjYTY0ICAgICAgICAgICAgICAgICAgCiQyOCAgIDogOGYwZWEwMDAgOGYwZWI0Mjgg OGZiMTg5MDAgODAzMzc1ZDQKSGkgICAgOiAwMDAwMDAwMApMbyAgICA6IDAwMDAxMTA0CmVwYyAg IDogODAzMzc1ZTggeGZzX3RyYW5zX2xvZ19idWYrMHhhMC8weGUwICAgICBOb3QgdGFpbnRlZApy YSAgICA6IDgwMzM3NWQ0IHhmc190cmFuc19sb2dfYnVmKzB4OGMvMHhlMApTdGF0dXM6IDExMDBj MzAzICAgIEtFUk5FTCBFWEwgSUUgCkNhdXNlIDogMDA4MDAwMDgKQmFkVkEgOiAwMDAwMDAwNgpQ cklkICA6IDAwMDE5NTQ4IChNSVBTIDM0SykKTW9kdWxlcyBsaW5rZWQgaW46IGJsb2NrMm10ZApQ cm9jZXNzIGNwIChwaWQ6IDE0MDcsIHRocmVhZGluZm89OGYwZWEwMDAsIHRhc2s9OGY4OWI2NDgp ClN0YWNrIDogMDAwMDAwMDAgMDNhNzBjNzggOGYwY2E0ODAgOGQyYzkzNmMgOGYwMTc0MDAgOGQy YzkzNmMgOGYzMzYyMDAgMDAwMDAwMDEKICAgICAgICA4ZjA4ZWU5OCA4MDJlMjg1OCAwMDAwMDAw OCAwMDAxNDAwNSA4ZjMzNjJjMCA4ZjMzNjJjMCA4ZjBlYjQ2OCA4ZjBlYjQ2YwogICAgICAgIDAw MDAwMDM4IDAwMDAwMDNiIDAwMDAwMDAwIDg3NzM4MDEwIDAwMDAwMDAxIDgwMmU3YTE4IDAwMDAw MDAxIDAwMDAwMDAwCiAgICAgICAgOGYwOGVlMDggMDAwMDAwMDEgMDAwMDAwMjQgMDAwMDAwMDAg ODA2NGVlYzAgOGYwOGVlMzAgOGYwMTc0MDAgODAzMDBlYTQKICAgICAgICAwMDAwNDAwNCA4MDMz N2FmMCAwMDAwMDIwMCAwMDAwMTEwNCAwMDNhNWZjMyAwM2E3MGM3OCAwMDAwMDAwOCAwMDAwMDAw MAogICAgICAgIC4uLgpDYWxsIFRyYWNlOgpbPDgwMzM3NWU4Pl0geGZzX3RyYW5zX2xvZ19idWYr MHhhMC8weGUwCls8ODAyZTI4NTg+XSB4ZnNfYWxsb2NfbG9nX2FnZisweDU4LzB4NmMKWzw4MDJl N2ExOD5dIHhmc19hbGxvY19kZWxyZWMrMHg0YjgvMHhiYTQKWzw4MDJlODE0Yz5dIHhmc19hbGxv Y19kZWxldGUrMHg0OC8weGVjCls8ODAyZTFlODQ+XSB4ZnNfYWxsb2NfZml4dXBfdHJlZXMrMHg4 Yy8weDQ2YwpbPDgwMmU0MDA0Pl0geGZzX2FsbG9jX2FnX3ZleHRlbnRfbmVhcisweDQyYy8weGFl OApbPDgwMmU0N2ZjPl0geGZzX2FsbG9jX2FnX3ZleHRlbnQrMHgxM2MvMHgxYTQKWzw4MDJlNTFk ND5dIHhmc19hbGxvY192ZXh0ZW50KzB4M2Q0LzB4NDkwCls8ODAyZjY5MzA+XSB4ZnNfYm1hcF9i dGFsbG9jKzB4NjZjLzB4YWJjCls8ODAyZmFjNTg+XSB4ZnNfYm1hcGkrMHhkNDgvMHgxM2Y4Cls8 ODAzMjE1ZDg+XSB4ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGUrMHgxNzgvMHg1OWMKWzw4MDMyMDQw OD5dIHhmc19pb21hcCsweDQwYy8weDQ2OApbPDgwMzQ1NzBjPl0geGZzX21hcF9ibG9ja3MrMHg0 OC8weGFjCls8ODAzNDY5Mjg+XSB4ZnNfcGFnZV9zdGF0ZV9jb252ZXJ0KzB4NjU4LzB4OTEwCls8 ODAzNDZmMjg+XSB4ZnNfdm1fd3JpdGVwYWdlKzB4ODQvMHgyMGMKWzw4MDE2OTg3Yz5dIF9fd3Jp dGVwYWdlKzB4MWMvMHg4OApbPDgwMTZhNmE4Pl0gd3JpdGVfY2FjaGVfcGFnZXMrMHgzMDAvMHg0 MTgKWzw4MDE2YTgyOD5dIGRvX3dyaXRlcGFnZXMrMHg0NC8weDc4Cls8ODAxYWJmODA+XSBfX3dy aXRlYmFja19zaW5nbGVfaW5vZGUrMHhhMC8weDQ4OApbPDgwMWFjOTM0Pl0gc3luY19zYl9pbm9k ZXMrMHgzMTgvMHg0NzAKWzw4MDFhY2RkYz5dIHdyaXRlYmFja19pbm9kZXMrMHg5Yy8weDE2MApb PDgwMTZiM2JjPl0gYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZF9ucisweDI3OC8weDNj OApbPDgwMTYzZTY0Pl0gZ2VuZXJpY19maWxlX2J1ZmZlcmVkX3dyaXRlKzB4MWZjLzB4NzU4Cls8 ODAzNGY4ZmM+XSB4ZnNfd3JpdGUrMHg2ODAvMHg5MzQKWzw4MDE4NDYwOD5dIGRvX3N5bmNfd3Jp dGUrMHhlMC8weDE2OApbPDgwMTg1Mjk4Pl0gc3lzX3dyaXRlKzB4NTgvMHhjMApbPDgwMTBiZWQw Pl0gc3RhY2tfZG9uZSsweDIwLzB4M2MKCgpDb2RlOiAwMjQwMjgyMSAgMzQ2MzAwMDEgIGFlMjMw MDYwIDw5MDQ3MDAwNj4gMjQwM2ZmZjcgIDAyNjAzMDIxICAzNGU3MDAwMSAgMDBlMzM4MjQgIGEw NDcwMDA2IAoK ------_=_NextPart_001_01CAF746.1730419D-- From fweimer@bfk.de Wed May 19 06:31:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JBVBT1125389 for ; Wed, 19 May 2010 06:31:12 -0500 X-ASG-Debug-ID: 1274268809-17d801db0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx01.bfk.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 10C28359A51 for ; Wed, 19 May 2010 04:33:29 -0700 (PDT) Received: from mx01.bfk.de (mx01.bfk.de [193.227.124.2]) by cuda.sgi.com with ESMTP id CTyIOlhjnq5gttgn for ; Wed, 19 May 2010 04:33:29 -0700 (PDT) Received: from mx00.int.bfk.de ([10.119.110.2]) by mx01.bfk.de with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) id 1OEhWe-0003hk-GR for xfs@oss.sgi.com; Wed, 19 May 2010 11:33:24 +0000 Received: by bfk.de with local id 1OEhWh-0001SN-C7 for xfs@oss.sgi.com; Wed, 19 May 2010 11:33:27 +0000 To: xfs@oss.sgi.com X-ASG-Orig-Subj: XFS on 2.6.26: reading the first 4K of a large file takes ages Subject: XFS on 2.6.26: reading the first 4K of a large file takes ages From: Florian Weimer Date: Wed, 19 May 2010 11:33:27 +0000 Message-ID: <8239xojfco.fsf@mid.bfk.de> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mx01.bfk.de[193.227.124.2] X-Barracuda-Start-Time: 1274268810 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.2, rules version 3.2.2.30247 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean We've got a couple of rather large files, and with a cold cache, reading the first 4K bytes of the file (e.g., just running "head --bytes 4096" on it) takes ages, up to several minutes, sometimes triggering the hang check timer. I wonder if XFS reads the whole extent information into RAM when the file is opened. Is this the case, at least on 2.6.26? Has this changed in later versions, perhaps? The files in question are heavily fragmented (they have been created with holes first, and the holes have been filled in subsequently). I'll try to run xfs_fsr on those files, but it's going to be tough. 8-/ --=20 Florian Weimer BFK edv-consulting GmbH http://www.bfk.de/ Kriegsstra=DFe 100 tel: +49-721-96201-1 D-76133 Karlsruhe fax: +49-721-96201-99 From michael.monnerie@is.it-management.at Wed May 19 06:44:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JBiMvF126061 for ; Wed, 19 May 2010 06:44:22 -0500 X-ASG-Debug-ID: 1274269600-17cb02190000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D5E0C359D43 for ; Wed, 19 May 2010 04:46:40 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id EWAt5XD7WJYTzzO9 for ; Wed, 19 May 2010 04:46:40 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 78C9F800182; Wed, 19 May 2010 13:46:39 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 22B8F83C804; Wed, 19 May 2010 13:46:39 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: rsync from xfs to nfs+xfs and ACL problems Subject: Re: rsync from xfs to nfs+xfs and ACL problems Date: Wed, 19 May 2010 13:46:38 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) Cc: Christoph Hellwig References: <201005181350.15308@zmi.at> <201005191304.42314@zmi.at> <20100519112034.GA29064@infradead.org> In-Reply-To: <20100519112034.GA29064@infradead.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart14486152.hTmOFNolno"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005191346.38699@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1274269600 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.2, rules version 3.2.2.30247 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart14486152.hTmOFNolno Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Mittwoch, 19. Mai 2010 Christoph Hellwig wrote: > XFS stores ACLs different than other Linux filesystems because it's > on-disk compatible to IRIX. While the other filesystems store the > ACL in the same format that is used for the user interface XFS > stores it in a separate trusted extended attribute. rsync should > and > traditionally has ignored those attributes, but it seems something in > rsync changed recently so that it tries to copy these attributes in > the trusted.* namespace, which fails on NFS. =20 Thank you. Does that mean I can simply ignore that errors, and that=20 everything is OK even over NFS? =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart14486152.hTmOFNolno Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkvzz54ACgkQzhSR9xwSCbToYACfZCfVVotIH8DOuhe5/3OfPWXl deIAoOXNiBlN0UBJQ5N7JnK7mFiFNDrM =xRXb -----END PGP SIGNATURE----- --nextPart14486152.hTmOFNolno-- From BATV+3478df1fd675c5a5ef2d+2460+infradead.org+hch@bombadil.srs.infradead.org Wed May 19 06:46:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JBk9c1126179 for ; Wed, 19 May 2010 06:46:09 -0500 X-ASG-Debug-ID: 1274269708-175b02fb0000-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 603E41DF3242 for ; Wed, 19 May 2010 04:48:28 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id L6iccW2gaSGNOPPL for ; Wed, 19 May 2010 04:48:28 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OEhlC-0004xs-2K; Wed, 19 May 2010 11:48:26 +0000 Date: Wed, 19 May 2010 07:48:26 -0400 From: Christoph Hellwig To: Florian Weimer Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS on 2.6.26: reading the first 4K of a large file takes ages Subject: Re: XFS on 2.6.26: reading the first 4K of a large file takes ages Message-ID: <20100519114826.GA18224@infradead.org> References: <8239xojfco.fsf@mid.bfk.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8239xojfco.fsf@mid.bfk.de> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274269708 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 19, 2010 at 11:33:27AM +0000, Florian Weimer wrote: > We've got a couple of rather large files, and with a cold cache, > reading the first 4K bytes of the file (e.g., just running > "head --bytes 4096" on it) takes ages, up to several minutes, > sometimes triggering the hang check timer. > > I wonder if XFS reads the whole extent information into RAM when the > file is opened. Is this the case, at least on 2.6.26? Has this > changed in later versions, perhaps? Yes, XFS always reads in the extent map, and no this hasn't changed recently. From BATV+3478df1fd675c5a5ef2d+2460+infradead.org+hch@bombadil.srs.infradead.org Wed May 19 06:49:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JBnXvx126332 for ; Wed, 19 May 2010 06:49:33 -0500 X-ASG-Debug-ID: 1274269911-175e03510000-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 25DBA1DF327F for ; Wed, 19 May 2010 04:51:52 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id YYbX1PGdmRJCtDdN for ; Wed, 19 May 2010 04:51:52 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OEhoV-0005xM-Pr; Wed, 19 May 2010 11:51:51 +0000 Date: Wed, 19 May 2010 07:51:51 -0400 From: Christoph Hellwig To: Michael Monnerie Cc: xfs@oss.sgi.com, Christoph Hellwig X-ASG-Orig-Subj: Re: rsync from xfs to nfs+xfs and ACL problems Subject: Re: rsync from xfs to nfs+xfs and ACL problems Message-ID: <20100519115151.GA19104@infradead.org> References: <201005181350.15308@zmi.at> <201005191304.42314@zmi.at> <20100519112034.GA29064@infradead.org> <201005191346.38699@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201005191346.38699@zmi.at> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274269912 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 19, 2010 at 01:46:38PM +0200, Michael Monnerie wrote: > On Mittwoch, 19. Mai 2010 Christoph Hellwig wrote: > > XFS stores ACLs different than other Linux filesystems because it's > > on-disk compatible to IRIX. While the other filesystems store the > > ACL in the same format that is used for the user interface XFS > > stores it in a separate trusted extended attribute. rsync should > > and > > traditionally has ignored those attributes, but it seems something in > > rsync changed recently so that it tries to copy these attributes in > > the trusted.* namespace, which fails on NFS. > > Thank you. Does that mean I can simply ignore that errors, and that > everything is OK even over NFS? Thinks should be okay - rsync probably has copied the ACLs via the normal system namespace. You can verify this by doing a getfacl on a nfs file that should havfe ACLs. From aelder@oss.sgi.com Wed May 19 07:03:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JC3PmA127132 for ; Wed, 19 May 2010 07:03:25 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o4JC3L0V127077; Wed, 19 May 2010 07:03:21 -0500 Date: Wed, 19 May 2010 07:03:21 -0500 Message-Id: <201005191203.o4JC3L0V127077@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v2.6.33-10192-ge158ccf X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 6ff75b78182c314112c1173edaab6c164c95d775 X-Git-Newrev: e158ccfbb03240523069c8079c3aec5583a8c267 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated e158ccf Merge branch 'v2.6.34' 9bf729c xfs: add a shrinker to background inode reclaim dd77ef9 xfs: more swap extent fixes for dynamic fork offsets f1d486a xfs: don't warn on EAGAIN in inode reclaim b6f8dd4 xfs: ensure that sync updates the log tail correctly 5a0e3ad include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h from 6ff75b78182c314112c1173edaab6c164c95d775 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit e158ccfbb03240523069c8079c3aec5583a8c267 Merge: 6ff75b78182c314112c1173edaab6c164c95d775 e40152ee1e1c7a63f4777791863215e3faa37a86 Author: Alex Elder Date: Tue May 18 15:44:14 2010 -0500 Merge branch 'v2.6.34' ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/kmem.c | 1 + fs/xfs/linux-2.6/xfs_acl.c | 1 + fs/xfs/linux-2.6/xfs_aops.c | 1 + fs/xfs/linux-2.6/xfs_buf.c | 2 +- fs/xfs/linux-2.6/xfs_ioctl.c | 1 + fs/xfs/linux-2.6/xfs_ioctl32.c | 1 + fs/xfs/linux-2.6/xfs_iops.c | 1 + fs/xfs/linux-2.6/xfs_super.c | 1 + 8 files changed, 8 insertions(+), 1 deletions(-) hooks/post-receive -- XFS development tree From jack@suse.cz Wed May 19 08:36:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JDa5Td131873 for ; Wed, 19 May 2010 08:36:05 -0500 X-ASG-Debug-ID: 1274276303-775e02930000-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 07D2D359F5B for ; Wed, 19 May 2010 06:38:23 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id IWZrLi1VDB6YG3Gm for ; Wed, 19 May 2010 06:38:23 -0700 (PDT) Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 3BF0A87567; Wed, 19 May 2010 15:38:21 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id C9BF92B1B2F; Wed, 19 May 2010 15:38:13 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org X-ASG-Orig-Subj: [PATCH 0/7 V2] Quota tests for XFSQA Subject: [PATCH 0/7 V2] Quota tests for XFSQA Date: Wed, 19 May 2010 15:38:02 +0200 Message-Id: <1274276289-8839-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274276304 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.2, rules version 3.2.2.30254 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, this is a second version of quota tests for xfstests package. Since previous version I have addressed David's comments and also added two more tests. Honza From jack@suse.cz Wed May 19 08:36:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_LOTS_OF_MONEY autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JDa5sE131876 for ; Wed, 19 May 2010 08:36:05 -0500 X-ASG-Debug-ID: 1274276303-775a02720000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6632B35A3A1 for ; Wed, 19 May 2010 06:38:23 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id J4TEV6CPBwl2qUho for ; Wed, 19 May 2010 06:38:23 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 4537494393; Wed, 19 May 2010 15:38:23 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 0DFBD2B1B34; Wed, 19 May 2010 15:38:14 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Kara X-ASG-Orig-Subj: [PATCH 7/7] Add test of quota limit and info setting Subject: [PATCH 7/7] Add test of quota limit and info setting Date: Wed, 19 May 2010 15:38:09 +0200 Message-Id: <1274276289-8839-8-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274276289-8839-1-git-send-email-jack@suse.cz> References: <1274276289-8839-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274276304 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Add test stressing addition and removal of quota structures and setting of quota grace time. Signed-off-by: Jan Kara --- 234 | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 234.out | 4 ++ group | 1 + 3 files changed, 111 insertions(+), 0 deletions(-) create mode 100755 234 create mode 100644 234.out diff --git a/234 b/234 new file mode 100755 index 0000000..84604eb --- /dev/null +++ b/234 @@ -0,0 +1,106 @@ +#! /bin/bash +# FS QA Test No. 234 +# +# Stress setquota and setinfo handling. +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Jan Kara. All Rights Reserved. +# +# Based on test 219, +# Copyright (c) 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +test_setting() +{ + echo; echo "### test limits and info setting" + count=2000 + procs=5 + idmod=200000 + + for (( i = 0; i < $procs; i++ )); do + ( SETUCOUNT=1; SETGCOUNT=1; SETUIDS[0]=0; SETGIDS[0]=0 + for (( j = 0; j < $count; j++ )); do + OP=$(($RANDOM%22)) + UG=$(($OP%2)) + OP=$(($OP/2)) + if [ $UG -eq 1 ]; then + type='u' + else + type='g' + fi + if [ $OP -eq 10 ]; then + setquota -t -$type $j $j $SCRATCH_MNT + elif [ $OP -lt 5 ]; then + ID=$(($RANDOM%$idmod)) + if [ $UG -eq 1 ]; then + SETUIDS[$SETUCOUNT]=$ID + SETUCOUNT=$(($SETUCOUNT+1)) + else + SETGIDS[$SETGCOUNT]=$ID + SETGCOUNT=$(($SETGCOUNT+1)) + fi + setquota -$type $ID $j $j $j $j $SCRATCH_MNT + else + if [ $UG -eq 1 ]; then + ID=${SETUIDS[$(($RANDOM%$SETUCOUNT))]} + else + ID=${SETGIDS[$(($RANDOM%$SETGCOUNT))]} + fi + setquota -$type $ID 0 0 0 0 $SCRATCH_MNT + fi + + done )& + done + wait + echo "### done with testing" +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux #IRIX +_require_scratch +_require_quota +_need_to_be_root + +# real QA test starts here +rm -f $seq.full + +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon -u -g $SCRATCH_MNT 2>/dev/null +test_setting +umount $SCRATCH_DEV + +status=0 +exit diff --git a/234.out b/234.out new file mode 100644 index 0000000..78d1587 --- /dev/null +++ b/234.out @@ -0,0 +1,4 @@ +QA output created by 234 + +### test limits and info setting +### done with testing diff --git a/group b/group index cc9bdb2..3a95e48 100644 --- a/group +++ b/group @@ -347,3 +347,4 @@ deprecated 231 auto quota 232 auto quota 233 auto quota +234 auto quota -- 1.6.4.2 From jack@suse.cz Wed May 19 08:36:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JDa6Jv131886 for ; Wed, 19 May 2010 08:36:06 -0500 X-ASG-Debug-ID: 1274276304-0475027b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 458221DF3500 for ; Wed, 19 May 2010 06:38:24 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id RBLivk6etzTFGTAZ for ; Wed, 19 May 2010 06:38:24 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 6813194430; Wed, 19 May 2010 15:38:24 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 8C57C2B1B30; Wed, 19 May 2010 15:38:13 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Kara X-ASG-Orig-Subj: [PATCH 2/7] Fix test whether kernel supports quotas Subject: [PATCH 2/7] Fix test whether kernel supports quotas Date: Wed, 19 May 2010 15:38:04 +0200 Message-Id: <1274276289-8839-3-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274276289-8839-1-git-send-email-jack@suse.cz> References: <1274276289-8839-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274276305 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean For all 2.6 kernels presence of quota support in kernel can be detected by checking /proc/sys/fs/quota. This is actually more reliable than trying to mount a filesystem with quota options (for example because SCRATCH_DEV does not have to contain a filesystem type we are going to test). Signed-off-by: Jan Kara --- common.quota | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) diff --git a/common.quota b/common.quota index 51bdc71..033390f 100644 --- a/common.quota +++ b/common.quota @@ -27,10 +27,7 @@ _require_quota() { [ -x /usr/bin/quota ] || _notrun "Quota user tools not installed" - _scratch_mount "-o usrquota,grpquota" - ret=$? - umount $SCRATCH_MNT - [ $ret -ne 0 ] && _notrun "Installed kernel does not support quota" + [ -d /proc/sys/fs/quota ] || _notrun "Installed kernel does not support quota" } # -- 1.6.4.2 From jack@suse.cz Wed May 19 08:36:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_52 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JDa7Wg131928 for ; Wed, 19 May 2010 08:36:07 -0500 X-ASG-Debug-ID: 1274276372-3cac02aa0000-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 B76C5156C51A for ; Wed, 19 May 2010 06:39:33 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id FDBHtMJoh5PJGnfH for ; Wed, 19 May 2010 06:39:33 -0700 (PDT) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 6ABD2890B6; Wed, 19 May 2010 15:38:24 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 44BE62B1B31; Wed, 19 May 2010 15:38:13 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Christoph Hellwig , Geoffrey Wehrman X-ASG-Orig-Subj: [PATCH 1/7] xfstests: test extent size hints Subject: [PATCH 1/7] xfstests: test extent size hints Date: Wed, 19 May 2010 15:38:03 +0200 Message-Id: <1274276289-8839-2-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274276289-8839-1-git-send-email-jack@suse.cz> References: <1274276289-8839-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274276373 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.2, rules version 3.2.2.30256 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Christoph Hellwig This is an adapted version of the reproduced in OSS BZ #874, which shows file corruption when using the extent size hint. Signed-off-by: Geoffrey Wehrman Signed-off-by: Christoph Hellwig --- 229 | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 229.out | 4 ++ group | 1 + src/Makefile | 2 +- src/t_holes.c | 41 ++++++++++++++++++++++++++ 5 files changed, 135 insertions(+), 1 deletions(-) create mode 100644 229 create mode 100644 229.out create mode 100644 src/t_holes.c diff --git a/229 b/229 new file mode 100644 index 0000000..418a5af --- /dev/null +++ b/229 @@ -0,0 +1,88 @@ +#! /bin/bash +# FS QA Test No. 221 +# +# Check for file corruption when using the extent size hint on +# the normal data subvolume. +# +# http://oss.sgi.com/bugzilla/show_bug.cgi?id=874 +# +# Based on a bug report and testcase from Geoffrey Wehrman . +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Christoph Hellwig. All Rights Reserved. +# Copyright (c) 2010 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=hch@lst.de + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -rf ${TDIR} +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +TDIR="${TEST_DIR}/t_holes" +NFILES="10" +EXTSIZE="256k" + +# Create the test directory +mkdir ${TDIR} + +# Set the test directory extsize +xfs_io -c "extsize ${EXTSIZE}" ${TDIR} + +# Create a set of holey files +echo "generating ${NFILES} files" + +for i in $(seq 0 ${NFILES}); do + $here/src/t_holes ${TDIR}/${i} +done + +# Compare the files +echo "comparing files" +errcnt=0 +j=0 +for i in $(seq 0 ${NFILES}); do + let j=$i+1 + while [ ${j} -lt ${NFILES} ] ; do + if ! cmp ${TDIR}/${i} ${TDIR}/${j} ; then + let errcnt=$errcnt+1 + fi + let j=$j+1 + done +done + +echo "got ${errcnt} errors" + +status=$errcnt +exit $status diff --git a/229.out b/229.out new file mode 100644 index 0000000..233920f --- /dev/null +++ b/229.out @@ -0,0 +1,4 @@ +QA output created by 229 +generating 10 files +comparing files +got 0 errors diff --git a/group b/group index 69ba24d..2c1ac50 100644 --- a/group +++ b/group @@ -342,3 +342,4 @@ deprecated 226 auto enospc 227 auto fsr 228 rw auto prealloc quick +229 auto rw diff --git a/src/Makefile b/src/Makefile index 2f95fe2..976133d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -10,7 +10,7 @@ TARGETS = dirstress fill fill2 getpagesize holes lstat64 \ mmapcat append_reader append_writer dirperf metaperf \ devzero feature alloc fault fstest t_access_root \ godown resvtest writemod makeextents itrash rename \ - multi_open_unlink dmiperf unwritten_sync genhashnames + multi_open_unlink dmiperf unwritten_sync genhashnames t_holes LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ diff --git a/src/t_holes.c b/src/t_holes.c new file mode 100644 index 0000000..eba310a --- /dev/null +++ b/src/t_holes.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2010 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 +#include +#include +#include + +int main(int argc, char **argv) +{ + int buf[1024]; + int fd, i, j; + + fd = open(argv[1], O_RDWR|O_CREAT, 0666); + for (i = 1; i < 9100; i++) { + for (j = 0; j < 1024; j++) + buf[j] = i | i << 5; + + if (write(fd,buf,253*4*sizeof(int))!= 253*4*sizeof(int)) + printf("Write did not return correct amount\n"); + + if ((i % 9) == 0 && i < 9001) + lseek(fd, 4096 * 110,SEEK_CUR); + } + + close(fd); + return 0; +} -- 1.6.4.2 From jack@suse.cz Wed May 19 08:36:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JDa7iC131914 for ; Wed, 19 May 2010 08:36:07 -0500 X-ASG-Debug-ID: 1274276371-3cb202aa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CB88D156C51E for ; Wed, 19 May 2010 06:39:31 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id h2maL4Ic8gxwEKRY for ; Wed, 19 May 2010 06:39:31 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 0CB799417A; Wed, 19 May 2010 15:38:22 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 162382B1B2C; Wed, 19 May 2010 15:38:14 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Kara X-ASG-Orig-Subj: [PATCH 4/7] Add test of quota accounting using fsx Subject: [PATCH 4/7] Add test of quota accounting using fsx Date: Wed, 19 May 2010 15:38:06 +0200 Message-Id: <1274276289-8839-5-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274276289-8839-1-git-send-email-jack@suse.cz> References: <1274276289-8839-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274276373 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Run fsx (and also several fsx threads in parallel) and verify that quota accounting is correct after they finish. Signed-off-by: Jan Kara --- 231 | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 231.out | 10 +++++ group | 1 + 3 files changed, 150 insertions(+), 0 deletions(-) create mode 100755 231 create mode 100644 231.out diff --git a/231 b/231 new file mode 100755 index 0000000..0e34d33 --- /dev/null +++ b/231 @@ -0,0 +1,139 @@ +#! /bin/bash +# FSQA Test No. 231 +# +# Run fsx with quotas enabled and verify accounted quotas in the end +# +# Derived from test 127 +#----------------------------------------------------------------------- +# Copyright (c) 2006 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +FSX_FILE_SIZE=64000000 +FSX_ARGS="-q -l $FSX_FILE_SIZE -o 65536 -S 191110531 -N 20000" + +filter_scratch() +{ + perl -ne " +s,$SCRATCH_MNT,[SCR_MNT],; +s,$SCRATCH_DEV,[SCR_DEV],; + print;" +} + +check_usage() +{ + quotaon -f -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch \ + >$tmp.orig + quotacheck -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch \ + >$tmp.checked + quotaon -u -g $SCRATCH_MNT 2>/dev/null + diff $tmp.orig $tmp.checked +} + +_fsx() +{ + tasks=$1 + echo "=== FSX Standard Mode, Memory Mapping, $tasks Tasks ===" + for (( i = 1; i <= $tasks; i++ )); do + su $qa_user -c "ltp/fsx $FSX_ARGS $SCRATCH_MNT/fsx_file$i" \ + >$tmp.output$i 2>&1 & + done + + for (( i = 1; i <= $tasks; i++ )); do + if ! wait %$i; then + cat $tmp.output$i + wait + return 1 + fi + $XFS_IO_PROG -F -c 'fsync' $SCRATCH_MNT/fsx_file$i + cat $tmp.output$i + done + return 0 +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch +_require_quota +_require_user +_need_to_be_root + +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +chmod 777 $SCRATCH_MNT +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon -u -g $SCRATCH_MNT 2>/dev/null + +if ! _fsx 1; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +if ! _fsx 4; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +#flush cache after write +FSX_ARGS="-f $FSX_ARGS" +if ! _fsx 1; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +umount $SCRATCH_DEV 2>/dev/null +status=0 +exit diff --git a/231.out b/231.out new file mode 100644 index 0000000..2f2d072 --- /dev/null +++ b/231.out @@ -0,0 +1,10 @@ +QA output created by 231 +=== FSX Standard Mode, Memory Mapping, 1 Tasks === +All operations completed A-OK! +=== FSX Standard Mode, Memory Mapping, 4 Tasks === +All operations completed A-OK! +All operations completed A-OK! +All operations completed A-OK! +All operations completed A-OK! +=== FSX Standard Mode, Memory Mapping, 1 Tasks === +All operations completed A-OK! diff --git a/group b/group index 441e0e9..6b59c69 100644 --- a/group +++ b/group @@ -344,3 +344,4 @@ deprecated 228 rw auto prealloc quick 229 auto rw 230 auto quota quick +231 auto quota -- 1.6.4.2 From jack@suse.cz Wed May 19 08:36:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_LOTS_OF_MONEY autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JDa6Nu131902 for ; Wed, 19 May 2010 08:36:07 -0500 X-ASG-Debug-ID: 1274276371-3cb402900000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 40178156C518 for ; Wed, 19 May 2010 06:39:31 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id GbbKrv8u8fF3YpGj for ; Wed, 19 May 2010 06:39:31 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 0C6B094109; Wed, 19 May 2010 15:38:22 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id BAE442B1B2E; Wed, 19 May 2010 15:38:14 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Kara X-ASG-Orig-Subj: [PATCH 6/7] Add quota accounting test when fsstress is run and quota limits are set low Subject: [PATCH 6/7] Add quota accounting test when fsstress is run and quota limits are set low Date: Wed, 19 May 2010 15:38:08 +0200 Message-Id: <1274276289-8839-7-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274276289-8839-1-git-send-email-jack@suse.cz> References: <1274276289-8839-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274276373 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Test various error recovery paths whether they properly handle EDQUOT failures. Signed-off-by: Jan Kara --- 233 | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 233.out | 6 +++ group | 1 + 3 files changed, 131 insertions(+), 0 deletions(-) create mode 100755 233 create mode 100644 233.out diff --git a/233 b/233 new file mode 100755 index 0000000..1185a6d --- /dev/null +++ b/233 @@ -0,0 +1,124 @@ +#! /bin/bash +# FSQA Test No. 233 +# +# Run fsstress with quotas enabled and limits set low and verify accounted +# quotas in the end +# +# Derived from test 231 +#----------------------------------------------------------------------- +# Copyright (c) 2006 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +FSX_FILE_SIZE=64000000 +FSX_ARGS="-q -l $FSX_FILE_SIZE -o 65536 -S 191110531 -N 100000" + +filter_scratch() +{ + perl -ne " +s,$SCRATCH_MNT,[SCR_MNT],; +s,$SCRATCH_DEV,[SCR_DEV],; + print;" +} + +check_usage() +{ + quotaon -f -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.orig + quotacheck -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.checked + quotaon -u -g $SCRATCH_MNT 2>/dev/null + diff $tmp.orig $tmp.checked +} + +_filter_num() +{ + tee -a $here/$seq.full |\ + sed -e 's/[0-9][0-9]* inodes/I inodes/g' \ + -e 's/[0-9][0-9]* paths/P paths/g' \ + -e 's/seed = [0-9][0-9]*/seed = S/' +} + +_fsstress() +{ + echo "" + echo "Testing fsstress" + echo "" + + out=$SCRATCH_MNT/fsstress.$$ + count=5000 + args="-z \ +-f rmdir=20 -f link=10 -f creat=10 -f mkdir=10 -f unlink=20 -f symlink=10 \ +-f rename=10 -f fsync=2 -f write=15 -f dwrite=15 \ +-n $count -d $out -p 7" + + echo "fsstress $args" | sed -e "s#$out#outdir#" + if ! su $qa_user -c "$FSSTRESS_PROG $args" | _filter_num + then + echo " fsstress $args returned $?" + cat $tmp.out | tee -a $here/$seq.full + status=1 + fi +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch +_require_quota +_require_user +_need_to_be_root + +umount $SCRATCH_DEV 2>/dev/null +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +chmod 777 $SCRATCH_MNT +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon -u -g $SCRATCH_MNT 2>/dev/null +setquota -u $qa_user 32000 32000 1000 1000 $SCRATCH_MNT 2>/dev/null + +if ! _fsstress; then + umount $SCRATCH_DEV 2>/dev/null + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +umount $SCRATCH_DEV 2>/dev/null +status=0 +exit diff --git a/233.out b/233.out new file mode 100644 index 0000000..208910d --- /dev/null +++ b/233.out @@ -0,0 +1,6 @@ +QA output created by 233 + +Testing fsstress + +fsstress -z -f rmdir=20 -f link=10 -f creat=10 -f mkdir=10 -f unlink=20 -f symlink=10 -f rename=10 -f fsync=2 -f write=15 -f dwrite=15 -n 5000 -d outdir -p 7 +seed = S diff --git a/group b/group index c8cd774..cc9bdb2 100644 --- a/group +++ b/group @@ -346,3 +346,4 @@ deprecated 230 auto quota quick 231 auto quota 232 auto quota +233 auto quota -- 1.6.4.2 From jack@suse.cz Wed May 19 08:36:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JDa6cA131904 for ; Wed, 19 May 2010 08:36:07 -0500 X-ASG-Debug-ID: 1274276371-3cab02ca0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5E0FF156C51A for ; Wed, 19 May 2010 06:39:31 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id qFyZPdNc574FOTWi for ; Wed, 19 May 2010 06:39:31 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 0C45894033; Wed, 19 May 2010 15:38:22 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id E98E12B1B3A; Wed, 19 May 2010 15:38:14 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Kara X-ASG-Orig-Subj: [PATCH 5/7] Add quota test with fsstress Subject: [PATCH 5/7] Add quota test with fsstress Date: Wed, 19 May 2010 15:38:07 +0200 Message-Id: <1274276289-8839-6-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274276289-8839-1-git-send-email-jack@suse.cz> References: <1274276289-8839-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274276373 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Run fsstress and verify that quota accounting is correct after it finishes. Signed-off-by: Jan Kara --- 232 | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 232.out | 6 +++ group | 1 + 3 files changed, 125 insertions(+), 0 deletions(-) create mode 100755 232 create mode 100644 232.out diff --git a/232 b/232 new file mode 100755 index 0000000..ef8ce8a --- /dev/null +++ b/232 @@ -0,0 +1,118 @@ +#! /bin/bash +# FSQA Test No. 232 +# +# Run fsstress with quotas enabled and verify accounted quotas in the end +# +# Derived from test 231 +#----------------------------------------------------------------------- +# Copyright (c) 2006 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +FSX_FILE_SIZE=64000000 +FSX_ARGS="-q -l $FSX_FILE_SIZE -o 65536 -S 191110531 -N 100000" + +filter_scratch() +{ + perl -ne " +s,$SCRATCH_MNT,[SCR_MNT],; +s,$SCRATCH_DEV,[SCR_DEV],; + print;" +} + +check_usage() +{ + quotaon -f -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.orig + quotacheck -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.checked + quotaon -u -g $SCRATCH_MNT 2>/dev/null + diff $tmp.orig $tmp.checked +} + +_filter_num() +{ + tee -a $here/$seq.full |\ + sed -e 's/[0-9][0-9]* inodes/I inodes/g' \ + -e 's/[0-9][0-9]* paths/P paths/g' \ + -e 's/seed = [0-9][0-9]*/seed = S/' +} + +_fsstress() +{ + echo "" + echo "Testing fsstress" + echo "" + + out=$SCRATCH_MNT/fsstress.$$ + count=2000 + args="-n $count -d $out -p 7" + + echo "fsstress $args" | sed -e "s#$out#outdir#" + if ! $FSSTRESS_PROG $args | _filter_num + then + echo " fsstress $args returned $?" + cat $tmp.out | tee -a $here/$seq.full + status=1 + fi +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch +_require_quota +_need_to_be_root + +umount $SCRATCH_DEV 2>/dev/null +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +chmod 777 $SCRATCH_MNT +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon -u -g $SCRATCH_MNT 2>/dev/null + +if ! _fsstress; then + umount $SCRATCH_DEV 2>/dev/null + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +umount $SCRATCH_DEV 2>/dev/null +status=0 +exit diff --git a/232.out b/232.out new file mode 100644 index 0000000..744192e --- /dev/null +++ b/232.out @@ -0,0 +1,6 @@ +QA output created by 232 + +Testing fsstress + +fsstress -n 2000 -d outdir -p 7 +seed = S diff --git a/group b/group index 6b59c69..c8cd774 100644 --- a/group +++ b/group @@ -345,3 +345,4 @@ deprecated 229 auto rw 230 auto quota quick 231 auto quota +232 auto quota -- 1.6.4.2 From jack@suse.cz Wed May 19 08:36:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_LOTS_OF_MONEY autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JDa65k131884 for ; Wed, 19 May 2010 08:36:06 -0500 X-ASG-Debug-ID: 1274276303-0969024f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 01E801DF3789 for ; Wed, 19 May 2010 06:38:23 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id lvwI8DeQT7DIdFAO for ; Wed, 19 May 2010 06:38:23 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 105E39428F; Wed, 19 May 2010 15:38:22 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 7BD072B1B2D; Wed, 19 May 2010 15:38:13 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Kara X-ASG-Orig-Subj: [PATCH 3/7] Test basic quota enforcement Subject: [PATCH 3/7] Test basic quota enforcement Date: Wed, 19 May 2010 15:38:05 +0200 Message-Id: <1274276289-8839-4-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274276289-8839-1-git-send-email-jack@suse.cz> References: <1274276289-8839-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274276305 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Add a test which checks whether basic quota enforcement works. Signed-off-by: Jan Kara --- 230 | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 230.out | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ group | 1 + 3 files changed, 277 insertions(+), 0 deletions(-) create mode 100755 230 create mode 100644 230.out diff --git a/230 b/230 new file mode 100755 index 0000000..a63e004 --- /dev/null +++ b/230 @@ -0,0 +1,145 @@ +#! /bin/bash +# FS QA Test No. 230 +# +# Simple quota enforcement test. +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Jan Kara. All Rights Reserved. +# +# Based on test 219, +# Copyright (c) 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +filter_scratch() +{ + perl -ne " +s,$SCRATCH_MNT,[SCR_MNT],; +s,$SCRATCH_DEV,[SCR_DEV],; + print;" +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux #IRIX +_require_scratch +_require_quota +_require_user +_need_to_be_root + +test_files() +{ + echo; echo "### create files, setting up ownership (type=$type)" + touch $SCRATCH_MNT/file{1,2} + chown $qa_user $SCRATCH_MNT/file{1,2} + chgrp $qa_user $SCRATCH_MNT/file{1,2} + chmod 777 $SCRATCH_MNT +} + +test_enforcement() +{ + echo "### some buffered IO (type=$type)" + echo "--- initiating IO..." >>$seq.full + # Firstly fit below block soft limit + su $qa_user -c "$XFS_IO_PROG -F -c 'pwrite 0 4096' -c fsync \ + $SCRATCH_MNT/file1" 2>&1 >>$seq.full | tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + # Secondly overcome block soft limit + su $qa_user -c "$XFS_IO_PROG -F -c 'pwrite 0 4097' -c fsync \ + $SCRATCH_MNT/file1" 2>&1 >>$seq.full | tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + # Now try to overcome block hardlimit + su $qa_user -c "$XFS_IO_PROG -F -c 'pwrite 0 4097' -c fsync \ + $SCRATCH_MNT/file2" 2>&1 >>$seq.full | tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + # Now sleep for grace time and check that softlimit got enforced + sleep $grace + su $qa_user -c "$XFS_IO_PROG -F -c 'truncate 0' -c 'pwrite 0 1' \ + $SCRATCH_MNT/file2" 2>&1 >>$seq.full | tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + # And now the softlimit test for inodes + su $qa_user -c "touch $SCRATCH_MNT/file3" 2>&1 >>$seq.full | + tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + # Try to exceed inode hardlimit + su $qa_user -c "touch $SCRATCH_MNT/file4 $SCRATCH_MNT/file5" 2>&1 \ + >>$seq.full | tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + # Wait and check grace time enforcement + rm -f $SCRATCH_MNT/file4 >>$seq.full 2>&1 + sleep $grace + su $qa_user -c "touch $SCRATCH_MNT/file4" 2>&1 >>$seq.full | + tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + echo "--- completed IO ($type)" >>$seq.full +} + +cleanup_files() +{ + rm -f $SCRATCH_MNT/file{1,2,3,4,5} +} + +# real QA test starts here +rm -f $seq.full + +grace=2 + +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon $SCRATCH_MNT 2>/dev/null +setquota -u $qa_user 4 12 2 4 $SCRATCH_MNT +setquota -u -t $grace $grace $SCRATCH_MNT +setquota -g $qa_user 4 12 2 4 $SCRATCH_MNT +setquota -g -t $grace $grace $SCRATCH_MNT +umount $SCRATCH_DEV + +echo; echo "### test user limit enforcement" +_scratch_mount "-o usrquota" +quotaon $SCRATCH_MNT 2>/dev/null +type=u +test_files +test_enforcement +cleanup_files +umount $SCRATCH_DEV 2>/dev/null + +echo; echo "### test group limit enforcement" +_scratch_mount "-o grpquota" +quotaon $SCRATCH_MNT 2>/dev/null +type=g +test_files +test_enforcement +cleanup_files +umount $SCRATCH_DEV 2>/dev/null + +status=0 +exit diff --git a/230.out b/230.out new file mode 100644 index 0000000..87fb372 --- /dev/null +++ b/230.out @@ -0,0 +1,131 @@ +QA output created by 230 + +### test user limit enforcement + +### create files, setting up ownership (type=u) +### some buffered IO (type=u) +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa -- 4 4 12 2 2 4 + + +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa +- 8 4 12 00:00 2 2 4 + + +pwrite64: Disk quota exceeded +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa +- 12 4 12 00:00 2 2 4 + + +pwrite64: Disk quota exceeded +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa +- 8 4 12 none 2 2 4 + + +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa ++ 8 4 12 none 3 2 4 00:00 + + +touch: cannot touch `/local/test1/file5': Disk quota exceeded +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa ++ 8 4 12 none 4 2 4 00:00 + + +touch: cannot touch `/local/test1/file4': Disk quota exceeded +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa ++ 8 4 12 none 3 2 4 none + + + +### test group limit enforcement + +### create files, setting up ownership (type=g) +### some buffered IO (type=g) +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa -- 4 4 12 2 2 4 + + +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa +- 8 4 12 00:00 2 2 4 + + +pwrite64: Disk quota exceeded +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa +- 12 4 12 00:00 2 2 4 + + +pwrite64: Disk quota exceeded +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa +- 8 4 12 none 2 2 4 + + +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa ++ 8 4 12 none 3 2 4 00:00 + + +touch: cannot touch `/local/test1/file5': Disk quota exceeded +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa ++ 8 4 12 none 4 2 4 00:00 + + +touch: cannot touch `/local/test1/file4': Disk quota exceeded +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa ++ 8 4 12 none 3 2 4 none + + diff --git a/group b/group index 2c1ac50..441e0e9 100644 --- a/group +++ b/group @@ -343,3 +343,4 @@ deprecated 227 auto fsr 228 rw auto prealloc quick 229 auto rw +230 auto quota quick -- 1.6.4.2 From sandeen@sandeen.net Wed May 19 08:50:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JDolSW133153 for ; Wed, 19 May 2010 08:50:48 -0500 X-ASG-Debug-ID: 1274277185-3282016e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CDB721DF395D for ; Wed, 19 May 2010 06:53:05 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id Y0n03tujAHiSsQnf for ; Wed, 19 May 2010 06:53:05 -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 mail.sandeen.net (Postfix) with ESMTP id 32E5B4968911; Wed, 19 May 2010 08:53:05 -0500 (CDT) Message-ID: <4BF3ED40.20609@sandeen.net> Date: Wed, 19 May 2010 08:53:04 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Stan Hoeppner CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel References: <4BF1EC44.7070803@hardwarefreak.com> <4BF219A6.4010900@hardwarefreak.com> <1274201857.17233.144.camel@montana.filmlight.ltd.uk> <4BF366C9.9050300@hardwarefreak.com> In-Reply-To: <4BF366C9.9050300@hardwarefreak.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1274277185 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30257 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Stan Hoeppner wrote: > big beer put forth on 5/18/2010 5:43 PM: > >> Strangely enough I was told by Hitachi that they licensed XFS from >> SGI, so they don't have any GPL code to give back. > > IIRC (and IANAL) any version of XFS, with the exception of CXFS, running on > Linux is GPL'd code. There is no such beast as non GPL XFS on Linux. > > For that SGI licensing statement to be true, they've have to be running XFS > on IRIX, which means they'd need an IRIX license as well. Not to mention > that IRIX only runs on MIPS hardware, and only SGI MIPS hardware. This HDS > storage blade is x86. > > It seems whoever told you that is misinformed or is being disingenuous in > order to avoid assisting you. Anyone with clear copyright can license the code under any license(s) they wish. So assuming SGI had clear copyright on all linux xfs code, it is certainly possible to offer it under an alternate license. http://www.gnu.org/licenses/gpl-faq.html#HeardOtherLicense : > I heard that someone got a copy of a GPL'ed program under another license. > Is this possible? > > The GNU GPL does not give users permission to attach other licenses to the > program. But the copyright holder for a program can release it under several > different licenses in parallel. One of them may be the GNU GPL. > > The license that comes in your copy, assuming it was put in by the copyright > holder and that you got the copy legitimately, is the license that applies > to your copy. -Eric (hoping the thread doesn't dissolve into a giant gpl speculation thread, having just fueled it further...) From stan@hardwarefreak.com Wed May 19 09:01:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JE17Ag133677 for ; Wed, 19 May 2010 09:01:08 -0500 X-ASG-Debug-ID: 1274277873-1b85005b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 47667156CBC8 for ; Wed, 19 May 2010 07:04:33 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id ZckiA8Dg4nXhvz8i for ; Wed, 19 May 2010 07:04:33 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 487936C24C for ; Wed, 19 May 2010 09:03:25 -0500 (CDT) Message-ID: <4BF3EFBD.7080808@hardwarefreak.com> Date: Wed, 19 May 2010 09:03:41 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel Subject: Re: mounting hixfs (Hitachi "tuned" XFS) on 2.6 kernel References: <4BF1EC44.7070803@hardwarefreak.com> <4BF219A6.4010900@hardwarefreak.com> <1274201857.17233.144.camel@montana.filmlight.ltd.uk> <4BF366C9.9050300@hardwarefreak.com> <4BF3ED40.20609@sandeen.net> In-Reply-To: <4BF3ED40.20609@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274277874 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2640 1.0000 -0.5089 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.09 X-Barracuda-Spam-Status: No, SCORE=0.09 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30256 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Eric Sandeen put forth on 5/19/2010 8:53 AM: >> The GNU GPL does not give users permission to attach other licenses to the >> program. But the copyright holder for a program can release it under several >> different licenses in parallel. One of them may be the GNU GPL. I admit my ignorance. I was under the impression the GPL forbade a copyright holder from releasing under parallel licenses if the GPL was one of them. Thank you for educating me Eric. It seems posts are made weekly to various lists that the reason ZFS can't/won't be included in Linux is because the Open Solaris license is incompatible with the GPL. According to what you posted, there's nothing stopping Oracle from releasing the ZFS source under multiple licenses concurrently, including the GPL. So I guess the "conventional wisdom" argument relating to Linux+GPL+ZFS is false. The reasons are "other". > (hoping the thread doesn't dissolve into a giant gpl speculation > thread, having just fueled it further...) Nah. This will be my only comment on it. I rarely swim in the GPL pool as I'm not a dev. Hence my ignorance. :( Again thanks for the education. -- Stan From stan@hardwarefreak.com Wed May 19 09:10:31 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JEAVPD134110 for ; Wed, 19 May 2010 09:10:31 -0500 X-ASG-Debug-ID: 1274278369-047803790000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 00B3B1DF3C5C for ; Wed, 19 May 2010 07:12:49 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id AxyDyzwrJHKlBB6L for ; Wed, 19 May 2010 07:12:49 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 843256C24C for ; Wed, 19 May 2010 09:12:49 -0500 (CDT) Message-ID: <4BF3F212.5030600@hardwarefreak.com> Date: Wed, 19 May 2010 09:13:38 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: noatime,nodiratime? Subject: noatime,nodiratime? Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274278370 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: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30257 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Need a little education here. I have a general understanding of what the inode access timestamps "are" but I have no idea what, if any, applications make use of these access times. I see posts all over Google land saying to use "noatime,nodiratime,logbufs=8" for XFS mount options to increase performance. Is there any potential downside to disabling atime? Do daemons such as Dovecot or Samba need these access times updated? Do any applications need this? Thanks. -- Stan From aelder@oss.sgi.com Wed May 19 09:31:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JEVlIF135743 for ; Wed, 19 May 2010 09:31:47 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o4JEVisP135424; Wed, 19 May 2010 09:31:44 -0500 Date: Wed, 19 May 2010 09:31:44 -0500 Message-Id: <201005191431.o4JEVisP135424@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus, updated. v2.6.33-10843-g8082f34 X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: 9bf729c0af67897ea8498ce17c29b0683f7f2028 X-Git-Newrev: 8082f34f5013f315473df7c78fe8ddfbedec3818 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-linus has been updated e158ccf Merge branch 'v2.6.34' 6ff75b7 xfs: mark xfs_iomap_write_ helpers static a413021 xfs: clean up end index calculation in xfs_page_state_convert 11720d2 xfs: clean up mapping size calculation in __xfs_get_blocks 76794fc xfs: clean up xfs_iomap_valid ebe4f59 xfs: move I/O type flags into xfs_aops.c 73e9c5e xfs: kill struct xfs_iomap 7c0fd24 xfs: report iomap_bn in block base 34ff304 xfs: report iomap_offset and iomap_bsize in block base fb7d0c9 xfs: remove iomap_delta 336f9cd xfs: remove iomap_target 89a603a xfs: limit xfs_imap_to_bmap to a single mapping c3626f7 xfs: simplify buffer to transaction matching 8ec826c xfs: Make fiemap work in query mode. 56e84ad xfs: add a shrinker to background inode reclaim 29db337 xfs: kill off l_sectbb_mask 678f0dc xfs: record log sector size rather than log2(that) e1e3a44 xfs: remove dead XFS_LOUD_RECOVERY code 87ffbbd xfs: removed unused XFS_QMOPT_ flags 58b3575 xfs: remove a few macro indirections in the quota code fcbd80f xfs: access quotainfo structure directly e9ec286 xfs: wait for direct I/O to complete in fsync and write_inode 40a6f8e xfs: more swap extent fixes for dynamic fork offsets f0ef9eb xfs: xfs_trace.c: duplicated include 4230937 xfs: minor odds and ends in xfs_log_recover.c 8057706 xfs: avoid repeated pointer dereferences 9be02e0 xfs: change a few labels in xfs_log_recover.c 4fd190c xfs: enforce synchronous writes in xfs_bwrite 1155962 xfs: remove periodic superblock writeback d65d59d xfs: make the log ticket transaction id random d993394 xfs: nothing special about 1-block log sector cf7af48 xfs: encapsulate bbcount validity checking 6610af4 xfs: kill XLOG_SECTOR_ROUND*() 4853b38 xfs: simplify XLOG_SECTOR_ROUND*() 55515d6 xfs: fix min bufsize bugs in two places c2b1d4f xfs: add const qualifiers to xfs error function args 4d62bf7 xfs: remove xfs_dqmarker 4e66454 xfs: convert the dquot free list to use list heads ff19c6b xfs: convert the dquot hash list to use list heads 808e75a xfs: remove duplicate code from dquot reclaim 23a35f5 xfs: convert the per-mount dquot list to use list heads bf886d4 xfs: add log item recovery tracing 777d8f6 xfs: don't warn on EAGAIN in inode reclaim e877e08 xfs: ensure that sync updates the log tail correctly 68a2ac7 xfs: clean up xlog_write_adv_cnt 9a0965f xfs: introduce new internal log vector structure 33841d9 xfs: reindent xlog_write b0c50e2 xfs: factor xlog_write ba08b39 xfs: log ticket reservation underestimates the number of iclogs 4da4898 xfs: Clean up xfs_trans_committed code after factoring ab4ea50 xfs: update and factor xfs_trans_committed() 72dec3a xfs: clean up xfs_trans_commit logic even more e35e0c8 xfs: split out iclog writing from xfs_trans_commit() 174d1ee xfs: fix reservation release commit flag in xfs_bmap_add_attrfork() 31534cc xfs: remove stale parameter from ->iop_unpin method aef714b xfs: Add inode pin counts to traces 1d3c797 xfs: factor log item initialisation 5b62938 xfs: add blockdev name to kthreads 080f453 xfs: Fix integer overflow in fs/xfs/linux-2.6/xfs_ioctl*.c from 9bf729c0af67897ea8498ce17c29b0683f7f2028 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_aops.c | 231 +++++++----- fs/xfs/linux-2.6/xfs_buf.c | 27 +- fs/xfs/linux-2.6/xfs_buf.h | 2 +- fs/xfs/linux-2.6/xfs_file.c | 2 + fs/xfs/linux-2.6/xfs_ioctl.c | 4 + fs/xfs/linux-2.6/xfs_ioctl32.c | 4 + fs/xfs/linux-2.6/xfs_iops.c | 5 +- fs/xfs/linux-2.6/xfs_super.c | 10 +- fs/xfs/linux-2.6/xfs_sync.c | 91 ++---- fs/xfs/linux-2.6/xfs_trace.c | 4 +- fs/xfs/linux-2.6/xfs_trace.h | 150 ++++++++- fs/xfs/quota/xfs_dquot.c | 193 +++++------ fs/xfs/quota/xfs_dquot.h | 35 +-- fs/xfs/quota/xfs_dquot_item.c | 30 +- fs/xfs/quota/xfs_qm.c | 609 ++++++++++++-------------------- fs/xfs/quota/xfs_qm.h | 23 +- fs/xfs/quota/xfs_qm_stats.c | 2 +- fs/xfs/quota/xfs_qm_syscalls.c | 152 ++++----- fs/xfs/quota/xfs_quota_priv.h | 102 ------ fs/xfs/quota/xfs_trans_dquot.c | 29 +- fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_buf_item.c | 55 ++-- fs/xfs/xfs_buf_item.h | 2 +- fs/xfs/xfs_error.c | 30 +- fs/xfs/xfs_error.h | 9 +- fs/xfs/xfs_extfree_item.c | 18 +- fs/xfs/xfs_inode.c | 2 + fs/xfs/xfs_inode_item.c | 21 +- fs/xfs/xfs_iomap.c | 123 ++----- fs/xfs/xfs_iomap.h | 47 +--- fs/xfs/xfs_log.c | 702 +++++++++++++++++++++++-------------- fs/xfs/xfs_log.h | 13 + fs/xfs/xfs_log_priv.h | 12 +- fs/xfs/xfs_log_recover.c | 311 ++++++++--------- fs/xfs/xfs_mount.c | 7 - fs/xfs/xfs_quota.h | 3 - fs/xfs/xfs_trans.c | 760 +++++++++++++++++++--------------------- fs/xfs/xfs_trans.h | 14 +- fs/xfs/xfs_trans_buf.c | 187 +++-------- 39 files changed, 1905 insertions(+), 2118 deletions(-) hooks/post-receive -- XFS development tree From niko@petole.demisel.net Wed May 19 12:31:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JHVYN3144386 for ; Wed, 19 May 2010 12:31:34 -0500 X-ASG-Debug-ID: 1274290431-7f5a01130000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from petole.demisel.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C23951B5D669 for ; Wed, 19 May 2010 10:33:52 -0700 (PDT) Received: from petole.demisel.net (petole.demisel.net [88.174.118.95]) by cuda.sgi.com with ESMTP id yQYrCV8m0al4yZHc for ; Wed, 19 May 2010 10:33:52 -0700 (PDT) Received: by petole.demisel.net (Postfix, from userid 1000) id 1FA076D859; Wed, 19 May 2010 19:33:49 +0200 (CEST) To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: noatime,nodiratime? Subject: Re: noatime,nodiratime? References: <4BF3F212.5030600@hardwarefreak.com> From: Nicolas KOWALSKI Date: Wed, 19 May 2010 19:33:49 +0200 In-Reply-To: <4BF3F212.5030600@hardwarefreak.com> Message-ID: <87mxvveqyq.fsf@petole.demisel.net> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: petole.demisel.net[88.174.118.95] X-Barracuda-Start-Time: 1274290432 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.2, rules version 3.2.2.30266 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Stan Hoeppner writes: > Need a little education here. I have a general understanding of what the > inode access timestamps "are" but I have no idea what, if any, applications > make use of these access times. I see posts all over Google land saying to > use "noatime,nodiratime,logbufs=8" for XFS mount options to increase > performance. BTW, about the mount options for XFS, is there a way to check for the default values (things like logbsize, logbufs, something else)? I used to have noatime,logbufs=8,logbsize=256k on my fileserver, not sure if these are still necessary. Thanks, -- Nicolas From stan@hardwarefreak.com Wed May 19 12:56:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JHuJeV145584 for ; Wed, 19 May 2010 12:56:20 -0500 X-ASG-Debug-ID: 1274291987-196502e30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6C5A99E8A93 for ; Wed, 19 May 2010 10:59:47 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id nuGaUtCEF3myRaRH for ; Wed, 19 May 2010 10:59:47 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 035056C24C for ; Wed, 19 May 2010 12:58:37 -0500 (CDT) Message-ID: <4BF42725.8060903@hardwarefreak.com> Date: Wed, 19 May 2010 13:00:05 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: noatime,nodiratime? Subject: Re: noatime,nodiratime? References: <4BF3F212.5030600@hardwarefreak.com> <87mxvveqyq.fsf@petole.demisel.net> In-Reply-To: <87mxvveqyq.fsf@petole.demisel.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274291987 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0208 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30266 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Nicolas KOWALSKI put forth on 5/19/2010 12:33 PM: > Stan Hoeppner writes: >> Need a little education here. I have a general understanding of what the >> inode access timestamps "are" but I have no idea what, if any, applications >> make use of these access times. I see posts all over Google land saying to >> use "noatime,nodiratime,logbufs=8" for XFS mount options to increase >> performance. > > BTW, about the mount options for XFS, is there a way to check for the > default values (things like logbsize, logbufs, something else)? > > I used to have noatime,logbufs=8,logbsize=256k on my fileserver, not > sure if these are still necessary. Yes, the defaults for each parameter are in your mount man page. logbsize=256K is higher than the default, which is 32K for any system with over 32MB RAM. logbufs=8 will be the default if your blocksize is 64K. If your blocksize is 4K you'll get logbufs=2 by default. This is all in the XFS section of man mount. -- Stan From BATV+3478df1fd675c5a5ef2d+2460+infradead.org+hch@bombadil.srs.infradead.org Wed May 19 13:21:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JILKiZ146609 for ; Wed, 19 May 2010 13:21:22 -0500 X-ASG-Debug-ID: 1274293487-1e8b03710000-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 D9B65156DD13 for ; Wed, 19 May 2010 11:24:47 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id h13cbQkXA4Js9fCn for ; Wed, 19 May 2010 11:24:47 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OEnvc-00032m-Tn; Wed, 19 May 2010 18:23:36 +0000 Date: Wed, 19 May 2010 14:23:36 -0400 From: Christoph Hellwig To: Stan Hoeppner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: noatime,nodiratime? Subject: Re: noatime,nodiratime? Message-ID: <20100519182336.GA6264@infradead.org> References: <4BF3F212.5030600@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4BF3F212.5030600@hardwarefreak.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274293487 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 19, 2010 at 09:13:38AM -0500, Stan Hoeppner wrote: > Need a little education here. I have a general understanding of what the > inode access timestamps "are" but I have no idea what, if any, applications > make use of these access times. I see posts all over Google land saying to > use "noatime,nodiratime,logbufs=8" for XFS mount options to increase > performance. Which doesn't make much sense. First 8 log buffers has been the default for XFS for a long time. Second nodiratime has always been useless as it is a strict subset of of noatime. Now noatime isn't the default yet, but instead relatime is, which still updates the atime in memory, but only writes it back when the inode has other changes, or on umount. It should give you equivalent performance to noatime, but better functionality. From BATV+3478df1fd675c5a5ef2d+2460+infradead.org+hch@bombadil.srs.infradead.org Wed May 19 13:22:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JIMGrN146654 for ; Wed, 19 May 2010 13:22:16 -0500 X-ASG-Debug-ID: 1274293475-26ce00d10000-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 84DE635BA96 for ; Wed, 19 May 2010 11:24:35 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id gKZ0bE9RvhJaHX9r for ; Wed, 19 May 2010 11:24:35 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OEnwY-0003Ih-Q3; Wed, 19 May 2010 18:24:34 +0000 Date: Wed, 19 May 2010 14:24:34 -0400 From: Christoph Hellwig To: Stan Hoeppner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: noatime,nodiratime? Subject: Re: noatime,nodiratime? Message-ID: <20100519182434.GB6264@infradead.org> References: <4BF3F212.5030600@hardwarefreak.com> <87mxvveqyq.fsf@petole.demisel.net> <4BF42725.8060903@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4BF42725.8060903@hardwarefreak.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1274293475 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 19, 2010 at 01:00:05PM -0500, Stan Hoeppner wrote: > Yes, the defaults for each parameter are in your mount man page. > logbsize=256K is higher than the default, which is 32K for any system with > over 32MB RAM. logbufs=8 will be the default if your blocksize is 64K. If > your blocksize is 4K you'll get logbufs=2 by default. This is all in the > XFS section of man mount. But it's not actually true anymore for a long time. XFS is always using 8 32k log buffers these days. I'll prepare an update for the mount man page to correct this. From aelder@sgi.com Wed May 19 13:33:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JIXhFu147090 for ; Wed, 19 May 2010 13:33:43 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 48CA0AC027; Wed, 19 May 2010 11:35:58 -0700 (PDT) Received: from [128.162.232.165] ([128.162.232.165]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 19 May 2010 13:35:58 -0500 Subject: Re: [PATCH 03/12] xfs: modify buffer item reference counting From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1274138668-1662-4-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> <1274138668-1662-4-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 19 May 2010 13:35:58 -0500 Message-ID: <1274294158.2140.35.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: quoted-printable X-OriginalArrivalTime: 19 May 2010 18:35:58.0423 (UTC) FILETIME=[1FC40670:01CAF782] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-05-18 at 09:24 +1000, Dave Chinner wrote: > From: Dave Chinner >=20 > The buffer log item reference counts used to take reference=D1=95 for eve= ry > transaction, similar to the pin counting. This is symmetric (like the > pin/unpin) with respect to transaction completion, but with dleayed loggi= ng > becomes assymetric as the pinning becomes assymetric w.r.t. transaction > completion. Doing the reference counts this way is an improvement. I have a question below. . . . > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c . . . > STATIC void > xfs_buf_item_unlock( > @@ -514,73 +523,54 @@ xfs_buf_item_unlock( > =20 > bp =3D bip->bli_buf; > =20 > - /* > - * Clear the buffer's association with this transaction. > - */ > + /* Clear the buffer's association with this transaction. */ > XFS_BUF_SET_FSPRIVATE2(bp, NULL); > =20 > /* > - * If this is a transaction abort, don't return early. > - * Instead, allow the brelse to happen. > - * Normally it would be done for stale (cancelled) buffers > - * at unpin time, but we'll never go through the pin/unpin > - * cycle if we abort inside commit. > + * If this is a transaction abort, don't return early. Instead, allow > + * the brelse to happen. Normally it would be done for stale > + * (cancelled) buffers at unpin time, but we'll never go through the > + * pin/unpin cycle if we abort inside commit. > */ > aborted =3D (bip->bli_item.li_flags & XFS_LI_ABORTED) !=3D 0; > =20 > /* > - * If the buf item is marked stale, then don't do anything. > - * We'll unlock the buffer and free the buf item when the > - * buffer is unpinned for the last time. > + * Before possibly freeing the buf item, determine if we should > + * release the buffer at the end of this routine. > + */ > + hold =3D bip->bli_flags & XFS_BLI_HOLD; > + > + /* Clear the per transaction state. */ > + bip->bli_flags &=3D ~(XFS_BLI_LOGGED | XFS_BLI_HOLD); > + > + /* > + * If the buf item is marked stale, then don't do anything. We'll > + * unlock the buffer and free the buf item when the buffer is unpinned > + * for the last time. > */ > if (bip->bli_flags & XFS_BLI_STALE) { > - bip->bli_flags &=3D ~XFS_BLI_LOGGED; > trace_xfs_buf_item_unlock_stale(bip); > ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); > - if (!aborted) > + if (!aborted) { > + atomic_dec(&bip->bli_refcount); I notice that, unlike before, if you return via this path the XFS_BLI_HOLD flag will have been turned off. I guess I don't know off hand whether this is an issue. Can you explain why it is not? > return; > + } > } > =20 . . . From BATV+3478df1fd675c5a5ef2d+2460+infradead.org+hch@bombadil.srs.infradead.org Wed May 19 13:40:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JIe8wX147397 for ; Wed, 19 May 2010 13:40:09 -0500 X-ASG-Debug-ID: 1274294547-4ba203960000-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 B867235C160 for ; Wed, 19 May 2010 11:42:27 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id K8hgRIJVM20EWoHq for ; Wed, 19 May 2010 11:42:27 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OEoDp-0000If-Rp; Wed, 19 May 2010 18:42:25 +0000 Date: Wed, 19 May 2010 14:42:25 -0400 From: Christoph Hellwig To: Jan Kara Cc: xfs@oss.sgi.com, hch@infradead.org X-ASG-Orig-Subj: Re: [PATCH 2/7] Fix test whether kernel supports quotas Subject: Re: [PATCH 2/7] Fix test whether kernel supports quotas Message-ID: <20100519184225.GA32747@infradead.org> References: <1274276289-8839-1-git-send-email-jack@suse.cz> <1274276289-8839-3-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274276289-8839-3-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1274294547 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 19, 2010 at 03:38:04PM +0200, Jan Kara wrote: > For all 2.6 kernels presence of quota support in kernel can be detected by > checking /proc/sys/fs/quota. This is actually more reliable than trying to > mount a filesystem with quota options (for example because SCRATCH_DEV does > not have to contain a filesystem type we are going to test). It's not actually correct. /proc/sys/fs/quota only gets registered by fs/quota/dquot.c, which means it's not avaiable in a kernel that only has XFS quotas. From aelder@sgi.com Wed May 19 14:07:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JJ72jR148613 for ; Wed, 19 May 2010 14:07:03 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id F36C4304070; Wed, 19 May 2010 12:09:18 -0700 (PDT) Received: from [128.162.232.165] ([128.162.232.165]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 19 May 2010 14:09:17 -0500 Subject: Re: [PATCH 04/12] xfs: Clean up XFS_BLI_* flag namespace From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1274138668-1662-5-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> <1274138668-1662-5-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 19 May 2010 14:09:16 -0500 Message-ID: <1274296156.2140.51.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 19 May 2010 19:09:18.0063 (UTC) FILETIME=[C7A4DFF0:01CAF786] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-05-18 at 09:24 +1000, Dave Chinner wrote: > From: Dave Chinner > > Clean up the buffer log format (XFS_BLI_*) flags because they have a > polluted namespace. They XFS_BLI_ prefix is used for both in-memory > and on-disk flag feilds, but have overlapping values for different > flags. Rename the buffer log format flags to use the XFS_BLF_* > prefix to avoid confusing them with the in-memory XFS_BLI_* prefixed > flags. This is a good change. That XFS_BLI_INODE_BUF thing was nasty. One little comment below, but otherwise looks good. > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig > --- > fs/xfs/linux-2.6/xfs_super.c | 2 +- > fs/xfs/quota/xfs_dquot.c | 6 ++-- . . . > diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h > index df44545..8cbb82b 100644 > --- a/fs/xfs/xfs_buf_item.h > +++ b/fs/xfs/xfs_buf_item.h > @@ -41,22 +41,22 @@ typedef struct xfs_buf_log_format { > * This flag indicates that the buffer contains on disk inodes > * and requires special recovery handling. > */ > -#define XFS_BLI_INODE_BUF 0x1 > +#define XFS_BLF_INODE_BUF 0x1 > /* > * This flag indicates that the buffer should not be replayed > * during recovery because its blocks are being freed. > */ > -#define XFS_BLI_CANCEL 0x2 > +#define XFS_BLF_CANCEL 0x2 > /* > * This flag indicates that the buffer contains on disk > * user or group dquots and may require special recovery handling. > */ > -#define XFS_BLI_UDQUOT_BUF 0x4 > -#define XFS_BLI_PDQUOT_BUF 0x8 > -#define XFS_BLI_GDQUOT_BUF 0x10 > +#define XFS_BLF_UDQUOT_BUF 0x4 > +#define XFS_BLF_PDQUOT_BUF 0x8 > +#define XFS_BLF_GDQUOT_BUF 0x10 I know this isn't part of your change, but I think a small comment here would make it more obvious that the following are numeric values, distinct from the bits defined just above (and therefore not part of the same name space for flags). Not a big deal--I'll make a note of it and may do it myself someday. > -#define XFS_BLI_CHUNK 128 > -#define XFS_BLI_SHIFT 7 > +#define XFS_BLF_CHUNK 128 > +#define XFS_BLF_SHIFT 7 From niko@petole.demisel.net Wed May 19 14:08:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JJ8MiP148669 for ; Wed, 19 May 2010 14:08:22 -0500 X-ASG-Debug-ID: 1274296307-3253018f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from petole.demisel.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 96C01129A05F for ; Wed, 19 May 2010 12:11:47 -0700 (PDT) Received: from petole.demisel.net (petole.demisel.net [88.174.118.95]) by cuda.sgi.com with ESMTP id Z0SRF4x4ASndl6tu for ; Wed, 19 May 2010 12:11:47 -0700 (PDT) Received: by petole.demisel.net (Postfix, from userid 1000) id D4DD36D85E; Wed, 19 May 2010 21:10:37 +0200 (CEST) To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: noatime,nodiratime? Subject: Re: noatime,nodiratime? References: <4BF3F212.5030600@hardwarefreak.com> <87mxvveqyq.fsf@petole.demisel.net> <4BF42725.8060903@hardwarefreak.com> <20100519182434.GB6264@infradead.org> From: Nicolas KOWALSKI Date: Wed, 19 May 2010 21:10:37 +0200 In-Reply-To: <20100519182434.GB6264@infradead.org> Message-ID: <87iq6jemhe.fsf@petole.demisel.net> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: petole.demisel.net[88.174.118.95] X-Barracuda-Start-Time: 1274296309 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.2, rules version 3.2.2.30273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig writes: > On Wed, May 19, 2010 at 01:00:05PM -0500, Stan Hoeppner wrote: >> Yes, the defaults for each parameter are in your mount man page. >> logbsize=256K is higher than the default, which is 32K for any system with >> over 32MB RAM. logbufs=8 will be the default if your blocksize is 64K. If >> your blocksize is 4K you'll get logbufs=2 by default. This is all in the >> XFS section of man mount. > > But it's not actually true anymore for a long time. XFS is always using > 8 32k log buffers these days. I'll prepare an update for the mount man > page to correct this. Ok, Thanks for the reminder and update. -- Nicolas From aelder@sgi.com Wed May 19 14:14:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JJERUV149013 for ; Wed, 19 May 2010 14:14:28 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id AC2F230407A; Wed, 19 May 2010 12:16:46 -0700 (PDT) Received: from [128.162.232.165] ([128.162.232.165]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 19 May 2010 14:16:46 -0500 Subject: Re: [PATCH 05/12] xfs: clean up log ticket overrun debug output From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1274138668-1662-6-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> <1274138668-1662-6-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 19 May 2010 14:16:44 -0500 Message-ID: <1274296604.2140.55.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 19 May 2010 19:16:46.0407 (UTC) FILETIME=[D2E0BD70:01CAF787] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-05-18 at 09:24 +1000, Dave Chinner wrote: > From: Dave Chinner > > Push the error message output when a ticket overrun is detected > into the ticket printing functions. Also remove the debug version > of the code as the production version will still panic just as > effectively on a debug kernel via the panic mask being set. Another not-really-actionable bit of commentary below, but this looks good. > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig > --- > fs/xfs/xfs_error.c | 2 +- > fs/xfs/xfs_log.c | 19 +++++-------------- > 2 files changed, 6 insertions(+), 15 deletions(-) > > diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c > index ef96175..047b8a8 100644 > --- a/fs/xfs/xfs_error.c > +++ b/fs/xfs/xfs_error.c > @@ -170,7 +170,7 @@ xfs_cmn_err(int panic_tag, int level, xfs_mount_t *mp, char *fmt, ...) > va_list ap; > > #ifdef DEBUG > - xfs_panic_mask |= XFS_PTAG_SHUTDOWN_CORRUPT; > + xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES); > #endif > > if (xfs_panic_mask && (xfs_panic_mask & panic_tag) > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 83be6a6..1efb303 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -1645,6 +1645,10 @@ xlog_print_tic_res(xfs_mount_t *mp, xlog_ticket_t *ticket) > "bad-rtype" : res_type_str[r_type-1]), > ticket->t_res_arr[i].r_len); > } > + > + xfs_cmn_err(XFS_PTAG_LOGRES, CE_ALERT, mp, > + "xfs_log_write: reservation ran out. Need to up reservation"); > + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); > } > > /* > @@ -1897,21 +1901,8 @@ xlog_write( > *start_lsn = 0; > > len = xlog_write_calc_vec_length(ticket, log_vector); > - if (ticket->t_curr_res < len) { > + if (ticket->t_curr_res < len) > xlog_print_tic_res(log->l_mp, ticket); Somehow "xlog_print_tic_res" doesn't suggest to me that we're going to panic at this point, and I think therefore that bit of information is lost with this change. I prefer what you've done, but I think I would have liked some brief comment or something that tells me this is a fatal condition. > -#ifdef DEBUG > - xlog_panic( > - "xfs_log_write: reservation ran out. Need to up reservation"); > -#else > - /* Customer configurable panic */ > - xfs_cmn_err(XFS_PTAG_LOGRES, CE_ALERT, log->l_mp, > - "xfs_log_write: reservation ran out. Need to up reservation"); > - > - /* If we did not panic, shutdown the filesystem */ > - xfs_force_shutdown(log->l_mp, SHUTDOWN_CORRUPT_INCORE); > -#endif > - } > - > ticket->t_curr_res -= len; > > index = 0; From stan@hardwarefreak.com Wed May 19 14:21:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JJLuR7149350 for ; Wed, 19 May 2010 14:21:56 -0500 X-ASG-Debug-ID: 1274297054-26e601d20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 576E735BFAD for ; Wed, 19 May 2010 12:24:15 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id 9wA2eLdDXQk8VyAZ for ; Wed, 19 May 2010 12:24:15 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id A71836C24C for ; Wed, 19 May 2010 14:24:14 -0500 (CDT) Message-ID: <4BF43B3C.6030403@hardwarefreak.com> Date: Wed, 19 May 2010 14:25:48 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: noatime,nodiratime? Subject: Re: noatime,nodiratime? References: <4BF3F212.5030600@hardwarefreak.com> <20100519182336.GA6264@infradead.org> In-Reply-To: <20100519182336.GA6264@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274297055 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig put forth on 5/19/2010 1:23 PM: > On Wed, May 19, 2010 at 09:13:38AM -0500, Stan Hoeppner wrote: >> Need a little education here. I have a general understanding of what the >> inode access timestamps "are" but I have no idea what, if any, applications >> make use of these access times. I see posts all over Google land saying to >> use "noatime,nodiratime,logbufs=8" for XFS mount options to increase >> performance. > > Which doesn't make much sense. First 8 log buffers has been the default > for XFS for a long time. Second nodiratime has always been useless as > it is a strict subset of of noatime. Now noatime isn't the default yet, > but instead relatime is, which still updates the atime in memory, but > only writes it back when the inode has other changes, or on umount. > It should give you equivalent performance to noatime, but better > functionality. Wow. That'll teach me to trust that man pages are accurate. :) Maybe you could add this explanation about relatime vs noatime to the man page as well. Any chance xfs_info could be updated to output the information we're discussing, including spitting out the XFS specific mount options that are currently active at the time of running xfs_info? There seems to be much confusion in the community due to lack of accurate information being available. Google for "XFS performance" and you'll see "noatime,nodiratime,logbufs=8" mentioned consistently from early 2000's to the present as a performance enhancer. If what you say is true, on my 2.6.32.9 system, I actually decreased logbufs from 8 to 4 half an hour ago, instead of increasing it from 2 to 4, as man lead me to believe I was doing. Do any of the xfs tools output the XFS specific active mount options allowing an op to confirm changes? As someone else stated it would be nice to be able to see these parameter values. As is, AFAICT, there's no way to confirm these parameter values. -- Stan From sandeen@sandeen.net Wed May 19 14:48:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JJmF4I150589 for ; Wed, 19 May 2010 14:48:16 -0500 X-ASG-Debug-ID: 1274298702-623901150000-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 0305E109A4E2 for ; Wed, 19 May 2010 12:51:42 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IJritcq3BZGFIkG3 for ; Wed, 19 May 2010 12:51:42 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o4JJoV6H026139 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 19 May 2010 15:50:31 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o4JJoTjP010016; Wed, 19 May 2010 15:50:30 -0400 Message-ID: <4BF44105.4040902@sandeen.net> Date: Wed, 19 May 2010 14:50:29 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100301 Fedora/3.0.3-1.fc11 Lightning/1.0b2pre Thunderbird/3.0.3 MIME-Version: 1.0 To: Stan Hoeppner CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: noatime,nodiratime? Subject: Re: noatime,nodiratime? References: <4BF3F212.5030600@hardwarefreak.com> <20100519182336.GA6264@infradead.org> <4BF43B3C.6030403@hardwarefreak.com> In-Reply-To: <4BF43B3C.6030403@hardwarefreak.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.17 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1274298704 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 05/19/2010 02:25 PM, Stan Hoeppner wrote: > Any chance xfs_info could be updated to output the information we're > discussing, including spitting out the XFS specific mount options that are > currently active at the time of running xfs_info? xfs_info actually calls xfs_growfs -n, and it's only reporting on-disk geometry. I kind of doubt that'll change. If you want to see mount options, /proc/mounts is the place ... but then we don't show the defaults ;) I wonder if we should change that and be explicit about every option in /proc/mounts *shrug* > There seems to be much > confusion in the community due to lack of accurate information being > available. Google for "XFS performance" and you'll see > "noatime,nodiratime,logbufs=8" mentioned consistently from early 2000's to > the present as a performance enhancer. It's so hard to keep google up to date ;) > If what you say is true, on my 2.6.32.9 system, I actually decreased logbufs > from 8 to 4 half an hour ago, instead of increasing it from 2 to 4, as man > lead me to believe I was doing. Do any of the xfs tools output the XFS > specific active mount options allowing an op to confirm changes? As someone > else stated it would be nice to be able to see these parameter values. As > is, AFAICT, there's no way to confirm these parameter values. /proc/mounts shows all mount options which were set differently from defaults. -Eric From aelder@oss.sgi.com Wed May 19 15:08:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JK8Dta151714 for ; Wed, 19 May 2010 15:08:13 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o4JK8CGB151692; Wed, 19 May 2010 15:08:12 -0500 Date: Wed, 19 May 2010 15:08:12 -0500 Message-Id: <201005192008.o4JK8CGB151692@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree annotated tag, v2.6.34, created. v2.6.34 X-Git-Refname: refs/tags/v2.6.34 X-Git-Reftype: annotated tag X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: dba2e709efc365df385a762e763b51365403bc0f This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The annotated tag, v2.6.34 has been created at dba2e709efc365df385a762e763b51365403bc0f (tag) tagging e40152ee1e1c7a63f4777791863215e3faa37a86 (commit) replaces v2.6.34-rc7 tagged by Linus Torvalds on Sun May 16 14:17:44 2010 -0700 - Log ----------------------------------------------------------------- Linux 2.6.34 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEABECAAYFAkvwYP0ACgkQF3YsRnbiHLsEVACguYLCUI+ECtmeARH8t2IbFU9i X1UAn1qcw6VhIQ6hdO2Z26y2yhDQ65yJ =crQi -----END PGP SIGNATURE----- Al Viro (2): Fix the regression created by "set S_DEAD on unlink()..." commit Fix double-free in logfs Alan Cox (1): tty: Fix unbalanced BKL handling in error path Alan Ott (1): HID: hidraw: fix numbered reports Alan Stern (1): HID: fix suspend crash by moving initializations earlier Alex Chiang (1): ACPI: sleep: eliminate duplicate entries in acpisleep_dmi_table[] Anatolij Gustschin (1): serial: mpc52xx_uart: fix null pointer dereference Andreas Herrmann (1): x86, amd: Check X86_FEATURE_OSVW bit before accessing OSVW MSRs Andreas Meissner (1): IPv4: unresolved multicast route cleanup Andrej Gelenberg (1): ALSA: hda - add support for Lenovo ThinkPad X100e in conexant codec Andrew Morton (1): drivers/gpu/drm/i915/i915_irq.c:i915_error_object_create(): use correct kmap-atomic slot AndrĂ© Goddard Rosa (1): mqueue: fix kernel BUG caused by double free() on mq_open() Antonio Ospite (1): HID: sony: fix sony_set_operational_bt Arnaldo Carvalho de Melo (1): perf record: Add a fallback to the reference relocation symbol Benjamin Herrenschmidt (1): Merge commit 'kumar/merge' into merge Bjørn Mork (1): ipv4: udp: fix short packet and bad checksum logging Borislav Petkov (1): x86, k8: Fix build error when K8_NB is disabled Brian Haley (1): IPv6: fix IPV6_RECVERR handling of locally-generated errors Catalin Marinas (5): ARM: 6105/1: Fix the __arm_ioremap_caller() definition in nommu.c ARM: 6106/1: Implement copy_to_user_page() for noMMU ARM: 6111/1: Implement read/write for ownership in the ARMv6 DMA cache ops ARM: 6112/1: Use the Inner Shareable I-cache and BTB ops on ARMv7 SMP ARM: 6110/1: Fix Thumb-2 kernel builds when UACCESS_WITH_MEMCPY is enabled Chandrakala Chavva (1): MIPS: N32: Use compat version for sys_ppoll. Chris Wright (1): rtnetlink: make SR-IOV VF interface symmetric Christian Lamparter (1): ar9170: wait for asynchronous firmware loading Clemens Ladisch (1): ALSA: virtuoso: fix Xonar D1/DX front panel microphone Cory Fields (1): HID: wacom: remove annoying non-error printk Dan Carpenter (1): fs/sysv: dereferencing ERR_PTR() Dan Rosenberg (1): Btrfs: check for read permission on src file in the clone ioctl Daniel T Chen (1): ALSA: hda: Fix 0 dB for Lenovo models using Conexant CX20549 (Venice) David Howells (2): CacheFiles: Fix occasional EIO on call to vfs_unlink() CacheFiles: Fix error handling in cachefiles_determine_cache_security() David Rientjes (1): x86: Fix fake apicid to node mapping for numa emulation David S. Miller (4): phy: Fix initialization in micrel driver. net: Fix FDDI and TR config checks in ipv4 arp and LLC. Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 Merge branch 'net-2.6' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost Denis Turischev (1): it8761e_gpio: fix bug in gpio numbering Dmitry Torokhov (2): Input: elantech - use all 3 bytes when checking version Input: psmouse - reset all types of mice before reconnecting Dongxiao Xu (1): KVM: x86: Call vcpu_load and vcpu_put in cpuid_update Eric Dumazet (2): veth: Dont kfree_skb() after dev_forward_skb() tcp: fix MD5 (RFC2385) support Eric Paris (2): inotify: clean up the inotify_add_watch out path inotify: race use after free/double free in inotify inode marks FUJITA Tomonori (1): dma-mapping: fix dma_sync_single_range_* Frank Arnold (1): x86, cacheinfo: Turn off L3 cache index disable feature in virtualized environments Frederic Weisbecker (1): perf: Fix static strings treated like dynamic ones Gerald Schaefer (1): [S390] ptrace: fix return value of do_syscall_trace_enter() H. Peter Anvin (1): x86, mrst: Don't blindly access extended config space Henrik Rydberg (1): hwmon: (applesmc) Correct sysfs fan error handling Hugh Dickins (2): hughd: update email address profile: fix stats and data leakage Ian Kent (1): autofs4-2.6.34-rc1 - fix link_count usage Jan Blunck (1): JFS: Free sbi memory in error path Jan Kara (1): vfs: Fix O_NOFOLLOW behavior for paths with trailing slashes Jan Kiszka (1): KVM: VMX: blocked-by-sti must not defer NMI injections Jean Delvare (1): drm/radeon: Fix 3 regressions - since buffer rework Jeff Layton (1): cifs: guard against hardlinking directories Jiri Kosina (1): HID: ntrig: explain firmware quirk Joerg Roedel (1): KVM: SVM: Fix wrong intercept masks on 32 bit Johannes Berg (1): iwlwifi: work around passive scan issue KAMEZAWA Hiroyuki (2): memcg: fix css_id() RCU locking for real memcg: fix css_is_ancestor() RCU locking Kees Cook (1): mmap_min_addr check CAP_SYS_RAWIO only for write Ken Milmore (1): hwmon: (asc7621) Bug fixes Kumar Gala (1): powerpc/swiotlb: Fix off by one in determining boundary of which ops to use Linus Torvalds (30): Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid Merge branch 'fix/hda' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging Revert "PCI: update bridge resources to get more big ranges in PCI assign unssigned" Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6 Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6 Merge branch 'kvm-updates/2.6.34' of git://git.kernel.org/pub/scm/virt/kvm/kvm Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6 Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge branch 'davinci-fixes-for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-davinci Merge branch 'for-linus' of git://git.infradead.org/users/eparis/notify Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge master.kernel.org:/home/rmk/linux-2.6-arm Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Linus 2.6.34 Marcelo Tosatti (1): KVM: convert ioapic lock to spinlock Marek Vasut (2): Input: iforce - add Guillemot Jet Leader Force Feedback Input: iforce - fix Guillemot Jet Leader 3D entry Mark Brown (1): mfd: Clean up after WM83xx AUXADC interrupt if it arrives late Martin Schwidefsky (1): [S390] correct address of _stext with CONFIG_SHARED_KERNEL=y Masami Hiramatsu (1): kprobes/x86: Fix removed int3 checking order Mel Gorman (1): hugetlbfs: kill applications that use MAP_NORESERVE with SIGBUS instead of OOM-killer Michael Hennerich (1): fbdev: bfin-t350mcqb-fb: fix fbmem allocation with blanking lines Michael S. Tsirkin (1): vhost: fix barrier pairing Michal Simek (4): microblaze: Remove compilation warnings in cache macro microblaze: Remove powerpc code from Microblaze port microblaze: export assembly functions used by modules microblaze: Fix module loading on system with WB cache Michel Lespinasse (1): rwsem: Test for no active locks in __rwsem_do_wake undo code Naoya Horiguchi (1): rmap: remove anon_vma check in page_address_in_vma() Nicolas Ferre (5): mmc: atmel-mci: fix two parameters swapped mmc: atmel-mci: prevent kernel oops while removing card mmc: atmel-mci: remove data error interrupt after xfer mmc: atmel-mci: fix in debugfs: response value printing mmc: at91_mci: modify cache flush routines Oliver Neukum (1): hp_accel: fix race in device removal Oskar Schirmer (1): Input: ad7877 - keep dma rx buffers in seperate cache lines Paul Mackerras (1): powerpc/perf_event: Fix oops due to perf_event_do_pending call Pavel Emelyanov (1): inotify: don't leak user struct on inotify release Rafi Rubin (3): HID: ntrig: Emit TOUCH with DOUBLETAP for single touch HID: ntrig: TipSwitch for single touch mode touch. HID: ntrig: Remove unused macro, TripleTap and QuadTap RaphaĂ«l Doursenaud (1): HID: add support for cymotion master solar keyboard Reinette Chatre (1): mac80211: remove association work when processing deauth request Robin Holt (1): revert "procfs: provide stack information for threads" and its fixup commits Roel Kluin (1): KVM: PPC: Keep index within boundaries in kvmppc_44x_emul_tlbwe() Russell King (1): Inotify: undefined reference to `anon_inode_getfd' Sage Weil (9): ceph: unregister bdi before kill_anon_super releases device name ceph: don't use writeback_control in writepages completion ceph: unregister osd request on failure ceph: fix open file counting on snapped inodes when mds returns no caps ceph: resubmit requests on pg mapping change (not just primary change) ceph: fix locking for waking session requests after reconnect ceph: zero unused message header, footer fields ceph: fix cap removal races ceph: preserve seq # on requeued messages after transient transport errors Sebastian Andrzej Siewior (1): net/gianfar: drop recycled skbs on MTU change Sergei Shtylyov (1): DA830: fix USB 2.0 clock entry Shane McDonald (1): MIPS FPU emulator: allow Cause bits of FCSR to be writeable by ctc1 Srinidhi Kasagar (2): ARM: 6125/1: ARM TWD: move TWD registers to common header ARM: 6126/1: ARM mpcore_wdt: fix build failure and other fixes Stefan Lippers-Hollmann (1): ALSA: Revert "ALSA: hda/realtek: quirk for D945GCLF2 mainboard" Stefan Weinhuber (1): [S390] dasd: fix race between tasklet and dasd_sleep_on Stephane Chatty (1): HID: fix N-trig touch panel with recent firmware Steven J. Magnani (3): microblaze: re-enable interrupts before calling schedule microblaze: fix get_user/put_user side-effects microblaze: export assembly functions used by modules Takashi Iwai (5): ALSA: hda - Fix mute-LED GPIO pin for HP dv series ALSA: hda - Add hp-dv4 model for IDT 92HD71bx ALSA: pcm - Use pgprot_noncached() for MIPS non-coherent archs ALSA: ice1724 - Fix ESI Maya44 capture source control Merge branch 'fix/hda' into for-linus Valentin Longchamp (1): serial: imx.c: fix CTS trigger level lower to avoid lost chars Vitaliy Gusev (1): bsdacct: use del_timer_sync() in acct_exit_ns() Vitaly Mayatskikh (1): kexec: fix OOPS in crash_kernel_shrink Vlad Yasevich (1): sctp: Fix a race between ICMP protocol unreachable and connect() Wei Yongjun (1): sctp: delete active ICMP proto unreachable timer when free transport Wu Fengguang (1): ALSA: hda - fix DG45ID SPDIF output Wu Zhangjin (1): MIPS: Oprofile: Fix Loongson irq handler kirjanov@gmail.com (1): lib/btree: fix possible NULL pointer dereference ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Wed May 19 15:08:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=ALL_TRUSTED,BAYES_00, J_CHICKENPOX_13,J_CHICKENPOX_21,J_CHICKENPOX_23,J_CHICKENPOX_31, J_CHICKENPOX_44 autolearn=no version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JK8IfE151787 for ; Wed, 19 May 2010 15:08:18 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o4JK8FlL151758; Wed, 19 May 2010 15:08:15 -0500 Date: Wed, 19 May 2010 15:08:15 -0500 Message-Id: <201005192008.o4JK8FlL151758@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree annotated tag, v2.6.34-rc2, created. v2.6.34-rc2 X-Git-Refname: refs/tags/v2.6.34-rc2 X-Git-Reftype: annotated tag X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 2fc56a2a7aa32adeddf7efe074b38cbdbb41894a This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The annotated tag, v2.6.34-rc2 has been created at 2fc56a2a7aa32adeddf7efe074b38cbdbb41894a (tag) tagging 220bf991b0366cc50a94feede3d7341fa5710ee4 (commit) replaces v2.6.34-rc1 tagged by Linus Torvalds on Fri Mar 19 18:18:08 2010 -0700 - Log ----------------------------------------------------------------- Linux 2.6.34-rc2 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEABECAAYFAkukIlQACgkQF3YsRnbiHLthZQCgoA8YAKNPtvIMbq4vVnlQm5Rz GLEAoKlCTxGZv8dMG1Lq6V3pi3cfDSyb =/UTZ -----END PGP SIGNATURE----- Aaro Koskinen (2): omap: pass the reboot command to the boot loader omap: mach-omap2/io.c: fix function declarations Adam Buchbinder (7): Fix a grammar error (redundant "be") in comment Fix misspelling of "truly" in a label. Fix misspellings of "truly" in comments. Fix misspellings of "invocation" in comments. Fix misspellings of "separate" in strings. Fix misspelling of "successful" and variants in comments. Fix misspelling of "should" and "shouldn't" in comments. Adam Lackorzynski (1): powerpc: Fix SMP build with disabled CPU hotplugging. Ajit Khaparde (3): be2net: remove usage of be_pci_func be2net: remove unused code in be_load_fw be2net: fix mccq create for big endian architectures Akinobu Mita (8): udf: use ext2_find_next_bit sgi-gru: use for_each_set_bit() btrfs: use memparse phonet: use for_each_set_bit() atm: use for_each_set_bit() ntfs: use bitmap_weight hpet: use for_each_set_bit() alpha: use __ratelimit Alan Stern (2): Input: enable remote wakeup for PNP i8042 keyboard ports USB: fix usbfs regression Albert Herranz (1): sdio: recognize io card without powercycle Alberto Panizzo (3): w1: mxc_w1: move probe() and remove() to the dev* text area backlight: Add Epson L4F00242T03 LCD driver backlight: l4f00242t03: Fix module licence absence. Alessio Igor Bogani (1): USB: ftdi_sio: Fix locking for change_speed() function Alex Chiang (12): ACPI: processor: mv processor_core.c processor_driver.c ACPI: processor: mv processor_pdc.c processor_core.c ACPI: processor: export acpi_get_cpuid() ACPI: processor: move acpi_get_cpuid into processor_core.c ACPI: processor: add internal processor_physically_present() ACPI: processor: remove early _PDC optin quirks ACPI: processor: driver doesn't need to evaluate _PDC ACPI: processor: refactor internal map_lapic_id() ACPI: processor: refactor internal map_x2apic_id() ACPI: processor: refactor internal map_lsapic_id() ACPI: processor: push file static MADT pointer into internal map_madt_entry() USB: xhci: rename driver to xhci_hcd Alex Elder (2): xfs: remove old vmap cache xfs: use scalable vmap API Alex Viskovatoff (1): fs/ufs: recognize Solaris-specific file system state Alexander Beregalov (1): ceph: move dereference after NULL test Alexander Clouter (1): [ARM] kirkwood: combine support for openrd base/client support Alexey Dobriyan (1): nsproxy: remove INIT_NSPROXY() Alexey Starikovskiy (4): ACPI: Battery: Add bit flags POWER: Add support for cycle_count ACPI: SBS: Export cycle_count ACPI: Battery: Add support for _BIX extended info method Ali Gholami Rudi (1): doc: fix checking socket() in net tstamp example Amit Kucheria (6): mxc: TrustZone interrupt controller (TZIC) for Freescale i.MX5 family mxc: changes to common plat-mxc code to add support for i.MX5 mxc: Core support for Freescale i.MX5 series mxc: Add support for the Babbage board (i.MX5) mxc: Add mx51_defconfig mxc: MAINTAINERS: Add maintainer for mach-mx5 Amit Kumar Salecha (2): qlcnic: fix bios version check qlcnic: remove extra space from board names Amit Shah (1): hvc_console: Fix race between hvc_close and hvc_remove Anders Grafström (1): ARM: 5991/1: Fix regression in restore_user_regs macro Andiry Xu (1): USB: xHCI: re-initialize cmd_completion Andrea Gelmini (2): powerpc/cpm2: Checkpatch cleanup omap: Checkpatch cleanup for blizzard.h Andrej Gelenberg (1): HID: add quirk for UC-Logik WP4030 tablet Andrew Clayton (1): ARM/OMAP: Remove the +x bit from a couple of source files Andrew Morton (1): drivers/char/mem.c: cleanups AndrĂ© Goddard Rosa (1): coredump: plug a memory leak situation on dump_seek() Andy Green (5): ARM: S3C64XX: Add SROM register definitions ARM: SMDK6410: Add nC1 chipselect SROM setup ARM: S3C64XX: Add virtual mapping for S3C64XX SROM area ARM: SMDK6410: Add comments on ethernet connectivity imx-serial-excessive-status-clearing-on-break.patch Aneesh Kumar K.V (3): net/9p: Use the tag name in the config space for identifying mount point net/9p: Add sysfs mount_tag file for virtio 9P device fs/9p: re-init the wstat in readdir loop Anisse Astier (1): ALSA: hda - Add PCI quirks for MSI NetOn AP1900 and Wind Top AE2220 Anton Blanchard (1): Remove reference to kthread_create_on_cpu Anton Vorontsov (6): gianfar: Fix TX ring processing on SMP machines powerpc/85xx: Convert socrates_fpga_pic_lock to raw_spinlock powerpc/82xx: Convert pci_pic_lock to raw_spinlock powerpc/qe: Convert qe_ic_lock to raw_spinlock powerpc/86xx: Convert gef_pic_lock to raw_spinlock leds-gpio: fix default state handling on OF platforms Arnaldo Carvalho de Melo (6): perf archive: Don't try to collect files without a build-id tracing: Update the comm field in the right variable in update_max_tr perf tools: Don't trow away old map slices not overlapped by new maps perf probe: Add missing variable initialization perf report: Print the map table just after samples for which no map was found perf record: Don't try to find buildids in a zero sized file Arnd Bergmann (1): Input: remove BKL, fix input_open_file() locking Atsushi Nemoto (1): ne: Do not use slashes in irq name string Atul Dahiya (1): ARM: S5P: Change S5P_TIMER_IRQ based to 11 for SAMSUNG S5P series. Barry Song (18): can: fix bfin_can build error after alloc_candev() change Blackfin: bf537-stamp: ad1938: switch to GPIO CS Blackfin: fix MPU page permission masks overflow when dealing with async memory Blackfin: replace harcoded define with proper THREAD_SIZE macro Blackfin: fix the section name of init_thread_union Blackfin: fix initial stack pointer setup Blackfin: initial XIP support Blackfin: bf533-{ezkit,stamp}: add sound platform devices Blackfin: bf537-stamp: declare parallel flash as ROM with XIP kernel Blackfin: fill out the signal si_addr when sending a SIGBUS/SIGSEGV Blackfin: bf548-ezkit: add ASoC CPU DAI resources Blackfin: bf537-stamp/bf527-ezkit: move ASoC SPORT resources to boards file Blackfin: respect the L1 kconfig optimization in the MPU code Blackfin: implement ndelay() Blackfin: add dma_disable_irq_nosync() API for irq handlers Blackfin: rename AD1938 to AD193X in board files Blackfin: bf537-stamp: add example AD715{0,2}/AD774{5,6,7} IIO resources Blackfin: rename AD1836 to AD183X in board files Bartlomiej Zolnierkiewicz (3): ACPI: remove superfluous NULL pointer check from acpi_processor_get_throttling_info() ACPICA: fix acpi_ex_release_mutex() comment Documentation: remove obsolete voyager.txt file Baruch Siach (10): mtd: mxc_nand: add MX25 to Kconfig mx25: add NAND support mx25pdk: add NAND device support mx25: add support for the DryIce rtc mx25pdk: platform code for the DryIce RTC module devres: typo fix s/dev/devm/ imxfb: add support for i.MX25 mx25: add platform support for imxfb mx25pdk: add LCD support mx25: move ARCH_MXC_IOMUX_V3 to the ARCH level Bela Lubkin (1): ipmi: fix slave_addrs setting to actually work Ben Blum (4): cgroups: revamp subsys array cgroups: subsystem module loading interface cgroups: subsystem module unloading cgroups: blkio subsystem as module Ben Dooks (110): ARM: SAMSUNG: Move to plat-samsung ARM: S3C64XX: Cleanup common init code in s3c6400-clock.c ARM: S3C64XX: Compress s3c6400-clock.c code ARM: S3C64XX: Use new clock-clksrc.c code for clocks. ARM: SAMSUNG: Reduce size of struct clk. ARM: S3C64XX: Fixup .reg_src and .reg_div with named initialisers ARM: S3C64XX: Avoid announcing clksrc clocks twice ARM: SAMSUNG: Move clock.c to arch/arm/plat-samsung ARM: SAMSUNG: Do not allow get/set/round rate calls with no divider ARM: SAMSUNG: Add call to register array of clocks ARM: SAMSUNG: Do not register set_parent call if no source ARM: SAMSUNG: Move pwm-clock code into plat-samsung ARM: SAMSUNG: Move device definitions in plat-samsung ARM: SAMSUNG: Move gpio-config.c into plat-samsung ARM: SAMSUNG: Move IRQ VIC timer handling out to common header files ARM: SAMSUNG: Move IRQ UART handling for newer devices to plat-samsung ARM: Add common entry code for system with two VICs ARM: S5PC1XX: Move to using generic clksrc_clk for clock code ARM: S5PC1XX: Move clock definitions around ready to turn into clksrc arrays ARM: S5PC1XX: Change clksrc_clks to use array of clocks ARM: SAMSUNG: Add script to change old clksrc_clk to new register defs ARM: S5PC1XX: Remove definitions deleted by previous clksrc changes ARM: S5PC1XX: Move to using standard timer IRQ handling code ARM: S5PC1XX: Use common UART IRQ handling code ARM: S3C: Rename s3c_device_usb to s3c_device_ohci ARM: S3C2412: Fixup commented out device in SMDK2413 ARM: Merge next-s3c64xx ARM: S5PC1XX: Register pd0 and hd0 clocks, remove unecessary dummy_enable ARM: SAMSUNG: Fix clksrc-clk's checks for bad register settings ARM: SAMSUNG: Fix bug in clksrc-clk round_rate call. ARM: SAMSUNG: Make UART device code common ARM: SAMSUNG: Add platform data registration for OHCI ARM: MINI2440: Remove commented out devices from device array ARM: S3C24XX: Add mci platform data set call s3c24xx_mci_set_platdata(). ARM: Merge next-samsung-mc-adc ARM: Merge next-s3c6410-andygreen ARM: Merge next-jassi-spi ARM: Merge next-samsung-devupdates1 ARM: Merge next-samsung-clock2 ARM: Merge next-jassi-spi ARM: Merge next-samsung-devupdates1 ARM: Merge next-samsung-clock2 ARM: Merge next-samsung-serial1 ARM: SAMSUNG: Move pm-gpio into plat-samsung ARM: SAMSUNG: Move gpiolib support in gpio.c to plat-samsung ARM: SAMSUNG: Move GPIO headers to plat-samsung ARM: SAMSUNG: Remove empty gpio-core.h and use central plat/gpio-core.h ARM: SAMSUNG: Add initial documentation directory and overview ARM: Merge next-samsung-s5p6440-iodec ARM: SAMSUNG: Move more support into plat-samsung ARM: SAMSUNG: Move pmw.c to plat-samsung ARM: SAMSUNG: Move pm-check.c to plat-samsung ARM: S3C64XX: Tidy up common code in s3c64xx_spi_set_info() ARM: S3C6400: Update s3c6400_defconfig for bigger initrds for SMDK6410 ARM: S3C64XX: Update s3c6400_defconfig for current kernel ARM: S5P6440: Add HSMMC and OTG base addresses to map.h ARM: SAMSUNG: Fix bad use of __initdata for s3c_register_clocks() ARM: S3C64XX: Merge mach-s3c6400 and mach-s3c6410 ARM: S3C64XX: Remove useless IO descriptor from S3C6410 ARM: S3C64XX: Squash SDHCI setup into one file ARM: SAMSUNG: Add documentation to the clock registration calls. ARM: SAMSUNG: Add error printing to s3c24xx_register_clocks ARM: Merge next-smdk6410-defconfig ARM: S3C2443: Use common clock gate code ARM: S3C24XX: Merge s3c2442 and s3c2440 machines into mach-s3c2440 ARM: S3C2442: Merge s3c2442.c and clock.c ARM: S3C2440: Fix SMDK2440 SoC selection ARM: S3C244X: Move S3C2442 code into S3C2440 ARM: S3C24XX: Remove old mach-s3c2442 ARM: S3C24XX: Move S3C2440/S3C2442 plat-s3c24xx support to mach-s3c2440 ARM: S3C244X: Merge plat-s3c24xx s3c2440.h and s3c2442.h into s3c244x.h ARM: SAMSUNG: Add DMA masks to hsotg device ARM: SAMSUNG: Add SERIAL_SAMSUNG_UARTS_4 Kconfig option ARM: SAMSUNG: Use PLAT_SAMSUNG instead of PLAT_S3C ARM: S3C64XX: Make audio device code built unconditionally ARM: Merge next-samsung-devupdates2 ARM: Merge next-samsung-s3c244x-merge ARM: S3C64XX: Move headers into machine include directory ARM: S3C64XX: Move IRQ support into mach-s3c64xx ARM: S3C64XX: Move device and device setup into mach-s3c64xx ARM: S3C64XX: Move core support to mach-s3c64xx ARM: S3C64XX: Merge s3c6400-init.c into cpu.c ARM: S3C64XX: Merge s3c6400-clock.c and clock.c into mach-s3c64xx ARM: S3C64XX: Combine the clock init code ARM: S3C64XX: Remove plat-s3c64xx Kconfig and PLAT_S3C64XX ARM: SAMSUNG: Move pm-core.h to machine directory ARM: SAMSUNG: Remove dma-plat.h to allow plat-s3c64xx to be removed ARM: S3C64XX: Eliminate plat-s3c64xx ARM: Merge next-samsung-s3c64xx-platdeletion ARM: SAMSUNG: Move common headers from plat-s3c to plat-samsung ARM: SAMSUNG: Move map-base to plat-samsung ARM: SAMSUNG: Move pm.c to plat-samsung ARM: SAMSUNG: Move DMA support to plat-samsung ARM: SAMSUNG: Move the last build from plat-s3c to plat-samsung ARM: SAMSUNG: Move plat-s3c Kconfig entries to plat-samsung and plat-s3c24xx ARM: S3C24XX: Move audio-simtec.h to plat-s3c24xx ARM: SAMSUNG: Select NO_IOPORT for plat-samsung ARM: SAMSUNG: Move include/mach files out of plat-s3c ARM: SAMSUNG: Eliminate plat-s3c ARM: S5P6442: Add files missing from original commit ARM: SAMSUNG: Fix UART number for S5P6442 ARM: S3C2440: Fix plat-s3c24xx move of s3c2440/s3c2442 support ARM: S3C2443: Change to using plat-samsung clksrc-clk implementation ARM: S3C2443: Further clksrc-clk conversions ARM: S3C2443: Update notes on MPLLREF clock ARM: S3C2443: Remove #if 0 for clk_mpll ARM: S3C2443: Add set_rate and round_rate calls for armdiv clock ARM: Merge next-samsung-s3c2443-clock ARM: SAMSUNG: Fix build error from stale define in ARM: SAMSUNG: Fixup commit 4e6d488af37980d224cbf298224db6173673f362 Ben Hutchings (2): uwb: declare MODULE_FIRMWARE() in i1480 DFU driver video: fix first line of kernel-doc for a few functions Benjamin Herrenschmidt (2): Merge commit 'kumar/next' into merge Merge commit 'kumar/merge' into merge Benjamin Marzinski (1): GFS2: Allow the number of committed revokes to temporarily be negative Bernhard Rosenkraenzer (1): USB: qcserial: add new device ids Bian Naimeng (1): rpc client can not deal with ENOSOCK, so translate it into ENOCONN Bjorn Helgaas (5): resource: expand IORESOURCE_TYPE_BITS to make room for bus resource type resource: add bus number support resource: add window support PNPACPI: add window support PNPACPI: add bus number support Boaz Harrosh (1): [SCSI] libosd: Fix unchecked err return found by smatch Bob Rodgers (1): leds: Add Dell Business Class Netbook LED driver Borislav Petkov (1): x86, k8 nb: Fix boot crash: enable k8_northbridges unconditionally on AMD systems Breno Leitao (1): s2io: Fixing debug message Brian King (2): [SCSI] ibmvscsi: Add suspend/resume support [SCSI] ibmvfc: Add suspend/resume support Bruno PrĂ©mont (6): HID: avoid '\0' in hid debugfs events file backlight: Add backlight_device parameter to check_fb backlight: classmate-laptop - Fix missing registration failure handling backlight: blackfin - Fix missing registration failure handling backlight: msi-laptop, msi-wmi: fix incomplete registration failure handling backlight: panasonic-laptop - Fix incomplete registration failure handling Bruno Randolf (4): ath5k: use fixed antenna for tx descriptors ath5k: fix TSF reset ath5k: fix I/Q calibration (for real) ath5k: read eeprom IQ calibration values correctly for G mode Bryan Polk (1): rt2x00: Add USB ID for CEIVA adapter to rt73usb Chien Tung (2): RDMA/nes: Clear stall bit before destroying NIC QP RDMA/nes: Fix CX4 link problem in back-to-back configuration Chris Mason (11): Btrfs: add search and inode lookup ioctls Btrfs: run the backing dev more often in the submit_bio helper Btrfs: be more selective in the defrag ioctl Btrfs: add new defrag-range ioctl. Btrfs: finish read pages in the order they are submitted Btrfs: don't look at bio flags after submit_bio Btrfs: buffer results in the space_info ioctl Btrfs: fix key checks and advance in the search ioctl Btrfs: return keys for large items to the search ioctl Btrfs: allow treeid==0 in the inode lookup ioctl Btrfs: fix the inode ref searches done by btrfs_search_path_in_tree Christoph Egger (5): fbdev: remove obsolete CONFIG_FB_SOFT_CURSOR obsolete config in kernel source: LWMON5 obsolete config in kernel source: USE_INTERNAL_TIMER obsolete config in kernel source: HSO_AUTOPM USB: Remove last bit of CONFIG_USB_BERRY_CHARGE Christoph Fritz (1): Input: i8042 - add ALDI/MEDION netbook E1222 to qurik reset table Christoph Hellwig (21): Blackfin: use generic ptrace_resume code GFS2: do not select QUOTA Add generic sys_old_select() Add generic sys_old_mmap() Add generic sys_ipc wrapper improve sys_newuname() for compat architectures Add generic sys_olduname() ptrace: use ptrace_request() in the remaining architectures ptrace: move user_enable_single_step & co prototypes to linux/ptrace.h alpha: use generic ptrace_resume code arm: use generic ptrace_resume code avr32: use generic ptrace_resume code h8300: use generic ptrace_resume code m68knommu: use generic ptrace_resume code microblaze: use generic ptrace_resume code mips: use generic ptrace_resume code um: use generic ptrace_resume code xtensa: use generic ptrace_resume code cris arch-v10: use generic ptrace_resume code cris arch-v32: use generic ptrace_resume code m32r: use generic ptrace_resume code Clemens Ladisch (2): USB: EHCI: fix ITD list order USB: EHCI: adjust ehci_iso_stream for changes in ehci_qh Cliff Cai (2): Blackfin: bf527-ezkit/bf537-stamp: add example SSM2602 I2C resources Blackfin: bf537-stamp: add example ADAU1361 resources Corey Minyard (1): ipmi: remove ipmi_smi.h self-include Daisuke Nishimura (9): cgroup: introduce cancel_attach() cgroup: introduce coalesce css_get() and css_put() memcg: add interface to move charge at task migration memcg: move charges of anonymous page memcg: improve performance in moving charge memcg: avoid oom during moving charge memcg: move charges of anonymous swap memcg: improve performance in moving swap charge memcg: update memcg_test.txt Dan Carpenter (18): uwb: remove duplicate cpu_to_le16() zd1211rw: fix potential array underflow cpmac: use after free cassini: fix off by one davinci_emac: off by one Input: gamecon - fix off by one range check bridge: cleanup: remove unneed check ems_usb: cleanup: remove uneeded check sock.c: potential null dereference irda-usb: add error handling and fix leak nfs: fix unlikely memory leak sched: Cleanup: remove unused variable in try_to_wake_up() tomoyo: fix potential use after free pcmcia: add important if statement cifs: trivial white space myri: remove dead code sound: sequencer: clean up remove bogus check USB: goku_udc: remove potential null dereference Daniel Mack (7): [ARM] pxa/raumfeld: add platform support [ARM] pxa/raumfeld: add defconfig tree-wide: s/widht/width/g typo in comments tree-wide: fix 'lenght' typo in comments and code tree-wide: Assorted spelling fixes [ARM] pxa/raumfeld: set GPIO drive bits for LED pins leds: ALIX2: Add dependency to !GPIO_CS5335 Daniel Sangorrin (1): USB: serial: ftdi: add CONTEC vendor and product id Daniel T Chen (1): ALSA: hda: Use LPIB and 6stack-dig for eMachines T5212 Dave Chinner (1): xfs: don't warn about page discards on shutdown Dave Kleikamp (2): powerpc/booke: Fix a couple typos in the advanced ptrace code powerpc/booke: Fix breakpoint/watchpoint one-shot behavior Dave Young (10): Documentation/email-clients.txt: update gmail information sysctl extern cleanup: C_A_D sysctl extern cleanup: signal sysctl extern cleanup: rcu sysctl extern cleanup: module sysctl extern cleanup: sg sysctl extern cleanup: acct sysctl extern cleanup: rtmutex sysctl extern cleanup: lockdep sysctl extern cleanup: poll David Brown (1): net: smc91x: Support Qualcomm MSM development boards. David Dillow (2): r8169: use correct barrier between cacheable and non-cacheable memory typhoon: fix incorrect use of smp_wmb() David Miller (2): uartlite: Fix build on sparc. uartlite: Fix build on sparc. David Rientjes (1): driver core: numa: fix BUILD_BUG_ON for node_read_distance David S. Miller (10): Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 MAINTAINERS: Add netdev to bridge entry. ipconfig: Handle devices which take some time to come up. Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 sparc64: Add very basic XVR-1000 framebuffer driver. e100: Fix ring parameter change handling regression. Merge branch 'master' of /home/davem/src/GIT/linux-2.6/ MAINTAINERS: Add entry for sparc serial drivers. bridge: Make first arg to deliver_clone const. sunxvr1000: Add missing FB=y depenency. David Vrabel (2): uwb: wlp: refactor wlp_get_() macros Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 into for-upstream Dimitri Sivanich (1): x86: Fix sched_clock_cpu for systems with unsynchronized TSC Divy Le Ray (1): cxgb3: fix hot plug removal crash Dmitry Torokhov (6): sony-laptop - remove private workqueue, use keventd instead sony-laptop - simplify keymap initialization sony-laptop - switch from workqueue to a timer Merge commit 'v2.6.34-rc1' into for-linus Input: i8042 - use platfrom_create_bundle() helper Input: scancode in get/set_keycodes should be unsigned Dominik Brodowski (2): pcmcia: pd6729, i82092: use parent (PCI) resources pcmcia: revert "irq probe can be done without risking an IRQ storm" Edward Z. Yang (1): Remove redundant trailing semicolons from macros Edwin Peer (1): [ARM] pxa: add support for Embedian MXM-8x10 Eli Cohen (1): IPoIB: Fix TX queue lockup with mixed UD/CM traffic Enric Balletbo i Serra (1): omap3: Fix support for the LEDs connected to GPIO outputs on IGEP v2board Eric B Munson (5): perf record: Add ID and to recorded event data when recording multiple events perf session: Change add_hist_entry to take the tree root instead of session perf session: Add storage for seperating event types in report perf session: Change perf_session post processing functions to take histogram tree perf report: Add multiple event support Eric Dumazet (8): tcp: Add SNMP counters for backlog and min_ttl drops net: fix route cache rebuilds tcp: Fix tcp_make_synack() ethtool: Use noinline_for_stack tcp: Fix tcp_v4_rcv() net: Annotates neigh_invalidate() net: Fix dev_mc_add() mac80211: Fix memory leak in ieee80211_if_write() Eric Miao (23): [ARM] pxa: use chip->ack() instead of accessing GEDR directly [ARM] pxa: simplify the LCD pin configuration for pxa25x platforms [ARM] pxa: simplify the LCD pin configuration for pxa27x platforms [ARM] pxa: remove the unnecessary restoring of MFP registers [ARM] pxa: introduce processor specific pxa27x_assert_ac97reset() [ARM] pxa: add the missing AC97 pin configurations [ARM] pxa: remove now unnecessary pxa_gpio_mode() calls in ac97 [ARM] pxa/cm-x270: avoid direct access of GPIO/MFP registers [ARM] pxa/tosa: make use of the matrix keypad driver [ARM] sa1100: remove unreferenced IRQ definitions [ARM] locomo: avoid unnecessary cascaded keyboard IRQ [ARM] locomo: remove unused IRQs and avoid unnecessary cascade [ARM] locomo: allow cascaded IRQ base to be specified by platforms [ARM] sa1111: avoid using hardcoded IRQ numbers for PCMCIA driver [ARM] sa1111: allow cascaded IRQs to be used by platforms [ARM] pxa: move board board IRQ definitions out of irqs.h [ARM] pxa: introduce PXA_SSP_LEGACY for legacy SSP API ASoC: Remove legacy SSP API usage from pxa-ssp.c [ARM] mmp: rename irq.c to irq-pxa168.c to allow other SoC IRQ chips MAINTAINERS: add maintainers for Marvell MMP2 (aka ARMADA610) support [ARM] mmp2: fix incorrect calling of chip->mask_ack() for 2nd level cascaded IRQs [ARM] pxa: refactor uncompress.h for non-PXA uarts [ARM] pxa: fix typo in mxm8x10.h Eric Paris (2): Btrfs: use RB_ROOT to intialize rb_trees instead of setting rb_node to NULL anon_inodes: mark the anon inode private Evan McClain (1): backlight: mbp_nvidia_bl - add five more MacBook variants Evgeniy Dushistov (1): ufs: make solaris fsck happy FUJITA Tomonori (37): x86/gart: Unexport gart_iommu_aperture Documentation/DMA-API.txt: remove deprecated function descriptions DMA-API.txt: add dma_sync_single/sg API description DMA-API.txt: remove dma_sync_single_range description alpha: remove dma_sync_single_range um: remove dma_sync_single_range pci-dma: add include/linux/pci-dma.h pci-dma: x86: use include/linux/pci-dma.h pci-dma: alpha: use include/linux/pci-dma.h pci-dma: arm: use include/linux/pci-dma.h pci-dma: frv: use include/linux/pci-dma.h pci-dma: ia64: use include/linux/pci-dma.h pci-dma: mips: use include/linux/pci-dma.h pci-dma: parisc: use include/linux/pci-dma.h pci-dma: powerpc: use include/linux/pci-dma.h pci-dma: sh: use include/linux/pci-dma.h pci-dma: sparc: use include/linux/pci-dma.h pci-dma: xtensa: use include/linux/pci-dma.h pci-dma: cris: use include/linux/pci-dma.h pci-dma: add linux/pci-dma.h to linux/pci.h dma-mapping.h: add the dma_unmap state API dma-mapping: frv: remove the obsolete and unnecessary DMA API comments dma-mapping: blackfin: remove the obsolete and unnecessary DMA API comments dma-mapping: mn10300: remove the obsolete and unnecessary DMA API comments dma-mapping: sparc: unify 32bit and 64bit dma_set_mask dma-mapping: alpha: use include/linux/pci-dma-compat.h dma-mapping: pci: convert pci_set_dma_mask to call dma_set_mask dma-mapping: dma-mapping.h: add dma_set_coherent_mask dma-mapping: powerpc: use generic pci_set_dma_mask and pci_set_consistent_dma_mask dma-mapping: arm: use generic pci_set_dma_mask and pci_set_consistent_dma_mask dma-mapping: pci: move pci_set_dma_mask and pci_set_consistent_dma_mask to pci-dma-compat.h Documentation: convert PCI-DMA-mapping.txt to use the generic DMA API Documentation: remove the PCI DMA API description in DMA-API.txt Documentation: rename PCI-DMA-mapping.txt to DMA-API-HOWTO.txt alpha: fix compile errors in dma-mapping-common.h powerpc: Fix swiotlb to respect the boot option powerpc: Remove IOMMU_VMERGE config option Fabio Estevam (1): mx51_babbage: Fix ckih2 parameter in mx51_clocks_init function Faisal Latif (1): RDMA/nes: Set assume_aligned_header bit Fang Wenqi (1): tty_buffer: Fix distinct type warning Felipe Balbi (2): omap2/3/4: ehci: avoid compiler error with touchbook usb: musb: core: declare mbase only where it's used Figo.zhang (1): fix a race in ks8695_poll Florian Fainelli (4): cpmac: fix the receiving of 802.1q frames cpmac: fallback to switch mode if no PHY chip found cpmac: bump version to 0.5.2 leds: Fix race between LED device uevent and actual attributes creation Florian Tobias Schandinat (17): viafb: deprecate private ioctls viafb: remove dead code viafb: split global index up viafb: remove the remaining VIA_RES_* uses viafb: some dvi cleanup viafb: yet another dead code removal viafb: reorder initialization for dual framebuffer mode viafb: video address setting revisited viafb: make viafb_set_par more dual framebuffer compatible viafb: introduce strict parameter checking viafb: split color mode setting up viafb: remove dead code due to IGA1_IGA2 viafb: make some variables a bit less global viafb: rework color checking viafb: some virtual_xres handling fixes viafb: rework color setting viafb: support color depth 15 and 30 Francisco Alecrim (1): omap2: add USB initialization for tusb6010 Frank Blaschka (2): qeth: l3 send dhcp in non pass thru mode qeth: change checksumming default for HiperSockets Frans Pop (3): Blackfin: remove trailing space in messages microblaze: remove trailing space in messages alpha: remove trailing spaces in messages Frederic Weisbecker (13): Merge commit 'v2.6.33' into perf/core perf lock: Drop the buffers multiplexing dependency perf: Remove pointless breakpoint union x86/hw-breakpoints: Remove the name field tracing: Include irqflags headers from trace clock hw-breakpoints: Remove stub unthrottle callback x86/stacktrace: Don't dereference bad frame pointers lockdep: Move lock events under lockdep recursion protection perf/x86-64: Use frame pointer to walk on irq and process stacks perf: Introduce new perf_fetch_caller_regs() for hot regs snapshot perf: Take a hot regs snapshot for trace events perf: Drop the obsolete profile naming for trace events perf: Fix unexported generic perf_arch_fetch_caller_regs Gal Rosen (1): [SCSI] scsi_transport_fc: Fix synchronization issue while deleting vport Geert Uytterhoeven (2): ataflop: Killl warning about unused variable flags mfd: Several MFD drivers should depend on GENERIC_HARDIRQS Gerrit Renker (1): net-2.6 [Bug-Fix][dccp]: fix oops caused after failed initialisation GeunSik Lim (1): doc: cpuset: Update the cpuset flag file Graf Yang (12): Blackfin: SMP: enable HAVE_LEGACY_PER_CPU_AREA Blackfin: drop cpu_callin_map on SMP systems Blackfin: SMP: add PM/CPU hotplug support Blackfin: fix up mm locking in address dumping Blackfin: implement nmi_watchdog for SMP on BF561 Blackfin: split watchdog definitions into a dedicated header file Blackfin: add support for cpufreq on SMP systems Blackfin: rewrite resync_core_{i,d}cache() SMP logic to avoid per_cpu data Blackfin: bf537-stamp: add example AD2S90 resources Blackfin: bf537-stamp: add example AD2S120x resources Blackfin: bf537-stamp: add example AD2S1210 IIO resources Blackfin: scale calibration when cpu freq changes Grant Likely (4): powerpc/52xx: update defconfigs of: Fix comparison of "compatible" properties powerpc/5200: Build fix for mpc52xx watchdog timer code usb/gadget: fix compile error on r8a66597-udc.c Grazvydas Ignotas (1): omap3: pandora: add missing i2c3 board_info Greg Kroah-Hartman (4): sysfs: fix sysfs lockdep warning in ipmi code sysfs: fix sysfs lockdep warning in infiniband code sysfs: fix sysfs lockdep warning in mlx4 code Revert "tty: Add a new VT mode which is like VT_PROCESS but doesn't require a VT_RELDISP ioctl call" Greg Ungerer (2): net: add ColdFire support to the smc91x driver ARM: 5988/1: pgprot_dmacoherent() for non-mmu builds H Hartley Sweeten (6): mach-orion5x/common.c: remove unnecessary (void *) casts mach-kirkwood/common.c: remove unnecessary (void *) casts mach-dove/common.c: remove unnecessary (void *) casts edac: mpc85xx use resource_size instead of raw math leds: led-class.c - Quiet boot messages leds: Kconfig cleanup Hannes Reinecke (1): [SCSI] scsi_dh_emc: fix mode select request setup Haojian Zhuang (11): [ARM] mmp: avengers lite (pxa168) board bring up [ARM] mmp: update pxa168_defconfig and include avengers lite support [ARM] mmp: add support for Marvell MMP2 [ARM] mmp: add default configuration for MMP2 [ARM] mmp: support jasper development board [ARM] mmp2: add mask function in irq-mmp2.c [ARM] mmp2: add mfpr setting [ARM] mmp2: add gpio initialization [ARM] mmp2: add missing ICU register definitions [ARM] mmp2: add support for board IRQs [ARM] mmp2: add handling on PMIC IRQ Harald Krapfenbauer (1): Blackfin: tcm-bf518: new board port Harald Welte (2): ARM: SAMSUNG: Add core clock implementation for clksrc based clocks ARM: S3C64XX: Remove unused clock definitions from clock header Heiko Carstens (2): memory hotplug: allow setting of phys_device memory hotplug/s390: set phys_device Helmut Schaa (3): rt2x00: fix rt2800pci compilation with SoC rt2x00: Export rt2x00soc_probe from rt2x00soc rt2x00: remove KSEG1ADDR define from rt2x00soc.h Herbert Xu (5): ipsec: Fix bogus bundle flowi bridge: Use RCU list primitive in __br_mdb_ip_get bridge: Fix RCU race in br_multicast_stop ipv6: Send netlink notification when DAD fails bridge: Move NULL mdb check into br_mdb_ip_get Hitoshi Mitake (1): perf lock: Fix and add misc documentally things Huang Weiyi (2): fbdev: bfin-lq035q1-fb: remove duplicated #include serial: sh-sci: remove duplicated #include Huang Ying (1): USB: Option: Add support for a variant of DLink DWM 652 U5 Ian Munsie (2): i4l: silence compiler warnings for array access in Eicon DIVA ISDN driver i4l: change magic numbers in Eicon DIVA ISDN driver to symbolic names Ingo Molnar (9): Merge branch 'linus' into core/rcu Merge branches 'core/futexes' and 'core/iommu' into core/urgent Merge branch 'perf/core' into perf/urgent Merge branch 'tip/tracing/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace into tracing/urgent Merge branch 'perf/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing into perf/urgent MAINTAINERS: Add Arnaldo as tools/perf/ co-maintainer Merge commit 'v2.6.34-rc1' into perf/urgent Merge branch 'tip/tracing/core' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace into tracing/urgent x86/mce: Fix build bug with CONFIG_PROVE_LOCKING=y && CONFIG_X86_MCE_INTEL=y Jaak Ristioja (1): bio: Fix outdated comment about bio_alloc_bioset() Jack Steiner (1): x86, UV: Fix target_cpus() in x2apic_uv_x.c James Bottomley (1): [SCSI] raid_attrs: fix dependency problems James Chapman (2): l2tp: Fix oops in pppol2tp_xmit l2tp: Fix UDP socket reference count bugs in the pppol2tp driver James Smart (7): [SCSI] lpfc 8.3.10: Fix Initialization issues [SCSI] lpfc 8.3.10: Fix user interface issues [SCSI] lpfc 8.3.10: Update SLI interface areas [SCSI] lpfc 8.3.10: Added management for LP21000 through BSG. [SCSI] lpfc 8.3.10: Fix Discovery issues [SCSI] lpfc 8.3.10: Added round robin FCF failover [SCSI] lpfc 8.3.10: Update Driver version to 8.3.10 Jan Kara (2): udf: Fix unalloc space handling in udf_update_inode udf: Do not read inode before writing it Jani Nikula (1): driver-core: document ERR_PTR() return values Janusz Krzysztofik (1): omap: McBSP: Drop unnecessary status/error bit clearing on reg_cacheretrieved register values Jari Vanhala (1): Input: add driver for TWL4030 vibrator device Jason Wessel (1): tty_port,usb-console: Fix usb serial console open/close regression Jasper Spaans (1): arch/x86/kernel/apic/apic_flat_64.c: Make comment match the code Jassi Brar (10): ARM: S3C64XX: Add I2S resources in platform code ARM: S3C64XX: SPI: Add SPI controller register base ARM: S3C64XX: SPI: Define SPI-48M clock sources ARM: S3C64XX: SPI: Header for passing platform data ARM: S3C64XX: SPI: Define SPI controller devices ARM: S3C64XX: SPI: Make platform device compilation selectable ARM: SMDK2443: Enable AC97 device ARM: S3C2443: GPIO: Correct AC97 pin defines ARM: S3C64XX: Add AC97 platform resources ARM: S3C64XX: Declare IISv4 PCLK for S3C6410 Jaya Kumar (3): broadsheetfb: add multiple panel type support broadsheetfb: add MMIO hooks broadsheetfb: support storing waveform Jayamohan Kallickal (7): [SCSI] libiscsi: Make iscsi_eh_target_reset start with session reset [SCSI] be2iscsi: Cleanup of resets for device and target [SCSI] be2iscsi: Fix for a possible udelay while holding lock [SCSI] be2iscsi: cleans up abort handling [SCSI] be2iscsi: Remove debug code [SCSI] be2iscsi: Fixing memory allocation for connection [SCSI] be2iscsi: Alloc only one EQ if intr mode Jean Delvare (6): devres/irq: Fix devm_irq_match comment i2c-powermac: Be less verbose in the absence of real errors. i2c-i801: Don't use the block buffer for I2C block writes tsl2550: Move from i2c/chips to misc i2c: Drop configure option I2C_DEBUG_CHIP i2c-algo-bit: Add pre- and post-xfer hooks Jeff Garzik (3): ethtool: Add direct access to ops->get_sset_count ethtool: Add direct access to ops->get_sset_count Delete zero-length file drivers/mtd/maps/omap_nor.c Jeff Layton (4): cifs: overhaul cifs_revalidate and rename to cifs_revalidate_dentry cifs: add a CIFSSMBQFileInfo function cifs: add a CIFSSMBUnixQFileInfo function cifs: add cifs_revalidate_file Jens KĂĽnzer (3): pcmcia: honor saved flags in yenta_socket's I365_CSCINT register pcmcia: allow for cb_irq to differ from pci_dev's irq in yenta_socket pcmcia: re-route Cardbus IRQ to ISA on ti1130 bridges if necessary Jesse Brandeburg (1): e1000e: fix packet corruption and tx hang during NFSv2 Jie Zhang (1): Blackfin: fix relocation errors with large initramfs images Jiri Kosina (7): crypto: fix typo in Kconfig help text No need to patch AMD-provided drivers/gpu/drm/radeon/atombios.h Remove drivers/parport/ChangeLog Fix of spelling in arch/sparc/kernel/leon_kernel.c no longer needed Remove fs/ntfs/ChangeLog Merge branch 'for-next' into for-linus sysfs: use sysfs_bin_attr_init in firmware class driver Jiri Pirko (2): af_packet: move strict addr_len check right before dev_[mc/unicast]_[add/del] rndis_wlan: correct multicast_list handling V3 Jiri Slaby (5): ipc: use rlimit helpers PCMCIA: resource, fix lock imbalance video: backlight/progear, fix pci device refcounting NET: ksz884x, fix lock imbalance NET: netpoll, fix potential NULL ptr dereference Joachim Eastwood (2): Blackfin: GPIO: implement to_irq handler Blackfin: mark gpio lib functions static Joakim Tjernlund (2): zlib: make new optimized inflate endian independent inflate_fast: sout is already a short so ptr arith was off by one. Joe Perches (42): net/sunrpc: Remove uses of NIPQUAD, use %pI4 net/sunrpc: Convert (void)snprintf to snprintf fs/ocfs2/cluster/tcp.c: remove use of NIPQUAD, use %pI4 drivers/block/floppy.c: convert some #include drivers/block/floppy.c: remove unnecessary braces drivers/block/floppy.c: remove used once CHECK_READY macro drivers/block/floppy.c: hoist assigns from if()s, neatening drivers/block/floppy.c: remove LAST_OUT macro drivers/block/floppy.c: comment neatening and remove naked ; drivers/block/floppy.c: remove CLEARSTRUCT macro, use memset drivers/block/floppy.c: indent a comment drivers/block/floppy.c: remove IN/OUT macros, indent switch/case drivers/block/floppy.c: remove a few spaces from function casts drivers/block/floppy.c: remove macro LOCK_FDC drivers/block/floppy.c: add debug_dcl(...) macro drivers/block/floppy.c: remove [U]CLEARF, [U]SETF, and [U]TESTF macros drivers/block/floppy.c: remove most uses of CALL and ECALL macros drivers/block/floppy.c: remove [_]COPYIN [_]COPYOUT and ECALL macros drivers/block/floppy.c: remove macros CALL, WAIT and IWAIT drivers/block/floppy.c: convert int 1/0 to bool true/false drivers/block/floppy.c: move leading && and || to preceding line drivers/block/floppy.c: remove #define DEVICE_NAME "floppy" drivers/block/floppy.c: convert int initialising to bool initialized drivers/block/floppy.c: add function is_ready_state drivers/block/floppy.c: remove unnecessary return and braces drivers/block/floppy.c: remove REPEAT macro drivers/block/floppy.c: unclutter redo_fd_request logic drivers/block/floppy.c: remove unnecessary argument from [__]reschedule_timeout drivers/block/floppy.c: remove #define FLOPPY_SANITY_CHECK drivers/block/floppy.c: DPRINT neatening drivers/block/floppy.c: use __func__ where appropriate drivers/block/floppy.c: use %pf in logging messages drivers/block/floppy.c: remove some unnecessary casting drivers/block/floppy.c: convert raw_cmd_copyin from while(1) to label: goto drivers/block/floppy.c: add __func__ to debugt drivers/block/floppy.c: remove obfuscating CODE2SIZE macro drivers/block/floppy.c: remove misleading, used once FD_IOCTL_ALLOWED macro drivers/block/floppy.c: remove unnecessary casting in fd_ioctl drivers/video/via: fix continuation line formats drivers/net/tulip/eeprom.c: fix bogus "(null)" in tulip init messages Johan Hovold (3): USB: serial: fix error message on close in generic driver USB: serial: fix softint not being called on errors USB: serial: use port endpoint size to determine if ep is available Johannes Berg (2): ar9170: load firmware asynchronously iwlwifi: load firmware asynchronously before mac80211 registration John Holland (3): [ARM] eSATA SheevaPlug basic board support [ARM] eSATA SheevaPlug: configure SoC SATA interface [ARM] eSATA SheevaPlug: correlate MPP to SD CD and SD WP John Kacur (1): perf: Make the install relative to DESTDIR if specified John W. Linville (1): Merge branch 'wireless-2.6' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6 Jonathan Corbet (1): Remove drivers/char/ChangeLog Josef Bacik (11): Btrfs: kfree correct pointer during mount option parsing Btrfs: make set/get functions for the super compat_ro flags use compat_ro Btrfs: change how we mount subvolumes Btrfs: add ioctl and incompat flag to set the default mount subvol Btrfs: make subvolid=0 mount the original default root Btrfs: make df be a little bit more understandable Btrfs: change the ordered tree to use a spinlock instead of a mutex Btrfs: cache extent state in find_delalloc_range Btrfs: cache ordered extent when completing io Btrfs: cache the extent state everywhere we possibly can V2 Btrfs: add a "df" ioctl for btrfs Josh Boyer (1): powerpc: Fix G5 thermal shutdown Jouni Malinen (2): mac80211: Fix reassociation processing (within ESS roaming) mac80211: Fix sta_mtx unlocking on insert STA failure path Julia Lawall (9): fs/ceph: introduce missing kfree fs/ceph: Move a dereference below a NULL test ceph: remove duplicate variable initialization fs/qnx4: decrement sizeof size in strncmp drivers/scsi/ses.c: eliminate double free drivers/char/mmtimer.c: eliminate useless code drivers/net/tg3.c: change the field used with the TG3_FLAG_10_100_ONLY constant drivers/net: drop redundant memset drivers/serial/sunsab.c: adjust the constant used to initialize the interrupt_mask0 fields Jussi Kivilinna (1): asix: fix setting mac address for AX88772 Justin P. Mattock (2): fix comment typo in pci-dma.c fix comment typos in avc.c Juuso Oikarinen (1): mac80211: Fix (dynamic) power save entry KAMEZAWA Hiroyuki (8): nommu: fix build breakage memcg: use generic percpu instead of private implementation memcg: update threshold and softlimit at commit memcg : share event counter rather than duplicate memcg: handle panic_on_oom=always case memcg: fix oom kill behavior memcg: update maintainer list memcg: avoid use cmpxchg in swap cgroup maintainance Kevin Dankwardt (1): fat: Fix stat->f_namelen Kevin Hilman (2): OMAP2: cpu_is_omap2*: fix compile-time removal of unused code OMAP4: fix temporary hacks that break multi-omap PM Kirill A. Shutemov (11): cgroups: fix CONTENTS in cgroups documentation cgroup: implement eventfd-based generic API for notifications memcg: extract mem_group_usage() from mem_cgroup_read() memcg: rework usage of stats by soft limit memcg: implement memory thresholds memcg: typo in comment to mem_cgroup_print_oom_info() cgroups: fix race between userspace and kernelspace cgroups: remove events before destroying subsystem state objects cgroups: add simple listener of cgroup events to documentation memcg: update memcg_test.txt to describe memory thresholds memcg: fix typos in memcg_test.txt Konstantin Olifer (1): edac: e752x fsb ecc Krishna Gudipati (30): [SCSI] bfa: Added separate MSI-X module parameters. [SCSI] bfa: Defined a new LPS event to clear virtual link on a vport [SCSI] bfa: Enable IOC auto-recovery and IOC type fix. [SCSI] bfa: Enable new halt interrupt in BFA. [SCSI] bfa: Changes to support FDMI Driver Parameter [SCSI] bfa: New interface to handle firmware upgrade scenario [SCSI] bfa: Fix to allow creation of only 190 vports on CNA. [SCSI] bfa: Resume BFA operations after firmware mismatch is resolved. [SCSI] bfa: IOC changes: Support faster recovery and split bfa_ioc.c into ASIC specific code. [SCSI] bfa: Clear LL_HALT and PSS_ERR bit when IOC crashes. [SCSI] bfa: Replace bfa_assert() with bfa_sm_fault() [SCSI] bfa: RPORT state machine: direct attach mode fix. [SCSI] bfa: Fix to copy fpma MAC when requested by user space application. [SCSI] bfa: PCI VPD, FIP and include file changes. [SCSI] bfa: FCS authentication related changes. [SCSI] bfa: Added firmware save clear feature for BFA driver. [SCSI] bfa: Introduce a link notification state machine. [SCSI] bfa: AEN and byte alignment fixes. [SCSI] bfa: IOC recovery fix in fcmode. [SCSI] bfa: Fix Command Queue (CPE) full condition check and ack CPE interrupt. [SCSI] bfa: In MSIX mode, ignore spurious RME interrupts when FCoE ports are in FW mismatch state. [SCSI] bfa: IOC fixes, check for IOC down condition. [SCSI] bfa: Rename pport to fcport in BFA FCS. [SCSI] bfa: New portlog entries for events (FIP/FLOGI/FDISC/LOGO). [SCSI] bfa: Replace bfa_get_attr() with specific APIs [SCSI] bfa: Modified the portstats get/clear logic [SCSI] bfa: FCS and include file changes. [SCSI] bfa: Handle SCSI IO underrun case. [SCSI] bfa: Remove unused header files and did some cleanup. [SCSI] bfa: Update the driver version to 2.1.2.1. Kukjin Kim (30): ARM: SAMSUNG: Make clk_default_setrate and clk_ops_def_setrate visible ARM: SAMSUNG: Add config option for number of additional GPIO pins. ARM: S5P6440: Add new CPU initialization support ARM: S5P6440: Add Clock and PLL support ARM: S5P6440: Add IRQ support ARM: S5P6440: Add Timer support ARM: S5P6440: Add new Kconfig and Makefiles ARM: S5P6440: Add Board support file ARM: S5P6440: Add configuration file ARM: S5P6440: Add serial port support ARM: SAMSUNG: Move GPIO common functions to plat-samsung ARM: S5P6440: Add S5P6440 GPIO support ARM: S5P6440: Add IO descriptor for ChipID block. ARM: S5P6440: Move CPU specific code in plat-s5p to machine directory ARM: S5P6440: Move common memory map definitions for S5P ARM: S5P6442: Add Samsung S5P6442 CPU support ARM: S5P6442: Add clock support for S5P6442 ARM: S5P6442: Add IRQ support ARM: S5P6442: Update Kconfig and Makefiles ARM: S5P6442: Add SMDK6442 board support file ARM: S5P6442: Add S5P6442 configuration file ARM: S5P6442: Add serial port support ARM: S5PV210: Add Samsung S5PV210 CPU support ARM: S5PV210: Add clock support for S5PV210 ARM: S5PV210: Add IRQ support ARM: S5PV210: Update Kconfig and Makefiles ARM: S5PV210: Add SMDKV210 board support file ARM: S5PV210: Add SMDKC110 board support file ARM: S5PV210: Add S5PV210 configuration file ARM: S5PV210: Add S5PC110 configuration file Kumar Gala (2): powerpc/85xx: Make sure lwarx hint isn't set on ppc32 powerpc/fsl-booke: Get coherent bit from PTE Kuninori Morimoto (9): ARM: mach-shmobile: intc-sh7372 tidyup ARM: mach-shmobile: Add sh7372 pinmux support ARM: mach-shmobile: SMSC 9220 support for AP4EVB. ARM: mach-shmobile: ap4evb: Add SCIFA0 support ARM: mach-shmobile: ap4evb: Add tiny document ARM: mach-shmobile: ap4evb: Add LED support ARM: mach-shmobile: ap4evb: Add S6 debug switch support ARM: mach-shmobile: pfc-sh7377: modify KEYIN settings ARM: mach-shmobile: ap4evb: Add KEYSC support Lai Jiangshan (2): tracing: Fix warning in s_next of trace file ops ring-buffer: Move disabled check into preempt disable section Lars Ellenberg (1): ISDN: Add PCI ID for HFC-2S/4S Beronet Card PCIe Laurent Pinchart (1): ARM: 5977/1: arm: Enable backtrace printing on oops when PC is corrupted Laurie Bradshaw (1): [ARM] orion5x: D-link DNS-323 revision A1 power LED Len Brown (4): ACPI: delete unused acpi_evaluate_string() ACPI: remove "acpi=ht" DMI blacklist ACPI: plan to delete "acpi=ht" boot option Merge branches 'battery-2.6.34', 'bugzilla-10805', 'bugzilla-14668', 'bugzilla-531916-power-state', 'ht-warn-2.6.34', 'pnp', 'processor-rename', 'sony-2.6.34', 'suse-bugzilla-531547', 'tz-check', 'video' and 'misc-2.6.34' into release Li Zefan (1): cgroups: clean up cgroup_pidlist_find() a bit Linus Torvalds (58): Merge git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6 Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc Merge branch 'msm-mmc_sdcc' of git://codeaurora.org/quic/kernel/dwalker/linux-msm Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-udf-2.6 Merge branch 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Fix up .gitignore for top-level file patterns Merge git://git.kernel.org/pub/scm/linux/kernel/git/hirofumi/fatfs-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 Merge branch 'tracing-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 Merge branch 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs Merge branch 'for-linus' of git://git.o-hand.com/linux-rpurdie-leds Merge branch 'for-linus' of git://git.o-hand.com/linux-rpurdie-backlight Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6 Merge branch 'for-linus' of git://neil.brown.name/md Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze Merge branch 'for-linus/samsung-fixes' of git://git.fluff.org/bjdooks/linux Merge master.kernel.org:/home/rmk/linux-2.6-arm Merge branch 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6 Merge branch 'merge' of git://git.secretlab.ca/git/linux-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vapier/blackfin Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6 Merge branch 'zerolen' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/misc-2.6 Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mattst88/alpha-2.6 Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/dvrabel/uwb Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 Linux 2.6.34-rc2 Louis Rilling (1): tg3: Fix tg3_poll_controller() passing wrong pointer to tg3_interrupt() Luca Barbieri (1): locking: Make sparse work with inline spinlocks and rwlocks Magnus Damm (23): ARM: mach-shmobile: SH-Mobile G3 support. ARM: mach-shmobile: SH-Mobile G4 support. ARM: mach-shmobile: SH-Mobile AP4 support. sh: Build drivers/sh for ARM-based SH-Mobile CPUs. sh: Let INTC set IRQF_VALID on ARM platforms. serial: sh-sci: Support ARM-based SH-Mobile CPUs. ARM: mach-shmobile: G3EVM, G4EVM and AP4EVB defconfigs ARM: mach-shmobile: optimize get_irqnr_preamble/and_base macros ARM: mach-shmobile: early console support using earlyprintk ARM: mach-shmobile: sh7367 INTCA support ARM: mach-shmobile: sh7377 INTCA support ARM: mach-shmobile: sh7372 INTCA support ARM: mach-shmobile: sh7367 and G3EVM pinmux support ARM: mach-shmobile: G3EVM USBHS support ARM: mach-shmobile: G3EVM KEYSC platform data ARM: mach-shmobile: G3EVM FLCTL platform data mtd: enable sh_flctl on SH-Mobile ARM ARM: mach-shmobile: sh7367 SDHI vector merge ARM: mach-shmobile: sh7377 SDHI vector merge ARM: mach-shmobile: sh7372 SDHI vector merge ARM: mach-shmobile: ap4evb SDHI0 platform data V2 video: enable sh_mobile_lcdc on SH-Mobile ARM Driver core: Early platform kernel-doc update Maik Broemme (1): intelfb: new maintainer Marc Zyngier (5): [ARM] pxa/zeus: Allow usage of 8250-compatible UART in uncompress [ARM] pxa/zeus: Correct the USB host initialisation flags [ARM] pxa/zeus: Add Eurotech as the manufacturer [ARM] pxa/zeus: Add support for onboard max6369 watchdog [ARM] pxa/zeus: Add support for mcp2515 CAN bus Marcel Holtmann (1): Bluetooth: Use single_open() for inquiry cache within debugfs Mark Brown (16): mx31ads: Convert 1133-EV1 to use dev_name to specify consumer devices mx31ads: Allow enable/disable of switchable supplies ARM: SMDK6410: Set up interrupt range for WM835x on 1190-EV1 PMIC board ARM: S3C64XX: Fix dev-audio build ARM: S3C64XX: Staticise audio platform data ARM: SAMSUNG: Staticise gpiolib implementation functions ARM: SMDK6410: Add initial support for WM1192-EV1 PMIC board ARM: SMDK6410: Add support for PMIC LED on WM1192-EV1 PMIC module ARM: SMDK6410: Register IISv4 device mx31ads: Configure SSI5 pins in IOMUX for PMIC module audio support ARM: S3C64XX: Add initial support for board specific IRQs ASoC: Fix S3C64xx IIS driver for Samsung header reorg ARM: S3C64XX: Reintroduce unconditional build of audio device USB: Fix s3c-hsotg build following Samsung platform header moves Input: wm831x-on - convert to use genirq ARM: 5985/2: ARM: Fix Samsung build after "ARM: Eliminate decompressor -Dstatic= PIC hack" Mark Nelson (1): powerpc/pseries: Pass CPPR value to H_XIRR hcall Markus Rathgeb (1): HID: Add RGT Clutch Wheel clutch device id Martin Buck (1): Input: ALPS - fix stuck buttons on some touchpads Martin K. Petersen (1): [SCSI] sd: Fix VPD buffer allocations Martin Wilck (1): ipmi: add parameter to limit CPU usage in kipmid Martyn Welch (1): powerpc/86xx: Renaming following split of GE Fanuc joint venture Masami Hiramatsu (1): kprobes: Calculate the index correctly when freeing the out-of-line execution slot Matthew Garrett (3): rfkill: Add support for KEY_RFKILL ACPI video: Be more liberal in validating _BQC behaviour backlight: Allow properties to be passed at registration Matthew Wilcox (1): USB: Fix usb_fill_int_urb for SuperSpeed devices Maurus Cuelenaere (7): ARM: S3C64XX: Add S3C64XX RTC platform driver ARM: SAMSUNG: Move S3C24XX ADC driver to plat-samsung ARM: S3C64XX: Add S3C64XX support to the generic Samsung ADC driver ARM: S3C64XX: Fix typo in s3c-hsotg platform data ARM: SAMSUNG: Fix null pointer dereference in ADC driver ARM: SAMSUNG: Add support for 12bit ADC USB: gadget: add gadget controller number for s3c-hsotg driver Meelis Roos (1): qlogicpti: Remove slash in QlogicPTI irq name Mel Gorman (2): sysfs: Initialised pci bus legacy_mem field before use tty: Take a 256 byte padding into account when buffering below sub-page units Miao Xie (2): nodemask: fix the declaration of NODEMASK_ALLOC() btrfs: fix btrfs_mkdir goto for no free objectids Michael Braun (1): bridge: Fix br_forward crash in promiscuous mode Michael Brunner (1): USB: cp210x: Remove double usb_control_msg from cp210x_set_config Michael Ellerman (1): powerpc: Dynamically allocate pacas Michael Hennerich (16): Blackfin: bf527-ezkit: add support for V2.1 boards Blackfin: extend bfin-lq035q1-fb resources to include PPI mode Blackfin: pull in asm/bfin_can.h for interrupt masks Blackfin: gpio: use shorter name Blackfin: update AD7879 resources to match the new gpiolib driver support Blackfin: BF51x: fix L1 Instruction SRAM size Blackfin: add optimized version of Hamming Weight functions Blackfin: increase NR_IRQS beyond NR on-chip IRQs Blackfin: bf537-stamp: add example ADS7846 touchscreen resources Blackfin: add support for the on-chip MAC status interrupts Blackfin: bf537-stamp: add example ADP8860 backlight/led resources Blackfin: don't support keypad wakeup from hibernate Blackfin: bf537-stamp: add example ADXL346 orientation resources Input: ads7846 - add support for AD7843 parts Input: ad7877 - increase pen up imeout fbdev: bf54x-lq043fb/bfin-t350mcqb-fb: drop custom mmap() handler Michael Poole (1): HID: magicmouse: fix oops after device removal Michal Nazarewicz (1): USB: g_mass_storage: fixed module name in Kconfig Michal Simek (26): microblaze: Support DMA microblaze: Implement __dma_sync_page microblaze: Add {z,}alloc_maybe_bootmem functions microblaze: Add irq_create_{of_,}mapping functions microblaze: io.h include asm-generic/iomap.h microblaze: Add pci.h microblaze: Add pci-bridge.h microblaze: Add core PCI files microblaze: Enable PCI, missing files microblaze: Add support for Xilinx PCI host bridge microblaze: Add support from PREEMPT microblaze: Move cache function to cache.c microblaze: Preliminary support for dma drivers microblaze: Change temp register for cmdline microblaze: Use generic show_mem() microblaze: Preliminary support for dma drivers microblaze: Add define for ASM_LOOP microblaze: Remove VMALLOC_VMADDR microblaze: Remove ancient Kconfig option for consistent mapping microblaze: pgtable.h: move consistent functions microblaze: Add consistent code microblaze: Fix dma alloc and free coherent dma functions microblaze: PCI early support for noMMU system microblaze: Simplify entry.S - save/restore r3/r4 - ret_from_trap microblaze: Save current task directly microblaze: entry.S use delay slot for return handlers Michel Pollet (1): ARM: S3C2412: SoC has the fractional baud rate register Mikael Pettersson (1): ARM: 5987/1: fix warning in kernel/elfcore.c from ARM's elf.h Mike Frysinger (30): Blackfin: bfin_sport: unify & standardize SPORT masks Blackfin: wire up the various memory related syscalls Blackfin: merge common CAN defines into one headers Blackfin: drop duplicate HOTPLUG Kconfig option Blackfin: drop unused SL811 platform resources from bf527/pnav boards Blackfin: bf537-stamp: change CONFIG_USB_SL811_BFIN_IRQ to IRQ_PF4 Blackfin: isram: add unlikely to sanity checks Blackfin: unify MMR helpers Blackfin: kgdb: mark all local funcs/structs static Blackfin: bf537-stamp: move ADF7021 MAC storage into platform resources Blackfin: implement ftrace mcount test Blackfin: support new ftrace frame pointer semantics Blackfin: fix whitespace damage in thread_info.h Blackfin: move KGDB selection to the way other arches do it Blackfin: simplify SYSCFG code a bit and ignore attempts to change it Blackfin: simplify PTRACE_{PEEK,POKE}USR in preperation for regset support Blackfin: initial regset support Blackfin: initial tracehook support Blackfin: fix single stepping over system calls Blackfin: check for bad syscalls after tracing it Blackfin: add support for restart_syscall() Blackfin: asm/page.h: pull in asm-generic headers Blackfin: eat spurious space in asm/dpmc.h Blackfin: stop cleaning include/asm/asm-offsets.h Input: bf54x-keys - fix system hang when pressing a key MAINTAINERS: add bfin_sdh driver usb: musb: abstract out ULPI_BUSCONTROL register reads/writes USB: musb: fix warnings in Blackfin regs USB: gadget: fix Blackfin builds after gadget cleansing USB: g_mass_storage: fix section mismatch warnings Mike Galbraith (1): net: add scheduler sync hint to tcp_prequeue(). Mike McCormack (1): sky2: Avoid rtnl_unlock without rtnl_lock Mike Miller (1): [SCSI] hpsa: remove scan thread Mike Travis (2): x86: Reduce per cpu MCA boot up messages x86: Reduce per cpu warning boot up messages Ming Lei (1): ath9k: fix lockdep warning when unloading module Mulyadi Santosa (1): doc: typo - Table 1-2 should refer to "status", not "statm" Márton NĂ©meth (3): uwb: make USB device id table constant leds: make PCI device id constant powerpc: Do not call prink when CONFIG_PRINTK is not defined NISHIMOTO Hiroki (3): ARM: mach-shmobile: sh7377 and G4EVM pinmux support ARM: mach-shmobile: G4EVM USBHS support ARM: mach-shmobile: G4EVM KEYSC platform data Nathan Lynch (1): powerpc: Use correct ccr bit for syscall error status Nathaniel McCallum (3): USB: option: fix incorrect manufacturer name in usb/serial/option: MAXON->CMOTECH USB: option: move hardcoded PID to a macro in usb/serial/option USB: option: add support for a new CMOTECH device to usb/serial/option Neil Horman (4): tipc: Fix oops on send prior to entering networked mode (v3) tipc: fix endianness on tipc subscriber messages tipc: filter out messages not intended for this host tipc: fix lockdep warning on address assignment NeilBrown (2): NFS: ensure bdi_unregister is called on mount failure. md: deal with merge_bvec_fn in component devices better. Nick Piggin (1): Btrfs: fix gfp flags masking in the compression code Nicolas Pitre (3): [ARM] orion5x: fix some improper includes in Linkstation files [ARM] Kirkwood: update defconfig [ARM] orion5x: update defconfig Nikanth Karthikesan (1): doc: fix typo in comment explaining rb_tree usage Noah Watkins (3): ceph: replace list_entry with container_of ceph: remove redundant use of le32_to_cpu ceph: fix intra strip unit length calculation OGAWA Hirofumi (1): fat: Fix vfat_lookup() Oleg Nesterov (1): pid_ns: zap_pid_ns_processes: use SEND_SIG_NOINFO instead of force_sig() Oliver Hartkopp (1): MAINTAINER: Correct CAN Maintainer responsibilities and paths Oliver Neukum (9): USB: cdc-acm: Fix stupid NULL pointer in resume() USB: Fix documentation for avoid_reset_quirk usb: cdc-wdm: Fix race between write and disconnect usb: cdc-wdm: Fix race between autosuspend and reading from the device usb: cdc-wdm: Fix race between disconnect and debug messages usb: cdc-wdm: Fix submission of URB after suspension usb: cdc-wdm:Fix loss of data due to autosuspend usb: cdc-wdm: Fix order in disconnect and fix locking usb: cdc-wdm: Fix deadlock between write and resume Ondrej Zary (1): USB: unusual_devs.h: Fix capacity for SL11R-IDE 2.6c Or Gerlitz (1): IPoIB: Include return code in trace message for ib_post_send() failures Paul E. McKenney (13): rcu: Fix holdoff for accelerated GPs for last non-dynticked CPU rcu: Make task_subsys_state() RCU-lockdep checks handle boot-time use sched, rcu: Fix rcu_dereference() for RCU-lockdep rcu: Use wrapper function instead of exporting tasklist_lock rcu, cgroup: Relax the check in task_subsys_state() as early boot is now handled by lockdep-RCU rcu: Add control variables to lockdep_rcu_dereference() diagnostics rcu: Make rcu_read_lock_sched_held() handle !PREEMPT rcu: Suppress __mpol_dup() false positive from RCU lockdep rcu, ftrace: Fix RCU lockdep splat in ftrace_perf_buf_prepare() rcu: Suppress RCU lockdep warnings during early boot ftrace: Replace read_barrier_depends() with rcu_dereference_raw() rcu: Increase RCU CPU stall timeouts if PROVE_RCU x86/mce: Fix RCU lockdep splats Paul Mackerras (2): perf_event: Fix oops triggered by cpu offline/online perf tools: Fix sparse CPU numbering related bugs Paul Mundt (5): MAINTAINERS: Add entry for ARM-based SH-Mobile architecture. sh: Support CPU affinity masks for INTC controllers. sh: Fix up uncached offset for legacy 29-bit mode. sh: Fix up NUMA build for 29-bit. sh: Export uncached helper symbols. Pavel Roskin (1): drm/kms: fix spelling in error message Peter Huewe (6): uwb/i1480: add __init/__exit macros isdn/hardware: add __init/__exit macros to mISDNisar.c w1: add __init/__exit macros to w1.c media/dvb: add __init/__exit macros to bt878.c isdn/mISDN: add __init/__exit macros to dsp_core.c serial: sh-sci: Fix build failure for non-sh architectures. Peter Korsgaard (2): USB: gadget: f_mass_storage::fsg_bind(): fix error handling USB: gadget/multi: cdc_do_config: remove redundant check Peter Tyser (3): edac: mpc85xx mask ecc syndrome correctly edac: mpc85xx improve SDRAM error reporting edac: e752x: add dram scrubbing support Peter Zijlstra (19): perf, x86: Restrict the ANY flag perf_events, x86: Fixup fixed counter constraints perf: Provide generic perf_sample_data initialization perf: Rework and fix the arch CPU-hotplug hooks perf: Optimize perf_disable perf, x86, Do not user perf_disable from NMI context perf, x86: Remove superfluous arguments to x86_perf_event_set_period() perf, x86: Remove superfluous arguments to x86_perf_event_update() perf, x86: Change x86_pmu.{enable,disable} calling convention perf, x86: Use unlocked bitops perf, x86: Fix x86_pmu_start perf, x86: Avoid double disable on throttle vs ioctl(PERF_IOC_DISABLE) perf, x86: Properly account n_added perf, x86: Fix double disable calls perf, x86: Fix double enable calls perf: Provide better condition for event rotation perf, ppc: Fix compile error due to new cpu notifiers perf, x86: Fix hw_perf_enable() event assignment sched: Fix pick_next_highest_task_rt() for cgroups Petko Manolov (1): another pegasus usb net device Ping Cheng (2): Input: wacom - replace WACOM_PKGLEN_PENABLED Input: wacom - merge out and in prox events Rabin Vincent (1): ARM: 5961/1: ux500: fix CLKRST addresses Rafael J. Wysocki (2): PCI/PM Runtime: Make runtime PM of PCI devices inactive by default ACPI / EC / PM: Close race between EC and resume from hibernation Rafi Rubin (1): HID: ntrig: fix touch events Ralf Gerbig (1): ALSA: hda - Sound MSI fallout on a Asus mobo NVIDIA MCP55 Randy Dunlap (11): bridge: depends on INET sound: fix opti92x-ad1848 build Documentation/timers/: split txt and source files Documentation/laptop/: split txt and source files Documentation/fs/: split txt and source files Documentation/vm/: split txt and source files Documentation/SubmitChecklist: add rule #1 scripts/kernel-doc: fix empty function description section Add include to i2c-xii.c to fix build error timestamping: fix example build driver-core: fix missing kernel-doc in firmware_class Ranjith Lohithakshan (1): Input: ads7846 - add wakeup support Reinette Chatre (2): iwl3945: fix memory corruption Revert "iwlwifi: Send broadcast probe request only when asked to" Richard Kennedy (1): fs: buffer_head: remove kmem_cache constructor to reduce memory usage under slub Richard Purdie (1): backlight: Revert some const qualifiers Richard Röjfors (1): Add the platform data include for the Xilinx XPS IIC Bus Interface Rob Alley (1): ARM: 5986/1: at91sam9g20-ek: Correct braces in I2C registration code Robert P. J. Day (3): xen: Fix misspelled CONFIG variable in comment. kobject: documentation: Fix erroneous example in kobject doc. kobject: documentation: Update to refer to kset-example.c. Robert Richter (4): Merge remote branch 'tip/oprofile' into tip/perf/core perf, x86: make IBS macros available in perf_event.h perf, x86: add some IBS macros to perf_event.h perf, x86: rename macro in ARCH_PERFMON_EVENTSEL_ENABLE Robin Getz (1): Blackfin: fix anomaly 283 handling with exact hardware error Rodolfo Giometti (6): pps: LinuxPPS clients support ldisc: new dcd_change() method for line disciplines ldisc n_tty: add new method n_tty_inherit_ops() pps: serial clients support serial 8250: enable PPS support serial amba-pl010: enable PPS support Roel Kluin (6): msm_sdcc.c: missing brackets in msmsdcc_resume() MX1/MX2: -EINVAL overwritten in second iteration in mxc_gpio_setup_multiple_pins() Blackfin: fix decoding of opcodes 41-47 in decode_instruction() asiliantfb: fix test of unsigned in asiliant_calc_dclk2() w1: fix test in ds2482_wait_1wire_idle() isdn: misplaced parenthesis in pof_handle_data() Roland Dreier (1): Merge branches 'cxgb3', 'ipoib', 'misc' and 'nes' into for-next Rudy Matela (1): Coding style correction of some wan drivers Russell King (20): Merge branch 'devel' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 into devel-stable Merge branch 'for-rmk/samsung3' of git://git.fluff.org/bjdooks/linux into devel-stable Merge branch 'for-rmk' of git://git.marvell.com/orion into devel-stable Merge branch 'arm/clock-event' of git://git.pengutronix.de/git/ukl/linux-2.6 into devel-stable Merge branch 'for-rmk' of git://git.marvell.com/orion into devel-stable ARM: Fix decompressor's kernel size estimation for ROM=y MTD: fix pismo build error Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 into devel-stable Merge master.kernel.org:/pub/scm/linux/kernel/git/lethal/genesis-2.6 into devel-stable Merge branch 'for-rmk/samsung5' of git://git.fluff.org/bjdooks/linux into devel-stable Merge branch 'for-rmk/samsung6' of git://git.fluff.org/bjdooks/linux into devel-stable Merge branch 'origin' into devel-stable Merge branch 'master' into for-linus decompress: fix new decompressor for PIC ARM: Add L2 cache handling to smp boot support Video: ARM CLCD: Better fix for swapped IENB and CNTL registers Merge master.kernel.org:/pub/scm/linux/kernel/git/lethal/genesis-2.6 ARM: Add final piece to fix XIP decompressor in read-only memory ARM: Fix sorting of platform group config options and includes ARM: Fix RiscPC decompressor build errors Ryusuke Konishi (6): nilfs2: fix discrepancy in use of static specifier nilfs2: fix function name typos in docbook comments nilfs2: fix typo "cout" -> "count" in error message nilfs2: fix various typos in comments nilfs2: remove spaces before tabs nilfs2: remove whitespaces before quoted newlines Sachin Prabhu (2): GFS2: Skip check for mandatory locks when unlocking 9p: Skip check for mandatory locks when unlocking Sage Weil (176): ceph: documentation ceph: on-wire types ceph: client types ceph: ref counted buffer ceph: super.c ceph: inode operations ceph: directory operations ceph: file operations ceph: address space operations ceph: MDS client ceph: OSD client ceph: CRUSH mapping algorithm ceph: monitor client ceph: capability management ceph: snapshot management ceph: messenger library ceph: message pools ceph: nfs re-export support ceph: ioctls ceph: debugfs ceph: Kconfig, Makefile ceph: document shared files in README ceph: show meaningful version on module load ceph: include preferred_osd in file layout virtual xattr ceph: gracefully avoid empty crush buckets ceph: fix mdsmap decoding when multiple mds's are present ceph: renew mon subscription before it expires ceph: fix osd request submission race ceph: revoke osd request message on request completion ceph: fail gracefully on corrupt osdmap (bad pg_temp mapping) ceph: reset osd session on fault, not peer_reset ceph: cancel osd requests before resending them ceph: update to mon client protocol v15 ceph: add file layout validation ceph: ignore trailing data in monamp ceph: remove unused CEPH_MSG_{OSD,MDS}_GETMAP ceph: add version field to message header ceph: convert encode/decode macros to inlines ceph: initialize sb->s_bdi, bdi_unregister after kill_anon_super ceph: move generic flushing code into helper ceph: flush dirty caps via the cap_dirty list ceph: correct subscribe_ack msgpool payload size ceph: warn on allocation from msgpool with larger front_len ceph: move dirty caps code around ceph: enable readahead ceph: include preferred osd in placement seed ceph: v0.17 of client ceph: move directory size logic to ceph_getattr ceph: remove small mon addr limit; use CEPH_MAX_MON where appropriate ceph: reduce parse_mount_args stack usage ceph: silence uninitialized variable warning ceph: fix, clean up string mount arg parsing ceph: allocate and parse mount args before client instance ceph: correct comment to match striping calculation ceph: fix object striping calculation for non-default striping schemes ceph: fix uninitialized err variable crush: always return a value from crush_bucket_choose ceph: init/destroy bdi in client create/destroy helpers ceph: use fixed endian encoding for ceph_entity_addr ceph: fix endian conversions for ceph_pg ceph: fix sparse endian warning ceph: convert port endianness ceph: clean up 'osd%d down' console msg ceph: make CRUSH hash functions non-inline ceph: use strong hash function for mapping objects to pgs ceph: make object hash a pg_pool property ceph: make CRUSH hash function a bucket property ceph: do not confuse stale and dead (unreconnected) caps ceph: separate banner and connect during handshake into distinct stages ceph: remove recon_gen logic ceph: exclude snapdir from readdir results ceph: initialize i_size/i_rbytes on snapdir ceph: pr_info when mds reconnect completes ceph: build cleanly without CONFIG_DEBUG_FS ceph: fix page invalidation deadlock ceph: remove bad calls to ceph_con_shutdown ceph: remove unnecessary ceph_con_shutdown ceph: handle errors during osd client init ceph: negotiate authentication protocol; implement AUTH_NONE protocol ceph: move mempool creation to ceph_create_client ceph: small cleanup in hash function ceph: fix debugfs entry, simplify fsid checks ceph: decode updated mdsmap format ceph: reset requested max_size after mds reconnect ceph: reset msgr backoff during open, not after successful handshake ceph: remove dead code ceph: remove useless IS_ERR checks ceph: plug leak of request_mutex ceph: whitespace cleanup ceph: hide /.ceph from readdir results ceph: allow preferred osd to be get/set via layout ioctl ceph: update MAINTAINERS entry with correct git URL ceph: mark v0.18 release ceph: use kref for ceph_buffer ceph: simplify ceph_buffer interface ceph: use kref for struct ceph_mds_request ceph: use kref for ceph_osd_request ceph: use kref for ceph_msg ceph: do not feed bad device ids to crush ceph: fix leak of monc mutex ceph: carry explicit msg reference for currently sending message ceph: plug msg leak in con_fault ceph: detect lossy state of connection ceph: don't save sent messages on lossy connections ceph: hex dump corrupt server data to KERN_DEBUG ceph: plug leak of incoming message during connection fault/close ceph: make mds ops interruptible ceph: include link to bdi in debugfs ceph: ensure rename target dentry fails revalidation ceph: do not drop lease during revalidate ceph: fix error paths for corrupt osdmap messages ceph: fix incremental osdmap pg_temp decoding bug ceph: do not touch_caps while iterating over caps list ceph: only unregister registered bdi ceph: unregister canceled/timed out osd requests ceph: use connection mutex to protect read and write stages ceph: control access to page vector for incoming data ceph: more informative msgpool errors ceph: include transaction id in ceph_msg_header (protocol change) ceph: add feature bits to connection handshake (protocol change) ceph: support ceph_pagelist for message payload ceph: use ceph_pagelist for mds reconnect message; change encoding (protocol change) ceph: remove unused erank field ceph: display pgid in debugfs osd request dump ceph: mark MDS CREATE as a write op ceph: properly handle aborted mds requests ceph: precede encoded ceph_pg_pool struct with version ceph: include type in ceph_entity_addr, filepath ceph: release all pages after successful osd write response ceph: buffer decoding helpers ceph: aes crypto and base64 encode/decode helpers ceph: allow renewal of auth credentials ceph: add struct version to auth encoding ceph: add support for auth_x authentication protocol ceph: add uid field to ceph_pg_pool ceph: cap revocation fixes ceph: do not retain caps that are being revoked ceph: fix sync read eof check deadlock ceph: cleanup async writeback, truncation, invalidate helpers ceph: invalidate pages even if truncate is pending ceph: remove bogus invalidate_mapping_pages ceph: fix msgr to keep sent messages until acked ceph: reset osd connections after fault ceph: allow connection to be reopened by fault callback ceph: cancel delayed work when closing connection ceph: use rbtree for mds requests ceph: use rbtree for snap_realms ceph: use rbtree for mon statfs requests ceph: fix authentication races, auth_none oops ceph: clean up readdir caps reservation ceph: fix iterate_caps removal race ceph: fix memory leak when destroying osdmap with pg_temp mappings ceph: use rbtree for pg pools; decode new osdmap format ceph: v0.19 release ceph: fix typo in ceph_queue_writeback debug output ceph: fix check for invalidate_mapping_pages success ceph: fix up unexpected message handling ceph: fix comments, locking in destroy_inode ceph: drop messages on unregistered mds sessions; cleanup ceph: fix client_request_forward decoding ceph: invalidate_authorizer without con->mutex held ceph: fix connection fault STANDBY check ceph: remove fragile __map_osds optimization ceph: remove bogus mds forward warning ceph: reset bits on connection close ceph: use single osd op reply msg ceph: fix snaptrace decoding on cap migration between mds ceph: reset front len on return to msgpool; BUG on mismatched front iov ceph: set osd request message front length correctly ceph: return EBADF if waiting for caps on closed file ceph: fix osdmap decoding when pools include (removed) snaps ceph: include migrating caps in issued set ceph: fix flush_dirty_caps race with caps migration Btrfs: flush data on snapshot creation Btrfs: fix search_ioctl key advance Btrfs: use __u64 types in ioctl.h Samuel Ortiz (1): mfd: Fix sm501 requested region size Santosh Shilimkar (1): omap4: Fix build break by moving omap_smc1 into a separate .S Sarah Sharp (1): USB: xhci: Make endpoint interval debugging clearer. Sarveshwar Bandi (1): be2net: download NCSI section during firmware update Sascha Hauer (17): Merge branch 'imx' of git://git.pengutronix.de/git/ukl/linux-2.6 into mxc-master Merge branch 'mxc-rc' into mxc-master Merge branch 'imx/master' of git://git.pengutronix.de/git/ukl/linux-2.6 into mxc-master fsl_mx3_udc: Add i.MX35 support i.MX ehci platform support: Some fixes i.MX27: Add USB control register access support i.MX35: Add USB control register access support i.MX27 pca100: Add USB support i.MX27 pcm038: Add USB support i.MX31 pcm037: Add USB support i.MX27 pca100: Add USB support mxc: refactor timer code to use timer versions add ssi header file pca100: add sound support i.MX pcm043: Add AC97 sound support Merge branch 'mx51-baseport-sascha' of git://kernel.ubuntu.com/amitk/mx51-upstream into mxc-master ARM: 5990/1: ARM: use __armv5tej_mmu_cache_flush for V5TEJ instead of __armv4_mmu_cache_flush Scott Ellis (2): spi/omap2_mcspi: fix NULL pointer dereference spi/omap2_mcspi: Use transaction speed if provided Scott Wood (2): powerpc/perf: Build callchain code regardless of hardware event support. powerpc/perf: e500 support Sebastian Andrzej Siewior (1): tree wide: remove execute flag from .c files Sebastien Requiem (2): [ARM] MV78XX0: MPP routines and definitions [ARM] MV78xx0: Support for Buffalo WXL (Terastation Duo) Sekhar Nori (1): net: davinci emac: use dma_{map, unmap}_single API for cache coherency Sergio Aguirre (1): omap: Fix gpio_resume_after_retention Shahar Havivi (1): vt: remove unused variables Shane Huang (1): ahci: pp->active_link is not reliable when FBS is enabled Shaohua Li (1): acpiphp: Execute ACPI _REG method for hotadded devices Shaun Patterson (1): vmiclock: fix comment spelling mistake Simon Guinot (4): [ARM] Orion5x: set valid GPIO inhibit power-off for d2net [ARM] Orion5x: enable SATA LED blinking for d2net [ARM] Kirkwood: add LaCie Internet Space v2 support [ARM] Kirkwood: define SATA LED for netspace_v2 Sonic Zhang (14): Blackfin: move on-chip UART resources to boards files Blackfin: move SPORT UART resources to boards files Blackfin: allow boards to register early devices Blackfin: add UART/SPORT early platform resources Blackfin: MPU: handle caches for reserved memory Blackfin: dma-mapping: fix thinko in constant optimization Blackfin: bf537-stamp: unify duplicated ADP5588 headers Blackfin: update defconfigs Blackfin: SMP: add support for IRQ affinity Blackfin: bf537-stamp: add example AD5398 power regulator resources Blackfin: bf537-stamp: add example ADP122/ADP150 power regulator resources Blackfin: bf537-stamp: add example AD7414 temp sensor resources Blackfin: bf537-stamp: add example AD7416 IIO resources USB: musb: fix build error introduced by isoc change Sripathi Kodi (1): 9p: Change the name of new protocol from 9p2010.L to 9p2000.L Stanislaw Gruszka (4): airo: return from set_wep_key() when key length is zero bnx2x: use smp_mb() to keep ordering of read write operations bnx2x: remove not necessary compiler barrier bnx2x: change smp_mb() comment to conform the true Stefan Schmidt (5): [ARM] pxa: enable check_scoop_reg() only if CONFIG_PM is set. [ARM] pxa: define zeus_power_off() only when CONFIG_PM enabled [ARM] pxa/imote2: Add defconfig for the imote2 platform. [ARM] pxa/imote2: Remove redundant pin entry for nCS. USB: serial: Fix module name typo for qcaux Kconfig entry. Stefan Weil (2): Fix spelling of 'platform' in comments and doc Fix spelling of 'platform' in log messages Stephen M. Cameron (8): [SCSI] hpsa: allow modifying device queue depth. [SCSI] hpsa: fix firmwart typo [SCSI] hpsa: fix scsi status mis-shift [SCSI] hpsa: return -ENOMEM, not -1 [SCSI] hpsa: mark hpsa_pci_init as __devinit [SCSI] hpsa: Clarify calculation of padding for commandlist structure [SCSI] hpsa: Increase the number of scatter gather elements supported. [SCSI] hpsa: remove unused members next, prev, and retry_count from command list structure. Stephen Rothwell (3): ceph: update for write_inode API change i2c-smbus: Use device_lock/device_unlock sysdev: the cpu probe/release attributes should be sysdev_class_attributes Steve Dickson (1): nfs4: Make the v4 callback service hidden Steve French (1): [CIFS] checkpatch cleanup Steve Glendinning (2): smsc75xx: SMSC LAN75xx USB gigabit ethernet adapter driver smsc95xx: wait for PHY to complete reset during init Steve Wise (2): IB/mad: Ignore iWARP devices on device removal RDMA/cxgb3: Wait at least one schedule cycle during device removal Steven Rostedt (6): function-graph: Fix unused reference to ftrace_set_func() function-graph: Use comment notation for func names of dangling '}' function-graph: Init curr_ret_stack with ret_stack tracing: Use same local variable when resetting the ring buffer tracing: Disable buffer switching when starting or stopping trace tracing: Do not record user stack trace from NMI context Sucheta Chakraborty (4): qlcnic: fix tx csum status qlcnic: additional driver statistics. qlcnic: fix multicast handling qlcnic: validate unified fw image Sujith (1): mac80211: Fix HT rate control configuration Suman Anna (1): omap2/3/4: mailbox: remove compiler warning Suresh Siddha (1): x86_64, cpa: Don't work hard in preserving kernel 2M mappings when using 4K already TARUISI Hiroaki (2): Btrfs: add a function to lookup a directory path by following backrefs btrfs: Update existing btrfs_device for renaming device Takashi Iwai (10): ALSA: hda - Fix wrong model range check for ALC268 ALSA: hda - Fix input source elements of secondary ADCs on Realtek Merge branch 'topic/hda' into for-linus Merge branch 'topic/misc' into for-linus ALSA: hda - Add an error message for invalid mapping NID ALSA: hda - Fix secondary ADC of ALC260 basic model ALSA: hda - Disable MSI for Nvidia controller Merge branch 'topic/misc' into fix/misc Merge branch 'fix/misc' into for-linus Merge branch 'fix/hda' into for-linus Tejun Heo (3): percpu: Add __percpu sparse annotations to hw_breakpoint ahci: add missing nv IDs ahci: use BIOS date in broken_suspend list Thadeu Lima de Souza Cascardo (10): fix ext3/ext4 comment typo compain -> complain fix comment typo boo -> boot in ksysfs.c doc: fix leve -> level typo in pm-runtime doc fix comment typo leve -> level in powerpc doc: update 00-INDEX for Documentation/laptops/ doc: fix Defaultd -> Defaults typo in EISA doc doc: capitalization and other minor fixes in pnp doc doc: fix console doc typo Input: mousedev - remove BKL Input: serio_raw - remove BKL Thomas Abraham (3): ARM: SAMSUNG: Add check to ensure that clksrc_clk does have multiple clock sources ARM: SAMSUNG: serial: Modify console initialization. ARM: S5PV210: Add serial port support Thomas Bächler (1): Input: alps - add support for the touchpad on Toshiba Tecra A11-11L Thomas Gleixner (1): mm: do not iterate over NR_CPUS in __zone_pcp_update() Thomas Renninger (2): ACPI thermal: Check for thermal zone requirement ACPI thermal: Don't invalidate thermal zone if critical trip point is bad Thomas Weber (1): OMAP2: serial.c: Fix number of uarts in early_init Tilman Schmidt (5): gigaset: avoid registering CAPI driver more than once gigaset: correct clearing of at_state strings on RING gigaset: prune use of tty_buffer_request_room gigaset: correct range checking off by one error gigaset: fix build failure Tim Bird (1): function-graph: Add tracing_thresh support to function_graph tracer Timo Teräs (1): gre: fix hard header destination address checking Tobias Klauser (1): tty: cpm_uart: use resource_size() Tom Zanussi (2): perf trace/scripting: Remove extraneous header read perf trace: Don't use pager if scripting Tony Lindgren (4): omap3: Fix compile for Touch Book early_param omap2: Update n8x0 defconfig to test multi-omap and DMA api changes omap: Enable PM_RUNTIME in defconfigs to avoid USB compile errors usb: musb: Fix compile error for omaps for musb_hdrc Trond Myklebust (2): NFSv4: Don't ignore the NFS_INO_REVAL_FORCED flag in nfs_revalidate_inode() NFS: Avoid a deadlock in nfs_release_page Ursula Braun (3): qeth: enable kmsg hash processing in qeth_core_sys.c qeth: set promisc off after trace disabling failure qeth: no recovery after layer mismatch (z/VM NICs) Uwe Kleine-König (83): [ARM] pxa/ttc_dkb: remove duplicate macro definition imx/mx2: fold crm_regs.h into its only consumer imx/clock-imx21: use a macro to define registers imx/clock-imx27: use a macro to define registers imx/mach-mx2: use constants namespaced by the corresponding SOC (easy part) imx/mach-mx3: use constants namespaced by the corresponding SOC (easy part) imx/mx3: rename clock.c and iomux.c to {clock,iomux}-imx31.c imx/mx1: add newline at end of Makefile imx/mx1: rename files defining a machine to mach-$mach.c imx: rename Kconfig symbol for "Eukrea CPUIMX27 module" imx: rename Kconfig symbol for "LogicPD MX27 LITEKIT platform" imx/mx2: rename files defining a machine to mach-$mach.c imx/mx3: rename files defining a machine to mach-$mach.c imx: provide helper macro to define IO_ADDRESS imx21: define and use MX21_IO_ADDRESS imx27: define and use MX27_IO_ADDRESS imx31: define and use MX31_IO_ADDRESS imx25: redefine MX25_IO_ADDRESS using IMX_IO_ADDRESS imx35: define and use MX35_IO_ADDRESS mx3/kzm_arm11_01: define and use board specific IO_ADDRESS macro imx: mangle addresses after adding the offset imx: only define deprecated symbols conditionally imx: remove mx1ads defconfig imx: remove unneeded include of mach/hardware.h imx: properly protect mach/mx{1,[25][157x]}.h from multiple inclusion imx: define functions to configure chip selects in the WEIM arm/at91: Don't disable irqs in set_next_event and set_mode callbacks arm/{pxa,sa1100,nomadik}: Don't disable irqs in set_next_event and set_mode mx2/mx3: debug-macro.S needs deprecated symbols mx1: prefix SOC specific defines with MX1_ and deprecate old names mx25: deprecate UART1_BASE_ADDR and UART2_BASE_ADDR imx: WARN in clk_disable if the clock isn't enabled mxc91231: use MXC91231_IO_ADDRESS instead of MXC91231_AIPS1_IO_ADDRESS mxc91231: redefine MXC91231_IO_ADDRESS using IMX_IO_ADDRESS imx2x: convert serial.c to use soc-prefixed constants imx: define per SOC ..._PHYS_OFFSET and use these in favour of PHYS_OFFSET imx/mx25: rename files defining a machine to mach-$mach.c fix typos "precidence" -> "precedence" in comments tree-wide: fix typos "ammount" -> "amount" grammar fix in comment fix typo "definetly" -> "definitely" in comment arm/mx2: use cpp magic to create spi_imx devices arm/mx2: use cpp magic to create imx_gpt devices arm/mx2: use cpp magic to create imx-i2c devices arm/mx2: use cpp magic to create imx-mmc devices arm/mx2: use cpp magic to create imx-ssi devices arm/mx2/devices: use SoC-prefixed names where possible tree-wide: fix typos "ass?o[sc]iac?te" -> "associate" in comments arm/mx2: define seperate imx_nand devices for imx21 and imx27 arm/mx2: use per-SOC nand device arm/mx2: define seperate gpio port descriptions for imx21 and imx27 arm/mx2/devices: no need for IMX_NEEDS_DEPRECATED_SYMBOLS any more arm/mx2: split generic.c into mm-imx2[17].c arm/imx/gpio: GPIO_INT_{HIGH,LOW}_LEV are not necessarily constant arm/imx: use generic_handle_irq instead of open-coding it arm/imx/gpio: use fls to find set bits in the irq status register arm/imx/gpio: remove a BUG_ON in hot path arm/imx/audmux-v1: use SoC-prefixed names arm/imx/audmux-v2: use SoC-prefixed names arm/imx: remove "NO_PAD_CTRL" from Copyright statements arm/imx: let ARCH_MXC select COMMON_CLKDEV instead of each subfamily arm/imx: don't explicitly select GENERIC_GPIO arm/imx: remove MTD_XIP support arm/imx: remove #ifndef CONFIG_COMMON_CLKDEV block arm/imx: don't depend on ARCH_MXC twice arm/imx/irq: order definitions of MXC_GPIO_IRQS numerically arm/imx: choose sane CONSISTENT_DMA_SIZE if video is enabled for both mx1 and mx3 arm/imx/dma-v1: don't use deprecated symbols DMA_BASE and MXC_INT_DMACH0 arm/imx/dma-v1: protect #ifdef'd blocks additionally by cpu_is_... arm/imx/iomux-v1: rename source file and reorganize Kconfig stuff arm/imx/iomux-v1: make base address a runtime choice arm/imx/iomux-mx1: unify style and comment cleanup arm/imx/iomux-mx21: unify style arm/imx/iomux-mx25: unify style and comment cleanup arm/imx/iomux-mx27: unify style and comments arm/imx/iomux-mx2x: unify style arm/imx/iomux-mx3.h: unify style and comments arm/mx25: don't include iomux.h which is for iomux-v1 machines arm/imx/iomux-v1: rename header file arm/imx: let platform files include the SoC-specific iomux header arm/imx/iomux-v1: check for invalid modes in mxc_gpio_mode Merge branch 'mxc-master' of git://git.pengutronix.de/git/imx/linux-2.6 into imx/master rtc/hctosys: only claim the RTC provided the system time if it did Vadim Zaliva (1): Input: appletouch - fix integer overflow issue Vaidyanathan Srinivasan (3): powerpc: Reset kernel stack on cpu online from cede state powerpc: Move checks in pseries_mach_cpu_die() powerpc: Reduce printk from pseries_mach_cpu_die() Valentin Longchamp (3): mx31moboard: change initial reset status for robot microcontollers mx31moboard: make usbh2 enable gpio claim more atomic mx31moboard: support for the smartbot baseboard Valentin Yakovenkov (1): Blackfin: bf561-acvilon: save the smsc911x mac address Vasily Khoruzhick (4): ARM: SAMSUNG: Add resources description for s3c24xx ts driver ARM: SAMSUNG: adc: disable/enable IRQ on suspend/resume ARM: S3C2440: Fix s3c2440 cpufreq compilation post move. ARM: SAMSUNG: Add suspend/resume support for S3C PWM driver Veaceslav Falico (4): copy_signal() cleanup: use zalloc and remove initializations copy_signal() cleanup: kill taskstats_tgid_init() and acct_init_pacct() copy_signal() cleanup: clean thread_group_cputime_init() copy_signal() cleanup: clean tty_audit_fork() Venkatesh Pallipadi (1): jffs2: fix up rb_root initializations to use RB_ROOT Vitaliy Gusev (1): route: Fix caught BUG_ON during rt_secret_rebuild_oneshot() Vitaliy Kulikov (1): ALSA: hda - New Intel HDA controller Vladimir Zapolskiy (2): ARM: IMX31: configure pins iomux for SDHC setup on litekit board. mxcmmc: fixed max_seg_size value on initialization Vladislav Zolotarov (1): bnx2x: Removed FW 5.2.7 Wang Qiang (1): NUC900 LCD Controller Driver Wayne Boyer (9): [SCSI] ipr: add support for new adapter command structures for the next generation chip [SCSI] ipr: define new offsets to registers for the next generation chip [SCSI] ipr: update the configuration table code for the next generation chip [SCSI] ipr: add error handling updates for the next generation chip [SCSI] ipr: add hardware assisted smart dump functionality [SCSI] ipr: implement shutdown changes and remove obsolete write cache parameter [SCSI] ipr: add support for multiple stages of initialization [SCSI] ipr: add support for new IOASCs [SCSI] ipr: adds PCI ID definitions for new adapters Will Deacon (4): perf, ARM: Modify kuser rmb() call to compile for Thumb-2 ARM: 5959/1: ARM: perf-events: request PMU interrupts with IRQF_NOBALANCING ARM: 5960/1: ARM: perf-events: fix v7 event selection mask ARM: 5989/1: ARM: KGDB: add support for SMP platforms Wolfgang Grandegger (1): MAINTAINERS: add netdev to CAN network layer and drivers entries Wolfram Sang (2): at24: Init dynamic bin_attribute structures init dynamic bin_attribute structures Wu Fengguang (2): mm: introduce dump_page() and print symbolic flag names /dev/mem: dont allow seek to last page Xiao Guangrong (2): perf: export perf_trace_regs and perf_arch_fetch_caller_regs btrfs: using btrfs_stack_device_id() get devid YOSHIFUJI Hideaki (1): bridge: ensure to unlock in error path in br_multicast_query(). YOSHIFUJI Hideaki / ĺ‰č—¤č‹±ćŽ (5): ipv6: Optmize translation between IPV6_PREFER_SRC_xxx and RT6_LOOKUP_F_xxx. ipv6 ip6_tunnel: eliminate unused recursion field from ip6_tnl{}. bridge br_multicast: Fix handling of Max Response Code in IGMPv3 message. bridge br_multicast: Fix skb leakage in error path. bridge br_multicast: Don't refer to BR_INPUT_SKB_CB(skb)->mrouters_only without IGMP snooping. Yehuda Sadeh (24): ceph: mount fails immediately on error ceph: fix msgpool reservation leak ceph: remove unaccessible code ceph: writepage grabs and releases inode ceph: writeback congestion control ceph: fix copy_user_to_page_vector() ceph: change dentry offset and position after splice_dentry ceph: allocate middle of message before stating to read ceph: refactor messages data section allocation ceph: alloc message data pages and check if tid exists ceph: keep reserved replies on the request structure ceph: remove unreachable code ceph: always send truncation info with read and write osd ops ceph: remove unused variable ceph: put unused osd connections on lru ceph: fix short synchronous reads ceph: refactor ceph_write_begin, fix ceph_page_mkwrite ceph: fix truncation when not holding caps ceph: sync read/write considers page cache ceph: remove page upon writeback completion if lost cache cap ceph: don't truncate dirty pages in invalidate work thread ceph: cleanup redundant code in handle_cap_grant ceph: don't clobber write return value when using O_SYNC ceph: reset osd after relevant messages timed out Yi Li (6): Blackfin: flush caches on SMP when one core calls another via IPI Blackfin: SMP: make core timers per-cpu clock events for HRT Blackfin: simplify SMP handling in SRAM code Blackfin: try to simplify interrupt ifdef ugliness Blackfin: add support for irqflags tracing Blackfin: add CALLER_ADDR ftrace macros Yoichi Yuasa (1): pcmcia/vrc4171: use local spinlock for device local lock. Yoshihiro Shimoda (1): usb: r8a66597-hcd: fix removed from an attached hub Zhang Rui (1): ACPI: Disable explicit power state retrieval on fans Zhu Qingsen (1): [ARM] Orion: Add Buffalo Linkstation LS-HGL support Zhu Yi (11): net: add limit for socket backlog tcp: use limited socket backlog udp: use limited socket backlog llc: use limited socket backlog sctp: use limited socket backlog tipc: use limited socket backlog x25: use limited socket backlog net: backlog functions rename net: add __must_check to sk_add_backlog libipw: split ieee->networks into small pieces ipw2200: use kmalloc for large local variables chaithrika@ti.com (1): TI DaVinci EMAC: Convert to dev_pm_ops john stultz (1): timekeeping: Prevent oops when GENERIC_TIME=n jvrao (1): 9p: Fixes a simple bug enabling writes beyond 2GB. spark (1): USB: option.c: Add Pirelli VID/PID and indicate Pirelli's modem interface is 0xff stephen hemminger (4): IPv6: addrconf dad timer unnecessary bh_disable IPv6: addrconf timer race IPv6: addrconf notify when address is unavailable IPv6: fix race between cleanup and add/delete address ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Wed May 19 15:08:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JK8OnK151899 for ; Wed, 19 May 2010 15:08:24 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o4JK8MQD151870; Wed, 19 May 2010 15:08:22 -0500 Date: Wed, 19 May 2010 15:08:22 -0500 Message-Id: <201005192008.o4JK8MQD151870@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree annotated tag, v2.6.34-rc5, created. v2.6.34-rc5 X-Git-Refname: refs/tags/v2.6.34-rc5 X-Git-Reftype: annotated tag X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: d1744e136396b363e5844ed5f928e40067b5784a This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The annotated tag, v2.6.34-rc5 has been created at d1744e136396b363e5844ed5f928e40067b5784a (tag) tagging 01bf0b64579ead8a82e7cfc32ae44bc667e7ad0f (commit) replaces v2.6.34-rc4 tagged by Linus Torvalds on Mon Apr 19 16:30:06 2010 -0700 - Log ----------------------------------------------------------------- Linux 2.6.34-rc5 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEABECAAYFAkvM54IACgkQF3YsRnbiHLsqIgCdFNaV6c2QVR+LrSmiMi4TZY2y 0UQAoKn/K9ImQIaOWKmtYohFD1Ui+7uB =seRX -----END PGP SIGNATURE----- Alex Deucher (6): drm/radeon/kms: more atom parser fixes (v2) drm/radeon/kms/atom: fix dual-link DVI on DCE3.2/4.0 drm/radeon/kms/evergreen: don't enable hdmi audio stuff drm/radeon/kms: fix tv dac conflict resolver drm/radeon/kms: adjust pll settings for tv drm/radeon/kms: disable the tv encoder when tv/cv is not in use Alexey Starikovskiy (1): ACPI: EC: Limit burst to 64 bits Amit Kumar Salecha (1): qlcnic: fix set mac addr Anders Larsen (1): ARM: 5975/1: AT91 slow-clock suspend: don't wait when turning PLLs off Ayaz Abdulla (1): forcedeth: fix tx limit2 flag check Brice Goglin (1): myri10ge: fix rx_pause in myri10ge_set_pauseparam Chase Douglas (1): Input: ALPS - add signature for HP Pavilion dm3 laptops Chris Wright (5): x86/amd-iommu: Pt mode fix for domain_destroy x86/amd-iommu: enable iommu before attaching devices x86/amd-iommu: warn when issuing command to uninitialized cmd buffer Revert "x86: disable IOMMUs on kernel crash" x86/amd-iommu: use for_each_pci_dev Christian Pulvermacher (1): ecryptfs: fix error code for missing xattrs in lower fs Clemens Ladisch (3): firewire: cdev: disallow receive packets without header firewire: cdev: require quadlet-aligned headers for transmit packets firewire: cdev: iso packet documentation Corbin Simpson (1): drivers/gpu/radeon: Add MSPOS regs to safe list. Dan Carpenter (2): dma-debug: Cleanup for copy-loop in filter_write() stmmac: use resource_size() Daniel Lezcano (1): packet : remove init_net restriction Daniel Vetter (2): drm/i915: introduce to_intel_bo helper agp/intel: intel_845_driver is an agp driver! Dave Airlie (2): drm/radeon/kms: only change mode when coherent value changes. drm/radeon/kms: add FireMV 2400 PCI ID. Dave Chinner (2): xfs: ensure that sync updates the log tail correctly xfs: don't warn on EAGAIN in inode reclaim David Howells (1): rcu: Better explain the condition parameter of rcu_dereference_check() David S. Miller (21): Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 Merge branch 'vhost' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost tcp: Set CHECKSUM_UNNECESSARY in tcp_init_nondata_skb Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 Revert "tcp: Set CHECKSUM_UNNECESSARY in tcp_init_nondata_skb" Merge branch 'master' of /home/davem/src/GIT/linux-2.6/ sparc64: Use kstack_valid() in die_if_kernel(). sparc64: Adjust __raw_local_irq_save() to cooperate in NMIs. sparc64: Add HAVE_FUNCTION_TRACE_MCOUNT_TEST and tidy up. sparc64: Kill CONFIG_STACK_DEBUG code. sparc64: Kill unnecessary static on local var in ftrace_call_replace(). sparc64: Remove profiling from some low-level bits. sparc64: Use a seperate counter for timer interrupts and NMI checks, like x86. sparc64: Give a stack frame to the ftrace call sites. sparc64: Add function graph tracer support. sparc64: Support kmemleak. sparc64: Add kmemleak annotation to sun4v_build_virq() sparc64: Fix memory leak in pci_register_iommu_region(). Merge branch 'master' of /home/davem/src/GIT/linux-2.6/ sparc64: Add some more commentary to __raw_local_irq_save() Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 Dmitry Torokhov (2): Input: sparse-keymap - implement safer freeing of the keymap Revert "Input: wacom - merge out and in prox events" Dominik Brodowski (1): Input: i8042 - spelling fix Eric Anholt (2): drm/i915: Rename intel_output to intel_encoder. drm/i915: Rename many remaining uses of "output" to encoder or connector. Eric Dumazet (4): can: avoids a false warning fib: suppress lockdep-RCU false positive in FIB trie. net: dev_pick_tx() fix ip: Fix ip_dev_loopback_xmit() Ernst Schwab (1): ARM: 5974/1: arm/mach-at91 Makefile: remove two blanks. Felix Fietkau (1): ath9k: fix double calls to ath_radio_enable Florian Fainelli (1): r6040: fix r6040_multicast_list Geert Uytterhoeven (2): m68k: Fix asm constraints for atomic_sub_and_test() and atomic_add_negative() [WATCHDOG] max63xx driver depends on ioremap() H Hartley Sweeten (1): Input: matrix_keypad - allow platform to disable key autorepeat Henrik Rydberg (4): Input: bcm5974 - retract efi-broken suspend_resume Input: clarify the no-finger event in multitouch protocol Input: update the status of the Multitouch X driver project hwmon: (applesmc) Switch maintainers Herbert Xu (1): bridge: Fix IGMP3 report parsing Huang Weiyi (1): ASoC: wm2000: remove unused #include Imre Deak (2): ARM: 6050/1: VFP: fix the SMP versions of vfp_{sync,flush}_hwstate ARM: 6051/1: VFP: preserve the HW context when calling signal handlers Ingo Molnar (1): Merge branch 'iommu/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu into x86/urgent Javier Cardona (1): mac80211: Handle mesh action frames in ieee80211_rx_h_action Jean Delvare (4): hwmon: (sht15) Properly handle the case CONFIG_REGULATOR=n hwmon: (it87) Don't arbitrarily enable temperature channels hwmon: (it87) Properly handle wrong sensor type requests hwmon: (it87) Invalidate cache on temperature sensor change Jeff Dike (1): vhost-net: fix vq_memory_access_ok error checking Jeff Mahoney (1): ecryptfs: fix use with tmpfs by removing d_drop from ecryptfs_destroy_inode Jerome Glisse (2): drm/radeon/kms: print GPU family and device id when loading drm/radeon/kms: fix rs600 tlb flush Jerome Oufella (1): hwmon: (sht15) Fix sht15_calc_temp interpolation function Jiri Slaby (1): PM / Hibernate: user.c, fix SNAPSHOT_SET_SWAP_AREA handling Joe Perches (1): vsprintf: Change struct printf_spec.precision from s8 to s16 Joerg Roedel (6): x86/amd-iommu: Protect IOMMU-API map/unmap path x86/amd-iommu: Report errors in acpi parsing functions upstream x86/amd-iommu: Use helper function to destroy domain x86/amd-iommu: Remove obsolete parameter documentation Merge branch 'amd-iommu/fixes' into iommu/fixes x86/gart: Disable GART explicitly before initialization Joerg Schirottke (1): ALSA: hda - add a quirk for Clevo M570U laptop Johannes Berg (2): mac80211: annotate station rcu dereferences iwlwifi: work around bogus active chains detection John Hughes (2): x25: Patch to fix bug 15678 - x25 accesses fields beyond end of packet. x.25 attempts to negotiate invalid throughput Jorge Boncompte [DTI2] (1): udp: fix for unicast RX path optimization Julia Lawall (1): x86/amd-iommu: Remove double NULL check in check_device Justin P. Mattock (1): hwmon: (applesmc) Add iMac9,1 and MacBookPro2,2 support Kailang Yang (2): ALSA: hda - Fix auto-parser of ALC269vb for HP pin NID 0x21 ALSA: hda - Fix setup for ALC269vb amic and dmic models Ken Kawasaki (1): smc91c92_cs: define multicast_table as unsigned char Krzysztof Halasa (1): WAN: flush tx_queue in hdlc_ppp to prevent panic on rmmod hw_driver. Len Brown (1): Merge branch 'bugzilla-15749' into release Linus Torvalds (24): Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6 Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6 Merge branch 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6 Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt/drm-intel Merge master.kernel.org:/home/rmk/linux-2.6-arm Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Fix ISDN/Gigaset build failure Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ecryptfs/ecryptfs-2.6 Linux 2.6.34-rc5 Luuk Paulussen (1): [WATCHDOG] fixed book E watchdog period register mask. Marc Zyngier (1): [WATCHDOG] max63xx: be careful when disabling the watchdog Marek Olšák (2): drm/radeon/kms: fix calculation of mipmapped 3D texture sizes drm/radeon/kms: allow R500 regs VAP_ALT_NUM_VERTICES and VAP_INDEX_OFFSET Maurus Cuelenaere (1): ALSA: hda: Add support for Medion WIM2160 Maxim Kuvyrkov (1): m68k: Fix `struct sigcontext' for ColdFire Michael Chan (1): cnic: Fix crash during bnx2x MTU change. Michael S. Tsirkin (1): tun: orphan an skb on tx Mika Westerberg (1): ARM: 6052/1: kdump: make kexec work in interrupt context Nicolas Pitre (1): ARM: 6007/1: fix highmem with VIPT cache and DMA Patrick Loschmidt (1): net: corrected documentation for hardware time stamping Paul E. McKenney (3): rcu: Add rcu_access_pointer and rcu_dereference_protected rcu: Update docs for rcu_access_pointer and rcu_dereference_protected rcu: Make RCU lockdep check the lockdep_recursion variable Philby John (1): ALSA: aaci - Fix alignment faults on ARM Cortex introduced by commit 29a4f2d3 Ping Cheng (1): Input: wacom - switch mode upon system resume Rik van Riel (1): rmap: add exclusively owned pages to the newest anon_vma Robert Hooker (1): drm/i915: Disable FBC on 915GM and 945GM. Rusty Russell (2): lguest: workaround cmpxchg8b_emu by ignoring cli in the guest. lguest: stop using KVM hypercall mechanism Sage Weil (9): ceph: fix dentry rehashing on virtual .snap dir ceph: allow writeback of snapped pages older than 'oldest' snapc ceph: fix snap context reference leaks ceph: fix leaked inode ref due to snap metadata writeback race ceph: fix ack counter reset on connection reset ceph: decode v5 of osdmap (pool names) [protocol change] ceph: fix dentry reference leak in dcache readdir ceph: queue_cap_snap should always queue dirty context ceph: use separate class for ceph sockets' sk_lock Santosh Shilimkar (1): [WATCHDOG] omap4: Fix WDT Kconfig Sascha Hauer (5): ASoC: imx-ssi: honor IMX_SSI_DMA flag ASoC: imx-pcm-dma-mx2: restart DMA after an error ASoC: imx-ssi: Use a hrtimer in FIQ mode ASoC: imx-ssi: increase minimum periods to 4 ASoC: imx-ssi: do not call hrtimer_disable in trigger function Shanyu Zhao (1): iwlwifi: use consistent table for tx data collect Shirley Ma (1): virtio_net: missing sg_init_table Stefan Assmann (1): igb: restrict WoL for 82576 ET2 Quad Port Server Adapter Stefan Bader (1): drm/i915: Add no_lvds entry for the Clientron U800 Stefan Richter (3): firewire: cdev: fix information leak firewire: cdev: comment fixlet firewire: cdev: change license of exported header files to MIT license Stephen Smalley (1): SELinux: Reduce max avtab size to avoid page allocation failures Takashi Iwai (10): ALSA: hda - Fix initial capture source connections of ALC880/260 ALSA: usb - Fix Oops after usb-midi disconnection ALSA: hda - Enhance fix-up table for Realtek codecs ALSA: hda - Add fix-up for Sony VAIO with ALC269 ALSA: hda - Fix control element allocations in VIA codec parser ALSA: hda - Avoid invalid "Independent HP" control for VIA codecs ALSA: hda - Add position_fix quirk for Biostar mobo Merge branch 'fix/asoc' into for-linus Merge branch 'fix/misc' into for-linus Merge branch 'fix/hda' into for-linus Terry Loftin (1): e1000e: stop cleaning when we reach tx_ring->next_to_use Tilman Schmidt (1): gigaset: include cleanup cleanup Trond Myklebust (6): NFSv4: Fall back to ordinary lookup if nfs4_atomic_open() returns EISDIR NFS: Fix the mode calculation in nfs_find_open_context NFS: Ensure that writeback_single_inode() calls write_inode() when syncing NFS: Fix a race with the new commit code NFS: Ensure that the WRITE and COMMIT RPC calls are always uninterruptible NFSv4: fix delegated locking Tyler Hicks (7): eCryptfs: Fix metadata in xattr feature regression eCryptfs: Rename ecryptfs_crypt_stat.num_header_bytes_at_front eCryptfs: Clear buffer before reading in metadata xattr eCryptfs: Strip metadata in xattr flag in encrypted view eCryptfs: Decrypt symlink target for stat size eCryptfs: Copy lower directory inode times and size on link eCryptfs: Turn lower lookup error messages into debug messages Wey-Yi Guy (1): iwlwifi: need check for valid qos packet before free Yehuda Sadeh (1): ceph: reserve one more caps space when doing readdir Yong Wang (1): Input: sparse-keymap - free the right keymap on error Zhao Yakui (1): drm/i915: Ignore LVDS EDID when it is unavailabe or invalid Zhu Yi (2): iwlwifi: fix DMA allocation warnings iwlwifi: avoid Tx queue memory allocation in interface down ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Wed May 19 15:08:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=ALL_TRUSTED,BAYES_00, J_CHICKENPOX_21,J_CHICKENPOX_35,J_CHICKENPOX_62,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JK8QSn151934 for ; Wed, 19 May 2010 15:08:26 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o4JK8OeE151904; Wed, 19 May 2010 15:08:24 -0500 Date: Wed, 19 May 2010 15:08:24 -0500 Message-Id: <201005192008.o4JK8OeE151904@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree annotated tag, v2.6.34-rc6, created. v2.6.34-rc6 X-Git-Refname: refs/tags/v2.6.34-rc6 X-Git-Reftype: annotated tag X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 1b5265c5905fdc68873d37c902adc4aec2cbd6a3 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The annotated tag, v2.6.34-rc6 has been created at 1b5265c5905fdc68873d37c902adc4aec2cbd6a3 (tag) tagging 66f41d4c5c8a5deed66fdcc84509376c9a0bf9d8 (commit) replaces v2.6.34-rc5 tagged by Linus Torvalds on Thu Apr 29 20:02:17 2010 -0700 - Log ----------------------------------------------------------------- Linux 2.6.34-rc6 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEABECAAYFAkvaSDwACgkQF3YsRnbiHLt25ACeL6bUpBMsu5AYiqNVh233JC20 iAQAn0s0pziM1V8HOlZp5RV+yxUmtmNP =GWn0 -----END PGP SIGNATURE----- Aaro Koskinen (2): omap: fix clocksource_32k to start from zero omap: delete unused bootloader tag variables Abraham Arce (2): KS8851: NULL pointer dereference if list is empty OMAP4: Clocks: Change SPI Instance Names Adam Jackson (2): drm/i915: Attempt to fix watermark setup on 85x (v2) drm/i915: Fix 82854 PCI ID, and treat it like other 85X Ajay Kumar Gupta (1): USB: ehci: omap: fix kernel panic with rmmod Al Viro (1): nfs d_revalidate() is too trigger-happy with d_drop() Alan Cox (1): e100: Fix the TX workqueue race Alan Stern (3): USB: fix remote wakeup settings during system sleep USB: EHCI: defer reclamation of siTDs USB: put claimed interfaces in the "suspended" state Albin Tonnerre (1): lib: fix the use of LZO to decompress initramfs images Alex Deucher (2): drm/radeon/kms/evergreen: fix LUT setup drm/radeon/kms/evergreen: No EnableYUV table Alex Manoussakis (1): USB: ti_usb_3410_5052: adding multitech dialup fax/modem devices Alexander Duyck (1): PCI aerdrv: use correct bit defines and add 2ms delay to aer_root_reset Alexander Kurz (2): net: 3c574_cs fix stats.tx_bytes counter pcmcia: fix matching rules for pseudo-multi-function cards Alexander Kuznetsov (1): 8139too: Fix a typo in the function name. Amerigo Wang (1): [CPUFREQ] fix a lockdep warning Amit Kucheria (1): w1: fix omap 1-wire driver compilation Andre Detsch (2): tg3: Fix INTx fallback when MSI fails cxgb3: Wait longer for control packets on initialization Andre Przywara (1): KVM: allow bit 10 to be cleared in MSR_IA32_MC4_CTL Andrea Arcangeli (1): memcg: fix prepare migration Andreas Hartmann (1): drivers/usb/net/kaweth.c: add device "Allied Telesyn AT-USB10 USB Ethernet Adapter" Andreas Schwab (1): kernel/sys.c: fix compat uname machine Andy Fleming (1): gianfar: Wait for both RX and TX to stop Anil Veerabhadrappa (1): [SCSI] bnx2i: Bug fixes related to MTU change issue when there are active iscsi sessions Anton Blanchard (2): fs/block_dev.c: fix performance regression in O_DIRECT|O_SYNC writes to block devices powerpc/numa: Add form 1 NUMA affinity Anton Vorontsov (4): powerpc/85xx/86xx: Fix build w/ CONFIG_PCI=n fsl_pq_mdio: Fix kernel oops during OF address translation gianfar: Fix potential oops during OF address translation watchdog: booke_wdt: fix build - unconstify watchdog_info Arnaud Patard (1): i2c-imx: fix error handling Arnd Bergmann (1): pktcdvd: improve BKL and compat_ioctl.c usage Avi Kivity (2): KVM: Don't spam kernel log when injecting exceptions due to bad cr writes KVM: VMX: Save/restore rflags.vm correctly in real mode Axel Lin (1): mc13783-regulator: fix a memory leak in mc13783_regulator_remove Balbir Singh (1): virtio: Fix GFP flags passed from the virtio balloon driver Becky Bruce (1): powerpc/fsl_booke: Correct test for MMU_FTR_BIG_PHYS Ben Hutchings (3): sfc: Wait at most 10ms for the MC to finish reading out MAC statistics sfc: Always close net device at the end of a disabling reset sfc: Change falcon_probe_board() to fail for unsupported boards Benjamin Herrenschmidt (1): powerpc/pseries: Flush lazy kernel mappings after unplug operations Bill Pemberton (1): jfs: fix diAllocExt error in resizing filesystem Bjorn Helgaas (5): x86/PCI: ignore Consumer/Producer bit in ACPI window descriptions PCI: revert broken device warning x86/PCI: parse additional host bridge window resource types x86/PCI: never allocate PCI MMIO resources below BIOS_END x86/PCI: compute Address Space length rather than using _LEN Boaz Harrosh (2): exofs: Fix "add bdi backing to mount session" fall out exofs: Fix "add bdi backing to mount session" fall out Bruce Allan (1): e1000e: enable/disable ASPM L0s and L1 and ERT according to hardware errata Changli Gao (1): flex_array: fix the panic when calling flex_array_alloc() without __GFP_ZERO Christof Schmitt (2): [SCSI] zfcp: Update MAINTAINERS entry [SCSI] zfcp: Fix tracing of requests with error status Christoph Egger (1): Remove redundant check for CONFIG_MMU Christoph Hellwig (1): x86: correctly wire up the newuname system call Chuck Lever (1): NFS: rsize and wsize settings ignored on v4 mounts Clemens Ladisch (4): firewire: core: fix retries calculation in iso manage_channel() firewire: core: fw_iso_resource_manage: return -EBUSY when out of resources firewire: ohci: prevent aliasing of locally handled register addresses firewire: ohci: wait for local CSR lock access to finish Colin Tuckley (1): ARM: 5957/1: ARM: RealView SD/MMC Card detection and write-protect using GPIOLIB Corentin Chary (1): eeepc-laptop: add missing sparse_keymap_free Curt Wohlgemuth (2): ext4: Fix possible lost inode write in no journal mode ext4: Fix buffer head leaks after calls to ext4_get_inode_loc() Dan Carpenter (14): [SCSI] dpt_i2o: several use after free issues [SCSI] wd7000: fix reset handler typo spin_unlock_irq() => spin_lock_irq() asus: don't modify bluetooth/wlan on boot pcmcia: fix error handling in cm4000_cs.c i2c-stu300: off by one issue security: testing the wrong variable in create_by_name() drbd: fix memory leak nfs: testing for null instead of ERR_PTR() rtnetlink: potential ERR_PTR dereference rdma: potential ERR_PTR dereference ksm: check for ERR_PTR from follow_page() ipheth: potential null dereferences on error path bluetooth: handle l2cap_create_connless_pdu() errors nfs: fix some issues in nfs41_proc_reclaim_complete() Dan Williams (1): USB: qcaux: add LG Rumor and Sanyo Katana LX device IDs Daniel Mack (1): jfs_dmap.[ch]: trivial typo fix: s/heigth/height/g Daniel T Chen (4): ALSA: hda: Use STAC_DELL_M6_BOTH quirk for Dell Studio XPS 1645 ALSA: hda: Use ALC880_F1734 quirk for Fujitsu Siemens AMILO Xi 1526 ALSA: hda: Use LPIB quirk for DG965OT board version AAD63733-203 ALSA: hda: Use STAC_DELL_M6_BOTH quirk for Dell Studio 1558 Daniel Vetter (1): drm/i915: fix tiling limits for i915 class hw v2 Dave Airlie (1): drm/radeon/kms: don't print error for legal crtcs. Dave Chinner (2): xfs: more swap extent fixes for dynamic fork offsets xfs: add a shrinker to background inode reclaim David Howells (7): CRED: Fix double free in prepare_usermodehelper_creds() error handling net: Fix an RCU warning in dev_pick_tx() AFS: Don't pass error value to page_cache_release() in error handling CRED: Fix a race in creds_are_invalid() in credentials debugging keys: fix an RCU warning keys: don't need to use RCU in keyring_read() as semaphore is held keys: the request_key() syscall should link an existing key to the dest keyring David Miller (1): drm/radeon: Fix sparc regression in r300_scratch() David S. Miller (8): sparc64: Allocate sufficient stack space in ftrace stubs. sparc64: Run NMIs on the hardirq stack. sparc64: Fix PREEMPT_ACTIVE value. sparc64: Use correct pt_regs in decode_access_size() error paths. sparc64: Fix hardirq tracing in trap return path. Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 Merge branch 'master' of /home/davem/src/GIT/linux-2.6/ Revert "tcp: bind() fix when many ports are bound" David Vrabel (1): usb: wusb: don't overflow the Keep Alive IE buffer Denis Turischev (2): watchdog: sbc_fitpc2_wdt: fixed I/O operations order watchdog: sbc_fitpc2_wdt: fixed "scheduling while atomic" bug. Diego Giagio (1): drivers/net/usb: Add new driver ipheth Dinh Nguyen (1): usb: Increase timeout value for device reset Dmitry Monakhov (1): jfs: add jfs specific ->setattr call Dmitry Torokhov (1): VMware Balloon driver Dominik Brodowski (7): [CPUFREQ] use max load in conservative governor pcmcia: use previously assigned IRQ for all card functions pcmcia: fix io_probe due to parent (PCI) resources pcmcia: re-start on MFC override pcmcia: fix ioport size calculation in rsrc_nonstatic pcmcia: avoid late calls to pccard_validate_cis pcmcia: pcmcia_dev_present bugfix Elina Pasheva (1): net/usb: add sierra_net.c driver Enric Balletbo i Serra (1): omap3: Fix EHCI port for IGEP v2 board Eric Dumazet (3): bridge: add a missing ntohs() tcp: bind() fix when many ports are bound ipv6: Fix inet6_csk_bind_conflict() FUJITA Tomonori (1): [SCSI] ibmvscsi: fix DMA API misuse Felipe Balbi (1): arm: omap1: remove dead code from timer32k.c Francisco Alecrim (1): n8x0_defconfig: remove CONFIG_NILFS2_FS override Frederic Weisbecker (2): perf: Fix unsafe frame rewinding with hot regs fetching sparc: Fix forgotten kmemleak headers inclusion Geoff Levand (2): powerpc/ps3: Update platform maintainer powerpc/ps3: Update ps3_defconfig Gleb Natapov (1): KVM: take srcu lock before call to complete_pio() Greg Ungerer (1): m68knommu: remove a duplicate vector setting line for 68360 Guenter Roeck (1): Watchdog: sb_wdog.c: Fix sibyte watchdog initialization H. Peter Anvin (2): x86-64: Clear a 64-bit FS/GS base on fork if selector is nonzero x86: Disable large pages on CPUs with Atom erratum AAE44 Hans J. Koch (1): can: Fix possible NULL pointer dereference in ems_usb.c Hans Verkuil (1): lib/vsprintf.c: add missing EXPORT_SYMBOL(simple_strtoll) Hans de Goede (2): ALSA: snd-meastro3: Add amp_gpio quirk for Compaq EVO N600C ALSA: snd-meastro3: Ignore spurious HV interrupts during suspend / resume Haojian Zhuang (1): regulator: fix enabling regulator issue on max8925 Harrison Metzger (1): USB: fixed bug in usbsevseg using USB autosuspend incorrectly Hendrik Brueckner (1): [S390] vdso: use ntp adjusted clock multiplier Herbert Xu (2): ipv6: Fix tcp_v6_send_response transport header setting. crypto: authenc - Add EINPROGRESS check Hiroshi Shimamoto (1): cxgb3: fix linkup issue Ian Dall (1): w1: w1 temp: fix negative termperature calculation Ingo Molnar (1): eeepc-wmi: Build fix Jacob Pan (1): x86, mrst: Conditionally register cpu hotplug notifier for apbt Jan Kara (1): quota: Convert __DQUOT_PARANOIA symbol to standard config option Jan Kiszka (2): uml: Fix build breakage after slab.h changes KVM: x86: Fix TSS size check for 16-bit tasks Janusz Krzysztofik (1): omap: gpio: fix incorrect matching of IRQ_TYPE_EDGE_BOTH Jarkko Nikula (2): omap: rx51_defconfig: Remove duplicate phonet omap: rx51_defconfig: Remove CONFIG_SYSFS_DEPRECATED*=y options Jean Delvare (1): regulator: Let drivers know when they use the stub API Jeff Garzik (1): libata: ensure NCQ error result taskfile is fully initialized Jeff Mahoney (2): reiserfs: fix permissions on .reiserfs_priv reiserfs: fix corruption during shrinking of xattrs Jens Axboe (13): bdi: add helper function for doing init and register of a bdi for a file system 9p: add bdi backing to mount session afs: add bdi backing to mount session. cifs: add bdi backing to mount session coda: add bdi backing to mount session ecryptfs: add bdi backing to mount session exofs: add bdi backing to mount session ncpfs: add bdi backing to mount session smbfs: add bdi backing to mount session btrfs: convert to using bdi_setup_and_register() mtd: ensure that bdi entries are properly initialized and registered coda: move backing-dev.h kernel include inside __KERNEL__ fs: fs/super.c needs to include backing-dev.h for !CONFIG_BLOCK Jerome Marchand (1): procfs: fix tid fdinfo Jesse Barnes (5): drm: delay vblank cleanup until after driver unload drm/i915: cleanup FBC buffers at unload time drm/i915: use PIPE_CONTROL instruction on Ironlake and Sandy Bridge drm/i915: fix non-Ironlake 965 class crashes drm: make sure vblank interrupts are disabled at DPMS time Jiri Kosina (1): sysfs: use sysfs_attr_init in ASUS atk0110 driver Jiri Olsa (1): net: ipv6 bind to device issue Jiri Slaby (3): [SCSI] be2iscsi: fix lock imbalance [SCSI] lpfc: fix lock imbalances [SCSI] qla2xxx: fix lock imbalance Joern Engel (7): [LogFS] Remove unused method [LogFS] Prevent memory corruption on large deletes [LogFS] Plug 8 byte information leak [LogFS] Move assertion [LogFS] Prevent mempool_destroy NULL pointer dereference [LogFS] Set s_bdi [LogFS] Split large truncated into smaller chunks Johannes Berg (2): iwlwifi: fix scan races mac80211: remove bogus TX agg state assignment Josef Bacik (1): Cleanup generic block based fiemap Julia Lawall (1): drivers/pcmcia: Add missing local_irq_restore Jun Sun (1): uclinux: error message when FLAT reloc symbol is invalid, v2 Jörn Engel (3): Fix JFFS2 sync silent failure Catch filesystems lacking s_bdi Move mtd_bdi_*mappable to mtdcore.c KAMEZAWA Hiroyuki (1): cgroups: fix procs documentation Ken Kawasaki (1): smc91c92_cs: spin_unlock_irqrestore before calling smc_interrupt() Kevin Wells (2): i2c-pnx: Limit maximum divider to 1023 i2c-pnx: Add stop conditions for end of transfer Kim Phillips (4): powerpc/83xx: add RTC drivers in 83xx defconfig powerpc/83xx: enable EPOLL syscall in defconfig powerpc/83xx: configure SIL SATA driver in 83xx-wide defconfig powerpc/mpc8xxx defconfigs - turn off SYSFS_DEPRECATED Kristoffer Ericson (1): pata_pcmcia/ide-cs: add IDs for transcend and kingston cards Kumar Gala (2): powerpc: 2.6.34 update of defconfigs for embedded 6xx/7xxx, 8xx, 8xxx powerpc/fsl-booke: Fix CONFIG_RELOCATABLE support on FSL Book-E ppc32 Lai Jiangshan (1): KVM: Add missing srcu_read_lock() for kvm_mmu_notifier_release() Leo Chen (1): ARM: 6023/1: update bcmring_defconfig to latest version and fix build error Linus Torvalds (50): Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6 Merge branch 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6 Merge branch 'for-linus' of git://neil.brown.name/md Merge branch 'kvm-updates/2.6.34' of git://git.kernel.org/pub/scm/virt/kvm/kvm Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/shaggy/jfs-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/joern/logfs Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6 Merge branch 'for-linus/i2c' of git://git.fluff.org/bjdooks/linux Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6 Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6 Merge branch 'slabh' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6 Merge branch 'for-linus' of git://neil.brown.name/md Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt/drm-intel Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6 Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6 Merge branch 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs Merge git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squashfs-linus Merge branch 'for-2.6.34' of git://linux-nfs.org/~bfields/linux Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block Merge branch 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6 Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-tip Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6 Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc Merge master.kernel.org:/home/rmk/linux-2.6-arm Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/linux-2.6-kgdb Linux 2.6.34-rc6 Manuel Jander (1): USB: pl2303: add AdLink ND-6530 USB IDs Marc Zyngier (1): gpio: fix pca953x set_type 'scheduling while atomic' bug Matthew Garrett (1): PCI: Ensure we re-enable devices on resume Maxim Kuvyrkov (1): Fix m68k-uclinux's rt_sigreturn trampoline Mel Gorman (1): hugetlb: fix infinite loop in get_futex_key() when backed by huge pages Michael Chan (3): bnx2: Fix lost MSI-X problem on 5709 NICs. bnx2: Prevent "scheduling while atomic" warning with cnic, bonding and vlan. bnx2: Update version to 2.0.9. Michael Holzheu (1): [S390] zcore: Fix reipl device detection Mika Westerberg (1): i2c-omap: fix OOPS in omap_i2c_unidle() during probe Mike Christie (1): [SCSI] iscsi_tcp: fix relogin/shutdown hang Neil Brown (1): nfsd4: bug in read_buf NeilBrown (2): md/raid5: allow for more than 2^31 chunks. md/raid5: fix previous patch. Nicolas Dichtel (1): xfrm6: ensure to use the same dev when building a bundle Oleg Nesterov (1): rmap: anon_vma_prepare() can leak anon_vma_chain Paulius Zaleckas (1): mtd: fix Orion NAND driver compilation with ARM OABI Peter Huewe (1): arch/avr32: fix build failure caused by wrong prototype Peter Waskiewicz (1): ixgbe: Power down PHY during driver resets Philip Nye (1): m68knommu: correct the CC flags for Coldfire M5272 targets Philipp Reisner (1): drbd: Terminate a connection early if sending the protocol fails Philippe De Muyter (2): m68knommu: fix coldfire tcdrain m68knommu: allow 4 coldfire serial ports Phillip Lougher (5): squashfs: fix locking bug in zlib wrapper initramfs: handle unrecognised decompressor when unpacking squashfs: fix warn_on when root inode is corrupted squashfs: add missing buffer free squashfs: fix potential buffer over-run on 4K block file systems Rajendra Nayak (1): OMAP4: prcm: Use logical OR instead of bitwise OR Randy Dunlap (3): staging: fix dt3155 build scsi: fix operator precedence warning Documentation/HOWTO: update git home URL Ranjith Lohithakshan (1): OMAP3: clock: fix enable bit used for dpll4_m4x2 clock Reinette Chatre (1): mac80211: pass HT changes to driver when off channel Richard Kennedy (1): block: ensure jiffies wrap is handled correctly in blk_rq_timed_out_timer Richard Woodruff (1): omap4: Fix build break when used with gcc-4.4.1 (2009-q3) Rik van Riel (1): mmap: check ->vm_ops before dereferencing Roman Fietze (1): libata: fix docs, RE port and device of libata.force ID separated by point Russell King (1): ARM: fix build error in arch/arm/kernel/process.c Santosh Shilimkar (2): OMAP4: Fix for CONTROL register Base omap4: Fix McBSP4 base address Sebastian Ott (3): [S390] cio: allow enable_facility from outside init functions [S390] add hook to reenable mss after hibernation [S390] cio: use exception-save stsch Sergei Shtylyov (1): USB: OHCI: DA8xx/OMAP-L1x: fix up macro rename Sergio Aguirre (7): OMAP3: serial: Check for zero-based physical addr OMAP3: serial: Use dev_* macros instead of printk omap2/3/4: serial: Remove condition for getting uart4_phys omap3: zoom2/3 / 3630sdp: Don't init always all uarts omap3: 3630sdp: Explicitly enable all UARTs omap3: zoom 2/3: Change debugboard serial port id omap3: zoom2/3: Register only 1 8250 port Shan Wei (1): ipv6: allow to send packet after receiving ICMPv6 Too Big message with MTU field less than IPV6_MIN_MTU Shanyu Zhao (1): iwlwifi: correct 6000 EEPROM regulatory address Sridhar Samudrala (1): KVM: Increase NR_IOBUS_DEVS limit to 200 Stefan Haberland (1): [S390] dasd: fix endless loop in erp Stefan Richter (2): firewire: cdev: fix cut+paste mistake in disclaimer Documentation: -stable rules: upstream commit ID requirement reworded Stefan Schmidt (1): ieee802154: Fix oops during ieee802154_sock_ioctl Takashi Iwai (4): ALSA: hda - Fix resume from StR of HP 2510p with docking-station Merge branch 'fix/hda' into for-linus Merge branch 'fix/misc' into for-linus lis3: add support for HP ProBook 432x/442x/452x/522x Takuya Yoshikawa (2): KVM: SVM: Fix memory leaks that happen when svm_create_vcpu() fails KVM: fix the handling of dirty bitmaps to avoid overflows Tejun Heo (1): libata: fix locking around blk_abort_request() Thara Gopinath (2): OMAP: HWMOD: Adding clockdomain check OMAP: HWMOD: Bug fixes in hwmod structure definitions Theodore Ts'o (1): ext4: Issue the discard operation *before* releasing the blocks to be reused Thomas Gerlach (1): drivers/video/efifb.c: support framebuffer for NVIDIA 9400M in MacBook Pro 5,1 Thomas Weber (8): omap: Devkit8000: Fix wrong usb port on Devkit8000 omap: board-sdp-flash.c: Fix typos in debug output omap: Devkit8000: Fix typo in supplies omap: Devkit8000: Add missing package selection omap: Devkit8000: Fix typo in pin name omap: Devkit8000: Remove unnecessary include file omap: Devkit8000: Change position of init calls omap: Devkit8000: Remove unused pins Timur Maximov (1): serial_cs: MD55x support (PCMCIA GPRS/EDGE modem) (kernel 2.6.33) Tony Lindgren (4): Merge branch 'omap-fixes-for-tony' of git://dev.omapzoom.org/pub/scm/saaguirre/linux-omap-camera into omap-fixes-for-linus Merge branch 'for_2.6.34rc_a' of git://git.pwsan.com/linux-2.6 into omap-fixes-for-linus omap2: Fix ARM processor check for 24xx omap: Fix n8x0 mmc_mmc_init compile warnings and typos Torgny Johansson (1): cdc_ether: fix autosuspend for mbm devices Tormod Volden (1): drm/radeon: 9800 SE has only one quadpipe Trond Myklebust (4): SUNRPC: Fix a bug in rpcauth_prune_expired NFSv4: Don't attempt an atomic open if the file is a mountpoint NFS: Fix an unstable write data integrity race NFS: Ensure that nfs_wb_page() waits for Pg_writeback to clear Valdis.Kletnieks@vt.edu (1): dri-devel mailing list moved - update MAINTAINERS Vlad Yasevich (3): sctp: fix potential reference of a freed pointer sctp: per_cpu variables should be in bh_disabled section sctp: Fix oops when sending queued ASCONF chunks Wei Yongjun (2): sctp: avoid irq lock inversion while call sk->sk_data_ready() sctp: fix to calc the INIT/INIT-ACK chunk length correctly is set William Lightning (1): USB: Add id for HP ev2210 a.k.a Sierra MC5725 miniPCI-e Cell Modem. Wolfgang Ocker (1): powerpc/fsl-cpm: Configure clock correctly for SCC Wufei (1): kgdb: don't needlessly skip PAGE_USER test for Fsl booke Xiao Guangrong (1): KVM: MMU: fix kvm_mmu_zap_page() and its calling path Xiaotian Feng (1): nfs: fix memory leak in nfs_get_sb with CONFIG_NFS_V4 YOSHIFUJI Hideaki / ĺ‰č—¤č‹±ćŽ (1): bridge br_multicast: Ensure to initialize BR_INPUT_SKB_CB(skb)->mrouters_only. Yegor Yefremov (1): ARM: 6030/1: KS8695: enable console Yong Wang (4): eeepc-wmi: add an eeepc_wmi context structure eeepc-wmi: use a platform device as parent device of all sub-devices eeepc-wmi: add backlight support dell-wmi: Fix memory leak Zhang Rui (1): drm/i915: set DIDL using the ACPI video output device _ADR method return. andrew hendry (1): X25 fix dead unaccepted sockets françois romieu (2): r8169: failure to enable mwi should not be fatal r8169: more broken register writes workaround kishore kadiyala (1): OMAP4-HSMMC: FIX for MMC5 Controller IRQ Base manjugk manjugk (1): omap: DMA: Init CDAC to zero stanley.miao (4): omap: fix the compile error if CONFIG_MTD_NAND_OMAP2 is notenabled omap: remove one of the define of INT_34XX_BENCH_MPU_EMUL AM3517: initialize i2c subsystem after mux subsystem omap: fix a gpmc nand problem viresh kumar (3): ARM: 6059/1: PL061 GPIO: Changing *_irq_chip_data with *_irq_data for real irqs. ARM: 6060/1: PL061 GPIO: Setting gpio val after changing direction to OUT. ARM: 6061/1: PL061 GPIO: Bug fix - setting gpio for HIGH_LEVEL interrupt is not working. ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Wed May 19 15:08:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=ALL_TRUSTED,BAYES_00, J_CHICKENPOX_12,J_CHICKENPOX_22,J_CHICKENPOX_46,J_CHICKENPOX_54, J_CHICKENPOX_57 autolearn=no version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JK8M8L151864 for ; Wed, 19 May 2010 15:08:22 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o4JK8Kbk151834; Wed, 19 May 2010 15:08:20 -0500 Date: Wed, 19 May 2010 15:08:20 -0500 Message-Id: <201005192008.o4JK8Kbk151834@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree annotated tag, v2.6.34-rc4, created. v2.6.34-rc4 X-Git-Refname: refs/tags/v2.6.34-rc4 X-Git-Reftype: annotated tag X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: cb0cbeb16ff949783023da2270d5af36af416865 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The annotated tag, v2.6.34-rc4 has been created at cb0cbeb16ff949783023da2270d5af36af416865 (tag) tagging 0d0fb0f9c5fddef4a10242fe3337f00f528a3099 (commit) replaces v2.6.34-rc3 tagged by Linus Torvalds on Mon Apr 12 18:41:45 2010 -0700 - Log ----------------------------------------------------------------- Linux 2.6.34-rc4 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEABECAAYFAkvDy98ACgkQF3YsRnbiHLtNOwCgrGmIaqNlja/SN41NfXJd/Qji TTcAoJWfBoxzyI/gHoo46P6Azi6jvvFj =mCkc -----END PGP SIGNATURE----- Adam Jackson (1): drm/edid/quirks: Envision EN2028 Ajit Khaparde (3): be2net: fix a bug in flashing the redboot section be2net: fix flashing on big endian architectures be2net: fix bug in vlan rx path for big endian architecture Al Viro (1): Have nfs ->d_revalidate() report errors properly Alan Jenkins (2): ACPI: battery: Fix CONFIG_ACPI_SYSFS_POWER=n ACPI: battery drivers should call power_supply_changed() Alberto Panizzo (5): MXC: mach-mx31_3ds: Update variable names over recent mach name modification. MXC: mach-mx31_3ds: Add support for on board NAND Flash. MXC: mach-mx31_3ds: Add SPI1 device support. MXC: mach-mx31_3ds: add support for freescale mc13783 power management device. MXC: mach_armadillo5x0: Add USB Host support. Alex Deucher (41): drm/radeon: add new RS880 pci id drm/radeon/kms/atom: spread spectrum fix drm/radeon/kms: use lcd pll limits when available drm/radeon/kms: further spread spectrum fixes drm/radeon/kms: fix pal tv-out support on legacy IGP chips drm/radeon/kms: fix for hw i2c drm/radeon/kms: fix i2c prescale calc on older radeons drm/radeon/kms/r1xx: enable hw i2c drm/radeon/kms/rs4xx: make sure crtcs are enabled when setting timing drm/radeon/r600: add missing license and comments to r600_blit_shaders.c drm/radeon/kms: expose thermal/fan i2c buses drm/radeon/kms/pm: fix segfault in clock code drm/radeon/kms: gfx init fixes for r6xx/r7xx drm/radeon/kms/pm: fix typo in power table parsing drm/radeon/kms: init rdev->num_crtc at asic init drm/radeon/kms: display watermark fixes drm/radeon/kms: never treat rs4xx as AGP drm/radeon/kms: fix display bandwidth setup on rs4xx drm/radeon/kms: remove lvds quirks drm/radeon/kms/atom: make sure tables are valid (v2) drm/radeon/r600: remove some regs are not safe regs for command buffers drm/radeon/kms: fix some typos in r6xx/r7xx hpd setup drm/radeon/r6xx/r7xx: CS parser fixes drm/radeon/kms: bump the version for r6xx/r7xx const buffer support drm/radeon: bump the UMS driver version for r6xx/r7xx const buffer support drm/radeon/r6xx/r7xx: further safe reg clean up drm/radeon/kms: fix macbookpro connector quirk drm/radeon/kms/atom: minor fixes to transmitter setup drm/radeon/kms/dp: remove extraneous training complete call drm/radeon/kms: minor fixes for eDP with LCD* device tags (v2) drm/radeon/kms/dp: disable training pattern on the sink at the end of link training drm/radeon/kms: display watermark updates (v2) drm/radeon/kms: disable MSI on IGP chips drm/radeon/kms: use new pre/post_xfer i2c bit algo hooks drm/radeon/kms: add hw_i2c module option drm/radeon/kms/evergreen: get DP working drm/radeon/kms/atom: fix gpio i2c table overrun (v2) drm/radeon/kms: fix washed out image on legacy tv dac drm/radeon/kms: legacy tv dac cleanup drm/radeon/kms: clean up atom dac handling drm/radeon/kms/combios: verify dac_adj values are valid Alexander Clouter (2): MIPS: AR7: Fix phat finger of reset bit in vlynq_high_data MIPS: AR7: Fix phat finger of cpmac fixed_phy_add Alexander Shishkin (1): mb862xxfb: update Valentin's email address Alexey Starikovskiy (1): ACPI: EC: Allow multibyte access to EC Alok Kataria (1): x86, hpet: Fix bug in RTC emulation Amerigo Wang (1): bonding: fix potential deadlock in bond_uninit() Amit Shah (1): MAINTAINERS: Put the virtio-console entry in correct alphabetical order Anders Larsen (1): ARM: 6043/1: AT91 slow-clock resume: Don't wait for a disabled PLL to lock Andi Kleen (1): x86: Handle overlapping mptables Andrea Gelmini (5): USB gadget r8a66597-udc.c: duplicated include ARM mach-mx3: duplicated include ARM mach-mx3: duplicated include Btrfs: remove duplicate include in ioctl.c MIPS: libgcc.h: Checkpatch cleanup Andreas Ferber (1): MIPS: Fix SSB PCIcore IO resource management Andrew Morton (2): bitops: remove temporary for_each_bit() vfs: rename block_fsync() to blkdev_fsync() Andrew Perepechko (1): quota: Fix possible dq_flags corruption Andrew Stubbs (1): sh: Fix FDPIC binary loader Andrew Vasquez (1): [SCSI] qla2xxx: Correct vp_idx checking during PORT_UPDATE processing. Andy Fleming (1): gianfar: Fix a memory leak in gianfar close code Aneesh Kumar K.V (3): fs/9p: Clunk the fid resulting from partial walk of the name 9p: drop nlink remove 9p: Make sure we are able to clunk the cached fid on umount Anisse Astier (1): HID: Add NOGET quirk for Quanta Pixart touchscreen Anton Altaparmakov (1): MIPS: Fix __vmalloc() etc. on MIPS for non-GPL modules Anton Blanchard (5): backing-dev: Handle class_create() failure sched: Fix sched_getaffinity() devmem: handle class_create() failure raw: fsync method is now required hvc_console: Fix race between hvc_close and hvc_remove Arnaldo Carvalho de Melo (1): perf kmem: Fix breakage introduced by 5a0e3ad slab.h script Arun Bhanu (3): microblaze: Add a missing single quote to make 'make help' happy microblaze: Fix Makefile to delete build generated files microblaze: Makefile cleanups Ben Hutchings (2): [SCSI] qla2xxx: Disable MSI on qla24xx chips other than QLA2432. sparc64: Fix array size reported by vmemmap_populate() Ben Konrath (1): ar9170: add support for NEC WL300NU-G USB dongle Ben Skeggs (21): drm/nouveau: add option to allow override of dcb connector table types drm/nouveau: Gigabyte NX85T connector table lies, it has DVI-I not HDMI drm/nv50: fix connector table parsing for some cards drm/nouveau: add module option to disable TV detection drm/edid: allow certain bogus edids to hit a fixup path rather than fail drm/nv50: fix fbcon when framebuffer above 4GiB mark drm/nv50: add more 0x100c80 flushy magic drm/nouveau: remove some unused members from drm_nouveau_private drm/nouveau: detect vram amount once, and save the value drm/nv40: rework lvds table parsing drm/nv40: add LVDS table quirk for Dell Latitude D620 drm/nv50: fix instmem init on IGPs if stolen mem crosses 4GiB mark drm/nouveau: fixup the init failure paths some more drm/nv50: cleanup properly if PDISPLAY init fails drm/nv50: preserve an unknown SOR_MODECTRL value for DP encoders drm/nv50: punt hotplug irq handling out to workqueue drm/nv50: another dodgy DP hack drm/nouveau: store raw gpio table entry in bios gpio structs drm/nv50: parse/use some more de-magiced parts of gpio table entries drm/nv50: implement gpio set/get routines drm/nouveau: bail out of auxch transaction if we repeatedly recieve defers Benjamin Larsson (1): Add a pci-id to the mwl8k driver Bjorn Helgaas (2): ACPI: use _HID when supplied by root-level devices PNPACPI: truncate _CRS windows with _LEN > _MAX - _MIN + 1 Borislav Petkov (1): perf, probe-finder: Build fix on Debian Brian Niebuhr (1): davinci: edma: clear events in edma_start() Carmelo AMOROSO (1): stmmac: fix kconfig for crc32 build error Catalin Marinas (6): ARM: 5993/1: ARM: Move the outer_cache definitions into a separate file (1/4) ARM: 5994/1: ARM: Add outer_cache_fns.sync function pointer (2/4) ARM: 5995/1: ARM: Add L2x0 outer_sync() support (3/4) ARM: 5996/1: ARM: Change the mandatory barriers implementation (4/4) ARM: 5997/1: ARM: Correct the VFPv3 detection ARM: 6006/1: ARM: Use the correct NOP size in memmove for Thumb-2 kernel builds Changli Gao (1): net: check the length of the socket address passed to connect(2) Chase Douglas (1): ACPI: Reduce ACPI resource conflict message to KERN_WARNING, printk cleanup Chien Tung (1): RDMA/nes: Correct cap.max_inline_data assignment in nes_query_qp() Chris Mason (2): Btrfs: add check for changed leaves in setup_leaf_for_split Btrfs: make sure the chunk allocator doesn't create zero length chunks Chris Wilson (1): drm: Return ENODEV if the inode mapping changes Christian Borntraeger (1): [S390] s390: disable change bit override Clemens Ladisch (1): PCI quirk: RS780/RS880: disable MSI behind the PCI bridge Corentin Chary (1): asus-laptop: fix warning in asus_handle_init Dan Carpenter (17): ASoC: wm8994: playback => capture iwlwifi: range checking issue Btrfs: dereferencing freed memory Btrfs: handle kmalloc() failure in inode lookup ioctl Btrfs: check btrfs_get_extent return for IS_ERR() cciss: unlock on error path ALSA: i2c: cleanup: change parameter to pointer 9p: return on mutex_lock_interruptible() 9p: saving negative to unsigned char proc: copy_to_user() returns unsigned ALSA: mixart: range checking proc file drm/radeon/kms: small memory leak in atom exit code mxser: spin_lock() => spin_lock_irq() cciss: unlock on error path IB/mlx4: Check correct variable for allocation failure udf: potential integer overflow [S390] sclp_async: potential buffer overflow Daniel Mack (2): net/wireless/libertas: do not call wiphy_unregister() w/o wiphy_register() ALSA: ASoC: move dma_data from snd_soc_dai to snd_soc_pcm_stream Daniel T Chen (1): ALSA: hda: Fix 0 dB offset for Lenovo Thinkpad models using AD1981 Daniel Vetter (5): drm/radeon: create radeon_asic.c drm/radeon: move asic structs to radeon_asic.c drm/radeon: unconfuse return value of radeon_asic->clear_surface_reg drm/radeon: include radeon_asic.h in the asic specific files drm/radeon: collect r100 asic related declarations in radeon_asic.h Dave Airlie (9): drm/ttm: use drm calloc large and free large Merge remote branch 'nouveau/for-airlied' into drm-linus Merge branch 'radeon-for-airlied' of ../linux-2.6 into drm-linus drm/radeon/kms: don't print error on -ERESTARTSYS. Merge branch 'v2.6.34-rc2' into drm-linus drm/radeon/kms: add sanity check to wptr. drm/radeon/kms: rs400/480 should set common registers. drm/radeon/kms: enable ACPI powermanagement mode on radeon gpus. Merge remote branch 'nouveau/for-airlied' of ../drm-nouveau-next into drm-linus David Daney (6): MIPS: Octeon: Remove vestiges of CONFIG_CAVIUM_RESERVE32_USE_WIRED_TLB MIPS: Octeon: Remove #if 0 code. MIPS: Add SYSCALL to uasm. MIPS: Preliminary VDSO MIPS: Move signal trampolines off of the stack. MIPS: Calculate proper ebase value for 64-bit kernels David Howells (4): frv: hide uncached_access() when pgprot_noncached is not #defined frv: fix kernel/user segment handling in NOMMU mode fs-cache: order the debugfs stats correctly radix_tree_tag_get() is not as safe as the docs make out [ver #2] David Härdeman (1): include/linux/kfifo.h: fix INIT_KFIFO() David Rientjes (2): x86: Increase CONFIG_NODES_SHIFT max to 10 ACPI: NUMA: map pxms to low node ids David S. Miller (6): sparc: Fix regset register window handling. Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 Merge branch 'master' of /home/davem/src/GIT/linux-2.6/ sparc64: Update defconfig. sparc64: Implement perf_arch_fetch_caller_regs sunxvr500: Ignore secondary output PCI devices. Dimitris Michailidis (6): cxgb4: Add register, message, and FW definitions cxgb4: Add HW and FW support code cxgb4: Add packet queues and packet DMA code cxgb4: Add remaining driver headers and L2T management cxgb4: Add main driver file and driver Makefile net: Hook up cxgb4 to Kconfig and Makefile Divyesh Shah (3): cfq-iosched: Add additional blktrace log messages in CFQ for easier debugging cfq-iosched: Do not merge queues of BE and IDLE classes cfq-iosched: Fix the incorrect timeslice accounting with forced_dispatch Dmitry Monakhov (4): blkdev: fix merge_bvec_fn return value checks v2 udf: add speciffic ->setattr callback ext2: symlink must be handled via filesystem specific operation ext3: symlink must be handled via filesystem specific operation Dominik Brodowski (1): pcmcia: fix up alignf issues Edward Shishkin (1): vfs: improve writeback_inodes_wb() Eric Dumazet (2): bonding: bond_xmit_roundrobin() fix /dev/mem: allow rewinding Eric Paris (1): audit: preface audit printk with audit FUJITA Tomonori (1): Documentation: fix block/biodoc.txt dma mapping description Ferenc Wagner (1): i2o: Remove the dangerous kobj_to_i2o_device macro Florian Fainelli (6): MIPS: make CAC_ADDR and UNCAC_ADDR account for PHYS_OFFSET MIPS: BCM63xx: Fix BCM6338 and BCM6345 gpio count MIPS: BCM63xx: Add the RTA1025W-16 BCM6348-based board to suppported boards. MIPS: BCM63xx: Add DWVS0 board MIPS: BCM63xx: Register SSB SPROM fallback in board's first stage callback MIPS: BCM63xx: Fix build failure in board_bcm963xx.c Francisco Jerez (4): drm/nv04-nv40: Fix up the programmed horizontal sync pulse delay. drm/nouveau: Never evict VRAM buffers to system. drm/nouveau: Make use of TTM busy_placements. drm/nv40: Init some tiling-related PGRAPH state. François DiakhatĂ© (1): virtio: console: Fix early_put_chars usage Frederic Weisbecker (4): perf: Correctly align perf event tracing buffer perf: Use hot regs with software sched switch/migrate events perf: Always build the stub perf_arch_fetch_caller_regs version perf: Always build the powerpc perf_arch_fetch_caller_regs version Gertjan van Wingerde (2): rt2x00: Fix typo in RF register programming of rt2800. rt2x00: Disable powersaving by default in rt2500usb. Giel van Schijndel (1): [WATCHDOG] doc: watchdog simple example: don't fail on fsync() Giridhar Malavali (1): [SCSI] qla2xxx: Updated version number to 8.03.02-k2. Giuseppe CAVALLARO (1): stmmac: add documentation for the driver. Graham Gower (1): ASoC: Fix passing platform_data to ac97 bus users and fix a leak Hans de Goede (1): Add USB ID for Thomson SpeedTouch 120g to p54usb id table Harro Haan (1): ARM: 5965/1: Fix soft lockup in at91 udc driver Hartley Sweeten (1): ARM: 6029/1: ep93xx: gpio.c: local functions should be static Heiko Carstens (1): [S390] nss: add missing .previous statement to asm function Herbert Xu (2): ide: Requeue request after DMA timeout ide: Must hold queue lock when requeueing Herton Ronaldo Krzesinski (1): [SCSI] advansys: fix regression with request_firmware change Ingo Molnar (1): Merge branch 'perf/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing into perf/urgent James Bottomley (1): [SCSI] attirbute_container: Initialize sysfs attributes with sysfs_attr_init James Hogan (1): [WATCHDOG] doc: Fix use of WDIOC_SETOPTIONS ioctl. Jan Beulich (1): vesafb: use platform_driver_probe() instead of platform_driver_register() Jan Kara (1): quota: Hide warnings about writes to the filesystem before quota was turned on Jani Nikula (1): IB/cm: Fix device_create() return value check Janusz Krzysztofik (1): ASoC: OMAP: Fix capture pointer handling for OMAP1510 to work correctly with recent ALSA PCM code Jason Gunthorpe (1): of/flattree: Fix unhandled OF_DT_NOP tag when unflattening the device tree Jason Wessel (6): x86,kgdb: Always initialize the hw breakpoint attribute kgdb: have ebin2mem call probe_kernel_write once kgdbts,sh: Add in breakpoint pc offset for superh kgdb: eliminate kgdb_wait(), all cpus enter the same way kgdb: use atomic_inc and atomic_dec instead of atomic_set kgdb: Turn off tracing while in the debugger Jeff Mahoney (1): reiserfs: Fix locking BUG during mount failure Jens Axboe (1): Merge branch 'master' into for-linus Jerome Glisse (2): drm/radeon/kms: catch atombios infinite loop and break out of it drm/radeon/kms: avoid possible oops (call gart_fini before gart_disable) Jiri Kosina (1): HID: fix oops in gyration_event() Johannes Berg (1): mac80211: move netdev queue enabling to correct spot John Linn (1): microblaze: io.h: Add io big-endian function John W. Linville (2): wireless: convert reg_regdb_search_lock to mutex mac80211: correct typos in "unavailable upon resume" warning Josef Bacik (5): Btrfs: fail to mount if we have problems reading the block groups Btrfs: kill max_extent mount option Btrfs: fix chunk allocate size calculation Btrfs: fix small race with delalloc flushing waitqueue's Btrfs: fix data enospc check overflow Julia Lawall (8): arch/sh/kernel: Use set_cpus_allowed_ptr ring-buffer: Add missing unlock drivers/serial/sunsu.c: Correct use after free drivers/net: Add missing unlock ALSA: echoaudio - Eliminate use after free drivers/char/amiserial.c: add missing local_irq_restore drivers/gpio/timbgpio.c: add missing unlock [S390] arch/s390/kernel: Add missing unlock Justin P. Mattock (1): fbdev: rename imacfb.txt to efifb.txt and change imacfb to efifb. KAMEZAWA Hiroyuki (3): proc: pagemap: Hold mmap_sem during page walk mm: avoid null-pointer deref in sync_mm_rss() memcg: fix race in file_mapped accounting KOSAKI Motohiro (1): mm: revert "vmscan: get_scan_ratio() cleanup" Ken Kawasaki (1): smc91c92_cs: fix the problem of "Unable to find hardware address" Kevin Hilman (3): davinci: timers: don't enable timer until clocksource is initialized davinci: DM365: fix duplicate default IRQ priorities rwsem generic spinlock: use IRQ save/restore spinlocks Kim Phillips (2): net: gianfar - initialize per-queue statistics net: gianfar - align BD ring size console messages Lars Ellenberg (6): drbd: fix NULL pointer dereference on 4k hard sect size drbd: fix broken state change after split-brain attach while connected fix unit of rs_same_csums accounting drbd_disconnect: grab meta.socket mutex as well drbd: add missing drbd command names to avoid in error messages drbd: fix al-to-on-disk-bitmap for 4k logical_block_size Len Brown (1): Merge branches 'battery', 'bugzilla-14667', 'bugzilla-15096', 'bugzilla-15480', 'bugzilla-15521', 'bugzilla-15605', 'gpe-reference-counters', 'misc', 'pxm-fix' and 'video-random-key' into release Leo Chen (1): ARM: 6024/1: bcmring: fix missing down on semaphore in dma.c Li Hong (2): nilfs2: fix a wrong type conversion in nilfs_ioctl() nilfs2: Remove an uninitialization warning in nilfs_btree_propagate_v() Li Zefan (2): block: make CONFIG_BLK_CGROUP visible tracing: Fix lockdep warning in global_clock() Linus Torvalds (54): Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86 Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 Merge branch 'sh/for-2.6.34' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid Merge branch 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6 Merge branch 'kgdb-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/linux-2.6-kgdb Merge branch 'reiserfs/kill-bkl' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing Merge branch 'merge' of git://git.secretlab.ca/git/linux-2.6 Merge master.kernel.org:/home/rmk/linux-2.6-arm Merge branch 'tracing-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu Merge branch 'slabh' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc Merge git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev Merge git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6 Merge branch 'slabh' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-tip Merge branch 'davinci-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-davinci Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide-2.6 Merge branch 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6 Revert "memory-hotplug: add 0x prefix to HEX block_size_bytes" Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband Simplify and comment on anon_vma re-use for anon_vma_prepare() vma_adjust: fix the copying of anon_vma chains anon_vma: clone the anon_vma chain in the right order anonvma: when setting up page->mapping, we need to pick the _oldest_ anonvma Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2 Merge branch 'for-2.6.34' of git://linux-nfs.org/~bfields/linux Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-udf-2.6 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable Merge master.kernel.org:/home/rmk/linux-2.6-arm Merge branch 'anonvma' Linux 2.6.34-rc4 Linus Walleij (1): ARM: 6028/1: ARM: add MAINTAINERS for U300 Maarten Maathuis (2): drm/nouveau: print a message very early during suspend drm/nv50: add a memory barrier to pushbuf submission Madhusudhan Chikkature (1): omap hsmmc: fix a bug in card remove scenario Manuel Lauss (1): MIPS: Alchemy: DB1200: Remove custom wait implementation Marc Zyngier (1): [WATCHDOG] set max63xx driver as ARM only Marcin KoĹ›cielnicki (7): drm/nv50: Remove redundant/incorrect ctxvals initialisation. drm/nouveau: Fix fbcon corruption with font width not divisible by 8 drm/nv50: Make ctxprog wait until interrupt handler is done. drm/nv50: Improve PGRAPH interrupt handling. drm/nv50: Fix NEWCTX_DONE flag number drm/nv50: Allow using the NVA3 new compute class. drm/nv50: Add NVA3 support in ctxprog/ctxvals generator. Mark Brown (5): ASoC: Avoid wraparound in wm_hubs DC servo correction ASoC: Support second DC servo readback method for wm_hubs ASoC: Don't do runtime wm_hubs DC servo updates if using offset correction ASoC: Don't use DCS_DATAPATH_BUSY for WM hubs devices ASoC: Only do WM8994 bias off transition from standby Mark Lord (1): libata: Fix accesses at LBA28 boundary (old bug, but nasty) (v2) Martin K. Petersen (3): block: Fix overrun in lcm() and move it to lib block: Finalize conversion of block limits functions block: Export max number of segments and max segment size in sysfs Martin Schwidefsky (3): [S390] fix io_return critical section cleanup [S390] increase default size of vmalloc area [S390] Update default configuration. Matt Fleming (2): sh: update the TLB replacement counter for entry wiring. sh: Enable the mmu in start_secondary() Matt Helsley (1): Freezer: Fix buggy resume test for tasks frozen with cgroup freezer Matthew Garrett (1): ACPI: Don't send KEY_UNKNOWN for random video notifications Maxime Bizon (4): MIPS: BCM63xx: Fix double gpio registration. MIPS: BCM63xx: Add support for second uart. MIPS: BCM63xx: Fix typo in cpu-feature-overrides file. MIPS: BCM63xx: Initialize gpio_out_low & out_high to current value at boot. Miao Xie (1): Btrfs: add NULL check for do_walk_down() Michael Hernandez (1): [SCSI] qla2xxx: Check to make sure multique and CPU affinity support is not enabled at the same time. Michael Reed (1): [SCSI] qla1280: retain firmware for error recovery Michael S. Tsirkin (1): virtio: disable multiport console support. Michal Simek (34): microblaze: Remove memset in free_init_pages microblaze: Remove segment.h microblaze: Move exception_table_entry upward microblaze: move noMMU __range_ok function to uaccess.h microblaze: uaccess: fix clean user macro microblaze: uaccess: fix __get_user_asm macro microblaze: uaccess: fix put_user and get_user macros microblaze: uaccess: sync put/get/clear_user macros microblaze: uaccess: copy_to_user unification microblaze: uaccess: fix copy_from_user macro microblaze: uaccess: Fix strncpy_from_user function microblaze: uaccess: fix clear_user for noMMU kernel microblaze: uaccess: Fix get_user macro for noMMU microblaze: uaccess: Fix put_user for noMMU microblaze: uaccess: Move functions to generic location microblaze: uaccess: Unify __copy_tofrom_user microblaze: uaccess: Sync strlen, strnlen, copy_to/from_user microblaze: Support systems without lmb bram microblaze: Add DEBUG option microblaze: Prepare work for optimization in exception code microblaze: Change register usage for ESR and EAR microblaze: Remove additional resr and rear loading microblaze: Use instruction with delay slot microblaze: Fix TLB macros microblaze: Add .type and .size to ASM functions microblaze: Adding likely macros microblaze: Kconfig Fix - pci microblaze: Use MICROBLAZE_TLB_SIZE in asm code microblaze: head.S typo fix microblaze: Print early printk information to log buffer microblaze: Support word copying in copy_tofrom_user microblaze: Fix futex code microblaze: Enable memory leak detector microblaze: Remove unused variable from ptrace Michel Dänzer (2): drm/radeon/kms: Only restrict BO to visible VRAM size when pinning to VRAM. drm/radeon: R300 AD only has one quad pipe. Mika Westerberg (1): ARM: 6005/1: arm: kprobes: fix register corruption with jprobes Mike Christie (1): [SCSI] libiscsi: Fix recovery slowdown regression Mike Galbraith (2): perf: Fix 'perf sched record' deadlock sched: Fix proc_sched_set_task() Mikulas Patocka (1): ide: Fix IDE taskfile with cfq scheduler Naoya Horiguchi (1): pagemap: fix pfn calculation for hugepage Neil Horman (1): r8169: clean up my printk uglyness NeilBrown (1): Remove GENHD_FL_DRIVERFS Nick Piggin (2): Btrfs: use add_to_page_cache_lru, use __page_cache_alloc Fix up possibly racy module refcounting Nikanth Karthikesan (1): loop: Update mtime when writing using aops Nikolaus Schulz (1): fat: fix buffer overflow in vfat_create_shortname() Oleg Nesterov (3): oom: fix the unsafe usage of badness() in proc_oom_score() sched: set_cpus_allowed_ptr(): Don't use rq->migration_thread after unlock tty: release_one_tty() forgets to put pids Pallipadi, Venkatesh (1): x86, hpet: Erratum workaround for read after write of HPET comparator Paul Moore (1): netlabel: Fix several rcu_dereference() calls used without RCU read locks Paul Mundt (2): sh: export return_address() symbol. sh: Fix up the SH-3 build for recent TLB changes. Pauli Nieminen (1): drm/radeon/kms: Fix NULL pointer dereference if memory allocation failed. Pavel Shilovsky (2): [CIFS] Add mmap for direct, nobrl cifs mount types not overwriting file_lock structure after GET_LK Pekka Enberg (2): slab: Generify kernel pointer validation slub: Fix kmem_ptr_validate() for non-kernel pointers Peter Zijlstra (2): x86: Move notify_cpu_starting() callback to a later stage perf, x86: Fix AMD hotplug & constraint initialization Philipp Reisner (6): drbd: --dry-run option for drbdsetup net ( drbdadm -- --dry-run connect ) drbd: Reduce the time an empty resync takes usually drbd: Make sure we do not send state updates during an empty resync [Bugz 271] drbd: Forcing primary should also work for Consistent disks [Bugz 266] drbd: Renamed overwrite_peer to primary_force drbd: lc_element_by_index() never returns NULL Porsch, Marco (1): mac80211: fix PREQ processing and one small bug Rabin Vincent (1): ARM: 6031/1: fix Thumb-2 decompressor Rafael J. Wysocki (2): ACPI / ACPICA: Do not check reference counters in acpi_ev_enable_gpe() ACPI / PM: Move ACPI video resume to a PM notifier RafaĹ‚ MiĹ‚ecki (8): drm/radeon/kms: clean HDMI definitions drm/radeon/kms: clean assigning HDMI blocks to encoders drm/radeon/kms: add HDMI code for pre-DCE3 R6xx GPUs drm/radeon/kms: enable audio engine on DCE32 drm/radeon/kms: remove dead audio/HDMI code drm/radeon/kms: improve coding style a little drm/radeon/kms: switch to condition waiting for reclocking drm/radeon/kms: prepare for more reclocking operations Ralf Baechle (8): MIPS: Fix build breakage if CONFIG_DEBUG_FS is enabled. MIPS: Cavium: Remove unused watchdog code. MIPS: delay: Fix use of current_cpu_data in preemptable code. MIPS: Fix elfcore.c build warning MIPS: Sibyte: Apply M3 workaround only on affected chip types and versions. MIPS: uasm: Add OR instruction. MIPS: Sibyte: Fix M3 TLB exception handler workaround. MIPS: Big Sur: Make defconfig more useful. Randy Dunlap (5): drm/vmwgfx: depends on FB kmemcheck: Fix build errors due to missing slab.h module: add stub for is_module_percpu_address drm: fix build error when SYSRQ is disabled mb862xxfb: fix acceleration module license Reinette Chatre (1): iwlwifi: fix regulatory Richard Kennedy (1): block: remove 16 bytes of padding from struct request on 64bits Ricky Benitez (1): block: expose the statistics in blkio.time and blkio.sectors for the root cgroup Rik van Riel (1): rmap: fix anon_vma_fork() memory leak Robert P. J. Day (2): drm: "kobject_init/kobject_add" -> "kobject_init_and_add". MIPS: Initialize an atomic_t properly with ATOMIC_INIT(0). Roel Kluin (1): paride: fix off-by-one test Roland Dreier (1): Merge branches 'cma', 'misc', 'mlx4' and 'nes' into for-linus Roman Fietze (1): powerpc/5200: in lpbfifo, flag DMA irqs as enabled after requesting them Russell King (2): Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 ARM: Fix ioremap_cached()/ioremap_wc() for SMP platforms Rusty Russell (1): virtio: console makes incorrect assumption about virtio API Ryusuke Konishi (1): nilfs2: fix typo "numer" -> "number" in alloc.c Sage Weil (1): Btrfs: create snapshot references in same commit as snapshot Santosh Vernekar (2): [SCSI] qla2xxx: Honour "Extended BB credits" bit for CNAs. [SCSI] qla2xxx: Prevent sending mbx commands from sysfs during isp reset. Sarang Radke (1): [SCSI] scsi_transport_fc: Make sure commands are completed when rport is offline Sascha Hauer (6): i.MX51 Babbage: Add uncompress output i.MX51: Use correct clock for gpt i.MX51: map TZIC dynamically i.MX51: determine silicon revision dynamically i.MX51: remove NFC AXI static mapping Merge branch 'mx51' into mxc-rc Sean Hefty (1): RDMA/cm: Set num_paths when manually assigning path records Sean MacLennan (1): [WATCHDOG] powerpc: pika_wdt ident cannot be const Sekhar Nori (1): davinci: da8xx/omap-l1: fix build error when CONFIG_DAVINCI_MUX is undefined Sergei Shtylyov (1): davinci: fix compile warning: : #include Sergey Senozhatsky (1): drivers/thermal/thermal_sys.c: fix 'key f70f4b50 not in .data' in thermal_sys Seth Heasley (1): [WATCHDOG] iTCO_wdt: TCO Watchdog patch for additional Intel Cougar Point DeviceIDs Shanyu Zhao (1): iwlwifi: clear unattended interrupts in tasklet Shaohua Li (2): cfq-iosched: fix a kbuild regression x86-32, resume: do a global tlb flush in S4 resume Sripathi Kodi (3): 9p: Fix setting of protocol flags in v9fs_session_info structure. 9p: documentation update 9p: Creating files with names too long should fail with ENAMETOOLONG. Steve French (1): [CIFS] initialize nbytes at the beginning of CIFSSMBWrite() Steven J. Magnani (3): net: Fix oops from tcp_collapse() when using splice() microblaze: Fix "kstack=" parsing microblaze: Fix ftrace_update_ftrace_func panic Suresh Jayaraman (1): cifs: Fix a kernel BUG with remote OS/2 server (try #3) Suresh Siddha (1): x86: Fix double enable_IR_x2apic() call on SMP kernel on !SMP boards Takashi Iwai (9): ALSA: hda - Fix invalid bit values passed to snd_hda_codec_amp_stereo() ALSA: hda - Fix ADC/MUX assignment of ALC269 codec ALSA: hda - Add missing printk argument in previous patch ALSA: hda - Update document about MSI and interrupts ALSA: hda - Add MSI blacklist for Aopen MZ915-M ALSA: hda - Fix a wrong array range check in patch_realtek.c Merge branch 'fix/misc' into for-linus Merge branch 'fix/asoc' into for-linus Merge branch 'fix/hda' into for-linus Tejun Heo (13): module: encapsulate percpu handling better and record percpu_size percpu, module: implement and use is_kernel/module_percpu_address() x86: don't include slab.h from arch/x86/include/asm/pgtable_32.h iwlwifi: don't include iwl-dev.h from iwl-devtrace.h include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h percpu: don't implicitly include slab.h from percpu.h staging/otus: include slab.h from usbdrv.h Merge branch 'master' into export-slabh eeepc-wmi: include slab.h libata: don't whine on spurious IRQ libata: disable NCQ on Crucial C300 SSD libata: unlock HPA if device shrunk nodemask: include slab.h from drivers/base/node.c Thomas Gleixner (2): block: drbd: Convert semaphore to mutex genirq: Force MSI irq handlers to run with interrupts disabled Thomas Mingarelli (1): [WATCHDOG] hpwdt - fix lower timeout limit Timur Tabi (1): powerpc/fsl: add device tree binding for QE firmware Tom Tucker (1): svcrdma: RDMA support not yet compatible with RPC6 Tom Zanussi (1): perf/scripts: Tuple was set from long in both branches in python_process_event() Tony Vroon (1): ALSA: hda - Enable amplifiers on Acer Inspire 6530G Torok Edwin (1): perf, x86: Fix callgraphs of 32-bit processes on 64-bit kernels Valentin Longchamp (1): setup correct int pipe type in ar9170_usb_exec_cmd Vince Weaver (1): perf, x86: Enable Nehalem-EX support Vladimir Zapolskiy (4): imx31: fix parent clock for rtc imx3: Add watchdog platform device support imx31: add watchdog device on litekit board. rtc-mxc: multiple fixes in rtc-mxc probe method Wey-Yi Guy (1): iwlwifi: counting number of tfds can be free for 4965 William Cohen (1): Add DocBook documentation for the block tracepoints. Wolfram Sang (1): device_attributes: add sysfs_attr_init() for dynamic attributes Wu Fengguang (1): readahead: fix NULL filp dereference Wu Zhangjin (4): MIPS: Trace: Don't trace irqsoff for the idle process MIPS: Lemote 2F: Ensure atomic execution of _rdmsr and _wrmsr MIPS: Loongson: Add module info to the loongson2_clock driver MIPS: Loongson-2F: Flush the branch target history in BTB and RAS Xiaotian Feng (1): Freezer: Only show the state of tasks refusing to freeze Yang Shi (1): MIPS: Octeon: Remove redundant declaration of octeon_reserve32_memory Yinghai Lu (4): x86: Make e820_remove_range to handle all covered case nobootmem, x86: Fix 32bit numa system without RAM on node 0 bootmem, x86: Fix 32bit numa system without RAM on node 0 ibft, x86: Change reserve_ibft_region() to find_ibft_region() Yong Wang (1): eeepc-wmi: new driver for WMI based hotkeys on Eee PC laptops Yong Zhang (3): ratelimit: annotate ___ratelimit() kernel.h: fix wrong usage of __ratelimit() ratelimit: fix the return value when __ratelimit() fails to acquire the lock Yusuke Goda (1): sh: Update ecovec_defconfig Zhang Rui (2): ACPI dock: support multiple ACPI dock devices ACPI: fixes a false alarm from lockdep Zhao Lei (3): Btrfs: Remove unnecessary finish_wait() in wait_current_trans() Btrfs: Add error handle for btrfs_search_slot() in btrfs_read_chunk_tree() Btrfs: Simplify num_stripes's calculation logical for __btrfs_alloc_chunk() Zhao Yakui (1): drm: remove the EDID blob stored in the EDID property when it is disconnected viresh kumar (4): ARM: 5999/1: Including device.h and resource.h header files in linux/amba/bus.h ARM: 6000/1: removing compilation warning comming from ARM: 6001/1: removing compilation warning comming from clkdev.h ARM: 6003/1: removing compilation warning from pl061.h wzt.wzt@gmail.com (1): Block: Fix block/elevator.c elevator_get() off-by-one error ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Wed May 19 15:08:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=ALL_TRUSTED,BAYES_00, J_CHICKENPOX_54,J_CHICKENPOX_82 autolearn=no version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JK8RiB151968 for ; Wed, 19 May 2010 15:08:27 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o4JK8Qub151939; Wed, 19 May 2010 15:08:26 -0500 Date: Wed, 19 May 2010 15:08:26 -0500 Message-Id: <201005192008.o4JK8Qub151939@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree annotated tag, v2.6.34-rc7, created. v2.6.34-rc7 X-Git-Refname: refs/tags/v2.6.34-rc7 X-Git-Reftype: annotated tag X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 3884cbfac5cf610a7116ca90a970a11cf495bb83 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The annotated tag, v2.6.34-rc7 has been created at 3884cbfac5cf610a7116ca90a970a11cf495bb83 (tag) tagging b57f95a38233a2e73b679bea4a5453a1cc2a1cc9 (commit) replaces v2.6.34-rc6 tagged by Linus Torvalds on Sun May 9 18:36:37 2010 -0700 - Log ----------------------------------------------------------------- Linux 2.6.34-rc7 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEABECAAYFAkvnYycACgkQF3YsRnbiHLtxjwCgtTVmxE4ZmqZU3pq+BtF76Ciw RacAoLN3b9/daOn1R+7vp4btJLKdbr6k =hjbj -----END PGP SIGNATURE----- Ajay Kumar Gupta (2): musb: fix power field to hold all possible values musb: save and restore missing bus control register Alan Cox (1): tty: Fix regressions in the char driver conversion Alan Stern (2): USB: don't choose configs with no interfaces USB: OHCI: don't look at the root hub to get the number of ports Alex Chiang (1): ACPI: DMI init_set_sci_en_on_resume for multiple Lenovo ThinkPads Alex Deucher (2): drm/radeon/kms: fix panel scaling adjusted mode setup drm/radeon/kms/legacy: only enable load detection property on DVI-I Anand Gadiyar (1): USB: fix build on OMAPs if CONFIG_PM_RUNTIME is not set Andrew Morton (2): Staging: iio: fix up the iio_get_new_idr_val comment arch/arm/include/asm/elf.h: forward-declare the task-struct Anisse Astier (1): ALSA: hda - Add quirk for Dell Inspiron 19T using a Conexant CX20582 Anton Blanchard (1): e1000e: Fix oops caused by ASPM patch. Arjan van de Ven (1): cpuidle: Fix incorrect optimization Arnaud Patard (3): MIPS: Loongson: Fix typo in gdium mach type string. MIPS: Loongson: Fix phys_mem_access_prot() check MIPS: Loongson: Fix LOONGSON_ADDRWIN_CFG macro. Benjamin Herrenschmidt (1): mutex: Don't spin when the owner CPU is offline or other weird cases Bjorn Helgaas (2): PNPACPI: compute Address Space length rather than using _LEN PNP: don't check for conflicts with bridge windows Bjørn Mork (1): V4L/DVB: budget: Oops: "BUG: unable to handle kernel NULL pointer dereference" Borislav Petkov (1): edac, mce: Fix wrong mask and macro usage Brian J. Tarricone (1): ALSA: hda - fix array indexing while creating inputs for Cirrus codecs Catalin Marinas (1): ARM: 6093/1: Fix kernel memory printing for sparsemem Chris Largret (1): Staging: rt2860: add Belkin F5D8055 Wireless-N USB Dongle device id Christoph Fritz (1): Input: joydev - allow binding to button-only devices Coly Li (1): ocfs2: one more warning fix in ocfs2_file_aio_write(), v2 Cyrill Gorcunov (1): Staging: hv: Fix up memory leak on HvCleanup Dan Carpenter (18): ocfs2: potential ERR_PTR dereference on error paths ACPI: silence kmemcheck false positive gpio: potential null dereference of: check for IS_ERR() drivers/gpu/drm/via/via_video.c: fix off by one issue drivers/gpu/drm/drm_memory.c: fix check for end of loop drivers/gpu/drm/radeon/radeon_atombios.c: range check issues drivers/gpu/drm/drm_sysfs.c: sysfs files error handling musb: potential use after free USB: fix testing the wrong variable in fs_create_by_name() USB: oxu210hp: release spinlock on error path Staging: iio: test for failed allocation ALSA: take tu->qlock with irqs disabled acpi_pad: "processor_aggregator" name too long power_meter: acpi_device_class "power_meter_resource" too long sbshc: acpi_device_class "smbus_host_controller" too long V4L/DVB: omap24xxcam: potential buffer overflow V4L/DVB: video: testing unsigned for less than 0 Dan Williams (1): raid6: fix recovery performance regression Daniel Mack (3): Input: eeti_ts - cancel pending work when going to suspend USB: rename usb_buffer_alloc() and usb_buffer_free() [ARM] pxa/raumfeld: fix button name Daniel T Chen (3): ALSA: hda: Use olpc-xo-1_5 quirk for Toshiba Satellite Pro T130-15F ALSA: hda: Use olpc-xo-1_5 quirk for Toshiba Satellite P500-PSPGSC-01800T ALSA: hda: Fix 0 dB for Packard Bell models using Conexant CX20549 (Venice) David Daney (7): MIPS: Don't vmap things at address zero. MIPS: Add uasm_i_dsrl_safe() and uasm_i_dsll_safe() to uasm. MIPS: Use uasm_i_ds{r,l}l_safe() instead of uasm_i_ds{r,l}l() in tlbex.c MIPS: Check for accesses beyond the end of the PGD. I2C: Fix section mismatch errors in i2c-octeon.c NET: mdio-octeon: Enable the hardware before using it. STAGING: octeon-ethernet: Use proper phy addresses for Movidis hardware. David Howells (8): NFS: Fix RCU issues in the NFSv4 delegation code KEYS: Fix an RCU warning KEYS: Fix an RCU warning in the reading of user keys Fix the x86_64 implementation of call_rwsem_wait() KEYS: Fix an RCU warning in the reading of user keys KEYS: Fix RCU handling in key_gc_keyring() KEYS: Use RCU dereference wrappers in keyring key type code KEYS: call_sbin_request_key() must write lock keyrings before modifying them David J. Choi (1): drivers/net/phy: micrel phy driver David S. Miller (3): Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 net: ep93xx_eth stops receiving packets ipv6: Fix default multicast hops setting. Dinh Nguyen (1): mx5: Fix build error for mx51_defconfig Dmitry Artamonow (2): ARM: 6075/1: SA1100: fix wrong CPU type for h3100 and h3600 ARM: 6076/1: SA1100: add processor check to sa1110-cpufreq driver Dmitry Torokhov (2): Input: psmouse - ignore parity error for basic protocols Revert "Input: ALPS - add signature for HP Pavilion dm3 laptops" Dominik Brodowski (3): USB: option: add ID for ZTE MF 330 pcmcia: avoid pccard_validate_cis failure in resume callpath pcmcia: order userspace suspend and resume requests Douglas Gilbert (1): [SCSI] scsi_debug: virtual_gb ignores sector_size Elina Pasheva (2): net/usb: remove default in Kconfig for sierra_net driver net/usb: initiate sync sequence in sierra_net.c driver Eric Dumazet (1): r8169: Fix rtl8169_rx_interrupt() Eric Lescouet (1): staging: usbip: Fix deadlock Erik AndrĂ©n (1): V4L/DVB: gspca - stv06xx: Remove the 046d:08da from the stv06xx driver Florian Fainelli (2): MIPS: BCM63xx: Update defconfig MIPS: Kconfig: Make Broadcom SoC support naming consistent Florian Ragwitz (3): Input: elantech - fix firmware version check Input: elantech - allow forcing Elantech protocol Input: elantech - ignore high bits in the position coordinates Gabriele A. Trombetti (1): md/raid6: Fix raid-6 read-error correction in degraded state Geert Uytterhoeven (1): MIPS: TXx9: Add missing MODULE_ALIAS definitions for TXx9 platform devices Greg Kroah-Hartman (1): USB: serial: option: add cinterion device id Guennadi Liakhovetski (3): SH: fix TS field shift calculation for DMA drivers SH: fix error paths in DMA driver sh: fix a number of Oopses and leaks in SH framebuffer driver H Hartley Sweeten (1): Staging: dt3155: fix 50Hz configuration Haiyang Zhang (1): Staging: hv: Fix a bug affecting IPv6 Hannes Reinecke (1): [SCSI] Enable retries for SYNCRONIZE_CACHE commands to fix I/O error Hans Verkuil (3): V4L/DVB: feature-removal: announce videotext.h removal V4L/DVB: v4l: fix config dependencies: mxb and saa7191 are V4L2 drivers, not V4L1 V4L/DVB: saa7146: fix regression of the av7110/budget-av driver Hans de Goede (1): p54pci: fix bugs in p54p_check_tx_ring Haojian Zhuang (2): [ARM] pxa: update cpuid pattern for pxa9xx in head.S [ARM] pxa: fix the incorrect cpu_is_pxa950() Hector Palacios (1): spi: spidev_test gives error upon 1-byte transfer Herton Ronaldo Krzesinski (1): [SCSI] advansys: fix narrow board error path Igor Grinberg (1): [ARM] pxa: add missing new line to regs-u2d.h Ingo Molnar (1): x86: Fix parse_reservetop() build failure on certain configs Jakob Viketoft (1): [ARM] pxa/colibri: fix missing #include in colibri.h James Bottomley (1): [SCSI] Retry commands with UNIT_ATTENTION sense codes to fix ext3/ext4 I/O error Jan Engelhardt (1): net: fix compile error due to double return type in SOCK_DEBUG Jarod Wilson (1): Input: ati_remote - add some missing devices from lirc_atiusb Jean Delvare (2): i2c: Fix probing of FSC hardware monitoring chips i2c-core: Use per-adapter userspace device lists Jeff Garzik (1): [MTD] Remove zero-length files mtdbdi.c and internal.ho Jens Axboe (1): Merge branch 'for-jens' of git://git.drbd.org/linux-2.6-drbd into for-linus Jerome Glisse (1): drm/radeon: async event synchronization for drmWaitVblank Jiri Slaby (1): gpu: vga_switcheroo, fix lock imbalance Joel Becker (4): ocfs2: Compute metaecc for superblocks during online resize. ocfs2_dlmfs: Fix math error when reading LVB. Merge branch 'skip_delete_inode' of git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2-mark into ocfs2-fixes ocfs2: Avoid a gcc warning in ocfs2_wipe_inode(). John Ellson (1): V4L/DVB: gspca: make usb id 0461:0815 get handled by the right driver Jonathan Cameron (2): staging: iio: lis3l02dq - incorrect ws used in container of call. staging: iio: ring_sw: Fix incorrect test on successful read of last value, causes infinite loop Julia Lawall (3): serial: drivers/serial/pmac_zilog.c: add missing unlock USB: gadget: s3c-hsotg: Add missing unlock arch/arm/plat-pxa/dma.c: correct NULL test Kamal Mostafa (1): ACPI: sleep: init_set_sci_en_on_resume for Dell Studio 155x Kristoffer Ericson (1): pata_pcmcia / ide-cs: Fix bad hashes for Transcend and kingston IDs Krzysztof Helt (1): ALSA: es968: fix wrong PnP dma index Lars Ellenberg (1): drbd: don't expose failed local READ to upper layers Len Brown (1): Merge branches 'bugzilla-14337', 'bugzilla-14998', 'bugzilla-15407', 'bugzilla-15903' and 'misc-2.6.34' into release Li Dongyang (4): ocfs2: add OCFS2_INODE_SKIP_ORPHAN_DIR flag and honor it in the inode wipe code ocfs2: use OCFS2_INODE_SKIP_ORPHAN_DIR in ocfs2_symlink error path ocfs2: use OCFS2_INODE_SKIP_ORPHAN_DIR in ocfs2_mknod error path ocfs2: Avoid direct write if we fall back to buffered I/O Li Zefan (5): cgroup: Fix an RCU warning in cgroup_path() cgroup: Fix an RCU warning in alloc_css_id() sched: Fix an RCU warning in print_task() cgroup: Check task_lock in task_subsys_state() blk-cgroup: Fix an RCU warning in blkiocg_create() Liang Li (1): x86: Fix 'reservetop=' functionality Linus Torvalds (35): Merge branch 'merge' of git://git.secretlab.ca/git/linux-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6 Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus Merge git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6 Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-tip Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6 Merge branch 'slab-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6 Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev Merge branch 'zerolen' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/misc-2.6 Merge branch 'sh/for-2.6.34' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 Merge master.kernel.org:/home/rmk/linux-2.6-arm Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'v4l_for_2.6.34' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6 Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6 Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block Merge branch 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6 Merge branch 'for-linus' of git://neil.brown.name/md Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6 Linux 2.6.34-rc7 Magnus Damm (2): sh: Fix maximum number of SCIF ports in R2D defconfigs sh: sh7751 pci controller io port fix Mahesh Kuruganti (1): USB: serial: option: ZTEAC8710 Support with Device ID 0xffff Manuel Lauss (1): MIPS: DB1200: PCMCIA card detection must not be auto-enabled. Marc Zyngier (1): pcmcia: fix compilation after 16bit state locking changes Marek Olšák (1): drm/radeon/kms: r300 fix CS checker to allow zbuffer-only fastfill Mark Fasheh (1): ocfs2: Add directory entry later in ocfs2_symlink() and ocfs2_mknod() Mark Langsdorf (1): powernow-k8: Fix frequency reporting Martyn Welch (1): Staging: vme: Re-introduce necessary brackets Mattias Walström (1): FEC: Fix kernel panic in fec_set_mac_address. Michael Hennerich (1): USB: sl811-hcd: Fix device disconnect Michael Hunold (1): V4L/DVB: saa7146: fix up bytesperline if it is an impossible value Michal Simek (16): microblaze: PCI: add pci_bus_for_each_resource(), remove direct bus->resource[] refs microblaze: resource/PCI: align functions now return start of resource microblaze: Quiet section mismatch warnings for MMU version microblaze: Remove ancient code microblaze: Add isa_dma_bridge_buggy to dma.h microblaze: Remove "cache" optimized copy_page function microblaze: page.h: Remove get_user_page and free_user_page microblaze: pci-dma: use include/linux/dma-mapping.h microblaze: Fix consistent code microblaze: Fix typo fault in cache code microblaze: Fix kmalloc alignment on non-coherent DMA platforms microblaze: cpuinfo shows cache line length microblaze: Define correct L1_CACHE_SHIFT value microblaze: Fix consistent-sync code microblaze: Optimize CACHE_LOOP_LIMITS and CACHE_RANGE_LOOP macros microblaze: Defconfig update Mike Christie (1): [SCSI] libiscsi: regression: fix header digest errors Murali Karicheri (1): V4L/DVB: V4L: vpfe_capture - free ccdc_lock when memory allocation fails Muralidharan Karicheri (1): V4L/DVB: V4L - vpfe capture - fix for kernel crash Neil Horman (1): sctp: Fix skb_over_panic resulting from multiple invalid parameter errors (CVE-2010-1173) (v4) NeilBrown (1): md: restore ability of spare drives to spin down. Nick Piggin (1): microblaze: invoke oom-killer from page fault Oleg Nesterov (1): workqueue: flush_delayed_work: keep the original workqueue for re-queueing Oliver Endriss (1): V4L/DVB: ngene: Workaround for stuck DiSEqC pin Patrice Vilchez (1): USB: ohci-at91: fix power management hanging Paul E. McKenney (3): rcu: Fix RCU lockdep splat on freezer_fork path memcg: css_id() must be called under rcu_read_lock() rcu: create rcu_my_thread_group_empty() wrapper Pavel Machek (1): [ARM] pxa/spitz: fix On/off key name to fix warning during boot Pavel Roskin (1): Staging: rtl8192su: add USB ID for 0bda:8171 Peter Korsgaard (1): dm9601: fix phy/eeprom write routine Peter Zijlstra (1): rcu: Fix RCU lockdep splat in set_task_cpu on fork path Ping Cheng (1): serial: 8250_pnp - add Fujitsu Wacom device Prarit Bhargava (1): x86: Fix NULL pointer access in irq_force_complete_move() for Xen guests Ralf Baechle (3): Inotify: Fix build failure in inotify user support MIPS: PNX8550: Fix build error, broken by: MIPS: cmpxchg.h: Fix excessive indentation. Randy Dunlap (2): USB: ti_usb: fix printk format warning microblaze: fix divide by zero exception message Richard Airlie (1): staging: rtl8192su: add Support for Belkin F5D8053 v6 Richard LIU (1): MIPS: Loongson: Fix find_vga_mem_init() Robert Fitzsimons (1): drm/radeon/kms/agp The wrong AGP chipset can cause a NULL pointer dereference Rodrigo Linfati (1): Staging: add Add Sitecom WL-349 to rtl8192su Roman Tereshonkov (4): spi: release device claimed by bus_find_device_by_name spi: spi_device memory should be released instead of device. omap2_mcspi: Flush posted writes omap2_mcspi: small fixes of output data format Russ Nelson (1): USB: cdc-acm: add another device quirk Russell King (3): ARM: Update mach-types Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 Ryusuke Konishi (1): nilfs2: fix sync silent failure Sage Weil (11): ceph: clear dir complete on d_move ceph: fix snap realm splits ceph: print more useful version info on module load ceph: fix leaked spinlock during mds reconnect ceph: add missing #includes ceph: fix seq counting for skipped messages ceph: discard incoming messages with bad seq # ceph: fix direct io truncate offset ceph: clear dir complete, invalidate dentry on replayed rename ceph: fix lockless caps check ceph: remove bad auth_x kmem_cache Santosh Shilimkar (2): ARM: 6068/1: Fix build break with KPROBES enabled ARM: 6066/1: Fix "BUG: scheduling while atomic: swapper/0/0x00000002 Sarah Sharp (2): USB: xhci: properly set the "Mult" field of the endpoint context. USB: xhci: properly set endpoint context fields for periodic eps. Sebastian Andrzej Siewior (4): MIPS: Fixup screen_info struct initializations MIPS: SB1250: Include correct header and fix a warning MIPS: Swarm, Littlesur: Enable PATA platform driver. MIPS: Use CKSEG1ADDR for uncached handler Sebastian Siewior (1): net/sb1250: register mdio bus in probe Sergei Shtylyov (9): MUSB: Blackfin: don't fake blackfin_interrupt() result musb_core: don't touch 'musb->clock' in musb_free() musb_core: don't prevent disabling clock on driver unload MUSB: DaVinci: fix musb_platform_init() error cleanup path MUSB: OMAP: don't call clk_put() musb_core: don't call musb_platform_exit() twice MUSB: fix DaVinci glue layer dependency musb_core: fix musb_init_controller() error cleanup path libata: Fix several inaccuracies in developer's guide Shaohua Li (1): ACPI: fix acpi_hest_firmware_first_pci() caused oops Simon Arlott (2): ppp_generic: pull 2 bytes so that PPP_PROTO(skb) is valid ppp_generic: handle non-linear skbs when passing them to pppd Simone Contini (1): USB: serial: pl2303: Hybrid reader Uniform HCR331 Sonic Zhang (1): staging: iio: Function iio_get_new_idr_val() return negative value if fails. Stefan Herbrechtsmeier (1): V4L/DVB: pxa_camera: move fifo reset direct before dma start Stefan Schmidt (1): [ARM] pxa/imote2: Fix iMote2 defconfig Stephen Hemminger (1): Staging: hv: name network device ethX rather than sethX Steven J. Magnani (2): microblaze: Fix IRQ entry/exit ftracing microblaze: Quiet section mismatch warnings Stijn Tintel (1): virtio: initialize earlier Takashi Iwai (2): Input: Add support of Synaptics Clickpad device Merge branch 'fix/hda' into for-linus Tao Ma (3): ocfs2_dlmfs: User DLM_* when decoding file open flags. ocfs2: Reset status if we want to restart file extension. ocfs2: Update VFS inode's id info after reflink. Tejun Heo (2): perf: Fix resource leak in failure path of perf_event_open() [SCSI] fix locking around blk_abort_request() Thomas Hellstrom (2): drm/ttm: Remove some leftover debug messages. drm/ttm: Remove the ttm_bo_block_reservation() function. Tony Lindgren (1): usb: Fix tusb6010 for DMA API Toshiyuki Okajima (1): KEYS: find_keyring_by_name() can gain access to a freed keyring Trond Myklebust (1): NFSv4: Fix the locking in nfs_inode_reclaim_delegation() Uwe Kleine-König (1): V4L/DVB: mx1-camera: compile fix Vaibhav Hiremath (1): V4L/DVB: V4L - Makfile:Removed duplicate entry of davinci Vivek Goyal (1): blk-cgroup: Fix RCU correctness warning in cfq_init_queue() Wengang Wang (1): ocfs2: Check the owner of a lockres inside the spinlock Wim Van Sebroeck (1): watchdog: ep93xx_wdt.c fix default timout value in MODULE_PARM_DESC string. Wolfram Sang (5): serial/mpc52xx_uart: Drop outdated comments Staging: iio: light: fix dangling pointers Staging: iio: adc: fix dangling pointers i2c-core: Erase pointer to clientdata on removal [ARM] pxa/viper: fix timeout usage for I2C Wu Zhangjin (5): MIPS: oprofile: Fix breakage when CONFIG_OPROFILE=m MIPS: Loongson: Add CPU_LOONGSON2F_WORKAROUNDS MIPS: Loongson 2F: Enable fixups of the latest binutils MIPS: Loongson-2F: Use CONFIG_CPU_JUMP_WORKAROUNDS to control workarounds. MIPS: Loongson 2F: Fix of problems introduced by -mfix-loongson2f-jump Yong Zhang (1): V4L/DVB: gspca - sn9c20x: Correct onstack wait_queue_head declaration Yury Polyanskiy (1): MIPS: die() does not call die notifier chain Zhang, Yanmin (1): slub: Fix bad boundary check in init_kmem_cache_nodes() ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Wed May 19 15:08:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=ALL_TRUSTED,BAYES_00, J_CHICKENPOX_21,J_CHICKENPOX_47 autolearn=no version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JK8KXd151829 for ; Wed, 19 May 2010 15:08:20 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o4JK8Ir9151792; Wed, 19 May 2010 15:08:18 -0500 Date: Wed, 19 May 2010 15:08:18 -0500 Message-Id: <201005192008.o4JK8Ir9151792@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree annotated tag, v2.6.34-rc3, created. v2.6.34-rc3 X-Git-Refname: refs/tags/v2.6.34-rc3 X-Git-Reftype: annotated tag X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: fc2199137e85558e1f8f2bf44e0d3fa2b5cc4371 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The annotated tag, v2.6.34-rc3 has been created at fc2199137e85558e1f8f2bf44e0d3fa2b5cc4371 (tag) tagging 2eaa9cfdf33b8d7fb7aff27792192e0019ae8fc6 (commit) replaces v2.6.34-rc2 tagged by Linus Torvalds on Tue Mar 30 09:24:52 2010 -0700 - Log ----------------------------------------------------------------- Linux 2.6.34-rc3 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEABECAAYFAkuyJdkACgkQF3YsRnbiHLv+zACggatuagrCVw/0KXGYzltIM8BS OIgAn2wuus0zSZn78iwkpdxSaOrd5eUE =/pDo -----END PGP SIGNATURE----- Abraham Arce (1): KS8851: Avoid NULL pointer in set rx mode Adel Gadllah (1): iwlwifi: Silence tfds_in_queue message Adrian Hunter (1): mmc: fix incorrect interpretation of card type bits Al Viro (1): Restore LOOKUP_DIRECTORY hint handling in final lookup on open() Alexander Duyck (3): igb: only use vlan_gro_receive if vlans are registered skbuff: remove unused dma_head & dma_maps fields igb: use correct bits to identify if managability is enabled Alexandra Kossovsky (1): tcp: Fix OOB POLLIN avoidance. Amerigo Wang (1): netpoll: warn when there are spaces in parameters Ameya Palande (1): regulator: Get rid of lockdep warning Amit Kumar Salecha (4): netxen: fix bios version calculation netxen: fix warning in ioaddr for NX3031 chip netxen: added sanity check for pci map netxen: update version to 4.0.73 Amit Shah (2): virtio: console: Generate a kobject CHANGE event on adding 'name' attribute virtio: console: Check if port is valid in resize_console Andreas Bombe (1): sh64: Remove long unused mid_sched macro Andreas Herrmann (1): x86, amd: Restrict usage of c1e_idle() Andrei Emeltchenko (1): Bluetooth: Fix kernel crash on L2CAP stress tests Andrew Morton (2): timer stats: Fix del_timer_sync() and try_to_del_timer_sync() kernel/sched.c: Suppress unused var warning Andy Gospodarek (1): bonding: fix broken multicast with round-robin mode Anton Blanchard (1): ppc64 sys_ipc breakage in 2.6.34-rc2 Arnaldo Carvalho de Melo (2): perf top: Improve the autosizing of column lenghts perf top: Add missing initialization to zero Axel Lin (2): lp3971: Fix setting val for LDO2 and LDO4 lp3971: Fix BUCK_VOL_CHANGE_SHIFT logic Ben Blum (1): cgroups: net_cls as module Ben Menchaca (1): gianfar: fix undo of reserve() Benjamin Li (1): bnx2: Fix netpoll crash. Bjorn Helgaas (11): resources: add interfaces that return conflict information PCI: for address space collisions, show conflicting resource PCI: break out primary/secondary/subordinate for readability PCI: make disabled window printk style match the enabled ones PCI: print resources consistently with %pR PCI: complain about devices that seem to be broken PCI: don't say we claimed a resource if we failed x86/PCI: remove redundant warnings frv/PCI: remove redundant warnings x86/PCI: for host bridge address space collisions, show conflicting resource x86/PCI: truncate _CRS windows with _LEN > _MAX - _MIN + 1 Borislav Petkov (2): edac, mce: Filter out invalid values fs/binfmt_aout.c: fix pointer warnings Brandon L Black (1): net: Add MSG_WAITFORONE flag to recvmmsg Carolyn Wyborny (1): igb: Add support for 82576 ET2 Quad Port Server Adapter Cheng Renquan (1): ceph: some documentations fixes Chris Leech (1): ixgbe: filter FIP frames into the FCoE offload queues Chris Wilson (1): drm/i915: Avoid NULL deref in get_pages() unwind after error. Christian Borntraeger (1): [S390] system.h: Fix compile error for 1 and 2 byte cmpxchg Christian Lamparter (2): [ARM] Kirkwood: WPS button keycode mapping [ARM] Orion5x: replace KEY_WLAN with KEY_WPS_BUTTON Clemens Ladisch (4): firewire: core: fw_iso_resource_manage: fix error handling firewire: ohci: add cycle timer quirk for the TI TSB12LV22 ALSA: cmipci: work around invalid PCM pointer PCI quirk: RS780/RS880: work around missing MSI initialization Colin Ian King (1): softlockup: Stop spurious softlockup messages due to overflow Crane Cai (1): i2c-scmi: Support IBM SMBus CMI devices Daisuke Nishimura (1): memcg: disable move charge in no mmu case Dan Carpenter (11): drm/i915: fix small leak on overlay error path sunrpc: handle allocation errors from __rpc_lookup_create() pxa168fb: fix incorrect resource calculation AFS: Potential null dereference regulator: handle kcalloc() failure ceph: handle kmalloc() failure af_key: return error if pfkey_xfrm_policy2msg_prep() fails memcontrol: fix potential null deref kcore: fix test for end of list fscache: add missing unlock hwmon: (w83793) Saving negative errors in unsigned Daniel Chen (1): ALSA: ac97: Add Toshiba P500 to ac97 jack sense blacklist Daniel Mack (2): ASoC: pxa-pcm-lib: initialize DMA channel to -1 [ARM] pxa/raumfeld: fix button name Daniel T Chen (3): ALSA: hda: Fix 0 dB offset for HP laptops using CX20551 (Waikiki) ALSA: ac97: Add IBM ThinkPad R40e to Headphone/Line Jack Sense blacklist ALSA: hda: Use LPIB for ga-ma770-ud3 board Daniel Taylor (1): fs/partitions/msdos: add support for large disks Daniel Vetter (1): drm/intel: fix up set_tiling for untiled->tiled transition Darrick J. Wong (2): acpi: Support IBM SMBus CMI devices i2c-scmi: Provide module aliases for automatic loading Dave Airlie (1): slow-work: use get_ref wrapper instead of directly calling get_ref David Howells (9): nommu: fix an incorrect comment in the do_mmap_shared_file() Document Linux's circular buffering capabilities FDPIC: For-loop in elf_core_vma_data_size() is incorrect do_sync_read/write() should set kiocb.ki_nbytes to be consistent NOMMU: Revert 'nommu: get_user_pages(): pin last page on non-page-aligned start' NOMMU: Fix __get_user_pages() to pin last page on offset buffers SLOW_WORK: CONFIG_SLOW_WORK_PROC should be CONFIG_SLOW_WORK_DEBUG frv/chris: fix lines with a missing semicolons KEYS: Add MAINTAINERS record David Härdeman (1): kfifo: fix KFIFO_INIT in include/linux/kfifo.h David S. Miller (12): Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 Merge branch 'vhost' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6 Merge branch 'master' of /home/davem/src/GIT/linux-2.6/ Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-2.6 via-velocity: Fix FLOW_CNTL_TX_RX handling in set_mii_flow_control() isdn: Add netdev to lists in MAINTAINERS entry. Revert "r8169: enable 64-bit DMA by default for PCI Express devices (v2)" Revert "via82cxxx: workaround h/w bugs" tulip: Add missing parens. Revert "ide: skip probe if there are no devices on the port (v2)" sparc64: Properly truncate pt_regs framepointer in perf callback. Dean Nelson (4): PCI: fix return value from pcix_get_max_mmrbc() PCI: fix access of PCI_X_CMD by pcix get and set mmrbc functions PCI: cleanup error return for pcix get and set mmrbc functions hwmon: (coretemp) Add missing newline to dev_warn() message Derek Kelly (1): ALSA: hda - Add support of Nvidia GT220 HDMI Dmitry Torokhov (1): Regulators: max8925-regulator - clean up driver data after removal Dominik Brodowski (4): pcmcia: do not use ioports < 0x100 on x86 pcmcia: allow for four multifunction subdevices (again) power: support _noirq actions on device types and classes pcmcia: use dev_pm_ops for class pcmcia_socket_class Emil Tantilov (4): igb: do not modify tx_queue_len on link speed change igbvf: do not modify tx_queue_len on link speed change e1000e: do not modify tx_queue_len on link speed change e1000: do not modify tx_queue_len on link speed change Eric Anholt (6): drm/i915: Don't bother with the BKL for GEM ioctls. drm/i915: Enable VS timer dispatch. agp/intel: Respect the GTT size on Sandybridge for scratch page setup. agp/intel: Don't do the chipset flush on Sandybridge. drm/i915: Set up the documented clock gating on Sandybridge and Ironlake. drm/i915: Stop trying to use ACPI lid status to determine LVDS connection. Eric Dumazet (3): net: Potential null skb->dev dereference netfilter: xt_hashlimit: dl_seq_stop() fix netfilter: xt_hashlimit: IPV6 bugfix Eric Miao (3): [ARM] mmp: fix for variables in uncompress.h being discarded [ARM] pxa: remove unnecessary 'select FB_W100' from some platforms [ARM] pxa/sharpsl: add dependency of max1111 driver to sharpsl_pm Eric Sandeen (1): ext4: Fixed inode allocator to correctly track a flex_bg's used_dirs Eric W. Biederman (1): netxen: The driver doesn't work on NX_P3_B1 so cause probe to fail. FUJITA Tomonori (1): Documentation: rename PCI/PCI-DMA-mapping.txt to DMA-API-HOWTO.txt Felix Fietkau (1): ath9k: fix BUG_ON triggered by PAE frames Francois Romieu (1): r8169: fix broken register writes Grazvydas Ignotas (1): wl1251: fix potential crash Greg Rose (7): ixgbevf: Fix VF Stats accounting after reset ixgbevf: Shorten up delay timer for watchdog task ixgbevf: Message formatting cleanups ixgbevf: Fix signed/unsigned int error ixgbe: In SR-IOV mode insert delay before bring the adapter up ixgbe: Change where clear_to_send_flag is reset to zero. ixgbe: Do not run all Diagnostic offline tests when VFs are active Greg Thelen (1): memcg: fix typo in memcg documentation Guennadi Liakhovetski (3): ASoC: SIU driver shall select FW_LOADER SH: fix SCIFA SCASCR register bit definitions SH: remove superfluous warning from the serial driver Guenter Roeck (1): ipv4: Don't drop redirected route cache entry unless PTMU actually expired Guo-Fu Tseng (3): jme: Fix VLAN memory leak jme: Protect vlgrp structure by pause RX actions. jme: Advance driver version number H Hartley Sweeten (2): [ARM] locomo: fix SPI register offset [ARM] locomo: fix unpaired spin_lock_irqsave Hans-Joachim Picht (1): [S390] fix broken proc interface for sclp_async Heiko Carstens (2): [S390] smp: fix lowcore allocation [S390] sclp: avoid 64 bit division Henne (4): isdn: Cleanup Sections in PCMCIA driver sedlbauer isdn: Cleanup Sections in PCMCIA driver teles isdn: Cleanup Sections in PCMCIA driver avma1 isdn: Cleanup Sections in PCMCIA driver elsa Henrik Kretzschmar (1): genirq: Move two IRQ functions from .init.text to .text Herbert Xu (1): ipv6: Remove redundant dst NULL check in ip6_dst_check Huang Weiyi (1): [ARM] pxa/raumfeld: remove duplicated #include Ian Campbell (1): x86: Do not free zero sized per cpu areas Jan Beulich (1): x86: Fix placement of FIX_OHCI1394_BASE Jan Kara (2): ext4: Fix estimate of # of blocks needed to write indirect-mapped files ext4: Don't use delayed allocation by default when used instead of ext3 Jani Nikula (1): c2port: fix device_create() return value check Jarkko Nikula (1): ALSA: pcm_lib - fix xrun functionality Jaswinder Singh Rajput (1): hwmon: (asc7621) Add X58 entry in Kconfig Jeff Dike (1): vhost: fix error path in vhost_net_set_backend Jeff Layton (1): NFS: don't try to decode GETATTR if DELEGRETURN returned error Jeff Mahoney (2): reiserfs: fix oops while creating privroot with selinux enabled reiserfs: properly honor read-only devices Jens Rottmann (1): ksz884x: fix return value of netdev_set_eeprom Jiri Kosina (1): x86: Remove excessive early_res debug output Joe Perches (3): drivers/gpu/drm/i915/intel_bios.c: fix continuation line formats MAINTAINERS: use tab not spaces for delimiter drivers/net: Fix continuation lines Joern Engel (12): Open segment file before using it Limit max_pages for insane devices Plug memory leak in writeseg_end_io Prevent schedule while atomic in __logfs_readdir Write out both superblocks on mismatch Fix logfs_get_sb_final error path Use deactivate_locked_super Prevent data corruption in logfs_rewrite_block() Simplify and fix pad_wbuf [LogFS] Clear PagePrivate when moving journal [LogFS] Move reserved segments with journal [LogFS] Erase new journal segments John Fastabend (1): ixgbe: cleanup maximum number of tx queues John Stultz (1): time: Fix accumulation bug triggered by long delay. Jon Maloy (1): TIPC: Removed inactive maintainer Jonathan Cameron (2): [ARM] pxa: fix for variables in uncompress.h being discarded [ARM] pxa: remove spi cs gpio direction to avoid clash with driver JosephChan@via.com.tw (2): pata_via: Add VIA VX900 support pata_via: fix VT6410/6415/6330 detection issue Jozsef Kadlecsik (1): netfilter: ip6table_raw: fix table priority Julia Lawall (2): sound/oss/vidc.c: change the field used with DMA_ACTIVE arch/sparc/kernel: Use set_cpus_allowed_ptr KOSAKI Motohiro (6): sched: sched_getaffinity(): Allow less than NR_CPUS length sched: Use proper type in sched_getaffinity() tmpfs: mpol=bind:0 don't cause mount error. tmpfs: handle MPOL_LOCAL mount option properly tmpfs: cleanup mpol_parse_str() doc: add the documentation for mpol=local Ken Kawasaki (1): pcnet_cs: add new id Komuro (1): pd6729: Coding Style fixes Kunal Gangakhedkar (1): ALSA: hda - Add PCI quirk for HP dv6-1110ax. Kuninori Morimoto (3): sh: mach-ecovec24: Add i2c_put_adapter on sh_eth_init sh: ms7724: Add tiny-document for sound sh: Add watch-dog register address for SH7722/SH7723/SH7724 Kyle McMartin (1): tulip: Fix null dereference in uli526x_rx_packet() Lai Jiangshan (2): rcu: Fix tracepoints & lockdep false positive rcu: Fix local_irq_disable() CONFIG_PROVE_RCU=y false positives Lee Schermerhorn (1): mempolicy: fix get_mempolicy() for relative and static nodes Lennart Schulte (1): tcp: Fix tcp_mark_head_lost() with packets == 0 Li Zefan (1): cgroups: remove duplicate include Linus Torvalds (41): Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost Fix up prototype for sys_ipc breakage Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6 Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt/drm-intel Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6 Merge branch 'sh/for-2.6.34' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6 Merge master.kernel.org:/home/rmk/linux-2.6-arm Merge branch 'for-linus' of git://gitorious.org/linux-omap-dss2/linux Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6 Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'irq-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'tracing-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide-2.6 ext3: fix broken handling of EXT3_STATE_NEW Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2 Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge git://git.kernel.org/pub/scm/linux/kernel/git/joern/logfs Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6 Linux 2.6.34-rc3 Magnus Damm (1): serial: sh-sci: fix SH-Mobile SH breakage Mallikarjuna R Chilakala (3): ixgbe: Fix 82599 multispeed fiber link issues due to Tx laser flapping ixgbe: Fix 82599 KX4 Wake on LAN issue after an improper system shutdown ixgbe: Set IXGBE_RSC_CB(skb)->DMA field to zero after unmapping the address Marcel Holtmann (2): Bluetooth: Fix potential bad memory access with sysfs files Bluetooth: Convert debug files to actually use debugfs instead of sysfs Mark Brown (3): ASoC: Bail out of wm_hubs DC servo if calibration fails Merge commit 'v2.6.34-rc2' into for-2.6.34 ASoC: Remove BROKEN from i.MX audio after dependencies merged Mark Fasheh (3): ocfs2: set i_mode on disk during acl operations ocfs2: Always try for maximum bits with new local alloc windows ocfs2: Clear undo bits when local alloc is freed Martin Schwidefsky (1): [S390] fix boot failures with compressed kernels Masami Hiramatsu (4): perf probe: Fix probe_point buffer overrun perf probe: Fix need_dwarf flag if lazy matching is used perf probe: Fix offset to allow signed value perf probe: Use original address instead of CU-based address Mathieu Desnoyers (1): CRED: Fix memory leak in error handling Matt Fleming (3): sh: Flush ITLB too in PTEAEX's flush_tlb_page() sh: Replace unsafe manipulation of MMUCR sh: Fix build after dynamic PMB rework Matthew Wilcox (1): PCI quirk: Disable MSI on VIA K8T890 systems Miao Xie (2): cpuset: fix the problem that cpuset_mem_spread_node() returns an offline node cpuset: alloc nodemask_t on the heap rather than the stack Michael Chan (1): bnx2: Use proper handler during netpoll. Michael Grzeschik (1): lxfb: set the H- and V-SYNC polarity of the flatpanel output Michael Holzheu (1): [S390] zcore: CPU registers are not saved under LPAR Michael S. Tsirkin (3): vhost: fix interrupt mitigation with raw sockets vhost: fix error handling in vring ioctls exit: fix oops in sync_mm_rss Mike Frysinger (2): can: bfin_can: switch to common Blackfin can header blackfin: enable DEBUG_SECTION_MISMATCH Mitch Williams (1): igb: count Rx FIFO errors correctly Neil Horman (1): r8169: offical fix for CVE-2009-4537 (overlength frame DMAs) Nick Bowler (1): Staging: et131x: Properly disable FC in txmac. Nicolas Dichtel (1): net: ipmr/ip6mr: prevent out-of-bounds vif_table access OGAWA Hirofumi (1): fs/partition/msdos: fix unusable extended partition for > 512B sector Owain G. Ainsworth (1): drm/i915: remove an unnecessary wait_request() Pablo Neira Ayuso (3): netlink: fix unaligned access in nla_get_be64() netlink: fix NETLINK_RECV_NO_ENOBUFS in netlink_set_err() netfilter: ctnetlink: fix reliable event delivery if message building fails Patrick McHardy (3): net: ipmr/ip6mr: fix potential out-of-bounds vif_table access netfilter: xt_recent: fix regression in rules using a zero hit_count net: fix netlink address dumping in IPv4/IPv6 Paul E. McKenney (2): rcu: Make rcu_read_lock_bh_held() allow for disabled BH net: suppress lockdep-RCU false positive in FIB trie. Paul Mackerras (1): powerpc/perf_events: Fix call-graph recording, add perf_arch_fetch_caller_regs Paul Mundt (3): PCI: kill off pci_register_set_vga_state() symbol export. sh: Tidy up a couple of section mismatches. sh: Silence unintialized variable warnings in dwarf unwinder. Paulius Zaleckas (1): if_tunnel.h: add missing ams/byteorder.h include Pavel Emelyanov (2): ipv4: Cleanup struct net dereference in rt_intern_hash ipv4: Restart rt_intern_hash after emergency rebuild (v2) Peter Ujfalusi (2): ASoC: tlv320dac33: Fix DSP modes ASoC: tlv320dac33: Internal clocking changes Prarit Bhargava (1): hwmon: (coretemp) Fix cpu model output Priit Laes (1): drm/i915: Rename FBC_C3_IDLE to FBC_CTL_C3_IDLE to match other registers Rafael J. Wysocki (1): x86 / perf: Fix suspend to RAM on HP nx6325 Randy Dunlap (2): scripts/kernel-doc: handle struct member __aligned scripts/kernel-doc: fix fatal error on function prototype Ravikiran G Thirumalai (1): tmpfs: fix oops on mounts with mpol=default Richard Röjfors (1): drivers/gpio/max730x.c: add license macro Rob Landley (1): sparc: Fix use of uid16_t and gid16_t in asm/stat.h Robert Love (2): ixgbe: Don't allow user buffer count to exceed 256 ixgbe: Priority tag FIP frames Robin Holt (1): mm/ksm.c is doing an unneeded _notify in write_protect_page. Russell King (4): ARM: Fix IXP23xx build error in mach/memory.h ARM: Update mach-types Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 Documentation/volatile-considered-harmful.txt: correct cpu_relax() documentation Ryusuke Konishi (3): nilfs2: fix duplicate call to nilfs_segctor_cancel_freev nilfs2: fix hang-up of cleaner after log writer returned with error nilfs2: fix imperfect completion wait in nilfs_wait_on_logs Sachin Prabhu (1): Skip check for mandatory locks when unlocking Sage Weil (26): ceph: implemented caps should always be superset of issued caps ceph: add missing locking to protect i_snap_realm_item during split ceph: fix inode removal from snap realm when racing with migration ceph: fix authenticator timeout ceph: fix authenticator buffer size calculation ceph: release old ticket_blob buffer ceph: clean up service ticket decoding ceph: fix null pointer deref of r_osd in debug output ceph: drop unnecessary WARN_ON in caps migration ceph: fix session locking in handle_caps, ceph_check_caps ceph: clean up handle_cap_grant, handle_caps wrt session mutex ceph: only release unused caps with mds requests ceph: fix mds sync() race with completing requests ceph: fix pg pool decoding from incremental osdmap update ceph: prevent dup stale messages to console for restarting mds ceph: fix connection fault con_work reentrancy problem ceph: rename r_sent_stamp r_stamp ceph: avoid reopening osd connections when address hasn't changed ceph: fix snap rebuild condition ceph: make write_begin wait propagate ERESTARTSYS ceph: propagate mds session allocation failures to caller ceph: fix session check on mds reply ceph: fix possible double-free of mds request reference ceph: avoid loaded term 'OSD' in documention ceph: fix use after free on mds __unregister_request ceph: update discussion list address in MAINTAINERS Srinivas Eeda (1): ocfs2: Fix a race in o2dlm lockres mastery Stanislaw Gruszka (1): posix-cpu-timers: Reset expire cache when no timer is running Stefan Haberland (1): [S390] dasd: check tsb validity Stefan Richter (2): firewire: core: fix Model_ID in modalias firewire: core: align driver match with modalias Stefan Weinhuber (1): [S390] dasd: fix alignment of transport mode recovery TCW Steve Glendinning (1): smsc95xx: Fix tx checksum offload for small packets Steven J. Magnani (1): NET_DMA: free skbs periodically Steven Rostedt (1): ring-buffer: Do 8 byte alignment for 64 bit that can not handle 4 byte align Suresh Siddha (1): x86: Handle legacy PIC interrupts on all the cpu's Takashi Iwai (7): ALSA: hda - Sort codec entry list of Nvidia HDMI ALSA: hda - Fix access-after-free in patch_realtek.c Merge branch 'fix/asoc' into for-linus Merge branch 'fix/hda' into for-linus ALSA: hda - Don't set invalid connection index in Realtek initialiaiton Merge branch 'fix/misc' into for-linus Merge branch 'fix/hda' into for-linus Tao Ma (4): ocfs2: Change bg_chain check for ocfs2_validate_gd_parent. ocfs2: Update i_blocks in reflink operations. ocfs2: Fix the update of name_offset when removing xattrs ocfs2: Init meta_ac properly in ocfs2_create_empty_xattr_block. Tejun Heo (1): libata-sff: fix spurious IRQ handling Tetsuo Handa (2): rxrpc: Check allocation failure. rxrpc: Check allocation failure. Theodore Ts'o (1): ext4: Fix spelling of CONTIG_FS_EXT3 to CONFIG_FS_EXT3 Thomas Gleixner (3): genirq: Prevent oneshot irq thread race clockevents: Sanitize min_delta_ns adjustment and prevent overflows genirq: Protect access to irq_desc->action in can_request_irq() Thomas Weber (1): OMAP: DSS2: VRAM: Fix early_param for vram Tim Yamin (1): PCI quirk: only apply CX700 PCI bus parking quirk if external VT6212L is present Timo Teräs (2): ipv4: check rt_genid in dst_check ip_gre: include route header_len in max_headroom calculation Tomi Valkeinen (2): OMAP: DSS2: initialize dss clk sources properly OMAP: DSS2: panel-generic: re-implement mode changing Tristan Ye (2): Ocfs2: Journaling i_flags and i_orphaned_slot when adding inode to orphan dir. Ocfs2: Handle deletion of reflinked oprhan inodes correctly. Trond Myklebust (4): NFS: Prevent another deadlock in nfs_release_page() SUNRPC: Fix a potential memory leak in auth_gss SUNRPC: Fix a use after free bug with the NFSv4.1 backchannel SUNRPC: Fix the return value of rpc_run_bc_task() Uwe Kleine-König (1): rtc/mc13783: fix use after free bug Vasu Dev (3): ixgbe: fix for real_num_tx_queues update issue vlan: adds vlan_dev_select_queue vlan: updates vlan real_num_tx_queues Wolfram Sang (2): regulator: fix dangling pointers get_maintainer: repair STDIN usage YOSHIFUJI Hideaki / ĺ‰č—¤č‹±ćŽ (1): ipv6: Don't drop cache route entry unless timer actually expired. Yegor Yefremov (1): KS8695: update ksp->next_rx_desc_read at the end of rx loop Yinghai Lu (2): x86: Make smp_locks end with page alignment x86: Make sure free_init_pages() frees pages on page boundary Zhenyu Wang (1): drm/i915: Fix check with IS_GEN6 stephen hemminger (1): TCP: check min TTL on received ICMP packets wzt wzt (1): benet: Fix compile warnnings in drivers/net/benet/be_ethtool.c ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From aelder@sgi.com Wed May 19 15:49:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JKnsLq154506 for ; Wed, 19 May 2010 15:49:54 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id 053E98F80F2 for ; Wed, 19 May 2010 13:52:10 -0700 (PDT) Received: from [128.162.232.165] ([128.162.232.165]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 19 May 2010 15:52:10 -0500 Subject: Re: [XFS updates] XFS development tree annotated tag, v2.6.34, created. v2.6.34 From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com In-Reply-To: <201005192008.o4JK8CGB151692@oss.sgi.com> References: <201005192008.o4JK8CGB151692@oss.sgi.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 19 May 2010 15:52:10 -0500 Message-ID: <1274302330.2140.82.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 19 May 2010 20:52:10.0610 (UTC) FILETIME=[26C4CD20:01CAF795] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2010-05-19 at 15:08 -0500, xfs@oss.sgi.com wrote: > This is an automated email from the git hooks/post-receive script. It was > generated because a ref change was pushed to the repository containing > the project "XFS development tree". > > The annotated tag, v2.6.34 has been created > at dba2e709efc365df385a762e763b51365403bc0f (tag) > tagging e40152ee1e1c7a63f4777791863215e3faa37a86 (commit) > replaces v2.6.34-rc7 > tagged by Linus Torvalds > on Sun May 16 14:17:44 2010 -0700 I'm not sure why each tag generates its own e-mail message to the list; they were all the result of a single "git push" operation. Now that 2.6.34 is out I have re-based the XFS master branch. I jumped the gun when I first pushed that change, and if you have already pulled in the changes you may have to do it again. You can do so with the following sequence of commands. It assumes that git://oss.sgi.com/xfs/xfs.git is your git repository's "origin" remote, with its "master" branch tracked by a local branch by the same name. It also presumes your working directory is clean. git remote update origin git fetch origin +master:master If your current branch is "master" you may get an error. In that case, do this: git checkout -b temporary git remote update origin git fetch origin +master:master git checkout master git branch -d temporary Sorry for the inconvenience. -Alex From aelder@sgi.com Wed May 19 15:54:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JKsjHU154733 for ; Wed, 19 May 2010 15:54:45 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 33B34AC02D; Wed, 19 May 2010 13:56:57 -0700 (PDT) Received: from stout.americas.sgi.com (localhost6.localdomain6 [127.0.0.1]) by stout.americas.sgi.com (8.14.3/8.14.2) with ESMTP id o4JKuvBU012030; Wed, 19 May 2010 15:56:57 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o4JKuua2012029; Wed, 19 May 2010 15:56:56 -0500 From: Alex Elder Message-Id: <201005192056.o4JKuua2012029@stout.americas.sgi.com> Date: Wed, 19 May 2010 15:56:56 -0500 To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update for 2.6.35-rc1 Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean FYI, I have a second batch of changes for XFS for 2.6.35-rc1. I'll send a separate pull request for them in another day or two. -Alex The following changes since commit 537b60d17894b7c19a6060feae40299d7109d6e7: Merge branch 'x86-uv-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip (2010-05-18 09:46:35 -0700) are available in the git repository at: git://oss.sgi.com/xfs/xfs for-linus Alex Elder (12): xfs: add const qualifiers to xfs error function args xfs: fix min bufsize bugs in two places xfs: simplify XLOG_SECTOR_ROUND*() xfs: kill XLOG_SECTOR_ROUND*() xfs: encapsulate bbcount validity checking xfs: nothing special about 1-block log sector xfs: change a few labels in xfs_log_recover.c xfs: avoid repeated pointer dereferences xfs: minor odds and ends in xfs_log_recover.c xfs: record log sector size rather than log2(that) xfs: kill off l_sectbb_mask Merge branch 'master' into for-linus Andrea Gelmini (1): xfs: xfs_trace.c: duplicated include Christoph Hellwig (23): xfs: clean up xfs_trans_commit logic even more xfs: reindent xlog_write xfs: clean up xlog_write_adv_cnt xfs: remove xfs_dqmarker xfs: remove periodic superblock writeback xfs: enforce synchronous writes in xfs_bwrite xfs: wait for direct I/O to complete in fsync and write_inode xfs: access quotainfo structure directly xfs: remove a few macro indirections in the quota code xfs: removed unused XFS_QMOPT_ flags xfs: remove dead XFS_LOUD_RECOVERY code xfs: simplify buffer to transaction matching xfs: limit xfs_imap_to_bmap to a single mapping xfs: remove iomap_target xfs: remove iomap_delta xfs: report iomap_offset and iomap_bsize in block base xfs: report iomap_bn in block base xfs: kill struct xfs_iomap xfs: move I/O type flags into xfs_aops.c xfs: clean up xfs_iomap_valid xfs: clean up mapping size calculation in __xfs_get_blocks xfs: clean up end index calculation in xfs_page_state_convert xfs: mark xfs_iomap_write_ helpers static Dave Chinner (16): xfs: factor log item initialisation xfs: Add inode pin counts to traces xfs: remove stale parameter from ->iop_unpin method xfs: fix reservation release commit flag in xfs_bmap_add_attrfork() xfs: split out iclog writing from xfs_trans_commit() xfs: update and factor xfs_trans_committed() xfs: Clean up xfs_trans_committed code after factoring xfs: log ticket reservation underestimates the number of iclogs xfs: factor xlog_write xfs: introduce new internal log vector structure xfs: add log item recovery tracing xfs: convert the per-mount dquot list to use list heads xfs: remove duplicate code from dquot reclaim xfs: convert the dquot hash list to use list heads xfs: convert the dquot free list to use list heads xfs: make the log ticket transaction id random Jan Engelhardt (1): xfs: add blockdev name to kthreads Tao Ma (1): xfs: Make fiemap work in query mode. Zhitong Wang (1): xfs: Fix integer overflow in fs/xfs/linux-2.6/xfs_ioctl*.c fs/xfs/linux-2.6/xfs_aops.c | 231 +++++++----- fs/xfs/linux-2.6/xfs_buf.c | 27 +- fs/xfs/linux-2.6/xfs_buf.h | 2 +- fs/xfs/linux-2.6/xfs_file.c | 2 + fs/xfs/linux-2.6/xfs_ioctl.c | 4 + fs/xfs/linux-2.6/xfs_ioctl32.c | 4 + fs/xfs/linux-2.6/xfs_iops.c | 5 +- fs/xfs/linux-2.6/xfs_super.c | 10 +- fs/xfs/linux-2.6/xfs_sync.c | 91 ++---- fs/xfs/linux-2.6/xfs_trace.c | 4 +- fs/xfs/linux-2.6/xfs_trace.h | 150 ++++++++- fs/xfs/quota/xfs_dquot.c | 193 +++++------ fs/xfs/quota/xfs_dquot.h | 35 +-- fs/xfs/quota/xfs_dquot_item.c | 30 +- fs/xfs/quota/xfs_qm.c | 609 ++++++++++++-------------------- fs/xfs/quota/xfs_qm.h | 23 +- fs/xfs/quota/xfs_qm_stats.c | 2 +- fs/xfs/quota/xfs_qm_syscalls.c | 152 ++++----- fs/xfs/quota/xfs_quota_priv.h | 102 ------ fs/xfs/quota/xfs_trans_dquot.c | 29 +- fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_buf_item.c | 55 ++-- fs/xfs/xfs_buf_item.h | 2 +- fs/xfs/xfs_error.c | 30 +- fs/xfs/xfs_error.h | 9 +- fs/xfs/xfs_extfree_item.c | 18 +- fs/xfs/xfs_inode.c | 2 + fs/xfs/xfs_inode_item.c | 21 +- fs/xfs/xfs_iomap.c | 123 ++----- fs/xfs/xfs_iomap.h | 47 +--- fs/xfs/xfs_log.c | 702 +++++++++++++++++++++++-------------- fs/xfs/xfs_log.h | 13 + fs/xfs/xfs_log_priv.h | 12 +- fs/xfs/xfs_log_recover.c | 311 ++++++++--------- fs/xfs/xfs_mount.c | 7 - fs/xfs/xfs_quota.h | 3 - fs/xfs/xfs_trans.c | 760 +++++++++++++++++++--------------------- fs/xfs/xfs_trans.h | 14 +- fs/xfs/xfs_trans_buf.c | 187 +++-------- 39 files changed, 1905 insertions(+), 2118 deletions(-) From SRS0+cg7x+78+fromorbit.com=david@internode.on.net Wed May 19 17:26:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JMQCGS159189 for ; Wed, 19 May 2010 17:26:12 -0500 X-ASG-Debug-ID: 1274308108-1357004b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9447835CC3D for ; Wed, 19 May 2010 15:28:29 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id cOqW4ikIORQ9hgiO for ; Wed, 19 May 2010 15:28:29 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25146168-1927428 for multiple; Thu, 20 May 2010 07:58:15 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OErkL-0008So-St; Thu, 20 May 2010 08:28:13 +1000 Date: Thu, 20 May 2010 08:28:13 +1000 From: Dave Chinner To: Jan Kara Cc: xfs@oss.sgi.com, hch@infradead.org X-ASG-Orig-Subj: Re: [PATCH 4/7] Add test of quota accounting using fsx Subject: Re: [PATCH 4/7] Add test of quota accounting using fsx Message-ID: <20100519222813.GN8120@dastard> References: <1274276289-8839-1-git-send-email-jack@suse.cz> <1274276289-8839-5-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274276289-8839-5-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1274308110 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.2, rules version 3.2.2.30282 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 19, 2010 at 03:38:06PM +0200, Jan Kara wrote: > Run fsx (and also several fsx threads in parallel) and verify that > quota accounting is correct after they finish. > > Signed-off-by: Jan Kara > --- > 231 | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 231.out | 10 +++++ > group | 1 + > 3 files changed, 150 insertions(+), 0 deletions(-) > create mode 100755 231 > create mode 100644 231.out > > diff --git a/231 b/231 > new file mode 100755 > index 0000000..0e34d33 > --- /dev/null > +++ b/231 > @@ -0,0 +1,139 @@ > +#! /bin/bash > +# FSQA Test No. 231 > +# > +# Run fsx with quotas enabled and verify accounted quotas in the end > +# > +# Derived from test 127 > +#----------------------------------------------------------------------- > +# Copyright (c) 2006 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 > +# > +#----------------------------------------------------------------------- > +# > +# creator > +owner=jack@suse.cz > + > +seq=`basename $0` > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > + > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.filter > +. ./common.quota > + > +FSX_FILE_SIZE=64000000 > +FSX_ARGS="-q -l $FSX_FILE_SIZE -o 65536 -S 191110531 -N 20000" My only question about this test is the use of a fixed seed for the test - shouldn't we randomise it and save the seed to $seq.full? This will results in different combinations of operations being tested (better long term coverage), but we still have the seed available to try to reproduce failures if they are based on a specific pattern of ops... As it stands, this would still be fine with a fixed seed... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+O8fi+78+fromorbit.com=david@internode.on.net Wed May 19 17:35:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JMZAa7159583 for ; Wed, 19 May 2010 17:35:11 -0500 X-ASG-Debug-ID: 1274308717-735903d80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5AB20109AA5B for ; Wed, 19 May 2010 15:38:38 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id IWaqvH5XAjkUy197 for ; Wed, 19 May 2010 15:38:38 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25014904-1927428 for multiple; Thu, 20 May 2010 08:07:27 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OErtF-0008TR-JI; Thu, 20 May 2010 08:37:25 +1000 Date: Thu, 20 May 2010 08:37:25 +1000 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/12] xfs: modify buffer item reference counting Subject: Re: [PATCH 03/12] xfs: modify buffer item reference counting Message-ID: <20100519223725.GO8120@dastard> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> <1274138668-1662-4-git-send-email-david@fromorbit.com> <1274294158.2140.35.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1274294158.2140.35.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1274308719 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.2, rules version 3.2.2.30282 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 19, 2010 at 01:35:58PM -0500, Alex Elder wrote: > On Tue, 2010-05-18 at 09:24 +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > The buffer log item reference counts used to take referenceŃ• for every > > transaction, similar to the pin counting. This is symmetric (like the > > pin/unpin) with respect to transaction completion, but with dleayed logging > > becomes assymetric as the pinning becomes assymetric w.r.t. transaction > > completion. > > Doing the reference counts this way is an improvement. > > I have a question below. > > . . . > > --- a/fs/xfs/xfs_buf_item.c > > +++ b/fs/xfs/xfs_buf_item.c > . . . > > STATIC void > > xfs_buf_item_unlock( > > @@ -514,73 +523,54 @@ xfs_buf_item_unlock( > > > > bp = bip->bli_buf; > > > > - /* > > - * Clear the buffer's association with this transaction. > > - */ > > + /* Clear the buffer's association with this transaction. */ > > XFS_BUF_SET_FSPRIVATE2(bp, NULL); > > > > /* > > - * If this is a transaction abort, don't return early. > > - * Instead, allow the brelse to happen. > > - * Normally it would be done for stale (cancelled) buffers > > - * at unpin time, but we'll never go through the pin/unpin > > - * cycle if we abort inside commit. > > + * If this is a transaction abort, don't return early. Instead, allow > > + * the brelse to happen. Normally it would be done for stale > > + * (cancelled) buffers at unpin time, but we'll never go through the > > + * pin/unpin cycle if we abort inside commit. > > */ > > aborted = (bip->bli_item.li_flags & XFS_LI_ABORTED) != 0; > > > > /* > > - * If the buf item is marked stale, then don't do anything. > > - * We'll unlock the buffer and free the buf item when the > > - * buffer is unpinned for the last time. > > + * Before possibly freeing the buf item, determine if we should > > + * release the buffer at the end of this routine. > > + */ > > + hold = bip->bli_flags & XFS_BLI_HOLD; > > + > > + /* Clear the per transaction state. */ > > + bip->bli_flags &= ~(XFS_BLI_LOGGED | XFS_BLI_HOLD); > > + > > + /* > > + * If the buf item is marked stale, then don't do anything. We'll > > + * unlock the buffer and free the buf item when the buffer is unpinned > > + * for the last time. > > */ > > if (bip->bli_flags & XFS_BLI_STALE) { > > - bip->bli_flags &= ~XFS_BLI_LOGGED; > > trace_xfs_buf_item_unlock_stale(bip); > > ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); > > - if (!aborted) > > + if (!aborted) { > > + atomic_dec(&bip->bli_refcount); > > I notice that, unlike before, if you return via this path > the XFS_BLI_HOLD flag will have been turned off. I guess > I don't know off hand whether this is an issue. Can you > explain why it is not? A buffer that has been marked stale is on that has been invalidated; they shouldn't get held across rolling transactions because they reference free space and cannot be reused without being reallocated. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+cg7x+78+fromorbit.com=david@internode.on.net Wed May 19 17:39:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JMd0KA159772 for ; Wed, 19 May 2010 17:39:00 -0500 X-ASG-Debug-ID: 1274308876-0f4f026f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D381E1B0E6DB for ; Wed, 19 May 2010 15:41:17 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id Vvy7k8riiXNXpk2p for ; Wed, 19 May 2010 15:41:17 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24845517-1927428 for multiple; Thu, 20 May 2010 08:11:16 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OErwx-0008Tl-15; Thu, 20 May 2010 08:41:15 +1000 Date: Thu, 20 May 2010 08:41:14 +1000 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 05/12] xfs: clean up log ticket overrun debug output Subject: Re: [PATCH 05/12] xfs: clean up log ticket overrun debug output Message-ID: <20100519224114.GP8120@dastard> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> <1274138668-1662-6-git-send-email-david@fromorbit.com> <1274296604.2140.55.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274296604.2140.55.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1274308878 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.2, rules version 3.2.2.30282 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 19, 2010 at 02:16:44PM -0500, Alex Elder wrote: > On Tue, 2010-05-18 at 09:24 +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Push the error message output when a ticket overrun is detected > > into the ticket printing functions. Also remove the debug version > > of the code as the production version will still panic just as > > effectively on a debug kernel via the panic mask being set. > > Another not-really-actionable bit of commentary > below, but this looks good. > > > Signed-off-by: Dave Chinner > > Reviewed-by: Christoph Hellwig > > --- > > fs/xfs/xfs_error.c | 2 +- > > fs/xfs/xfs_log.c | 19 +++++-------------- > > 2 files changed, 6 insertions(+), 15 deletions(-) > > > > diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c > > index ef96175..047b8a8 100644 > > --- a/fs/xfs/xfs_error.c > > +++ b/fs/xfs/xfs_error.c > > @@ -170,7 +170,7 @@ xfs_cmn_err(int panic_tag, int level, xfs_mount_t *mp, char *fmt, ...) > > va_list ap; > > > > #ifdef DEBUG > > - xfs_panic_mask |= XFS_PTAG_SHUTDOWN_CORRUPT; > > + xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES); > > #endif > > > > if (xfs_panic_mask && (xfs_panic_mask & panic_tag) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > > index 83be6a6..1efb303 100644 > > --- a/fs/xfs/xfs_log.c > > +++ b/fs/xfs/xfs_log.c > > @@ -1645,6 +1645,10 @@ xlog_print_tic_res(xfs_mount_t *mp, xlog_ticket_t *ticket) > > "bad-rtype" : res_type_str[r_type-1]), > > ticket->t_res_arr[i].r_len); > > } > > + > > + xfs_cmn_err(XFS_PTAG_LOGRES, CE_ALERT, mp, > > + "xfs_log_write: reservation ran out. Need to up reservation"); > > + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); > > } > > > > /* > > @@ -1897,21 +1901,8 @@ xlog_write( > > *start_lsn = 0; > > > > len = xlog_write_calc_vec_length(ticket, log_vector); > > - if (ticket->t_curr_res < len) { > > + if (ticket->t_curr_res < len) > > xlog_print_tic_res(log->l_mp, ticket); > > Somehow "xlog_print_tic_res" doesn't suggest to me > that we're going to panic at this point, and I think > therefore that bit of information is lost with this > change. Normally it won't panic - if there is a problem it will shut down the filesystem. Only if the kernel is a debug kernel or the admin has specifically set the panic mask to panic on this failure will there be a panic. If we start to document every place where there is in shutdown or panic inside a function call that is not documented at eh function call site, we won't be able to see the code for the "this might panic" comments. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From aelder@sgi.com Wed May 19 17:41:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JMfx8A159917 for ; Wed, 19 May 2010 17:41:59 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7348AAC02D for ; Wed, 19 May 2010 15:44:15 -0700 (PDT) Received: from stout.americas.sgi.com (localhost6.localdomain6 [127.0.0.1]) by stout.americas.sgi.com (8.14.3/8.14.2) with ESMTP id o4JMiEfW014865 for ; Wed, 19 May 2010 17:44:14 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o4JMiEPY014864 for xfs@oss.sgi.com; Wed, 19 May 2010 17:44:14 -0500 From: Alex Elder Message-Id: <201005192244.o4JMiEPY014864@stout.americas.sgi.com> Date: Wed, 19 May 2010 17:44:14 -0500 To: xfs@oss.sgi.com Subject: xfstests: 226: have xfs_io use bigger buffers User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean By default xfs_io uses a buffer size of 4096 bytes. On test 226, the result is that the test runs much slower (at least an order of magnitude) than it needs to. Add a flag to the "pwrite" command sent to xfs_io so it uses larger buffers, thereby speeding things up considerably. Signed-off-by: Alex Elder --- 226 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) Index: b/226 =================================================================== --- a/226 +++ b/226 @@ -49,10 +49,14 @@ _scratch_mount loops=16 +# Buffer size argument supplied to xfs_io "pwrite" command +buffer="-b $(expr 512 \* 1024)" + echo "--> $loops buffered 64m writes in a loop" for I in `seq 1 $loops`; do echo -n "$I " - xfs_io -F -f -c 'pwrite 0 64m' $SCRATCH_MNT/test >> $seq.full + xfs_io -F -f \ + -c "pwrite ${buffer} 0 64m" $SCRATCH_MNT/test >> $seq.full rm -f $SCRATCH_MNT/test done @@ -63,7 +67,8 @@ _scratch_mount echo "--> $loops direct 64m writes in a loop" for I in `seq 1 $loops`; do echo -n "$I " - xfs_io -F -f -d -c 'pwrite 0 64m' $SCRATCH_MNT/test >> $seq.full + xfs_io -F -f -d \ + -c "pwrite ${buffer} 0 64m" $SCRATCH_MNT/test >> $seq.full rm -f $SCRATCH_MNT/test done From SRS0+cg7x+78+fromorbit.com=david@internode.on.net Wed May 19 18:25:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JNPGAk162911 for ; Wed, 19 May 2010 18:25:16 -0500 X-ASG-Debug-ID: 1274311653-0f50035e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 298D61411EAD for ; Wed, 19 May 2010 16:27:34 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id XuRBrEf4l3B6C1Rb for ; Wed, 19 May 2010 16:27:34 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 24850610-1927428 for multiple; Thu, 20 May 2010 08:57:33 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OEsfj-00005f-Dv; Thu, 20 May 2010 09:27:31 +1000 Date: Thu, 20 May 2010 09:27:31 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Florian Weimer , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS on 2.6.26: reading the first 4K of a large file takes ages Subject: Re: XFS on 2.6.26: reading the first 4K of a large file takes ages Message-ID: <20100519232731.GR8120@dastard> References: <8239xojfco.fsf@mid.bfk.de> <20100519114826.GA18224@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100519114826.GA18224@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1274311655 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.2, rules version 3.2.2.30285 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 19, 2010 at 07:48:26AM -0400, Christoph Hellwig wrote: > On Wed, May 19, 2010 at 11:33:27AM +0000, Florian Weimer wrote: > > We've got a couple of rather large files, and with a cold cache, > > reading the first 4K bytes of the file (e.g., just running > > "head --bytes 4096" on it) takes ages, up to several minutes, > > sometimes triggering the hang check timer. > > > > I wonder if XFS reads the whole extent information into RAM when the > > file is opened. Is this the case, at least on 2.6.26? Has this > > changed in later versions, perhaps? > > Yes, XFS always reads in the extent map, and no this hasn't changed > recently. And demand paging the in-memory information is hard. It's on a to-do list somewhere 'round here.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Wed May 19 18:42:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4JNgOFB163579 for ; Wed, 19 May 2010 18:42:24 -0500 X-ASG-Debug-ID: 1274312682-187100e30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3D49635D0AF for ; Wed, 19 May 2010 16:44:42 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id LN39DzFf4KTuXE45 for ; Wed, 19 May 2010 16:44:42 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 7FCDB6C264 for ; Wed, 19 May 2010 18:44:42 -0500 (CDT) Message-ID: <4BF47859.6020808@hardwarefreak.com> Date: Wed, 19 May 2010 18:46:33 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: noatime,nodiratime? Subject: Re: noatime,nodiratime? References: <4BF3F212.5030600@hardwarefreak.com> <20100519182336.GA6264@infradead.org> <4BF43B3C.6030403@hardwarefreak.com> <4BF44105.4040902@sandeen.net> In-Reply-To: <4BF44105.4040902@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274312683 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30285 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Eric Sandeen put forth on 5/19/2010 2:50 PM: > xfs_info actually calls xfs_growfs -n, and it's only reporting on-disk > geometry. I kind of doubt that'll change. If you want to see mount > options, /proc/mounts is the place ... but then we don't show the > defaults ;) I wonder if we should change that and be explicit about > every option in /proc/mounts *shrug* IMHO the option values should be listed, whether they are the defaults or user defined. XFS may be breaking convention by doing so, as it appears EXT2 (and probably 3/4, and other filesystems) behave the same as XFS currently does--no display of default settings, except rw. > It's so hard to keep google up to date ;) Add the information to the FAQ and it'll show up in Google indexes in short order, assuming you allow robots to crawl xfs.org, which IIRC, you do. > /proc/mounts shows all mount options which were set differently from > defaults. Yes. It would be nice to see the settings regardless of default or user defined. In the absence of, or in addition to this, could we get a consistent (default) for each setting in XFS man mount? For example, barrier is listed but we're not told if it's the default. nobarrier isn't even in the man page, but it's on the wiki FAQ. The wiki FAQ tells us that barrier is the default. I'm referring to the man page that comes with Debian 5.0. The current man page may be updated to reflect some of these things, though I've not read it yet. Sorry if I seem nit-picky. I've spent many hours trying to hunt down some of this information and it's been a frustrating process. XFS rocks. Currently, from here, the docs don't rock yet. :( -- Stan From sandeen@sandeen.net Wed May 19 23:37:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4K4bZji179103 for ; Wed, 19 May 2010 23:37:35 -0500 X-ASG-Debug-ID: 1274330393-15ae00950000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ED3DE35D9E8 for ; Wed, 19 May 2010 21:39:53 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id OCfM3ljcEx2Vqd4j for ; Wed, 19 May 2010 21:39:53 -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 mail.sandeen.net (Postfix) with ESMTP id C10A34966B5C; Wed, 19 May 2010 23:39:52 -0500 (CDT) Message-ID: <4BF4BD18.1020608@sandeen.net> Date: Wed, 19 May 2010 23:39:52 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Alex Elder CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfstests: 226: have xfs_io use bigger buffers Subject: Re: xfstests: 226: have xfs_io use bigger buffers References: <201005192244.o4JMiEPY014864@stout.americas.sgi.com> In-Reply-To: <201005192244.o4JMiEPY014864@stout.americas.sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1274330393 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30302 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Alex Elder wrote: > By default xfs_io uses a buffer size of 4096 bytes. On test 226, > the result is that the test runs much slower (at least an order > of magnitude) than it needs to. > > Add a flag to the "pwrite" command sent to xfs_io so it uses > larger buffers, thereby speeding things up considerably. > > Signed-off-by: Alex Elder Reviewed-by: Eric Sandeen > > --- > 226 | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > Index: b/226 > =================================================================== > --- a/226 > +++ b/226 > @@ -49,10 +49,14 @@ _scratch_mount > > loops=16 > > +# Buffer size argument supplied to xfs_io "pwrite" command > +buffer="-b $(expr 512 \* 1024)" > + > echo "--> $loops buffered 64m writes in a loop" > for I in `seq 1 $loops`; do > echo -n "$I " > - xfs_io -F -f -c 'pwrite 0 64m' $SCRATCH_MNT/test >> $seq.full > + xfs_io -F -f \ > + -c "pwrite ${buffer} 0 64m" $SCRATCH_MNT/test >> $seq.full > rm -f $SCRATCH_MNT/test > done > > @@ -63,7 +67,8 @@ _scratch_mount > echo "--> $loops direct 64m writes in a loop" > for I in `seq 1 $loops`; do > echo -n "$I " > - xfs_io -F -f -d -c 'pwrite 0 64m' $SCRATCH_MNT/test >> $seq.full > + xfs_io -F -f -d \ > + -c "pwrite ${buffer} 0 64m" $SCRATCH_MNT/test >> $seq.full > rm -f $SCRATCH_MNT/test > done > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sim@netnation.com Thu May 20 03:28:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4K8SlQA192889 for ; Thu, 20 May 2010 03:28:48 -0500 X-ASG-Debug-ID: 1274344265-3aa200e10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from peace.netnation.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A4CE335E197 for ; Thu, 20 May 2010 01:31:05 -0700 (PDT) Received: from peace.netnation.com (newpeace.netnation.com [204.174.223.7]) by cuda.sgi.com with ESMTP id tg06xPD7xzQUd86M for ; Thu, 20 May 2010 01:31:05 -0700 (PDT) Received: from sim by peace.netnation.com with local (Exim 4.63) (envelope-from ) id 1OF19k-0001JC-TT for xfs@oss.sgi.com; Thu, 20 May 2010 01:31:04 -0700 Date: Thu, 20 May 2010 01:31:04 -0700 From: Simon Kirby To: xfs@oss.sgi.com X-ASG-Orig-Subj: [2.6.33.3] scheduling while atomic (inode reclaim races still?) Subject: [2.6.33.3] scheduling while atomic (inode reclaim races still?) Message-ID: <20100520083104.GA4723@hostway.ca> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.13 (2006-08-11) X-Barracuda-Connect: newpeace.netnation.com[204.174.223.7] X-Barracuda-Start-Time: 1274344266 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.2, rules version 3.2.2.30315 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This started happening on host about 10 days after upgrading to 2.6.33.3 (in hopes that it fixed all of the reclaim issues present in 2.6.33.2). I don't see any fixes in 2.6.33.4 relevant to this particular issue. After this first error, the kernel logs just filled with repeat occurrences with different backtraces. BUG: scheduling while atomic: nfsd/29671/0x00000250 Modules linked in: aoe xt_MARK ipmi_devintf ipmi_si ipmi_msghandler e1000e bnx2 Pid: 29671, comm: nfsd Not tainted 2.6.33.3-hw #1 Call Trace: [] ? xfs_iflush+0x2ee/0x350 [] __schedule_bug+0x61/0x70 [] schedule+0x588/0xa00 [] ? bit_waitqueue+0x12/0xc0 [] schedule_timeout+0x18f/0x270 [] ? process_timeout+0x0/0x10 [] io_schedule_timeout+0x8f/0xf0 [] balance_dirty_pages_ratelimited_nr+0x178/0x3a0 [] generic_file_buffered_write+0x193/0x230 [] xfs_write+0x7c6/0x8f0 [] ? xfs_iget+0x4f0/0x660 [] ? xfs_file_aio_write+0x0/0x60 [] xfs_file_aio_write+0x56/0x60 [] do_sync_readv_writev+0xcb/0x110 [] ? exportfs_decode_fh+0xe6/0x270 [] ? nfsd_acceptable+0x0/0x120 [] ? rw_copy_check_uvector+0x7e/0x130 [] do_readv_writev+0xcf/0x1f0 [] ? nfsd_setuser_and_check_port+0x72/0x80 [] ? nfsd_permission+0xec/0x160 [] vfs_writev+0x40/0x60 [] nfsd_vfs_write+0xde/0x420 [] ? dentry_open+0x4d/0xb0 [] ? nfsd_open+0x16e/0x200 [] nfsd_write+0xea/0x100 [] ? nfsd_cache_lookup+0x2bb/0x3e0 [] nfsd3_proc_write+0xaf/0x140 [] nfsd_dispatch+0xbb/0x260 [] svc_process+0x4af/0x820 [] ? nfsd+0x0/0x160 [] nfsd+0xdd/0x160 [] kthread+0x96/0xb0 [] kernel_thread_helper+0x4/0x10 [] ? kthread+0x0/0xb0 [] ? kernel_thread_helper+0x0/0x10 BUG: scheduling while atomic: nfsd/29671/0x00000250 Modules linked in: aoe xt_MARK ipmi_devintf ipmi_si ipmi_msghandler e1000e bnx2 Pid: 29671, comm: nfsd Not tainted 2.6.33.3-hw #1 Call Trace: [] __schedule_bug+0x61/0x70 [] schedule+0x588/0xa00 [] ? try_to_del_timer_sync+0xa4/0xd0 [] schedule_timeout+0x18f/0x270 [] ? process_timeout+0x0/0x10 [] io_schedule_timeout+0x8f/0xf0 [] balance_dirty_pages_ratelimited_nr+0x178/0x3a0 [] generic_file_buffered_write+0x193/0x230 [] xfs_write+0x7c6/0x8f0 [] ? xfs_iget+0x4f0/0x660 [] ? xfs_file_aio_write+0x0/0x60 [] xfs_file_aio_write+0x56/0x60 [] do_sync_readv_writev+0xcb/0x110 [] ? exportfs_decode_fh+0xe6/0x270 [] ? nfsd_acceptable+0x0/0x120 [] ? rw_copy_check_uvector+0x7e/0x130 [] do_readv_writev+0xcf/0x1f0 [] ? nfsd_setuser_and_check_port+0x72/0x80 [] ? nfsd_permission+0xec/0x160 [] vfs_writev+0x40/0x60 [] nfsd_vfs_write+0xde/0x420 [] ? dentry_open+0x4d/0xb0 [] ? nfsd_open+0x16e/0x200 [] nfsd_write+0xea/0x100 [] ? nfsd_cache_lookup+0x2bb/0x3e0 [] nfsd3_proc_write+0xaf/0x140 [] nfsd_dispatch+0xbb/0x260 [] svc_process+0x4af/0x820 [] ? nfsd+0x0/0x160 [] nfsd+0xdd/0x160 [] kthread+0x96/0xb0 [] kernel_thread_helper+0x4/0x10 [] ? kthread+0x0/0xb0 [] ? kernel_thread_helper+0x0/0x10 BUG: scheduling while atomic: nfsd/29671/0x00000250 Modules linked in: aoe xt_MARK ipmi_devintf ipmi_si ipmi_msghandler e1000e bnx2 Pid: 29671, comm: nfsd Not tainted 2.6.33.3-hw #1 Call Trace: [] __schedule_bug+0x61/0x70 [] schedule+0x588/0xa00 [] ? __alloc_pages_nodemask+0x108/0x6e0 [] schedule_timeout+0x18f/0x270 [] ? process_timeout+0x0/0x10 [] svc_recv+0x539/0x8b0 [] ? default_wake_function+0x0/0x10 [] ? nfsd+0x0/0x160 [] nfsd+0x9d/0x160 [] kthread+0x96/0xb0 [] kernel_thread_helper+0x4/0x10 [] ? kthread+0x0/0xb0 [] ? kernel_thread_helper+0x0/0x10 (followed by several million more "scheduling while atomic" errors with different backtraces) Simon- From BATV+6cbd68cdc11da824e1fa+2461+infradead.org+hch@bombadil.srs.infradead.org Thu May 20 04:01:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4K91AHK194512 for ; Thu, 20 May 2010 04:01:11 -0500 X-ASG-Debug-ID: 1274346281-7f47033b0000-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 DC58F156ED60 for ; Thu, 20 May 2010 02:04:41 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id 8ThaSUltZExnymdR for ; Thu, 20 May 2010 02:04:41 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OF1f6-0004wc-Gz; Thu, 20 May 2010 09:03:28 +0000 Date: Thu, 20 May 2010 05:03:28 -0400 From: Christoph Hellwig To: Simon Kirby Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [2.6.33.3] scheduling while atomic (inode reclaim races still?) Subject: Re: [2.6.33.3] scheduling while atomic (inode reclaim races still?) Message-ID: <20100520090328.GA21428@infradead.org> References: <20100520083104.GA4723@hostway.ca> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100520083104.GA4723@hostway.ca> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1274346281 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 20, 2010 at 01:31:04AM -0700, Simon Kirby wrote: > This started happening on host about 10 days after upgrading to 2.6.33.3 > (in hopes that it fixed all of the reclaim issues present in 2.6.33.2). > I don't see any fixes in 2.6.33.4 relevant to this particular issue. > > After this first error, the kernel logs just filled with repeat > occurrences with different backtraces. > > BUG: scheduling while atomic: nfsd/29671/0x00000250 The bug unfortunately doesn't tell us what caused the "atomic" situation. But given that XFS doesn't take any spinlock in that path it seems like this must be caused by nfsd. From kim@h-213.61.243.70.host.de.colt.net Thu May 20 04:25:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4K9PW3G195782 for ; Thu, 20 May 2010 04:25:32 -0500 X-ASG-Debug-ID: 1274347742-225001e40000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail385c25.carrierzone.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D1EDC156EAEA for ; Thu, 20 May 2010 02:29:02 -0700 (PDT) Received: from mail385c25.carrierzone.com (mail385c25.carrierzone.com [209.235.146.155]) by cuda.sgi.com with ESMTP id fWlmRJ2a57gLuifZ for ; Thu, 20 May 2010 02:29:02 -0700 (PDT) X-POP-User: r.keller@sph-ag.com Received: from scrawny ([217.111.102.170]) by mail385c25.carrierzone.com (8.13.6/8.13.1) with SMTP id o4K9QlgX011259; Thu, 20 May 2010 09:26:50 GMT Date: Thu, 20 May 2010 09:26:47 GMT Message-Id: <201005200926.o4K9QlgX011259@mail385c25.carrierzone.com> To: info@avinc.com, info@topdrevo.cz, sales@history-cleaner.com, inrivaallago@inrivaallago.com, devore.jon@gmail.com, lkusek@jointcommission.org, new919@gmail.com, markokastiello@hotmail.it, marketing@aaedpro.com X-ASG-Orig-Subj: b2b marketing lists Subject: b2b marketing lists Reply-To: kim@h-213.61.243.70.host.de.colt.net From: "Hershel ( Cooke" X-Barracuda-Connect: mail385c25.carrierzone.com[209.235.146.155] X-Barracuda-Start-Time: 1274347742 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2373 1.0000 -0.6374 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.64 X-Barracuda-Spam-Status: No, SCORE=-0.64 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.2, rules version 3.2.2.30319 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Here's a couple of our healthcare list packages on sale this week only: Package 1 Alternative Medicine - 1,141,602 total records with 36,320 emails and 38.935 fax numbers Massage Therapists - 76,701 records and 8,305 emails Physical Therapists - 125,460 total records with 5,483 emails and 4,405 fax numbers All complete lists above: $277 Package 2 Chiropractors - 108,421 total records * 3,414 emails * 6,553 fax numbers Acupuncturists - 23,988 records 1,826 emails Massage Therapists - 76,701 records and 8,305 emails All complete lists above: $247 There are more packages and not just for healthcare contact me here for more info or to get samples: successtools@gmx.com Send us an email to remfiles@gmx.com we will discontinue from the list From fweimer@bfk.de Thu May 20 07:08:50 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KC8n9B203322 for ; Thu, 20 May 2010 07:08:50 -0500 X-ASG-Debug-ID: 1274357467-3152039d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx01.bfk.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5BF991417AC1 for ; Thu, 20 May 2010 05:11:08 -0700 (PDT) Received: from mx01.bfk.de (mx01.bfk.de [193.227.124.2]) by cuda.sgi.com with ESMTP id 4VW7CD1zvJmJCVE6 for ; Thu, 20 May 2010 05:11:08 -0700 (PDT) Received: from mx00.int.bfk.de ([10.119.110.2]) by mx01.bfk.de with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) id 1OF4ad-0001ML-3y; Thu, 20 May 2010 12:11:03 +0000 Received: by bfk.de with local id 1OF4aa-0002M1-Ds; Thu, 20 May 2010 12:11:00 +0000 To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS on 2.6.26: reading the first 4K of a large file takes ages Subject: Re: XFS on 2.6.26: reading the first 4K of a large file takes ages References: <8239xojfco.fsf@mid.bfk.de> <20100519114826.GA18224@infradead.org> From: Florian Weimer Date: Thu, 20 May 2010 12:11:00 +0000 In-Reply-To: <20100519114826.GA18224@infradead.org> (Christoph Hellwig's message of "Wed\, 19 May 2010 07\:48\:26 -0400") Message-ID: <82sk5m7oyz.fsf@mid.bfk.de> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mx01.bfk.de[193.227.124.2] X-Barracuda-Start-Time: 1274357468 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.2, rules version 3.2.2.30329 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean * Christoph Hellwig: > On Wed, May 19, 2010 at 11:33:27AM +0000, Florian Weimer wrote: >> We've got a couple of rather large files, and with a cold cache, >> reading the first 4K bytes of the file (e.g., just running >> "head --bytes 4096" on it) takes ages, up to several minutes, >> sometimes triggering the hang check timer. >>=20 >> I wonder if XFS reads the whole extent information into RAM when the >> file is opened. Is this the case, at least on 2.6.26? Has this >> changed in later versions, perhaps? > > Yes, XFS always reads in the extent map, and no this hasn't changed > recently. Okay, defragmenting seems to improve things considerably. But it's going to take a while: "extents before:5309152 after:13" *sigh* Thanks for confirming my hunch. I don't think it's worth fixing this in XFS. The database should call posix_fallocate() before flushing its internal cache to the file in essentially random order, but it's difficult to get upstream to implement this (the source code is a bit hard to follow, unfortunately). --=20 Florian Weimer BFK edv-consulting GmbH http://www.bfk.de/ Kriegsstra=DFe 100 tel: +49-721-96201-1 D-76133 Karlsruhe fax: +49-721-96201-99 From jack@suse.cz Thu May 20 07:46:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KCkper205084 for ; Thu, 20 May 2010 07:46:51 -0500 X-ASG-Debug-ID: 1274359749-4c3600ad0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B806D1417E49 for ; Thu, 20 May 2010 05:49:10 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id miq9asl2LKf41xKb for ; Thu, 20 May 2010 05:49:10 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 931455362F; Thu, 20 May 2010 14:49:09 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id B14A12B1B2E; Thu, 20 May 2010 14:49:02 +0200 (CEST) Date: Thu, 20 May 2010 14:49:02 +0200 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/7] Fix test whether kernel supports quotas Subject: Re: [PATCH 2/7] Fix test whether kernel supports quotas Message-ID: <20100520124902.GB3395@quack.suse.cz> References: <1274276289-8839-1-git-send-email-jack@suse.cz> <1274276289-8839-3-git-send-email-jack@suse.cz> <20100519184225.GA32747@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100519184225.GA32747@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274359750 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed 19-05-10 14:42:25, Christoph Hellwig wrote: > On Wed, May 19, 2010 at 03:38:04PM +0200, Jan Kara wrote: > > For all 2.6 kernels presence of quota support in kernel can be detected by > > checking /proc/sys/fs/quota. This is actually more reliable than trying to > > mount a filesystem with quota options (for example because SCRATCH_DEV does > > not have to contain a filesystem type we are going to test). > > It's not actually correct. /proc/sys/fs/quota only gets registered by > fs/quota/dquot.c, which means it's not avaiable in a kernel that only > has XFS quotas. Ah, I was convinced that _require_quota() should check whether VFS quotas are enabled but apparently it should work also for XFS. So would test like below be OK? if [ $FSTYP = "xfs" ]; then [ -f /proc/fs/xfs/xqmstat ] || _notrun "Installed kernel does not support XFS quota" else [ -d /proc/sys/fs/quota ] || _notrun "Installed kernel does not support quota" fi Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Thu May 20 07:50:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KCoN4V205248 for ; Thu, 20 May 2010 07:50:23 -0500 X-ASG-Debug-ID: 1274359962-4c3900d10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 171611D4FD71 for ; Thu, 20 May 2010 05:52:42 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id WZSb2G0TTH07uST8 for ; Thu, 20 May 2010 05:52:42 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id EA8C58FEA2; Thu, 20 May 2010 14:52:41 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id C0C9B2B1B2E; Thu, 20 May 2010 14:52:34 +0200 (CEST) Date: Thu, 20 May 2010 14:52:34 +0200 From: Jan Kara To: Dave Chinner Cc: Jan Kara , xfs@oss.sgi.com, hch@infradead.org X-ASG-Orig-Subj: Re: [PATCH 4/7] Add test of quota accounting using fsx Subject: Re: [PATCH 4/7] Add test of quota accounting using fsx Message-ID: <20100520125234.GC3395@quack.suse.cz> References: <1274276289-8839-1-git-send-email-jack@suse.cz> <1274276289-8839-5-git-send-email-jack@suse.cz> <20100519222813.GN8120@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100519222813.GN8120@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274359963 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu 20-05-10 08:28:13, Dave Chinner wrote: > On Wed, May 19, 2010 at 03:38:06PM +0200, Jan Kara wrote: > > Run fsx (and also several fsx threads in parallel) and verify that > > quota accounting is correct after they finish. > > > > Signed-off-by: Jan Kara > > --- > > 231 | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > 231.out | 10 +++++ > > group | 1 + > > 3 files changed, 150 insertions(+), 0 deletions(-) > > create mode 100755 231 > > create mode 100644 231.out > > > > diff --git a/231 b/231 > > new file mode 100755 > > index 0000000..0e34d33 > > --- /dev/null > > +++ b/231 > > @@ -0,0 +1,139 @@ > > +#! /bin/bash > > +# FSQA Test No. 231 > > +# > > +# Run fsx with quotas enabled and verify accounted quotas in the end > > +# > > +# Derived from test 127 > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2006 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 > > +# > > +#----------------------------------------------------------------------- > > +# > > +# creator > > +owner=jack@suse.cz > > + > > +seq=`basename $0` > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > > + > > +# get standard environment, filters and checks > > +. ./common.rc > > +. ./common.filter > > +. ./common.quota > > + > > +FSX_FILE_SIZE=64000000 > > +FSX_ARGS="-q -l $FSX_FILE_SIZE -o 65536 -S 191110531 -N 20000" > > My only question about this test is the use of a fixed seed for the > test - shouldn't we randomise it and save the seed to $seq.full? > This will results in different combinations of operations being > tested (better long term coverage), but we still have the seed > available to try to reproduce failures if they are based on a > specific pattern of ops... Ah, that's a great idea. I wanted a reproducible testcase so I chose fixed seed but I forgot I could save it in $seq.full. I'll change the test to work this way. Honza -- Jan Kara SUSE Labs, CR From SRS0+RQGG+79+fromorbit.com=david@internode.on.net Thu May 20 08:14:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KDEfhr206473 for ; Thu, 20 May 2010 08:14:41 -0500 X-ASG-Debug-ID: 1274361418-429303d10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2B8791DF4AEB for ; Thu, 20 May 2010 06:16:59 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id KYDgCTPvCpBZAzwm for ; Thu, 20 May 2010 06:16:59 -0700 (PDT) Received: from dastard (unverified [121.44.136.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25251509-1927428 for multiple; Thu, 20 May 2010 22:46:44 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OF5cA-0000uB-Hf; Thu, 20 May 2010 23:16:42 +1000 Date: Thu, 20 May 2010 23:16:42 +1000 From: Dave Chinner To: Jan Kara Cc: xfs@oss.sgi.com, hch@infradead.org X-ASG-Orig-Subj: Re: [PATCH 5/7] Add quota test with fsstress Subject: Re: [PATCH 5/7] Add quota test with fsstress Message-ID: <20100520131642.GT8120@dastard> References: <1274276289-8839-1-git-send-email-jack@suse.cz> <1274276289-8839-6-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274276289-8839-6-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1274361420 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.2, rules version 3.2.2.30332 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 19, 2010 at 03:38:07PM +0200, Jan Kara wrote: > Run fsstress and verify that quota accounting is correct after it finishes. > > Signed-off-by: Jan Kara > --- > 232 | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 232.out | 6 +++ > group | 1 + > 3 files changed, 125 insertions(+), 0 deletions(-) > create mode 100755 232 > create mode 100644 232.out > > diff --git a/232 b/232 > new file mode 100755 > index 0000000..ef8ce8a > --- /dev/null > +++ b/232 > @@ -0,0 +1,118 @@ > +#! /bin/bash > +# FSQA Test No. 232 > +# > +# Run fsstress with quotas enabled and verify accounted quotas in the end > +# > +# Derived from test 231 .... > +FSX_FILE_SIZE=64000000 > +FSX_ARGS="-q -l $FSX_FILE_SIZE -o 65536 -S 191110531 -N 100000" These look like left overs from a copy-n-paste ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From jack@suse.cz Thu May 20 08:20:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KDK6mu206746 for ; Thu, 20 May 2010 08:20:06 -0500 X-ASG-Debug-ID: 1274361817-7cef02d30000-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 65835156F5E0 for ; Thu, 20 May 2010 06:23:38 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 1GWBEI0kHL8x0bXS for ; Thu, 20 May 2010 06:23:38 -0700 (PDT) Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 20E4187D82; Thu, 20 May 2010 15:22:23 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 705E72B1B2E; Thu, 20 May 2010 15:22:17 +0200 (CEST) Date: Thu, 20 May 2010 15:22:17 +0200 From: Jan Kara To: Dave Chinner Cc: Jan Kara , xfs@oss.sgi.com, hch@infradead.org X-ASG-Orig-Subj: Re: [PATCH 5/7] Add quota test with fsstress Subject: Re: [PATCH 5/7] Add quota test with fsstress Message-ID: <20100520132217.GD3395@quack.suse.cz> References: <1274276289-8839-1-git-send-email-jack@suse.cz> <1274276289-8839-6-git-send-email-jack@suse.cz> <20100520131642.GT8120@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100520131642.GT8120@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274361818 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0006 1.0000 -2.0169 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.2, rules version 3.2.2.30333 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu 20-05-10 23:16:42, Dave Chinner wrote: > On Wed, May 19, 2010 at 03:38:07PM +0200, Jan Kara wrote: > > Run fsstress and verify that quota accounting is correct after it finishes. > > > > Signed-off-by: Jan Kara > > --- > > 232 | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > 232.out | 6 +++ > > group | 1 + > > 3 files changed, 125 insertions(+), 0 deletions(-) > > create mode 100755 232 > > create mode 100644 232.out > > > > diff --git a/232 b/232 > > new file mode 100755 > > index 0000000..ef8ce8a > > --- /dev/null > > +++ b/232 > > @@ -0,0 +1,118 @@ > > +#! /bin/bash > > +# FSQA Test No. 232 > > +# > > +# Run fsstress with quotas enabled and verify accounted quotas in the end > > +# > > +# Derived from test 231 > .... > > +FSX_FILE_SIZE=64000000 > > +FSX_ARGS="-q -l $FSX_FILE_SIZE -o 65536 -S 191110531 -N 100000" > > These look like left overs from a copy-n-paste ;) Yup. Fixed. Honza -- Jan Kara SUSE Labs, CR From BATV+6cbd68cdc11da824e1fa+2461+infradead.org+hch@bombadil.srs.infradead.org Thu May 20 09:59:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KExPeR211697 for ; Thu, 20 May 2010 09:59:25 -0500 X-ASG-Debug-ID: 1274367777-5a6f03230000-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 40506156FE74 for ; Thu, 20 May 2010 08:02:58 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 91ClL4T5ejKykLsY for ; Thu, 20 May 2010 08:02:58 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OF7Fm-0002Hy-1U; Thu, 20 May 2010 15:01:42 +0000 Date: Thu, 20 May 2010 11:01:42 -0400 From: Christoph Hellwig To: Jan Kara Cc: xfs@oss.sgi.com, hch@infradead.org, Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH 1/7] xfstests: test extent size hints Subject: Re: [PATCH 1/7] xfstests: test extent size hints Message-ID: <20100520150141.GA27124@infradead.org> References: <1274276289-8839-1-git-send-email-jack@suse.cz> <1274276289-8839-2-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274276289-8839-2-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274367778 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I think you included one patch too many in your series, this was already applied. Btw, if you have this in a git tree making that available would ease testing a bit. From BATV+6cbd68cdc11da824e1fa+2461+infradead.org+hch@bombadil.srs.infradead.org Thu May 20 10:03:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KF3ctS211960 for ; Thu, 20 May 2010 10:03:38 -0500 X-ASG-Debug-ID: 1274367957-3d2802240000-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 42F061DF4E86 for ; Thu, 20 May 2010 08:05:57 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id p7LSRLvJleHbck1I for ; Thu, 20 May 2010 08:05:57 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OF7Jr-0007jD-VK; Thu, 20 May 2010 15:05:55 +0000 Date: Thu, 20 May 2010 11:05:55 -0400 From: Christoph Hellwig To: Jan Kara Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/7] Fix test whether kernel supports quotas Subject: Re: [PATCH 2/7] Fix test whether kernel supports quotas Message-ID: <20100520150555.GB27124@infradead.org> References: <1274276289-8839-1-git-send-email-jack@suse.cz> <1274276289-8839-3-git-send-email-jack@suse.cz> <20100519184225.GA32747@infradead.org> <20100520124902.GB3395@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100520124902.GB3395@quack.suse.cz> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274367958 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 20, 2010 at 02:49:02PM +0200, Jan Kara wrote: > On Wed 19-05-10 14:42:25, Christoph Hellwig wrote: > > On Wed, May 19, 2010 at 03:38:04PM +0200, Jan Kara wrote: > > > For all 2.6 kernels presence of quota support in kernel can be detected by > > > checking /proc/sys/fs/quota. This is actually more reliable than trying to > > > mount a filesystem with quota options (for example because SCRATCH_DEV does > > > not have to contain a filesystem type we are going to test). > > > > It's not actually correct. /proc/sys/fs/quota only gets registered by > > fs/quota/dquot.c, which means it's not avaiable in a kernel that only > > has XFS quotas. > Ah, I was convinced that _require_quota() should check whether VFS > quotas are enabled but apparently it should work also for XFS. So would > test like below be OK? > > if [ $FSTYP = "xfs" ]; then > [ -f /proc/fs/xfs/xqmstat ] || _notrun "Installed kernel does not support XFS quota" > else > [ -d /proc/sys/fs/quota ] || _notrun "Installed kernel does not support quota" > fi That would still fail for GFS2. From BATV+6cbd68cdc11da824e1fa+2461+infradead.org+hch@bombadil.srs.infradead.org Thu May 20 10:09:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KF9BJW212233 for ; Thu, 20 May 2010 10:09:11 -0500 X-ASG-Debug-ID: 1274368290-33e303980000-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 6404C35FB88 for ; Thu, 20 May 2010 08:11:31 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 5mMs9b2IoJIQqFyq for ; Thu, 20 May 2010 08:11:31 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OF7PG-0004QM-IM; Thu, 20 May 2010 15:11:30 +0000 Date: Thu, 20 May 2010 11:11:30 -0400 From: Christoph Hellwig To: Jan Kara Cc: xfs@oss.sgi.com, hch@infradead.org X-ASG-Orig-Subj: Re: [PATCH 3/7] Test basic quota enforcement Subject: Re: [PATCH 3/7] Test basic quota enforcement Message-ID: <20100520151130.GC27124@infradead.org> References: <1274276289-8839-1-git-send-email-jack@suse.cz> <1274276289-8839-4-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=unknown-8bit Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1274276289-8839-4-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274368291 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The golden output contains "/local/test1/file5" which appaears to be in your test fs. You need to do something like sed -e "s,$SCRATCH_MNT,SCRATCH_MNT,g" or sed -e "s,$T“T_MNT,TEST_MNT,g" to make the test portable. This probably applies to the other tests as well. From jack@suse.cz Thu May 20 11:51:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KGpJuJ216457 for ; Thu, 20 May 2010 11:51:20 -0500 X-ASG-Debug-ID: 1274374491-7a1e009e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ED27A9F9774 for ; Thu, 20 May 2010 09:54:51 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id 0928JQLnK3QqbvI4 for ; Thu, 20 May 2010 09:54:51 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id BCE605362F; Thu, 20 May 2010 18:53:36 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id ADC2B2B1B2E; Thu, 20 May 2010 18:53:29 +0200 (CEST) Date: Thu, 20 May 2010 18:53:29 +0200 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/7] Fix test whether kernel supports quotas Subject: Re: [PATCH 2/7] Fix test whether kernel supports quotas Message-ID: <20100520165328.GE3395@quack.suse.cz> References: <1274276289-8839-1-git-send-email-jack@suse.cz> <1274276289-8839-3-git-send-email-jack@suse.cz> <20100519184225.GA32747@infradead.org> <20100520124902.GB3395@quack.suse.cz> <20100520150555.GB27124@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100520150555.GB27124@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274374492 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu 20-05-10 11:05:55, Christoph Hellwig wrote: > On Thu, May 20, 2010 at 02:49:02PM +0200, Jan Kara wrote: > > On Wed 19-05-10 14:42:25, Christoph Hellwig wrote: > > > On Wed, May 19, 2010 at 03:38:04PM +0200, Jan Kara wrote: > > > > For all 2.6 kernels presence of quota support in kernel can be detected by > > > > checking /proc/sys/fs/quota. This is actually more reliable than trying to > > > > mount a filesystem with quota options (for example because SCRATCH_DEV does > > > > not have to contain a filesystem type we are going to test). > > > > > > It's not actually correct. /proc/sys/fs/quota only gets registered by > > > fs/quota/dquot.c, which means it's not avaiable in a kernel that only > > > has XFS quotas. > > Ah, I was convinced that _require_quota() should check whether VFS > > quotas are enabled but apparently it should work also for XFS. So would > > test like below be OK? > > > > if [ $FSTYP = "xfs" ]; then > > [ -f /proc/fs/xfs/xqmstat ] || _notrun "Installed kernel does not support XFS quota" > > else > > [ -d /proc/sys/fs/quota ] || _notrun "Installed kernel does not support quota" > > fi > > That would still fail for GFS2. OK, still easy to fix ;) if [ $FSTYP = "xfs" ]; then [ -f /proc/fs/xfs/xqmstat ] || _notrun "Installed kernel does not support XFS quota" elif [ $FSTYP != "gfs2" ]; then [ -d /proc/sys/fs/quota ] || _notrun "Installed kernel does not support quota" fi Anything else? This filesystem type testing isn't too nice but the only other way of fixing the old check is by running _scratch_mkfs before it and that takes long... Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Thu May 20 12:11:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KHBudV217252 for ; Thu, 20 May 2010 12:11:57 -0500 X-ASG-Debug-ID: 1274375655-59db01960000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 74E9F3602DC for ; Thu, 20 May 2010 10:14:15 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id WuvuHVbnljtF5JYP for ; Thu, 20 May 2010 10:14:15 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 0BBD28E8CC; Thu, 20 May 2010 19:14:15 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 30DFA2B1B2E; Thu, 20 May 2010 19:14:08 +0200 (CEST) Date: Thu, 20 May 2010 19:14:08 +0200 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , xfs@oss.sgi.com, Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH 1/7] xfstests: test extent size hints Subject: Re: [PATCH 1/7] xfstests: test extent size hints Message-ID: <20100520171408.GF3395@quack.suse.cz> References: <1274276289-8839-1-git-send-email-jack@suse.cz> <1274276289-8839-2-git-send-email-jack@suse.cz> <20100520150141.GA27124@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100520150141.GA27124@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274375656 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu 20-05-10 11:01:42, Christoph Hellwig wrote: > I think you included one patch too many in your series, this was already Yes, I've noticed that as well. Sorry for that. > applied. Btw, if you have this in a git tree making that available > would ease testing a bit. OK. It's at git://git.kernel.org/pub/scm/linux/kernel/git/jack/xfstests-dev/ in branch quota-tests (I know it's inappropriate place but I'm too lazy to setup the repository somewhere else ;). Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Thu May 20 12:19:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KHJ3xt217674 for ; Thu, 20 May 2010 12:19:03 -0500 X-ASG-Debug-ID: 1274376082-6f7803ba0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 33473141846C for ; Thu, 20 May 2010 10:21:22 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id OaVvmNO2lm1bNt1N for ; Thu, 20 May 2010 10:21:22 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id B68E093EE3; Thu, 20 May 2010 19:21:21 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 1B37F2B1B2E; Thu, 20 May 2010 19:21:15 +0200 (CEST) Date: Thu, 20 May 2010 19:21:15 +0200 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/7] Test basic quota enforcement Subject: Re: [PATCH 3/7] Test basic quota enforcement Message-ID: <20100520172114.GG3395@quack.suse.cz> References: <1274276289-8839-1-git-send-email-jack@suse.cz> <1274276289-8839-4-git-send-email-jack@suse.cz> <20100520151130.GC27124@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100520151130.GC27124@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274376083 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu 20-05-10 11:11:30, Christoph Hellwig wrote: > The golden output contains "/local/test1/file5" which appaears > to be in your test fs. You need to do something like > > sed -e "s,$SCRATCH_MNT,SCRATCH_MNT,g" > > or > > sed -e "s,$T“T_MNT,TEST_MNT,g" > > to make the test portable. This probably applies to the other tests > as well. I have filter_scratch function for this in all tests. I just forgot to filter output of touch(1) through it. It should be fixed now. BTW: What is the purpose of 'status' variable? I set it to 1 if I want the test to fail because diff found differences between accounted and real usage. Is this correct? Actually, diff will also print the differences to stdout so setting status probably shouldn't be needed. So is it preferred to set status to 1 or leave it 0? Honza -- Jan Kara SUSE Labs, CR From aelder@sgi.com Thu May 20 15:13:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_63 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KKDM6R225668 for ; Thu, 20 May 2010 15:13:23 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 53BD8AC046; Thu, 20 May 2010 13:15:38 -0700 (PDT) Received: from [128.162.232.197] ([128.162.232.197]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 20 May 2010 15:15:38 -0500 Subject: Re: [PATCH 07/12] xfs: Improve scalability of busy extent tracking From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1274138668-1662-8-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> <1274138668-1662-8-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Thu, 20 May 2010 15:15:38 -0500 Message-ID: <1274386538.2095.148.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 20 May 2010 20:15:38.0276 (UTC) FILETIME=[3672EE40:01CAF859] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-05-18 at 09:24 +1000, Dave Chinner wrote: > When we free a metadata extent, we record it in the per-AG busy > extent array so that it is not re-used before the freeing > transaction hits the disk. This array is fixed size, so when it > overflows we make further allocation transactions synchronous > because we cannot track more freed extents until those transactions > hit the disk and are completed. Under heavy mixed allocation and > freeing workloads with large log buffers, we can overflow this array > quite easily. . . . This is a really good set of changes. It might have been good to split into a few separate pieces: - Marking transactions synchronous rather than forcing the log in some situations - Conversion from fixed array to dynamic rbtree - Drop the busy chunk stuff from the transaction code But at this point that would be a lot of needless work. Many of my remarks below are suggestions for changes to comments. But I do have a few things of more substance, including some suggested changes and (unless I'm missing something) a real bug. -Alex > Further, the array is sparsely populated, which means that inserts > need to search for a free slot, and array searches often have to > search many more slots that are actually used to check all the > busy extents. Quite inefficient, really. . . . > diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h > index abb8222..401f364 100644 > --- a/fs/xfs/xfs_ag.h > +++ b/fs/xfs/xfs_ag.h . . . > @@ -216,7 +222,8 @@ typedef struct xfs_perag { > xfs_agino_t pagl_leftrec; > xfs_agino_t pagl_rightrec; > #ifdef __KERNEL__ > - spinlock_t pagb_lock; /* lock for pagb_list */ > + spinlock_t pagb_lock; /* lock for pagb_tree */ > + struct rb_root pagb_tree; /* ordered tree of busy extents */ I really think "pagb_busy" would be a better name. The fact that it's a tree is immaterial--the role it plays is recording busy extents. > > atomic_t pagf_fstrms; /* # of filestreams active in this AG */ > > @@ -226,7 +233,6 @@ typedef struct xfs_perag { > int pag_ici_reclaimable; /* reclaimable inodes */ > #endif > int pagb_count; /* pagb slots in use */ > - xfs_perag_busy_t pagb_list[XFS_PAGB_NUM_SLOTS]; /* unstable blocks */ > } xfs_perag_t; > > /* > diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c > index 94cddbf..f8d592b 100644 > --- a/fs/xfs/xfs_alloc.c > +++ b/fs/xfs/xfs_alloc.c . . . > @@ -540,9 +538,16 @@ xfs_alloc_ag_vextent( > be32_to_cpu(agf->agf_length)); > xfs_alloc_log_agf(args->tp, args->agbp, > XFS_AGF_FREEBLKS); > - /* search the busylist for these blocks */ > - xfs_alloc_search_busy(args->tp, args->agno, > - args->agbno, args->len); > + /* > + * Search the busylist for these blocks and mark the > + * transaction as synchronous if blocks are found. This > + * avoids the need to block in due to a synchronous log ...need to block on a... > + * force to ensure correct ordering as the synchronous > + * transaction will guarantee that for us. > + */ > + if (xfs_alloc_busy_search(args->mp, args->agno, > + args->agbno, args->len)) > + xfs_trans_set_sync(args->tp); > } > if (!args->isfl) > xfs_trans_mod_sb(args->tp, . . . > @@ -1993,10 +1998,17 @@ xfs_alloc_get_freelist( > * and remain there until the freeing transaction is committed to > * disk. Now that we have allocated blocks, this list must be > * searched to see if a block is being reused. If one is, then > - * the freeing transaction must be pushed to disk NOW by forcing > - * to disk all iclogs up that transaction's LSN. > - */ > - xfs_alloc_search_busy(tp, be32_to_cpu(agf->agf_seqno), bno, 1); > + * the freeing transaction must be pushed to disk before this > + * transaction. > + * > + * We do this by setting the current transaction Funny formatting of the comment here (whatever). (Here begins a bunch of things related to spelling and wording in comments.) > + * to a sync transaction which guarantees that the freeing transaction > + * is on disk before this transaction. This is done instead of a > + * synchronous log force here so that we don't sit and wait with > + * the AGF locked in the transaction during the log force. > + */ > + if (xfs_alloc_busy_search(mp, be32_to_cpu(agf->agf_seqno), bno, 1)) > + xfs_trans_set_sync(tp); > return 0; > } > . . . > @@ -2479,127 +2491,273 @@ error0: > * list is reused, the transaction that freed it must be forced to disk > * before continuing to use the block. > * > - * xfs_alloc_mark_busy - add to the per-ag busy list > - * xfs_alloc_clear_busy - remove an item from the per-ag busy list > + * xfs_alloc_busy_insert - add to the per-ag busy list > + * xfs_alloc_busy_clear - remove an item from the per-ag busy list To me, the name xfs_alloc_busy_remove matches the _insert name better. > + * xfs_alloc_busy_search - search for a busy extent > + */ > + > +/* > + * Insert a new extent into the busy tree. > + * Maybe not here, but I think a brief explanation of the per-ag busy extent tree might be in order. For example, that it's indexed by start address of each extent. It is also true that no range of addresses is represented by more than one entry in the tree, right? I'm not sure what would be enough but I think a simple intro is helpful to give the reader some context. > + * This is straight forward, except that we can get overlaps with existing busy > + * extents, and even duplicate busy extents. There are two main cases we have > + * to handle here. > + * > + * The first case is a transaction that triggers a "free - allocate - free" > + * cycle. This can occur during btree manipulations as a btree block is freed > + * to the freelist, then allocated from the free list, then freed again. In > + * this case, the second extnet free is what triggers the duplicate and as such ...second extent free... > + * the transaction IDs should match. Because the extent was allocated in this > + * transaction, the transaction must be marked as synchronous. This is true for > + * all cases where the free/alloc/free occurs in the one transaction, hence the > + * addition of the ASSERT(tp->t_flags & XFS_TRANS_SYNC) to this case. This > + * serves to catch violations of the second case quite effectively. > + * The next paragraph should be rewritten. I think it's unclear and confusing. Here are a few suggestions. > + * The second case is where the free/alloc/free occur in different > + * transactions. In this case, we can't mark the extent busy immediately ... In this case, the re-allocating thread can't... > + * because it is already tracked in a transaction that may be committing. When > + * the log commit completes, the busy extent will be removed from the tree. If ... the first log commit completes,... > + * we allow this busy insert to continue using that busy extent structure, it ... allow this second busy insert ... > + * can be freed before this transaction is safely in the log. Hence our only > + * option in this case is to force the log to remove the existing busy extent > + * from the list before we insert the new one with the current transaction ID. . . . > + * *** KABOOM! *** > + * .... > + * log IO completes > + * unbusy 1:91909 1:91909 ????? > + * checkpoint completes > + * > + * By issuing a log force in thread 3 @ "KABOOM", the thread will block until > + * the checkpoint completes, and the busy extent it matched will have been > + * removed from the tree when it is woken. Hence it can then continue safely. . . . > + * Future: for delayed logging, we could avoid the log force is the extent was ... force if ... > + * first freed in the current checkpoint sequence. This, however, requires the > + * ability to pin the current checkpoint in memory until this transaction > + * commits to ensure that both the original free and the current one combine > + * logically into the one checkpoint. If the checkpoint sequences are > + * different, however, we still need to wait on a log force. > */ OK, now a little more substantive feedback. As you search the red-black tree in xfs_alloc_busy_insert() (as well as xfs_alloc_busy_search()), once the value of match gets set to -1, it will never get set to anything else. So once it's set, I'm not sure there's much point to any further descent into the tree--you found an overlapping extent in the busy tree, and it's from a different transaction, so you need to force the log and try again. So I think the loop condition could be changed to drop out if match is negative (I'll show what I mean below). Doing that would also simplify some of the stuff inside the loop. > void > -xfs_alloc_mark_busy(xfs_trans_t *tp, > - xfs_agnumber_t agno, > - xfs_agblock_t bno, > - xfs_extlen_t len) > +xfs_alloc_busy_insert( > + struct xfs_trans *tp, > + xfs_agnumber_t agno, > + xfs_agblock_t bno, > + xfs_extlen_t len) > { > - xfs_perag_busy_t *bsy; > + struct xfs_busy_extent *new; > + struct xfs_busy_extent *busyp; > struct xfs_perag *pag; > - int n; > + struct rb_node **rbp; > + struct rb_node *parent; > + xfs_agblock_t uend, bend; I can understand what "b" in "bend" might represent. But what does "u" mean? > + int match; > > - pag = xfs_perag_get(tp->t_mountp, agno); > - spin_lock(&pag->pagb_lock); > > - /* search pagb_list for an open slot */ > - for (bsy = pag->pagb_list, n = 0; > - n < XFS_PAGB_NUM_SLOTS; > - bsy++, n++) { > - if (bsy->busy_tp == NULL) { > - break; > - } > + new = kmem_zalloc(sizeof(struct xfs_busy_extent), KM_MAYFAIL); > + if (!new) { > + /* > + * No Memory! Since it is now not possible to track the free > + * block, make this a synchronous transaction to insure that > + * the block is not reused before this transaction commits. > + */ > + trace_xfs_alloc_busy(tp, agno, bno, len, 1); > + xfs_trans_set_sync(tp); > + return; > } > > - trace_xfs_alloc_busy(tp->t_mountp, agno, bno, len, n); > + new->agno = agno; > + new->bno = bno; > + new->length = len; > + new->tid = xfs_log_get_trans_ident(tp); > > - if (n < XFS_PAGB_NUM_SLOTS) { > - bsy = &pag->pagb_list[n]; > - pag->pagb_count++; > - bsy->busy_start = bno; > - bsy->busy_length = len; > - bsy->busy_tp = tp; > - xfs_trans_add_busy(tp, agno, n); > - } else { > + INIT_LIST_HEAD(&new->list); > + > + /* trace before insert to be able to see failed inserts */ > + trace_xfs_alloc_busy(tp, agno, bno, len, 0); > + > + pag = xfs_perag_get(tp->t_mountp, new->agno); > + uend = bno + len - 1; > +restart: > + spin_lock(&pag->pagb_lock); > + rbp = &pag->pagb_tree.rb_node; > + parent = NULL; > + busyp = NULL; > + match = 0; > + while (*rbp) { while (match >= 0 && *rbp) { (Or possibly just break out of the loop below whenever match gets assigned -1.) > + parent = *rbp; > + busyp = rb_entry(parent, struct xfs_busy_extent, rb_node); > + bend = busyp->bno + busyp->length - 1; No need to compute this here. Compute it where it's needed, or just do it inline. > + > + if (new->bno < busyp->bno) { > + /* may overlap, but exact start block is lower */ > + rbp = &(*rbp)->rb_left; > + if (uend >= busyp->bno) { > + if (busyp->tid != new->tid) > + match = -1; Mentioned above--could possibly just break here instead. Outside the loop, you could check for *rbp != NULL rather than match < 0. > + else if (match >= 0) > + match = 1; match = busyp->tid == new->tid ? 1 : -1; > + } > + } else if (new->bno > busyp->bno) { > + /* may overlap, but exact start block is higher */ > + rbp = &(*rbp)->rb_right; > + if (bno <= bend) { if (bno <= busyp->bno + busyp->length - 1) { > + if (busyp->tid != new->tid) > + match = -1; > + else if (match >= 0) > + match = 1; > + } > + } else { > + if (busyp->tid != new->tid) > + match = -1; > + else if (match >= 0) > + match = 1; > + break; No need for the break here if you get rid of the reassignment of busyp to NULL (more on this below). > + } > + busyp = NULL; > + } Right now, the only way you exit this loop with busyp being non-null is if you exit due to new->bno == busyp->bno. But that's puzzling, because that suggests that the if (match > 0) test below would be dereferencing a null pointer (and maybe that means you haven't seen in your testing a case of reallocating an extent in the same transaction you freed it in?). In any case, what I wanted to say here is that it looks like you're nulling that pointer just so you can call kmem_free(busyp) at the end of the function in all cases. Instead, I think you should just free busyp in the one case you know you need to--when the starting addresses of the new and existing busy extents match. Then drop the assignment of NULL to busyp. > + if (match < 0) { > + /* overlap marked busy in different transaction */ > + spin_unlock(&pag->pagb_lock); > + xfs_log_force(tp->t_mountp, XFS_LOG_SYNC); > + goto restart; > + } > + if (match > 0) { > /* > - * The busy list is full! Since it is now not possible to > - * track the free block, make this a synchronous transaction > - * to insure that the block is not reused before this > - * transaction commits. > + * overlap marked busy in same transaction. Update if exact > + * start block match, otherwise combine the busy extents into > + * a single range. > */ > - xfs_trans_set_sync(tp); > + if (busyp->bno == new->bno) { Dereferencing a null pointer here? > + busyp->length = max(busyp->length, new->length); > + spin_unlock(&pag->pagb_lock); > + ASSERT(tp->t_flags & XFS_TRANS_SYNC); > + xfs_perag_put(pag); > + kmem_free(new); > + return; > + } > + rb_erase(&busyp->rb_node, &pag->pagb_tree); > + new->length = max(busyp->bno + busyp->length, > + new->bno + new->length) - > + min(busyp->bno, new->bno); > + new->bno = min(busyp->bno, new->bno); > } > > + rb_link_node(&new->rb_node, parent, rbp); > + rb_insert_color(&new->rb_node, &pag->pagb_tree); > + > + list_add(&new->list, &tp->t_busy); > spin_unlock(&pag->pagb_lock); > xfs_perag_put(pag); > + kmem_free(busyp); Move this call up to the only place that needs it. > } > > -void > -xfs_alloc_clear_busy(xfs_trans_t *tp, > - xfs_agnumber_t agno, > - int idx) > +/* > + * Search for a busy extent within the range of the extent we are about to > + * allocate. You need to be holding the busy extent tree lock when calling > + * xfs_alloc_busy_search(). This function returns 0 for no overlapping busy > + * extent, -1 for an overlapping but not exact busy extent, and 1 for an exact > + * match. This is done so that a non-zero return indicates an overlap that > + * will require a synchronous transaction, but it can still be > + * used to distinguish between a partial or exact match. > + */ > +static int > +xfs_alloc_busy_search( > + struct xfs_mount *mp, > + xfs_agnumber_t agno, > + xfs_agblock_t bno, > + xfs_extlen_t len) > { > struct xfs_perag *pag; > - xfs_perag_busy_t *list; > + struct rb_node *rbp; > + xfs_agblock_t uend, bend; > + struct xfs_busy_extent *busyp; > + int match = 0; > > - ASSERT(idx < XFS_PAGB_NUM_SLOTS); > - pag = xfs_perag_get(tp->t_mountp, agno); > + pag = xfs_perag_get(mp, agno); > spin_lock(&pag->pagb_lock); > - list = pag->pagb_list; > > - trace_xfs_alloc_unbusy(tp->t_mountp, agno, idx, list[idx].busy_tp == tp); > - > - if (list[idx].busy_tp == tp) { > - list[idx].busy_tp = NULL; > - pag->pagb_count--; > + uend = bno + len - 1; > + rbp = pag->pagb_tree.rb_node; > + > + /* find closest start bno overlap */ > + while (rbp) { Similar to above, once you've made the determination that there's either an overlapping match or an exact match, you can quit looking. You aren't returning anything about the particular busy entry that matches, after all (though your tracing can yield a different result). while (!match && rbp) { > + busyp = rb_entry(rbp, struct xfs_busy_extent, rb_node); > + bend = busyp->bno + busyp->length - 1; > + if (bno < busyp->bno) { > + /* may overlap, but exact start block is lower */ > + if (uend >= busyp->bno) > + match = -1; > + rbp = rbp->rb_left; > + } else if (bno > busyp->bno) { > + /* may overlap, but exact start block is higher */ > + if (bno <= bend) > + match = -1; > + rbp = rbp->rb_right; > + } else { > + /* bno matches busyp, length determines exact match */ > + match = (busyp->length == len) ? 1 : -1; > + break; And as above, you could drop the break here. > + } > } > - > spin_unlock(&pag->pagb_lock); > + trace_xfs_alloc_busysearch(mp, agno, bno, len, !!match); > xfs_perag_put(pag); > + return match; > } > > - > -/* > - * If we find the extent in the busy list, force the log out to get the > - * extent out of the busy list so the caller can use it straight away. > - */ > -STATIC void > -xfs_alloc_search_busy(xfs_trans_t *tp, > - xfs_agnumber_t agno, > - xfs_agblock_t bno, > - xfs_extlen_t len) Are there any locking requirements for the clear (or insert) routine? > +void > +xfs_alloc_busy_clear( > + struct xfs_mount *mp, > + struct xfs_busy_extent *busyp) > { > struct xfs_perag *pag; > - xfs_perag_busy_t *bsy; > - xfs_agblock_t uend, bend; > - xfs_lsn_t lsn = 0; > - int cnt; > > - pag = xfs_perag_get(tp->t_mountp, agno); > - spin_lock(&pag->pagb_lock); > - cnt = pag->pagb_count; > + trace_xfs_alloc_unbusy(mp, busyp->agno, busyp->bno, > + busyp->length); > > - /* > - * search pagb_list for this slot, skipping open slots. We have to > - * search the entire array as there may be multiple overlaps and > - * we have to get the most recent LSN for the log force to push out > - * all the transactions that span the range. > - */ > - uend = bno + len - 1; > - for (cnt = 0; cnt < pag->pagb_count; cnt++) { > - bsy = &pag->pagb_list[cnt]; > - if (!bsy->busy_tp) > - continue; > - > - bend = bsy->busy_start + bsy->busy_length - 1; > - if (bno > bend || uend < bsy->busy_start) > - continue; > - > - /* (start1,length1) within (start2, length2) */ > - if (XFS_LSN_CMP(bsy->busy_tp->t_commit_lsn, lsn) > 0) > - lsn = bsy->busy_tp->t_commit_lsn; > - } > + ASSERT(xfs_alloc_busy_search(mp, busyp->agno, busyp->bno, > + busyp->length) == 1); > + > + list_del_init(&busyp->list); > + > + pag = xfs_perag_get(mp, busyp->agno); > + spin_lock(&pag->pagb_lock); > + rb_erase(&busyp->rb_node, &pag->pagb_tree); > spin_unlock(&pag->pagb_lock); > xfs_perag_put(pag); > - trace_xfs_alloc_busysearch(tp->t_mountp, agno, bno, len, lsn); > > - /* > - * If a block was found, force the log through the LSN of the > - * transaction that freed the block > - */ > - if (lsn) > - xfs_log_force_lsn(tp->t_mountp, lsn, XFS_LOG_SYNC); > + kmem_free(busyp); > } . . . The rest is all fine. From xfs@tlinx.org Thu May 20 16:37:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_51,J_CHICKENPOX_71 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KLbv3g229328 for ; Thu, 20 May 2010 16:37:58 -0500 X-ASG-Debug-ID: 1274391685-06d1010c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from Ishtar.sc.tlinx.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4ED799F9FBE for ; Thu, 20 May 2010 14:41:26 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id xE1Qb4wRWYUwtaSt for ; Thu, 20 May 2010 14:41:26 -0700 (PDT) Received: from [192.168.3.12] (Athenae [192.168.3.12]) by Ishtar.sc.tlinx.org (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KLe5Xi008490 for ; Thu, 20 May 2010 14:40:07 -0700 Message-ID: <4BF5AC35.7050909@tlinx.org> Date: Thu, 20 May 2010 14:40:05 -0700 From: "Linda A. Walsh" User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: mkfs.xfs -n ci - error? Subject: mkfs.xfs -n ci - error? X-Stationery: 0.5.1 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1274391692 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.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=BSF_RULE_7580D X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30356 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.75 BSF_RULE_7580D BODY: Custom Rule 7580D X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I'm trying to use the "-n ci" option on a volume, but get an error where it tells me the correct syntax is "-n ci". Am I missing something? mkfs.xfs -i maxpct=5 -n ci -l size=32704b,lazy-count=1 -d su=64k,sw=4 -L Backup -f /dev/Space/Backup unknown option -n ci Usage: mkfs.xfs /* blocksize */ [-b log=n|size=num] /* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num, (sunit=value,swidth=value|su=num,sw=num), sectlog=n|sectsize=num /* inode size */ [-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2] /* log subvol */ [-l agnum=n,internal,size=num,logdev=xxx,version=n sunit=value|su=num,sectlog=n|sectsize=num, lazy-count=0|1] /* label */ [-L label (maximum 12 characters)] /* naming */ [-n log=n|size=num,version=2|ci] ^^^^ ^^^ From sandeen@sandeen.net Thu May 20 16:45:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_51,J_CHICKENPOX_71,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KLjnSY229707 for ; Thu, 20 May 2010 16:45:49 -0500 X-ASG-Debug-ID: 1274392087-7ab7019e0000-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 CA34E141B788 for ; Thu, 20 May 2010 14:48:07 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id n0z3vgElil4fj9kC for ; Thu, 20 May 2010 14:48:07 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o4KLm6oq015485 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 20 May 2010 17:48:07 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o4KLm60J030409; Thu, 20 May 2010 17:48:06 -0400 Message-ID: <4BF5AE16.6060403@sandeen.net> Date: Thu, 20 May 2010 16:48:06 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100301 Fedora/3.0.3-1.fc11 Lightning/1.0b2pre Thunderbird/3.0.3 MIME-Version: 1.0 To: "Linda A. Walsh" CC: xfs-oss X-ASG-Orig-Subj: Re: mkfs.xfs -n ci - error? Subject: Re: mkfs.xfs -n ci - error? References: <4BF5AC35.7050909@tlinx.org> In-Reply-To: <4BF5AC35.7050909@tlinx.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.21 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1274392088 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 05/20/2010 04:40 PM, Linda A. Walsh wrote: > I'm trying to use the "-n ci" option on a volume, but get an error where it tells me > the correct syntax is "-n ci". Am I missing something? > > mkfs.xfs -i maxpct=5 -n ci -l size=32704b,lazy-count=1 -d su=64k,sw=4 -L Backup -f /dev/Space/Backup > unknown option -n ci > Usage: mkfs.xfs > /* blocksize */ [-b log=n|size=num] > /* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num, > (sunit=value,swidth=value|su=num,sw=num), > sectlog=n|sectsize=num > /* inode size */ [-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2] > /* log subvol */ [-l agnum=n,internal,size=num,logdev=xxx,version=n > sunit=value|su=num,sectlog=n|sectsize=num, > lazy-count=0|1] > /* label */ [-L label (maximum 12 characters)] > /* naming */ [-n log=n|size=num,version=2|ci] > ^^^^ ^^^ -n version=ci from the man page: version=value The naming (directory) version value can be either 2 or ’ci’, defaulting to 2 if unspecified. -Eric From MAILER-DAEMON@oss.sgi.com Thu May 20 16:46:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.4 required=5.0 tests=BAYES_80, RCVD_IN_BL_SPAMCOP_NET,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KLkpPA229757 for ; Thu, 20 May 2010 16:46:51 -0500 X-ASG-Debug-ID: 1274392224-07b301450000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from n39b.bullet.mail.sp1.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 69E359FA108 for ; Thu, 20 May 2010 14:50:24 -0700 (PDT) Received: from n39b.bullet.mail.sp1.yahoo.com (n39b.bullet.mail.sp1.yahoo.com [66.163.168.153]) by cuda.sgi.com with SMTP id SpgV8RYCPXGLB9E5 for ; Thu, 20 May 2010 14:50:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoogroups.com; s=lima; t=1274392149; bh=KSXXzBQM8CJuVoIejm14UhWjdpcMN93OPxspnMy4qIQ=; h=Received:Received:Received:Date:Message-ID:X-Yahoo-Newman-Property:MIME-Version:To:From:Subject:Content-Type; b=kyBSh8Juk8vmSOdwiHG+4c6aahg6utvE0M8YofYFKZzdBNGQMHMNWGAsNfxz+/fAMwcbLMZGN6eUp1oeUOrsN1hxNJ6ZIPxefFRrLjG5zYrzGM0XvgjLHq+r2MA1Ew2/ DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=lima; d=yahoogroups.com; b=jKzE6j1WlB2mWG1ifUNVrlF+PSrxSXNumedM0quA5Y0ENsmL1dtyskZKOlZlQ84VIvePt0aCyuLMhbPWBenk5z39i4WE1Ui4XW9/SJcoFFMe72cFW9As42UmDtzAicaA; Received: from [69.147.65.174] by n39.bullet.mail.sp1.yahoo.com with NNFMP; 20 May 2010 21:49:09 -0000 Received: from [66.196.94.59] by t12.bullet.mail.sp1.yahoo.com with NNFMP; 20 May 2010 21:49:09 -0000 Received: (qmail 16490 invoked by uid 7800); 20 May 2010 21:49:07 -0000 Date: 20 May 2010 21:49:07 -0000 Message-ID: <1274392147.604.16255.m14@yahoogroups.com> X-Yahoo-Newman-Property: groups-bounce MIME-Version: 1.0 To: linux-xfs@oss.sgi.com From: Yahoo! Groups X-ASG-Orig-Subj: Unable to process your message Subject: Unable to process your message Content-Type: multipart/mixed; boundary="TYzQ599FW9az71RQYbggv9TghWFNm-bfUJ19U8g" X-Barracuda-Connect: n39b.bullet.mail.sp1.yahoo.com[66.163.168.153] X-Barracuda-Start-Time: 1274392225 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4754 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30356 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --TYzQ599FW9az71RQYbggv9TghWFNm-bfUJ19U8g Content-Type: text/plain Content-Transfer-Encoding: 7bit We are unable to process the message from to . Your message was addressed to a group (nffbby) that does not exist. Please check to make sure you spelled the group name correctly. For further assistance, please visit http://help.yahoo.com/l/us/yahoo/groups/original/members/forms/general.html --TYzQ599FW9az71RQYbggv9TghWFNm-bfUJ19U8g Content-Type: message/rfc822 Received: (qmail 5252 invoked from network); 20 May 2010 21:47:58 -0000 Received: from unknown (98.137.34.46) by m14.grp.re1.yahoo.com with QMQP; 20 May 2010 21:47:58 -0000 Received: from unknown (HELO Ishtar.sc.tlinx.org) (173.164.175.65) by mta3.grp.sp2.yahoo.com with SMTP; 20 May 2010 21:47:51 -0000 Received: from [192.168.3.12] (Athenae [192.168.3.12]) by Ishtar.sc.tlinx.org (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KLlMR0009147 for ; Thu, 20 May 2010 14:47:25 -0700 Message-ID: <4BF5ADEA.9060703@oss.sgi.com> Date: Thu, 20 May 2010 14:47:22 -0700 From: member User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: "nffbby-unsubscribe@yahoogroups.com" X-Stationery: 0.5.1 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-eGroups-Remote-IP: 173.164.175.65 --TYzQ599FW9az71RQYbggv9TghWFNm-bfUJ19U8g-- From xfs@tlinx.org Thu May 20 18:02:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KN2LN1233538 for ; Thu, 20 May 2010 18:02:21 -0500 X-ASG-Debug-ID: 1274396671-5819006a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from Ishtar.sc.tlinx.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 88D25141DE3D for ; Thu, 20 May 2010 16:04:32 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id DBY7A2GFmIBYwLgG for ; Thu, 20 May 2010 16:04:32 -0700 (PDT) Received: from [192.168.3.12] (Athenae [192.168.3.12]) by Ishtar.sc.tlinx.org (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4KM53ZK010942; Thu, 20 May 2010 15:05:09 -0700 Message-ID: <4BF5B20F.1020400@tlinx.org> Date: Thu, 20 May 2010 15:05:03 -0700 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: Michael Monnerie , "xfs@oss.sgi.com" X-ASG-Orig-Subj: Re: rsync from xfs to nfs+xfs and ACL problems Subject: Re: rsync from xfs to nfs+xfs and ACL problems References: <201005181350.15308@zmi.at> <20100518123304.GH2150@dastard> In-Reply-To: <20100518123304.GH2150@dastard> X-Stationery: 0.5.1 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1274396680 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.2, rules version 3.2.2.30360 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean If the NFS system doesn't handle ACL's, you might try using "star" which can handle ACL's and extended file attributes storing them in an extended tar-format archive. It has a "-copy" feature that I've used successfully to copy extended file attributes: (cd sourcedir; star -acl -xattr -no-fsync . /destdir/.)& and ACL's from one XFS file system to another, so I'm reasonably sure it's archive format (see its manpage for correct options) would also store them. Dave Chinner wrote: > On Tue, May 18, 2010 at 01:50:15PM +0200, Michael Monnerie wrote: >> Hello, I'm trying to rsync from an xfs with ACLs set to another server >> which has an xfs filesystem. I mounted the nfs using >> >> Does it mean I can't sync ACLs? How could I do it? I need a full backup >> including ACLs, as I want to move all data and then restore. > > NFSv3 doesn't support ACLs, IIRC. > > Cheers, > > Dave. From pedrib@gmail.com Thu May 20 21:13:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4L2Dv2v240700 for ; Thu, 20 May 2010 21:13:58 -0500 X-ASG-Debug-ID: 1274408252-111d026c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f228.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7CBEF9F5F42 for ; Thu, 20 May 2010 19:17:32 -0700 (PDT) Received: from mail-ew0-f228.google.com (mail-ew0-f228.google.com [209.85.219.228]) by cuda.sgi.com with ESMTP id LeHHZDzkbqiPRZKB for ; Thu, 20 May 2010 19:17:32 -0700 (PDT) Received: by ewy28 with SMTP id 28so96814ewy.18 for ; Thu, 20 May 2010 19:16:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=L1spsnSNGUI7bqE2GAMEhTaGfJlVkbswM16ui3O41EU=; b=ptdi1R+1PJcvSlQABkBxVzSOJctKZgv63dWwwHP7U6nhbhx4vhRuZx3QndmXROzvxU j7mwA8xpLLLbHBW2io2E9AUOH1l8q/bZaIG6EGL3vo17hNyhyOv8Z/XEfvYNKlIELOaH 8gCFU4udFx0ALF3OoHBhMpBFAGSAKMwrX0iwM= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=M+JqfXgm3b5BlzXddBqkHlqBMtUiEb0x6BVOO3afh9LiYtfO7NfCvm5xNJm4g905Lk H7iCrgELPWDD70DCPcc4kEpl4kLrJEwXQxSaDzmzc7d8/WDS6p9Sxxx/ARuykjKkiKZh 8dmQx1fNzxkIxR4i3SklzJ63PFksIVSM4G00Y= MIME-Version: 1.0 Received: by 10.213.63.75 with SMTP id a11mr141033ebi.9.1274408175806; Thu, 20 May 2010 19:16:15 -0700 (PDT) Received: by 10.213.108.67 with HTTP; Thu, 20 May 2010 19:16:15 -0700 (PDT) Date: Fri, 21 May 2010 03:16:15 +0100 Message-ID: X-ASG-Orig-Subj: Tuning XFS for real time audio on a laptop with encrypted LVM Subject: Tuning XFS for real time audio on a laptop with encrypted LVM From: Pedro Ribeiro To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ew0-f228.google.com[209.85.219.228] X-Barracuda-Start-Time: 1274408253 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=BSF_SC5_SA210e, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30369 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi all, I was wondering what is the best scheduler for my use case given my current hardware. I have a laptop with a fast Core 2 duo at 2.26 and a nice amount of ram (4GB) which I use primarily for real time audio (though without a -rt kernel). All my partitions are XFS under LVM which itself is contained on a LUKS partition (encrypted with AES 128). CFQ currently does not perform very well and causes a lot of thrashing and high latencies when I/O usage is high. Changing it to the noop scheduler solves some of the problems and makes it more responsive. Still performance is a bit of a let down: it takes 1m30s to unpack the linux-2.6.34 tarball and a massive 2m30s to rm -r. I have lazy-count=1, noatime, logbufs=8, logbsize=256k and a 128m log. Is there any tunable I should mess with to solve this? And what do you think of my scheduler change (I haven't tested it that much to be honest)? Regards, Pedro From SRS0+zbUS+80+fromorbit.com=david@internode.on.net Thu May 20 21:14:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4L2E5ju240721 for ; Thu, 20 May 2010 21:14:07 -0500 X-ASG-Debug-ID: 1274408182-137c02010000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7C6D9141F342 for ; Thu, 20 May 2010 19:16:23 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id t7bjoUjDDLiVSuTV for ; Thu, 20 May 2010 19:16:23 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25316195-1927428 for multiple; Fri, 21 May 2010 11:46:21 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OFHme-0001jI-1p; Fri, 21 May 2010 12:16:20 +1000 Date: Fri, 21 May 2010 12:16:19 +1000 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 07/12] xfs: Improve scalability of busy extent tracking Subject: Re: [PATCH 07/12] xfs: Improve scalability of busy extent tracking Message-ID: <20100521021619.GV8120@dastard> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> <1274138668-1662-8-git-send-email-david@fromorbit.com> <1274386538.2095.148.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274386538.2095.148.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1274408184 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.2, rules version 3.2.2.30368 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 20, 2010 at 03:15:38PM -0500, Alex Elder wrote: > On Tue, 2010-05-18 at 09:24 +1000, Dave Chinner wrote: > > When we free a metadata extent, we record it in the per-AG busy > > extent array so that it is not re-used before the freeing > > transaction hits the disk. This array is fixed size, so when it > > overflows we make further allocation transactions synchronous > > because we cannot track more freed extents until those transactions > > hit the disk and are completed. Under heavy mixed allocation and > > freeing workloads with large log buffers, we can overflow this array > > quite easily. > > . . . > > This is a really good set of changes. It might have been good > to split into a few separate pieces: > - Marking transactions synchronous rather than forcing the > log in some situations > - Conversion from fixed array to dynamic rbtree > - Drop the busy chunk stuff from the transaction code > > But at this point that would be a lot of needless work. Especially as I used to have it as three separate patches just like this, and every time I modified the first patch it then took 15 minutes to fix all the conflicts generates in the other two. So, no, I'm not going to split it. > > diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h > > index abb8222..401f364 100644 > > --- a/fs/xfs/xfs_ag.h > > +++ b/fs/xfs/xfs_ag.h > > . . . > > > @@ -216,7 +222,8 @@ typedef struct xfs_perag { > > xfs_agino_t pagl_leftrec; > > xfs_agino_t pagl_rightrec; > > #ifdef __KERNEL__ > > - spinlock_t pagb_lock; /* lock for pagb_list */ > > + spinlock_t pagb_lock; /* lock for pagb_tree */ > > + struct rb_root pagb_tree; /* ordered tree of busy extents */ > > I really think "pagb_busy" would be a better name. The > fact that it's a tree is immaterial--the role it plays > is recording busy extents. Redundant. "pagb" = per-ag-busy. And the use of {lock,tree} is consistent here e.g. m_perag_{lock,tree} in the struct xfs_mount is the same... > > + * xfs_alloc_busy_search - search for a busy extent > > + */ > > + > > +/* > > + * Insert a new extent into the busy tree. > > + * > > Maybe not here, but I think a brief explanation of the > per-ag busy extent tree might be in order. For example, > that it's indexed by start address of each extent. It > is also true that no range of addresses is represented > by more than one entry in the tree, right? I'm not > sure what would be enough but I think a simple intro > is helpful to give the reader some context. Added. > > + * *** KABOOM! *** > > + * .... > > + * log IO completes > > + * unbusy 1:91909 > 1:91909 ????? That was cut'n'paste from the tracing logs that generated the problem (i.e. ag 1, agbno 91909 was the problem busy extent), and I forgot to replace that one with X... > OK, now a little more substantive feedback. > > As you search the red-black tree in xfs_alloc_busy_insert() > (as well as xfs_alloc_busy_search()), once the value of > match gets set to -1, it will never get set to anything > else. So once it's set, I'm not sure there's much point > to any further descent into the tree--you found an > overlapping extent in the busy tree, and it's from a > different transaction, so you need to force the log and > try again. That was a result of - at one point - optimising the log force as the transaction pointer contained the LSN of the commit, so the log could be forced only to the commit it needed to. Hence all overlapping extents needed to be searched to find the most recent. At some point I'd like to get back to that, but I'll clean it up for now. > So I think the loop condition could be changed to drop > out if match is negative (I'll show what I mean below). > Doing that would also simplify some of the stuff inside > the loop. > > > void > > -xfs_alloc_mark_busy(xfs_trans_t *tp, > > - xfs_agnumber_t agno, > > - xfs_agblock_t bno, > > - xfs_extlen_t len) > > +xfs_alloc_busy_insert( > > + struct xfs_trans *tp, > > + xfs_agnumber_t agno, > > + xfs_agblock_t bno, > > + xfs_extlen_t len) > > { > > - xfs_perag_busy_t *bsy; > > + struct xfs_busy_extent *new; > > + struct xfs_busy_extent *busyp; > > struct xfs_perag *pag; > > - int n; > > + struct rb_node **rbp; > > + struct rb_node *parent; > > + xfs_agblock_t uend, bend; > > I can understand what "b" in "bend" might represent. But > what does "u" mean? I just used the same variable names as in xfs_alloc_busy_search() for consistency. The meaning of the "u" in uend has been lost in the mists of time - I think it might have meant "unbusy end" to go with "busy end". I'll just inline them now, as they are only used once each. > > + } else { > > + if (busyp->tid != new->tid) > > + match = -1; > > + else if (match >= 0) > > + match = 1; > > + break; > > No need for the break here if you get rid > of the reassignment of busyp to NULL (more > on this below). I'm going to leave it there as a defensive mechanism - the tree pointer is not changed, so if we don't break we could end up with endless loops down the track if loop termination conditions are changed.... > Right now, the only way you exit this loop with busyp > being non-null is if you exit due to new->bno == busyp->bno. > But that's puzzling, because that suggests that the > if (match > 0) test below would be dereferencing a null > pointer (and maybe that means you haven't seen in your > testing a case of reallocating an extent in the same > transaction you freed it in?). I've definitely seen the same extent being freed a second time, but maybe not an overlapping extent. Definitely looks like a bug though. > In any case, what I wanted to say here is that it looks > like you're nulling that pointer just so you can call > kmem_free(busyp) at the end of the function in all cases. No, I'm doing it so I can call kmem_free() ouside of the pagb_lock spin lock. > > + pag = xfs_perag_get(mp, agno); > > spin_lock(&pag->pagb_lock); > > - list = pag->pagb_list; > > > > - trace_xfs_alloc_unbusy(tp->t_mountp, agno, idx, list[idx].busy_tp == tp); > > - > > - if (list[idx].busy_tp == tp) { > > - list[idx].busy_tp = NULL; > > - pag->pagb_count--; > > + uend = bno + len - 1; > > + rbp = pag->pagb_tree.rb_node; > > + > > + /* find closest start bno overlap */ > > + while (rbp) { > > Similar to above, once you've made the determination that > there's either an overlapping match or an exact match, > you can quit looking. You aren't returning anything > about the particular busy entry that matches, after all > (though your tracing can yield a different result). That's not true for this loop. When we clear a busy extent, the debug code checks that it can find an exact match. Hence the search cannot terminate on the first overlap it finds as it still needs to try to find an exact bno match before terminating. > > while (!match && rbp) { > > > + busyp = rb_entry(rbp, struct xfs_busy_extent, rb_node); > > + bend = busyp->bno + busyp->length - 1; > > + if (bno < busyp->bno) { > > + /* may overlap, but exact start block is lower */ > > + if (uend >= busyp->bno) > > + match = -1; > > + rbp = rbp->rb_left; > > + } else if (bno > busyp->bno) { > > + /* may overlap, but exact start block is higher */ > > + if (bno <= bend) > > + match = -1; > > + rbp = rbp->rb_right; > > + } else { > > + /* bno matches busyp, length determines exact match */ > > + match = (busyp->length == len) ? 1 : -1; > > + break; > > And as above, you could drop the break here. In this case it's a valid termination - we've got an exact block number match, so regardless of the length way we do not need to search any further because we know for certain whether an exact match exists in the tree. > > -/* > > - * If we find the extent in the busy list, force the log out to get the > > - * extent out of the busy list so the caller can use it straight away. > > - */ > > -STATIC void > > -xfs_alloc_search_busy(xfs_trans_t *tp, > > - xfs_agnumber_t agno, > > - xfs_agblock_t bno, > > - xfs_extlen_t len) > > Are there any locking requirements for the clear (or insert) > routine? The tree is protected by the pagb_lock. Inserts and searches during allocation are serialised by the AGF buffer lock (i.e. transaction context). Removals (and searches during removal) are serialised by the pagb_lock. Nothing has changed there. FWIW, Alex, this code has been out there for some time now - could you please attempt to review code before the last minute? Your reviews are valuable and feedback like this while I was having trouble with this code would have helped a great deal. However, now I'm pressed for time to retest significant modifications right before a merge deadline.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+zbUS+80+fromorbit.com=david@internode.on.net Thu May 20 23:12:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4L4Bx55244228 for ; Thu, 20 May 2010 23:12:00 -0500 X-ASG-Debug-ID: 1274415333-262502b90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8E8E7A016B8 for ; Thu, 20 May 2010 21:15:34 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id KKSVEb9kvHwRTVCk for ; Thu, 20 May 2010 21:15:34 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13462159-1927428 for multiple; Fri, 21 May 2010 13:44:16 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OFJcl-0001on-5H; Fri, 21 May 2010 14:14:15 +1000 Date: Fri, 21 May 2010 14:14:15 +1000 From: Dave Chinner To: Pedro Ribeiro Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Tuning XFS for real time audio on a laptop with encrypted LVM Subject: Re: Tuning XFS for real time audio on a laptop with encrypted LVM Message-ID: <20100521041415.GW8120@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1274415335 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=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30375 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 21, 2010 at 03:16:15AM +0100, Pedro Ribeiro wrote: > Hi all, > > I was wondering what is the best scheduler for my use case given my > current hardware. > > I have a laptop with a fast Core 2 duo at 2.26 and a nice amount of > ram (4GB) which I use primarily for real time audio (though without a > -rt kernel). All my partitions are XFS under LVM which itself is > contained on a LUKS partition (encrypted with AES 128). > > CFQ currently does not perform very well and causes a lot of thrashing > and high latencies when I/O usage is high. Changing it to the noop > scheduler solves some of the problems and makes it more responsive. > Still performance is a bit of a let down: it takes 1m30s to unpack the > linux-2.6.34 tarball and a massive 2m30s to rm -r. > I have lazy-count=1, noatime, logbufs=8, logbsize=256k and a 128m log. > > Is there any tunable I should mess with to solve this? Depends if you value your data or not. If you don't care about corruption or data loss on sudden power loss (e.g. battery runs flat), then add nobarrier to your mount options. Otherwise, you're close to the best performance you are going to get on that hardware with XFS. > And what do you > think of my scheduler change (I haven't tested it that much to be > honest)? I only ever use the noop scheduler with XFS these days. CFQ has been a steaming pile of ever changing regressions for the past 4 or 5 kernel releases, so i stopped using it. Besides, XFS is often 10-15% faster on no-op for the same workload, anyway... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+vMdd+80+fromorbit.com=dave@internode.on.net Fri May 21 00:45:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4L5jpNF250049 for ; Fri, 21 May 2010 00:45:51 -0500 X-ASG-Debug-ID: 1274420964-067500af0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DB895A01D39 for ; Thu, 20 May 2010 22:49:24 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id FCfnyIUDWW8iz96D for ; Thu, 20 May 2010 22:49:24 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25043584-1927428 for ; Fri, 21 May 2010 15:18:06 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OFL5Z-0001su-H3 for xfs@oss.sgi.com; Fri, 21 May 2010 15:48:05 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OFL5T-0000cx-57 for xfs@oss.sgi.com; Fri, 21 May 2010 15:47:59 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: Check new inode size is OK before preallocating Subject: [PATCH] xfs: Check new inode size is OK before preallocating Date: Fri, 21 May 2010 15:47:59 +1000 Message-Id: <1274420879-2391-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1274420966 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.2, rules version 3.2.2.30380 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The new xfsqa test 228 tries to preallocate more space than the filesystem contains. it should fail, but instead triggers an assert about lock flags. The failure is due to the size extension failing in vmtruncate() due to rlimit being set. Check this before we start the preallocation to avoid allocating space that will never be used. Also the path through xfs_vn_allocate already holds the IO lock, so it should not be present in the lock flags when the setattr fails. Hence the assert needs to take this into account. This will prevent other such callers from hitting this incorrect ASSERT. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_iops.c | 16 +++++++++++++--- fs/xfs/xfs_vnodeops.c | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 9c8019c..d74914f 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c @@ -585,11 +585,20 @@ xfs_vn_fallocate( bf.l_len = len; xfs_ilock(ip, XFS_IOLOCK_EXCL); + + /* check the new inode size is valid before allocating */ + if (!(mode & FALLOC_FL_KEEP_SIZE) && + offset + len > i_size_read(inode)) { + new_size = offset + len; + error = inode_newsize_ok(inode, newsize); + if (error) + goto out_unlock; + } + error = -xfs_change_file_space(ip, XFS_IOC_RESVSP, &bf, 0, XFS_ATTR_NOLOCK); - if (!error && !(mode & FALLOC_FL_KEEP_SIZE) && - offset + len > i_size_read(inode)) - new_size = offset + len; + if (error) + goto out_unlock; /* Change file size if needed */ if (new_size) { @@ -600,6 +609,7 @@ xfs_vn_fallocate( error = -xfs_setattr(ip, &iattr, XFS_ATTR_NOLOCK); } +out_unlock: xfs_iunlock(ip, XFS_IOLOCK_EXCL); out_error: return error; diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 9d376be..a06bd62 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -267,7 +267,7 @@ xfs_setattr( if (code) { ASSERT(tp == NULL); lock_flags &= ~XFS_ILOCK_EXCL; - ASSERT(lock_flags == XFS_IOLOCK_EXCL); + ASSERT(lock_flags == XFS_IOLOCK_EXCL || !need_iolock); goto error_return; } tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE); -- 1.5.6.5 From stewart@flamingspork.com Fri May 21 01:18:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4L6IUuN251429 for ; Fri, 21 May 2010 01:18:30 -0500 X-ASG-Debug-ID: 1274422848-2fff01390000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kaylee.flamingspork.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 79F6314200C3 for ; Thu, 20 May 2010 23:20:48 -0700 (PDT) Received: from kaylee.flamingspork.com (kaylee.flamingspork.com [74.207.245.61]) by cuda.sgi.com with ESMTP id vLo3MTDNwb4GcK8v for ; Thu, 20 May 2010 23:20:48 -0700 (PDT) Received: from willster (localhost [127.0.0.1]) by kaylee.flamingspork.com (Postfix) with ESMTPS id C7A4B639A; Fri, 21 May 2010 06:14:06 +0000 (UTC) Received: by willster (Postfix, from userid 1000) id CE8417A29; Fri, 21 May 2010 16:20:46 +1000 (EST) From: Stewart Smith To: Florian Weimer , Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS on 2.6.26: reading the first 4K of a large file takes ages Subject: Re: XFS on 2.6.26: reading the first 4K of a large file takes ages In-Reply-To: <82sk5m7oyz.fsf@mid.bfk.de> References: <8239xojfco.fsf@mid.bfk.de> <20100519114826.GA18224@infradead.org> <82sk5m7oyz.fsf@mid.bfk.de> User-Agent: Notmuch/0.3.1-17-gc50524e (http://notmuchmail.org) Emacs/23.1.1 (x86_64-pc-linux-gnu) Date: Fri, 21 May 2010 16:20:46 +1000 Message-ID: <87zkztojwh.fsf@willster.local.flamingspork.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: kaylee.flamingspork.com[74.207.245.61] X-Barracuda-Start-Time: 1274422849 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.2, rules version 3.2.2.30381 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 20 May 2010 12:11:00 +0000, Florian Weimer wrote: > Thanks for confirming my hunch. I don't think it's worth fixing this > in XFS. The database should call posix_fallocate() before flushing > its internal cache to the file in essentially random order, but it's > difficult to get upstream to implement this (the source code is a bit > hard to follow, unfortunately). Which database? You could always mount with allocsize or use other tools to do the preallocation before things got too bad. -- Stewart Smith From stan@hardwarefreak.com Fri May 21 01:23:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4L6NRjx251680 for ; Fri, 21 May 2010 01:23:27 -0500 X-ASG-Debug-ID: 1274423124-571f02540000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E959B3621FA for ; Thu, 20 May 2010 23:25:24 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id sOhY0TT3e8tJKPsL for ; Thu, 20 May 2010 23:25:24 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id B5D2A6C24C for ; Fri, 21 May 2010 01:25:23 -0500 (CDT) Message-ID: <4BF62766.8070105@hardwarefreak.com> Date: Fri, 21 May 2010 01:25:42 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Tuning XFS for real time audio on a laptop with encrypted LVM Subject: Re: Tuning XFS for real time audio on a laptop with encrypted LVM References: <20100521041415.GW8120@dastard> In-Reply-To: <20100521041415.GW8120@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274423125 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0199 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30381 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner put forth on 5/20/2010 11:14 PM: > I only ever use the noop scheduler with XFS these days. CFQ has been > a steaming pile of ever changing regressions for the past 4 or 5 > kernel releases, so i stopped using it. Besides, XFS is often 10-15% > faster on no-op for the same workload, anyway... IIRC the elevator sits below the FS in the stack, and has a tighter relationship to the block device driver and physical storage subsystem than to the FS. I have one box with a 7.2K 500GB WD drive and a sata_sil controller that doesn't support NCQ. Without NCQ due to no controller support or ATA_horkage_NCQ blacklisted drives, the deadline and anticipatory (now removed from the kernel IIRC) elevators yield vastly superior performance under load compared to CFQ or noop. Noop fits well with good hardware RAID, either local machine PCI/x/e RAID card or straight FC HBA talking to a SAN array controller. CFQ just gets in the way with good hardware. In some testing I've done with FC HBAs and target LUNs on IBM FasTt and Nexsan SAN arrays, deadline has shown a tiny advantage over noop with a few synthetic tests. This testing was performed on SLED 10 and Debian Etch guests atop VMWare ESX 3 at night on weekends when load across the ESX blade farm was near zero, but it was still done in a virtual environment. On bare hardware, I'm not sure one would get the same results. Anyway, the deadline elevator gave such little advantage over noop, I'd still recommend noop on good hardware due to zero CPU overhead. Deadline has a few fancy tricks so it will always eat more CPU, even though it's a modest amount. I'd sum the elevator choice up this way: If you have a good storage hardware and driver combo such as fast SATA disks with good NCQ, or just about any SCSI, SAS, RAID, or SAN setup, go with noop. For lesser hardware/drivers, use deadline (i.e. lacking or crappy NCQ, or on laptops due to the slow 4200/5400 rpm drives, even if they do have good NCQ). I agree with Dave that CFQ isn't all that great, and in my testing it's even worse when used with Linux guests on ESX than it is on bare metal. Caveat: I'm no expert, and I don't do storage subsystem performance testing all day long. I'm just reporting my first hand experience. YMMV and all the normal disclaimers apply. -- Stan From fweimer@bfk.de Fri May 21 01:41:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4L6f3of252400 for ; Fri, 21 May 2010 01:41:04 -0500 X-ASG-Debug-ID: 1274424278-0659022d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx01.bfk.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 70756A0378B for ; Thu, 20 May 2010 23:44:39 -0700 (PDT) Received: from mx01.bfk.de (mx01.bfk.de [193.227.124.2]) by cuda.sgi.com with ESMTP id WD4uvHmOAWFXXQI2 for ; Thu, 20 May 2010 23:44:39 -0700 (PDT) Received: from mx00.int.bfk.de ([10.119.110.2]) by mx01.bfk.de with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) id 1OFLwu-0007vj-9E; Fri, 21 May 2010 06:43:12 +0000 Received: by bfk.de with local id 1OFLwx-0001q5-1O; Fri, 21 May 2010 06:43:15 +0000 To: Stewart Smith Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS on 2.6.26: reading the first 4K of a large file takes ages Subject: Re: XFS on 2.6.26: reading the first 4K of a large file takes ages References: <8239xojfco.fsf@mid.bfk.de> <20100519114826.GA18224@infradead.org> <82sk5m7oyz.fsf@mid.bfk.de> <87zkztojwh.fsf@willster.local.flamingspork.com> From: Florian Weimer Date: Fri, 21 May 2010 06:43:15 +0000 In-Reply-To: <87zkztojwh.fsf@willster.local.flamingspork.com> (Stewart Smith's message of "Fri\, 21 May 2010 16\:20\:46 +1000") Message-ID: <828w7d69h8.fsf@mid.bfk.de> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mx01.bfk.de[193.227.124.2] X-Barracuda-Start-Time: 1274424279 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.2, rules version 3.2.2.30381 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean * Stewart Smith: > On Thu, 20 May 2010 12:11:00 +0000, Florian Weimer wrote: >> Thanks for confirming my hunch. I don't think it's worth fixing this >> in XFS. The database should call posix_fallocate() before flushing >> its internal cache to the file in essentially random order, but it's >> difficult to get upstream to implement this (the source code is a bit >> hard to follow, unfortunately). > > Which database? Oracle Berkeley DB. > You could always mount with allocsize This happens with "allocsize=3D4194304". > or use other tools to do the preallocation before things got too > bad. Is there a way to transparently preallocate a few GB after the current end of the file? That would be helpful because Berkeley DB wouldn't have to know about it. It's a legacy system, otherwise I would invest more effort into putting some sort of preallocation somewhere deep into Berkeley DB. --=20 Florian Weimer BFK edv-consulting GmbH http://www.bfk.de/ Kriegsstra=DFe 100 tel: +49-721-96201-1 D-76133 Karlsruhe fax: +49-721-96201-99 From SRS0+AoG0+80+fromorbit.com=david@internode.on.net Fri May 21 03:24:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4L8O5Ah257217 for ; Fri, 21 May 2010 03:24:05 -0500 X-ASG-Debug-ID: 1274430382-3015038f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D81A514219B9 for ; Fri, 21 May 2010 01:26:22 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id PMejtGT41Wn9AxHs for ; Fri, 21 May 2010 01:26:22 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25109983-1927428 for multiple; Fri, 21 May 2010 17:56:21 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OFNYi-00022Q-0P; Fri, 21 May 2010 18:26:20 +1000 Date: Fri, 21 May 2010 18:26:19 +1000 From: Dave Chinner To: Florian Weimer Cc: Stewart Smith , Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS on 2.6.26: reading the first 4K of a large file takes ages Subject: Re: XFS on 2.6.26: reading the first 4K of a large file takes ages Message-ID: <20100521082619.GX8120@dastard> References: <8239xojfco.fsf@mid.bfk.de> <20100519114826.GA18224@infradead.org> <82sk5m7oyz.fsf@mid.bfk.de> <87zkztojwh.fsf@willster.local.flamingspork.com> <828w7d69h8.fsf@mid.bfk.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <828w7d69h8.fsf@mid.bfk.de> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1274430383 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.2, rules version 3.2.2.30388 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 21, 2010 at 06:43:15AM +0000, Florian Weimer wrote: > * Stewart Smith: > > > On Thu, 20 May 2010 12:11:00 +0000, Florian Weimer wrote: > >> Thanks for confirming my hunch. I don't think it's worth fixing this > >> in XFS. The database should call posix_fallocate() before flushing > >> its internal cache to the file in essentially random order, but it's > >> difficult to get upstream to implement this (the source code is a bit > >> hard to follow, unfortunately). > > > > Which database? > > Oracle Berkeley DB. > > > You could always mount with allocsize > > This happens with "allocsize=4194304". Because allocsize only works for allocations extending the file. > > or use other tools to do the preallocation before things got too > > bad. > > Is there a way to transparently preallocate a few GB after the current > end of the file? That would be helpful because Berkeley DB wouldn't > have to know about it. Yes. the fallocate() syscall has a mode that allows allocation beyond the current end of file, as does the XFS_IOC_RESVSP ioctl. Or, even easier, with xfs_io: $ stat /mnt/test/foo File: `/mnt/test/foo' Size: 0 Blocks: 0 IO Block: 4096 regular empty file .... $ xfs_io -f -c "resvsp 0 1048576" /mnt/test/foo $ stat /mnt/test/foo File: `/mnt/test/foo' Size: 0 Blocks: 2048 IO Block: 4096 regular empty file .... $ xfs_bmap -vp /mnt/test/foo /mnt/test/foo: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL FLAGS 0: [0..2047]: 171912..173959 0 (171912..173959) 2048 10000 $ /mnt/test/foo still a zero length file but has 1MB of extents allocated. Cheers, Dave. -- Dave Chinner david@fromorbit.com From pedrib@gmail.com Fri May 21 06:27:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LBR9qr003761 for ; Fri, 21 May 2010 06:27:09 -0500 X-ASG-Debug-ID: 1274441445-028f01260000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f228.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2030A149B460 for ; Fri, 21 May 2010 04:30:45 -0700 (PDT) Received: from mail-ew0-f228.google.com (mail-ew0-f228.google.com [209.85.219.228]) by cuda.sgi.com with ESMTP id z3hFAHwAD2fyU3Yv for ; Fri, 21 May 2010 04:30:45 -0700 (PDT) Received: by ewy28 with SMTP id 28so168275ewy.18 for ; Fri, 21 May 2010 04:29:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=H4mh2NQ3RPZunFOCmFneejBKrdQ5XINmCftxBJMB0lk=; b=D13Y2XcXmInowdD7cSZLp4/iI44YqLUXs4h2FQ0qrGzce/ny22wFdpZcOrW209wnME vQIHUzzRJPJiaKxG1uWzKfNQ/NG8cCY/E4LyFAd7g4iEgnC9fqt9grCTRxvUWH/+53IO ukPAmkSPq+rBToIbXyPLdJ5UEzB0k9uDE+iE0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=Vr8Z0jUQiqD91PGfhQtA5Ee57B/Kh7XpLkvPn+bws2E2l6dlSE278Cjh5cO7J21TAQ PZpOAy0/1Q45TIhOPZeS6kC79qR5Gkdyqofgw5HN475DhtHrrsd08wPBvHv5R6n/pU+m jmAZvO3ffrrx7IvMBGkBnKi+OhABDyW6wEjsU= MIME-Version: 1.0 Received: by 10.213.53.75 with SMTP id l11mr368207ebg.31.1274441366377; Fri, 21 May 2010 04:29:26 -0700 (PDT) Received: by 10.213.108.67 with HTTP; Fri, 21 May 2010 04:29:26 -0700 (PDT) In-Reply-To: <4BF62766.8070105@hardwarefreak.com> References: <20100521041415.GW8120@dastard> <4BF62766.8070105@hardwarefreak.com> Date: Fri, 21 May 2010 12:29:26 +0100 Message-ID: X-ASG-Orig-Subj: Re: Tuning XFS for real time audio on a laptop with encrypted LVM Subject: Re: Tuning XFS for real time audio on a laptop with encrypted LVM From: Pedro Ribeiro To: Stan Hoeppner , david@fromorbit.com Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-ew0-f228.google.com[209.85.219.228] X-Barracuda-Start-Time: 1274441447 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30397 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 21 May 2010 07:25, Stan Hoeppner wrote: > Dave Chinner put forth on 5/20/2010 11:14 PM: > >> I only ever use the noop scheduler with XFS these days. CFQ has been >> a steaming pile of ever changing regressions for the past 4 or 5 >> kernel releases, so i stopped using it. Besides, XFS is often 10-15% >> faster on no-op for the same workload, anyway... > > IIRC the elevator sits below the FS in the stack, and has a tighter > relationship to the block device driver and physical storage subsystem th= an > to the FS. =A0I have one box with a 7.2K 500GB WD drive and a sata_sil > controller that doesn't support NCQ. =A0Without NCQ due to no controller > support or ATA_horkage_NCQ blacklisted drives, the deadline and anticipat= ory > (now removed from the kernel IIRC) elevators yield vastly superior > performance under load compared to CFQ or noop. > > Noop fits well with good hardware RAID, either local machine PCI/x/e RAID > card or straight FC HBA talking to a SAN array controller. =A0CFQ just ge= ts in > the way with good hardware. =A0In some testing I've done with FC HBAs and > target LUNs on IBM FasTt and Nexsan SAN arrays, deadline has shown a tiny > advantage over noop with a few synthetic tests. =A0This testing was perfo= rmed > on SLED 10 and Debian Etch guests atop VMWare ESX 3 at night on weekends > when load across the ESX blade farm was near zero, but it was still done = in > a virtual environment. =A0On bare hardware, I'm not sure one would get th= e > same results. =A0Anyway, the deadline elevator gave such little advantage= over > noop, I'd still recommend noop on good hardware due to zero CPU overhead. > Deadline has a few fancy tricks so it will always eat more CPU, even thou= gh > it's a modest amount. > > I'd sum the elevator choice up this way: =A0If you have a good storage > hardware and driver combo such as fast SATA disks with good NCQ, or just > about any SCSI, SAS, RAID, or SAN setup, go with noop. =A0For lesser > hardware/drivers, use deadline (i.e. lacking or crappy NCQ, or on laptops > due to the slow 4200/5400 rpm drives, even if they do have good NCQ). > > I agree with Dave that CFQ isn't all that great, and in my testing it's e= ven > worse when used with Linux guests on ESX than it is on bare metal. > > Caveat: =A0I'm no expert, and I don't do storage subsystem performance te= sting > all day long. =A0I'm just reporting my first hand experience. =A0YMMV and= all > the normal disclaimers apply. > > -- > Stan > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > Thanks for the answers. I do value my data a lot (that's why I changed from Windows some years ago), and even though this is a laptop with battery protection I keep crashing and hard locking it because I like always to use -rcX kernels and to fool around with lots of dangerous stuff/settings/etc. Actually that is one of the reasons I stick with XFS instead of going to EXT4 or the like. I've been using and torturing XFS for a couple of years now and I NEVER suffered any corruption, and only had a couple of times where unimportant data loss happened, but it was completely expected because I was an ass. I only lost the data that was unsynched during the last minute though. I forgot to say that I have a SATA-I 5400rpm hard drive, it does support NCQ and since this is a laptop there is no RAID or similars. I've been running a few tests with bonnie++ and hdparm. hdparm reports my bare hard drive speed as 67 Mb/s for read. With bonnie++ the maximum I can get is 52 Mb/s with noop and cfq and deadline only gives me 48 Mb/s. This is not bad at all. noop is a tad faster in all the tests and the only thing it performs worse is in read latency, although read throughput appears to be the same. So it is agreed that CFQ sucks right now. I'll continue my testing but now with proper daily use to see which is better, deadline or noop. Regards, Pedro From stan@hardwarefreak.com Fri May 21 08:42:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_14, J_CHICKENPOX_43,J_CHICKENPOX_52,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LDfxaL009982 for ; Fri, 21 May 2010 08:42:00 -0500 X-ASG-Debug-ID: 1274449536-667401c10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 87CC91571A76 for ; Fri, 21 May 2010 06:45:36 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id DJCVl4bevd3CSoCf for ; Fri, 21 May 2010 06:45:36 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 50B5A6C264 for ; Fri, 21 May 2010 08:44:17 -0500 (CDT) Message-ID: <4BF68E74.8040305@hardwarefreak.com> Date: Fri, 21 May 2010 08:45:24 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Tuning XFS for real time audio on a laptop with encrypted LVM Subject: Re: Tuning XFS for real time audio on a laptop with encrypted LVM References: <20100521041415.GW8120@dastard> <4BF62766.8070105@hardwarefreak.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274449537 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_SC0_SA085, BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30406 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Pedro Ribeiro put forth on 5/21/2010 6:29 AM: > So it is agreed that CFQ sucks right now. I'll continue my testing but > now with proper daily use to see which is better, deadline or noop. I'd be curious to see what your seek performance is with each elevator on that laptop drive. Give this basic parallel seek tester a spin. Make runs with 1, 8, 16, 32, and 64 threads to find peak seek throughput and number of threads required to reach it. Each run takes about 30 seconds. For 7.2k rpm and up mechanical drives and SSDs you'd want to test 128 and 256 threads also. Due to the threaded nature good command queuing will have a substantial effect on results, as will elevator choice on some systems. For background info and evolution of this code, see this thread: http://www.linuxinsight.com/how_fast_is_your_disk.html compile with: gcc -o seeker_baryluk -O2 -march=native seeker_baryluk.c -pthread run command: ./seeker_baryluk device number_of_threads A nice feature is that you can test an entire drive or individual partitions (or an entire SAN LUN or just partitions on said LUN). This can tell you how much slower inner cylinders are compared to outer cylinders, and even works for local RAID and SAN LUNs. ./seeker_baryluk /dev/sda 64 ./seeker_baryluk /dev/sda2 64 ... ./seeker_baryluk /dev/sda9 64 I find this a much more informative simple test of storage subsystem performance than something like hdparm which is very small sequential I/O. --- seeker_baryluk.c --- #define _LARGEFILE64_SOURCE #ifndef _REENTRANT #define _REENTRANT #endif #include #include #include #include #include #include #include #include #include #include #include #define BLOCKSIZE 512 #define TIMEOUT 30 pthread_mutex_t muteks = PTHREAD_MUTEX_INITIALIZER; int count; time_t start; off64_t maxoffset = 0; off64_t minoffset = 249994674176000uLL; int threads; typedef struct { int id; int fd; int run; char* filename; unsigned int seed; unsigned long long numbytes; char* buffer; int count; off64_t maxoffset; off64_t minoffset; } parm; parm *p; void done() { int i; time_t end; time(&end); if (end < start + TIMEOUT) { printf("."); alarm(1); return; } for (i = 0; i < threads; i++) { p[i].run = 0; } } void report() { if (count) { printf(".\nResults: %d seeks/second, %.3f ms random access time (%llu < offsets < %llu)\n", count / TIMEOUT, 1000.0 * TIMEOUT / count, (unsigned long long)minoffset, (unsigned long long)maxoffset); } exit(EXIT_SUCCESS); } void handle(const char *string, int error) { if (error) { perror(string); exit(EXIT_FAILURE); } } void* f(void *arg) { int retval; off64_t offset; parm *p = (parm*)arg; srand(p->seed); /* wait for all processes */ pthread_mutex_lock(&muteks); pthread_mutex_unlock(&muteks); while (p->run) { offset = (off64_t) ( (unsigned long long) (p->numbytes * (rand_r(&(p->seed)) / (RAND_MAX + 1.0) ))); //printf("%d %llu\n", p->id, (unsigned long long )offset); retval = lseek64(p->fd, offset, SEEK_SET); handle("lseek64", retval == (off64_t) -1); retval = read(p->fd, p->buffer, BLOCKSIZE); handle("read", retval < 0); p->count++; if (offset > p->maxoffset) { p->maxoffset = offset; } else if (offset < p->minoffset) { p->minoffset = offset; } } //pthread_exit(NULL); return NULL; } int main(int argc, char **argv) { int fd, retval; int physical_sector_size = 0; size_t logical_sector_size = 0ULL; unsigned long long numblocks, numbytes; unsigned long long ull; unsigned long ul; pthread_t *t_id; pthread_attr_t pthread_custom_attr; int i; setvbuf(stdout, NULL, _IONBF, 0); printf("Seeker v3.0, 2009-06-17, " "http://www.linuxinsight.com/how_fast_is_your_disk.html\n"); if (!(argc == 2 || argc == 3)) { printf("Usage: %s device [threads]\n", argv[0]); exit(1); } threads = 1; if (argc == 3) { threads = atoi(argv[2]); } //pthread_mutex_init(&muteks, NULL); fd = open(argv[1], O_RDONLY | O_LARGEFILE); handle("open", fd < 0); #ifdef BLKGETSIZE64 retval = ioctl(fd, BLKGETSIZE64, &ull); numbytes = (unsigned long long)ull; #else retval = ioctl(fd, BLKGETSIZE, &ul); numbytes = (unsigned long long)ul; #endif handle("ioctl", retval == -1); retval = ioctl(fd, BLKBSZGET, &logical_sector_size); handle("ioctl", retval == -1 && logical_sector_size > 0); retval = ioctl(fd, BLKSSZGET, &physical_sector_size); handle("ioctl", retval == -1 && physical_sector_size > 0); numblocks = ((unsigned long long)numbytes)/(unsigned long long)BLOCKSIZE; printf("Benchmarking %s [%llu blocks, %llu bytes, %llu GB, %llu MB, %llu GiB, %llu MiB]\n", argv[1], numblocks, numbytes, numbytes/(1024uLL*1024uLL*1024uLL), numbytes / (1024uLL*1024uLL), numbytes/(1000uLL*1000uLL*1000uLL), numbytes / (1000uLL*1000uLL)); printf("[%d logical sector size, %d physical sector size]\n", physical_sector_size, physical_sector_size); printf("[%d threads]\n", threads); printf("Wait %d seconds", TIMEOUT); t_id = (pthread_t *)malloc(threads*sizeof(pthread_t)); handle("malloc", t_id == NULL); pthread_attr_init(&pthread_custom_attr); p = (parm *)malloc(sizeof(parm)*threads); handle("malloc", p == NULL); time(&start); pthread_mutex_lock(&muteks); srand((unsigned int)start*(unsigned int)getpid()); for (i = 0; i < threads; i++) { p[i].id = i; p[i].filename = argv[1]; p[i].seed = rand()+i; p[i].fd = dup(fd); handle("dup", p[i].fd < 0); p[i].buffer = malloc(sizeof(char)*BLOCKSIZE); p[i].numbytes = numbytes; handle("malloc", p[i].buffer == NULL); p[i].run = 1; p[i].count = 0; p[i].minoffset = minoffset; p[i].maxoffset = maxoffset; retval = pthread_create(&(t_id[i]), NULL, f, (void*)(p+i)); handle("pthread_create", retval != 0); } sleep(1); time(&start); signal(SIGALRM, &done); alarm(1); pthread_mutex_unlock(&muteks); for (i = 0; i < threads; i++) { pthread_join(t_id[i], NULL); } for (i = 0; i < threads; i++) { count += p[i].count; if (p[i].maxoffset > maxoffset) { maxoffset = p[i].maxoffset; } if (p[i].minoffset < minoffset) { minoffset = p[i].minoffset; } } report(); /* notreached */ return 0; } From BATV+ce7b3a5a96d54e5b3c50+2462+infradead.org+hch@bombadil.srs.infradead.org Fri May 21 10:01:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LF1bIW013544 for ; Fri, 21 May 2010 10:01:38 -0500 X-ASG-Debug-ID: 1274454236-37f600080000-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 683C136369D for ; Fri, 21 May 2010 08:03:56 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id wn9hfY8AI9IvKeBY for ; Fri, 21 May 2010 08:03:56 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OFTlP-0001Bk-SF; Fri, 21 May 2010 15:03:51 +0000 Date: Fri, 21 May 2010 11:03:51 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: Check new inode size is OK before preallocating Subject: Re: [PATCH] xfs: Check new inode size is OK before preallocating Message-ID: <20100521150351.GA3493@infradead.org> References: <1274420879-2391-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274420879-2391-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1274454237 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 21, 2010 at 03:47:59PM +1000, Dave Chinner wrote: > From: Dave Chinner > > The new xfsqa test 228 tries to preallocate more space than the > filesystem contains. it should fail, but instead triggers an assert > about lock flags. The failure is due to the size extension failing > in vmtruncate() due to rlimit being set. Check this before we start > the preallocation to avoid allocating space that will never be used. > > Also the path through xfs_vn_allocate already holds the IO lock, so > it should not be present in the lock flags when the setattr fails. > Hence the assert needs to take this into account. This will prevent > other such callers from hitting this incorrect ASSERT. Looks good, Reviewed-by: Christoph Hellwig Can you also add a check to 228 to ensure the space doesn't stay allocate when the test fails, to catch the old XFS behaviour. From BATV+ce7b3a5a96d54e5b3c50+2462+infradead.org+hch@bombadil.srs.infradead.org Fri May 21 10:02:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LF2jlr013613 for ; Fri, 21 May 2010 10:02:45 -0500 X-ASG-Debug-ID: 1274454305-37d200180000-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 A135B3636B5 for ; Fri, 21 May 2010 08:05:05 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id u8Gp5iBFDMEHtc2T for ; Fri, 21 May 2010 08:05:05 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OFTma-0001p8-Iw; Fri, 21 May 2010 15:05:04 +0000 Date: Fri, 21 May 2010 11:05:04 -0400 From: Christoph Hellwig To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/4] writeback: tracing and wbc->nr_to_write fixes Subject: Re: [PATCH 0/4] writeback: tracing and wbc->nr_to_write fixes Message-ID: <20100521150504.GA4598@infradead.org> References: <1271731314-5893-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1271731314-5893-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274454305 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean What happened to this series? Getting the trace events in will defintively help with tuning the writeback code, and we'll also need the nr_to_write issue fixed some way. From BATV+ce7b3a5a96d54e5b3c50+2462+infradead.org+hch@bombadil.srs.infradead.org Fri May 21 10:04:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LF4Lrw013681 for ; Fri, 21 May 2010 10:04:21 -0500 X-ASG-Debug-ID: 1274454401-24cb02570000-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 A7E3A1DF621C for ; Fri, 21 May 2010 08:06:41 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id BADdIozhpa0ro98v for ; Fri, 21 May 2010 08:06:41 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OFTo8-00022w-BK; Fri, 21 May 2010 15:06:40 +0000 Date: Fri, 21 May 2010 11:06:40 -0400 From: Christoph Hellwig To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/4] writeback: initial tracing support Subject: Re: [PATCH 1/4] writeback: initial tracing support Message-ID: <20100521150640.GB4598@infradead.org> References: <1271731314-5893-1-git-send-email-david@fromorbit.com> <1271731314-5893-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1271731314-5893-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1274454401 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Apr 20, 2010 at 12:41:51PM +1000, Dave Chinner wrote: > From: From: Jens Axboe > > Trace queue/sched/exec parts of the writeback loop. If you move the CREATE_TRACE_POINTS into fs-writeback.c and include after the sturcture defintions there's no need to move them to a header. From aelder@sgi.com Fri May 21 15:57:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LKvJiR030395 for ; Fri, 21 May 2010 15:57:19 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id B490EAC058; Fri, 21 May 2010 13:59:36 -0700 (PDT) Received: from [128.162.232.197] ([128.162.232.197]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 21 May 2010 15:59:35 -0500 Subject: Re: [PATCH 07/12] xfs: Improve scalability of busy extent tracking From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <20100521021619.GV8120@dastard> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> <1274138668-1662-8-git-send-email-david@fromorbit.com> <1274386538.2095.148.camel@doink> <20100521021619.GV8120@dastard> Content-Type: text/plain; charset="UTF-8" Date: Fri, 21 May 2010 15:59:35 -0500 Message-ID: <1274475575.2255.36.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 21 May 2010 20:59:35.0912 (UTC) FILETIME=[8503FE80:01CAF928] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 2010-05-21 at 12:16 +1000, Dave Chinner wrote: > On Thu, May 20, 2010 at 03:15:38PM -0500, Alex Elder wrote: > > On Tue, 2010-05-18 at 09:24 +1000, Dave Chinner wrote: . . . > FWIW, Alex, this code has been out there for some time now - could > you please attempt to review code before the last minute? Your > reviews are valuable and feedback like this while I was having > trouble with this code would have helped a great deal. However, now > I'm pressed for time to retest significant modifications right > before a merge deadline.... I'm really sorry Dave. I've been meaning to do this review for literally weeks, but have been repeatedly preempted by other things. I actually thought Linus wouldn't release the 2.6.34 as quickly as he did after -rc7, and expected I'd have another week or more to review this. In any case I'll put a better priority on it in the future--especially when we approach the start of a new release cycle. -Alex From aelder@sgi.com Fri May 21 15:59:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LKxn2j030572 for ; Fri, 21 May 2010 15:59:49 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 949ADAC055; Fri, 21 May 2010 14:02:06 -0700 (PDT) Received: from [128.162.232.197] ([128.162.232.197]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 21 May 2010 16:02:06 -0500 Subject: Re: [PATCH 08/12] xfs: Delayed logging design documentation From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1274138668-1662-9-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> <1274138668-1662-9-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Fri, 21 May 2010 16:02:05 -0500 Message-ID: <1274475725.2255.38.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 21 May 2010 21:02:06.0147 (UTC) FILETIME=[DE900930:01CAF928] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-05-18 at 09:24 +1000, Dave Chinner wrote: > From: Dave Chinner > > Document the design of the delayed logging implementation. This > includes assumptions made, dead ends followed, the reasoning behind > the structuring of the code, the layout of various structures, how > things fit together, traps and pit-falls avoided, etc. This is all > too much to document in the code itself, so do it in a separate > file. I found some typo's and other things, but will hold off suggesting (or posting fixes for) them until after we've got the baseline document checked in. Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > --- > .../filesystems/xfs-delayed-logging-design.txt | 819 ++++++++++++++++++++ > 1 files changed, 819 insertions(+), 0 deletions(-) > create mode 100644 Documentation/filesystems/xfs-delayed-logging-design.txt From aelder@sgi.com Fri May 21 16:03:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LL3jjR030732 for ; Fri, 21 May 2010 16:03:45 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6D630AC055; Fri, 21 May 2010 14:06:04 -0700 (PDT) Received: from [128.162.232.197] ([128.162.232.197]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 21 May 2010 16:06:03 -0500 Subject: Re: [PATCH 09/12] xfs: Introduce delayed logging core code From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1274138668-1662-10-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> <1274138668-1662-10-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Fri, 21 May 2010 16:06:03 -0500 Message-ID: <1274475963.2255.42.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 21 May 2010 21:06:03.0991 (UTC) FILETIME=[6C542670:01CAF929] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-05-18 at 09:24 +1000, Dave Chinner wrote: > From: Dave Chinner > > The delayed logging code only changes in-memory structures and as > such can be enabled and disabled with a mount option. Add the mount > option and emit a warning that this is an experimental feature that > should not be used in production yet. I gave this a careful review. I am a little surprised at how nicely you could stitch this in, leveraging the existing code, while still supporting the "old" logging model. Anyway, I found some nits but no bugs so I'm not going to bother mentioning them here. Reviewed-by: Alex Elder . . . > the necessary synchronisation for correct operation in both cases. > > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig > --- From aelder@sgi.com Fri May 21 16:19:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LLJ1iT031491 for ; Fri, 21 May 2010 16:19:02 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 29A66AC056; Fri, 21 May 2010 14:21:22 -0700 (PDT) Received: from [128.162.232.197] ([128.162.232.197]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 21 May 2010 16:21:21 -0500 Subject: Re: [PATCH 0/12] xfs: delayed logging V6 From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Fri, 21 May 2010 16:21:21 -0500 Message-ID: <1274476881.2255.47.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: quoted-printable X-OriginalArrivalTime: 21 May 2010 21:21:21.0709 (UTC) FILETIME=[8F54CDD0:01CAF92B] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-05-18 at 09:24 +1000, Dave Chinner wrote: > Hi Folks, >=20 > This is version 6 of the delayed logging series and is the first > release candidate for inclu=D1=95ion in the xfs-dev tree and 2.6.35-rc1. >=20 > I won't repeat everything about what it is, just point you > here: >=20 > http://marc.info/?l=3Dlinux-xfs&m=3D126862777118946&w=3D2 >=20 > for the description, and here: >=20 > git://git.kernel.org/pub/scm/linux/kernel/git/dgc/xfs.git delayed-logging I've reviewed the whole series. I see that you rebased and updated the code on your delayed-logging branch so I'll re-pull the updated version and after I run it through some testing of my own I will push the result to oss.sgi.com. After that I'll send a request to Linus to pull in these changes as well. -Alex From sandeen@sandeen.net Fri May 21 16:33:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LLXxBu031963 for ; Fri, 21 May 2010 16:33:59 -0500 X-ASG-Debug-ID: 1274477778-3df201610000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 98D743652AF for ; Fri, 21 May 2010 14:36:19 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id sCXDGpDBKDl8TeiQ for ; Fri, 21 May 2010 14:36:19 -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 mail.sandeen.net (Postfix) with ESMTP id 552A84966B5C; Fri, 21 May 2010 16:36:18 -0500 (CDT) Message-ID: <4BF6FCD1.10805@sandeen.net> Date: Fri, 21 May 2010 16:36:17 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: drop dmapi hooks Subject: Re: [PATCH 1/2] xfs: drop dmapi hooks References: <20100510140823.GA16540@infradead.org> In-Reply-To: <20100510140823.GA16540@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1274477779 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30432 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > Dmapi support was never merged upstream, but we still have a lot of hooks > bloating XFS for it, all over the fast pathes of the filesystem. > > This patch drops over 700 lines of dmapi overhead. If we'll ever get HSM > support in mainline at least the namespace events can be done much saner > in the VFS instead of the individual filesystem, so it's not like this > is much help for future work. > > Signed-off-by: Christoph Hellwig yeah, probably about time. There is a fair bit of dmapi crumbs left though: [sandeen@sandeen xfs]$ grep -ri dmapi * | wc -l 63 so I think this patch can go further toward its goal... -Eric From michael.monnerie@is.it-management.at Fri May 21 16:42:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LLgP4s032285 for ; Fri, 21 May 2010 16:42:25 -0500 X-ASG-Debug-ID: 1274478363-6a8801db0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8BAB7A07C16 for ; Fri, 21 May 2010 14:46:03 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id 8QTEc6huo8azU265 for ; Fri, 21 May 2010 14:46:03 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 1085D800189 for ; Fri, 21 May 2010 23:44:42 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id C453183C804 for ; Fri, 21 May 2010 23:44:41 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: kernel crash: scheduling while atomic Subject: kernel crash: scheduling while atomic Date: Fri, 21 May 2010 23:44:41 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart2133492.X4gh1j7eho"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005212344.41367@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1274478364 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30432 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart2133492.X4gh1j7eho Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Ist this caused by xfs? I just rsynced from another server to this one, the filesystem is nearly fu= ll, I was in the process of vgextend (done), lvextend (done) and just wanted to call xfs_growfs but before I could press enter the system was gone. It's a VM within XenServer, if that matters. Kernel 2.6.31.12-0.2-xen by openSUSE 11.2 [21877.948005] BUG: scheduling while atomic: rsync/2345/0xffff8800 [21877.948005] Modules linked in: af_packet nfs lockd fscache nfs_acl auth_= rpcgss sunrpc ipv6 ramzswap xvmalloc lzo_decompress lzo_compress loop dm_mo= d reiserfs xfs exportfs xennet xenblk cdrom [21877.948005] Pid: 2345, comm: rsync Not tainted 2.6.31.12-0.2-xen #1 [21877.948005] Call Trace: [21877.949649] [] try_stack_unwind+0x189/0x1b0 [21877.949659] [] dump_trace+0xa6/0x1e0 [21877.949666] [] show_trace_log_lvl+0x64/0x90 [21877.949676] [] show_trace+0x23/0x40 [21877.949684] [] dump_stack+0x81/0x9e [21877.949695] [] __schedule_bug+0x78/0x90 [21877.949702] [] thread_return+0x1d7/0x3fb [21877.949709] [] schedule_timeout+0x195/0x200 [21877.949717] [] wait_for_common+0x10b/0x230 [21877.949726] [] wait_for_completion+0x2b/0x50 [21877.949768] [] xfs_buf_iowait+0x31/0x80 [xfs] [21877.949894] [] _xfs_buf_read+0x70/0x80 [xfs] [21877.949992] [] xfs_buf_read_flags+0x8b/0xd0 [xfs] [21877.950089] [] xfs_trans_read_buf+0x1e9/0x320 [xfs] [21877.950174] [] xfs_btree_read_buf_block+0x68/0xe0 [xf= s] [21877.950232] [] xfs_btree_lookup_get_block+0x8e/0x110 = [xfs] [21877.950281] [] xfs_btree_lookup+0xdf/0x4d0 [xfs] [21877.950329] [] xfs_alloc_lookup_eq+0x27/0x50 [xfs] [21877.950361] [] xfs_alloc_fixup_trees+0x249/0x370 [xfs] [21877.950397] [] xfs_alloc_ag_vextent_near+0x4e0/0x9a0 = [xfs] [21877.950432] [] xfs_alloc_ag_vextent+0x105/0x160 [xfs] [21877.950471] [] xfs_alloc_vextent+0x3b4/0x4b0 [xfs] [21877.950504] [] xfs_bmbt_alloc_block+0xf8/0x210 [xfs] [21877.950550] [] xfs_btree_split+0xc7/0x720 [xfs] [21877.950597] [] xfs_btree_make_block_unfull+0x15c/0x1c= 0 [xfs] [21877.950643] [] xfs_btree_insrec+0x40f/0x5c0 [xfs] [21877.950689] [] xfs_btree_insert+0xa1/0x1b0 [xfs] [21877.950748] [] xfs_bmap_add_extent_delay_real+0x82e/0= x12a0 [xfs] [21877.950787] [] xfs_bmap_add_extent+0x424/0x450 [xfs] [21877.950833] [] xfs_bmapi+0xda3/0x1320 [xfs] [21877.950879] [] xfs_iomap_write_allocate+0x1d8/0x3f0 [= xfs] [21877.950953] [] xfs_iomap+0x2c9/0x300 [xfs] [21877.951021] [] xfs_map_blocks+0x38/0x60 [xfs] [21877.951108] [] xfs_page_state_convert+0x3fa/0x720 [xf= s] [21877.951204] [] xfs_vm_writepage+0x84/0x160 [xfs] [21877.951301] [] pageout+0x143/0x2b0 [21877.951308] [] shrink_page_list+0x26e/0x650 [21877.951314] [] shrink_inactive_list+0x2d3/0x7c0 [21877.951320] [] shrink_list+0x5b/0x110 [21877.951325] [] shrink_zone+0x171/0x250 [21877.951330] [] shrink_zones+0x83/0x120 [21877.951336] [] do_try_to_free_pages+0x9e/0x380 [21877.951342] [] try_to_free_pages+0x77/0xa0 [21877.951349] [] __alloc_pages_slowpath+0x2d3/0x5c0 [21877.951355] [] __alloc_pages_nodemask+0x151/0x160 [21877.951362] [] __page_cache_alloc+0x27/0x50 [21877.951368] [] grab_cache_page_write_begin+0x9a/0xe0 [21877.951376] [] block_write_begin+0xae/0x120 [21877.951396] [] xfs_vm_write_begin+0x34/0x50 [xfs] [21877.951482] [] generic_perform_write+0xc1/0x1f0 [21877.951489] [] generic_file_buffered_write+0x90/0x160 [21877.951512] [] xfs_write+0x521/0xb60 [xfs] [21877.951624] [] xfs_file_aio_write+0x70/0xa0 [xfs] [21877.951711] [] do_sync_write+0x102/0x160 [21877.951718] [] vfs_write+0xd8/0x1c0 [21877.951723] [] sys_write+0x5b/0xa0 [21877.951729] [] system_call_fastpath+0x16/0x1b [21877.951736] [<00007fc41b0fab10>] 0x7fc41b0fab10 [21877.951750] BUG: unable to handle kernel paging request at 0000000108743= 280 [21877.951755] IP: [] dequeue_task+0x72/0x110 [21877.951766] PGD 31c6f067 PUD 0=20 [21877.951770] Thread overran stack, or stack corrupted [21877.951773] Oops: 0000 [#1] SMP=20 [21877.951777] last sysfs file: /sys/kernel/uevent_seqnum [21877.951780] CPU 0=20 [21877.951783] Modules linked in: af_packet nfs lockd fscache nfs_acl auth_= rpcgss sunrpc ipv6 ramzswap xvmalloc lzo_decompress lzo_compress loop dm_mo= d reiserfs xfs exportfs xennet xenblk cdrom [21877.951817] Pid: 2345, comm: rsync Not tainted 2.6.31.12-0.2-xen #1=20 [21877.951821] RIP: e030:[] [] dequeue= _task+0x72/0x110 [21877.951826] RSP: e02b:ffff880030ff80e8 EFLAGS: 00010012 [21877.951830] RAX: 000000000000a380 RBX: ffff880028d72700 RCX: 0000000030f= f8028 [21877.951833] RDX: 0000000000000001 RSI: ffff880028d72700 RDI: ffffc900000= 0a380 [21877.951836] RBP: ffff880030ff8108 R08: ffff880030ff8000 R09: 00000000000= 00000 [21877.951839] R10: 00000000000010f3 R11: 0000000000000000 R12: 00000000000= 00000 [21877.951841] R13: ffff88000d864bf0 R14: 0000000000007d00 R15: 00000000000= 00000 [21877.951848] FS: 00007fc41bbc86f0(0000) GS:ffffc90000000000(0000) knlGS:= 000000000000000 [21877.951851] CS: e033 DS: 0000 ES: 0000 CR0: 000000008005003b [21877.951854] CR2: 0000000108743280 CR3: 0000000031c75000 CR4: 00000000000= 00660 [21877.951858] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 00000000000= 00000 [21877.951861] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 00000000000= 00400 [21877.951864] Process rsync (pid: 2345, threadinfo ffff880030ff8000, task = ffff880028d72700) [21877.951867] Stack: [21877.951869] ffff880030ff8138 0000000077adb4da 0000000000000000 ffffc900= 0000a380 [21877.951874] <0> ffff880030ff8138 ffffffff80034968 ffffc9000000a380 00000= 00077adb4da [21877.951880] <0> ffff88000d864bf0 ffffc9000000a380 ffff880030ff8248 fffff= fff8046c8fc [21877.951892] Call Trace: [21877.951898] [] deactivate_task+0x38/0x60 [21877.951907] [] thread_return+0x157/0x3fb [21877.951913] [] schedule_timeout+0x195/0x200 [21877.951922] [] wait_for_common+0x10b/0x230 [21877.951928] [] wait_for_completion+0x2b/0x50 [21877.951953] [] xfs_buf_iowait+0x31/0x80 [xfs] [21877.951991] [] _xfs_buf_read+0x70/0x80 [xfs] [21877.951991] [] xfs_buf_read_flags+0x8b/0xd0 [xfs] [21877.951991] [] xfs_trans_read_buf+0x1e9/0x320 [xfs] [21877.951991] [] xfs_btree_read_buf_block+0x68/0xe0 [xf= s] [21877.951991] [] xfs_btree_lookup_get_block+0x8e/0x110 = [xfs] [21877.951991] [] xfs_btree_lookup+0xdf/0x4d0 [xfs] [21877.951991] [] xfs_alloc_lookup_eq+0x27/0x50 [xfs] [21877.951991] [] xfs_alloc_fixup_trees+0x249/0x370 [xfs] [21877.951991] [] xfs_alloc_ag_vextent_near+0x4e0/0x9a0 = [xfs] [21877.951991] [] xfs_alloc_ag_vextent+0x105/0x160 [xfs] [21877.951991] [] xfs_alloc_vextent+0x3b4/0x4b0 [xfs] [21877.951991] [] xfs_bmbt_alloc_block+0xf8/0x210 [xfs] [21877.951991] [] xfs_btree_split+0xc7/0x720 [xfs] [21877.951991] [] xfs_btree_make_block_unfull+0x15c/0x1c= 0 [xfs] [21877.951991] [] xfs_btree_insrec+0x40f/0x5c0 [xfs] [21877.951991] [] xfs_btree_insert+0xa1/0x1b0 [xfs] [21877.951991] [] xfs_bmap_add_extent_delay_real+0x82e/0= x12a0 [xfs] [21877.951991] [] xfs_bmap_add_extent+0x424/0x450 [xfs] [21877.951991] [] xfs_bmapi+0xda3/0x1320 [xfs] [21877.951991] [] xfs_iomap_write_allocate+0x1d8/0x3f0 [= xfs] [21877.951991] [] xfs_iomap+0x2c9/0x300 [xfs] [21877.951991] [] xfs_map_blocks+0x38/0x60 [xfs] [21877.951991] [] xfs_page_state_convert+0x3fa/0x720 [xf= s] [21877.951991] [] xfs_vm_writepage+0x84/0x160 [xfs] [21877.951991] [] pageout+0x143/0x2b0 [21877.951991] [] shrink_page_list+0x26e/0x650 [21877.951991] [] shrink_inactive_list+0x2d3/0x7c0 [21877.951991] [] shrink_list+0x5b/0x110 [21877.951991] [] shrink_zone+0x171/0x250 [21877.951991] [] shrink_zones+0x83/0x120 [21877.951991] [] do_try_to_free_pages+0x9e/0x380 [21877.951991] [] try_to_free_pages+0x77/0xa0 [21877.951991] [] __alloc_pages_slowpath+0x2d3/0x5c0 [21877.951991] [] __alloc_pages_nodemask+0x151/0x160 [21877.951991] [] __page_cache_alloc+0x27/0x50 [21877.951991] [] grab_cache_page_write_begin+0x9a/0xe0 [21877.951991] [] block_write_begin+0xae/0x120 [21877.951991] [] xfs_vm_write_begin+0x34/0x50 [xfs] [21877.951991] [] generic_perform_write+0xc1/0x1f0 [21877.951991] [] generic_file_buffered_write+0x90/0x160 [21877.951991] [] xfs_write+0x521/0xb60 [xfs] [21877.951991] [] xfs_file_aio_write+0x70/0xa0 [xfs] [21877.951991] [] do_sync_write+0x102/0x160 [21877.951991] [] vfs_write+0xd8/0x1c0 [21877.951991] [] sys_write+0x5b/0xa0 [21877.951991] [] system_call_fastpath+0x16/0x1b [21877.951991] [<00007fc41b0fab10>] 0x7fc41b0fab10 [21877.951991] Code: 00 48 29 c8 48 29 f0 48 c1 f8 03 48 01 f0 48 89 83 a0 = 00 00 00 4c 8b 43 08 4c 8b 8b 18 02 00 00 48 c7 c0 80 a3 00 00 41 8b 48 18 = <48> 8b 0c cd 40 31 78 80 48 8b b4 08 40 08 00 00 31 c9 48 c7 83=20 [21877.951991] RIP [] dequeue_task+0x72/0x110 [21877.951991] RSP [21877.951991] CR2: 0000000108743280 [21877.951991] ---[ end trace 4e4e8115170a7eca ]--- =2D-=20 mit freundlichen Gr=C3=BCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=C3=A4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart2133492.X4gh1j7eho Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkv2/skACgkQzhSR9xwSCbSIaQCgwbwLNJkdYrjraiC/89NMvX0W 3moAnRi8xZvFMxGIUbb2E28o1WrG4w6B =FB3a -----END PGP SIGNATURE----- --nextPart2133492.X4gh1j7eho-- From sandeen@sandeen.net Fri May 21 16:54:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LLsNeC032930 for ; Fri, 21 May 2010 16:54:23 -0500 X-ASG-Debug-ID: 1274479002-3df8018d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2B38F36540D for ; Fri, 21 May 2010 14:56:42 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id Be9cMHp3jpPC7nGu for ; Fri, 21 May 2010 14:56:42 -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 mail.sandeen.net (Postfix) with ESMTP id AF1A54966B5C; Fri, 21 May 2010 16:56:41 -0500 (CDT) Message-ID: <4BF70199.1000607@sandeen.net> Date: Fri, 21 May 2010 16:56:41 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Michael Monnerie CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel crash: scheduling while atomic Subject: Re: kernel crash: scheduling while atomic References: <201005212344.41367@zmi.at> In-Reply-To: <201005212344.41367@zmi.at> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1274479003 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30433 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Michael Monnerie wrote: > Ist this caused by xfs? > > I just rsynced from another server to this one, the filesystem is nearly full, > I was in the process of vgextend (done), lvextend (done) and just wanted > to call xfs_growfs but before I could press enter the system was gone. > It's a VM within XenServer, if that matters. > Kernel 2.6.31.12-0.2-xen by openSUSE 11.2 I'm guessing you blew the stack. I've seen stack overruns hit thread flags which then cause this to trip, and that backtrace looks loooooong. oh and indeed: > [21877.951770] Thread overran stack, or stack corrupted \o/ I put that test in years ago, this is about the first time I've seen it be useful ;) So, this is a stack overrun issue. Reclaim recursed back into the filesystem. This should be a _NOFS allocation I'd think, but I don't have a suse kernel handy... upstream I wonder if xfs should be setting AOP_FLAG_NOFS in xfs_vm_write_begin .... -Eric > [21877.948005] BUG: scheduling while atomic: rsync/2345/0xffff8800 > [21877.948005] Modules linked in: af_packet nfs lockd fscache nfs_acl auth_rpcgss sunrpc ipv6 ramzswap xvmalloc lzo_decompress lzo_compress loop dm_mod reiserfs xfs exportfs xennet xenblk cdrom > [21877.948005] Pid: 2345, comm: rsync Not tainted 2.6.31.12-0.2-xen #1 > [21877.948005] Call Trace: > [21877.949649] [] try_stack_unwind+0x189/0x1b0 > [21877.949659] [] dump_trace+0xa6/0x1e0 > [21877.949666] [] show_trace_log_lvl+0x64/0x90 > [21877.949676] [] show_trace+0x23/0x40 > [21877.949684] [] dump_stack+0x81/0x9e > [21877.949695] [] __schedule_bug+0x78/0x90 > [21877.949702] [] thread_return+0x1d7/0x3fb > [21877.949709] [] schedule_timeout+0x195/0x200 > [21877.949717] [] wait_for_common+0x10b/0x230 > [21877.949726] [] wait_for_completion+0x2b/0x50 > [21877.949768] [] xfs_buf_iowait+0x31/0x80 [xfs] > [21877.949894] [] _xfs_buf_read+0x70/0x80 [xfs] > [21877.949992] [] xfs_buf_read_flags+0x8b/0xd0 [xfs] > [21877.950089] [] xfs_trans_read_buf+0x1e9/0x320 [xfs] > [21877.950174] [] xfs_btree_read_buf_block+0x68/0xe0 [xfs] > [21877.950232] [] xfs_btree_lookup_get_block+0x8e/0x110 [xfs] > [21877.950281] [] xfs_btree_lookup+0xdf/0x4d0 [xfs] > [21877.950329] [] xfs_alloc_lookup_eq+0x27/0x50 [xfs] > [21877.950361] [] xfs_alloc_fixup_trees+0x249/0x370 [xfs] > [21877.950397] [] xfs_alloc_ag_vextent_near+0x4e0/0x9a0 [xfs] > [21877.950432] [] xfs_alloc_ag_vextent+0x105/0x160 [xfs] > [21877.950471] [] xfs_alloc_vextent+0x3b4/0x4b0 [xfs] > [21877.950504] [] xfs_bmbt_alloc_block+0xf8/0x210 [xfs] > [21877.950550] [] xfs_btree_split+0xc7/0x720 [xfs] > [21877.950597] [] xfs_btree_make_block_unfull+0x15c/0x1c0 [xfs] > [21877.950643] [] xfs_btree_insrec+0x40f/0x5c0 [xfs] > [21877.950689] [] xfs_btree_insert+0xa1/0x1b0 [xfs] > [21877.950748] [] xfs_bmap_add_extent_delay_real+0x82e/0x12a0 [xfs] > [21877.950787] [] xfs_bmap_add_extent+0x424/0x450 [xfs] > [21877.950833] [] xfs_bmapi+0xda3/0x1320 [xfs] > [21877.950879] [] xfs_iomap_write_allocate+0x1d8/0x3f0 [xfs] > [21877.950953] [] xfs_iomap+0x2c9/0x300 [xfs] > [21877.951021] [] xfs_map_blocks+0x38/0x60 [xfs] > [21877.951108] [] xfs_page_state_convert+0x3fa/0x720 [xfs] > [21877.951204] [] xfs_vm_writepage+0x84/0x160 [xfs] > [21877.951301] [] pageout+0x143/0x2b0 > [21877.951308] [] shrink_page_list+0x26e/0x650 > [21877.951314] [] shrink_inactive_list+0x2d3/0x7c0 > [21877.951320] [] shrink_list+0x5b/0x110 > [21877.951325] [] shrink_zone+0x171/0x250 > [21877.951330] [] shrink_zones+0x83/0x120 > [21877.951336] [] do_try_to_free_pages+0x9e/0x380 > [21877.951342] [] try_to_free_pages+0x77/0xa0 > [21877.951349] [] __alloc_pages_slowpath+0x2d3/0x5c0 > [21877.951355] [] __alloc_pages_nodemask+0x151/0x160 > [21877.951362] [] __page_cache_alloc+0x27/0x50 > [21877.951368] [] grab_cache_page_write_begin+0x9a/0xe0 > [21877.951376] [] block_write_begin+0xae/0x120 > [21877.951396] [] xfs_vm_write_begin+0x34/0x50 [xfs] > [21877.951482] [] generic_perform_write+0xc1/0x1f0 > [21877.951489] [] generic_file_buffered_write+0x90/0x160 > [21877.951512] [] xfs_write+0x521/0xb60 [xfs] > [21877.951624] [] xfs_file_aio_write+0x70/0xa0 [xfs] > [21877.951711] [] do_sync_write+0x102/0x160 > [21877.951718] [] vfs_write+0xd8/0x1c0 > [21877.951723] [] sys_write+0x5b/0xa0 > [21877.951729] [] system_call_fastpath+0x16/0x1b > [21877.951736] [<00007fc41b0fab10>] 0x7fc41b0fab10 > [21877.951750] BUG: unable to handle kernel paging request at 0000000108743280 > [21877.951755] IP: [] dequeue_task+0x72/0x110 > [21877.951766] PGD 31c6f067 PUD 0 > [21877.951770] Thread overran stack, or stack corrupted > [21877.951773] Oops: 0000 [#1] SMP > [21877.951777] last sysfs file: /sys/kernel/uevent_seqnum > [21877.951780] CPU 0 > [21877.951783] Modules linked in: af_packet nfs lockd fscache nfs_acl auth_rpcgss sunrpc ipv6 ramzswap xvmalloc lzo_decompress lzo_compress loop dm_mod reiserfs xfs exportfs xennet xenblk cdrom > [21877.951817] Pid: 2345, comm: rsync Not tainted 2.6.31.12-0.2-xen #1 > [21877.951821] RIP: e030:[] [] dequeue_task+0x72/0x110 > [21877.951826] RSP: e02b:ffff880030ff80e8 EFLAGS: 00010012 > [21877.951830] RAX: 000000000000a380 RBX: ffff880028d72700 RCX: 0000000030ff8028 > [21877.951833] RDX: 0000000000000001 RSI: ffff880028d72700 RDI: ffffc9000000a380 > [21877.951836] RBP: ffff880030ff8108 R08: ffff880030ff8000 R09: 0000000000000000 > [21877.951839] R10: 00000000000010f3 R11: 0000000000000000 R12: 0000000000000000 > [21877.951841] R13: ffff88000d864bf0 R14: 0000000000007d00 R15: 0000000000000000 > [21877.951848] FS: 00007fc41bbc86f0(0000) GS:ffffc90000000000(0000) knlGS:000000000000000 > [21877.951851] CS: e033 DS: 0000 ES: 0000 CR0: 000000008005003b > [21877.951854] CR2: 0000000108743280 CR3: 0000000031c75000 CR4: 0000000000000660 > [21877.951858] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 > [21877.951861] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 > [21877.951864] Process rsync (pid: 2345, threadinfo ffff880030ff8000, task ffff880028d72700) > [21877.951867] Stack: > [21877.951869] ffff880030ff8138 0000000077adb4da 0000000000000000 ffffc9000000a380 > [21877.951874] <0> ffff880030ff8138 ffffffff80034968 ffffc9000000a380 0000000077adb4da > [21877.951880] <0> ffff88000d864bf0 ffffc9000000a380 ffff880030ff8248 ffffffff8046c8fc > [21877.951892] Call Trace: > [21877.951898] [] deactivate_task+0x38/0x60 > [21877.951907] [] thread_return+0x157/0x3fb > [21877.951913] [] schedule_timeout+0x195/0x200 > [21877.951922] [] wait_for_common+0x10b/0x230 > [21877.951928] [] wait_for_completion+0x2b/0x50 > [21877.951953] [] xfs_buf_iowait+0x31/0x80 [xfs] > [21877.951991] [] _xfs_buf_read+0x70/0x80 [xfs] > [21877.951991] [] xfs_buf_read_flags+0x8b/0xd0 [xfs] > [21877.951991] [] xfs_trans_read_buf+0x1e9/0x320 [xfs] > [21877.951991] [] xfs_btree_read_buf_block+0x68/0xe0 [xfs] > [21877.951991] [] xfs_btree_lookup_get_block+0x8e/0x110 [xfs] > [21877.951991] [] xfs_btree_lookup+0xdf/0x4d0 [xfs] > [21877.951991] [] xfs_alloc_lookup_eq+0x27/0x50 [xfs] > [21877.951991] [] xfs_alloc_fixup_trees+0x249/0x370 [xfs] > [21877.951991] [] xfs_alloc_ag_vextent_near+0x4e0/0x9a0 [xfs] > [21877.951991] [] xfs_alloc_ag_vextent+0x105/0x160 [xfs] > [21877.951991] [] xfs_alloc_vextent+0x3b4/0x4b0 [xfs] > [21877.951991] [] xfs_bmbt_alloc_block+0xf8/0x210 [xfs] > [21877.951991] [] xfs_btree_split+0xc7/0x720 [xfs] > [21877.951991] [] xfs_btree_make_block_unfull+0x15c/0x1c0 [xfs] > [21877.951991] [] xfs_btree_insrec+0x40f/0x5c0 [xfs] > [21877.951991] [] xfs_btree_insert+0xa1/0x1b0 [xfs] > [21877.951991] [] xfs_bmap_add_extent_delay_real+0x82e/0x12a0 [xfs] > [21877.951991] [] xfs_bmap_add_extent+0x424/0x450 [xfs] > [21877.951991] [] xfs_bmapi+0xda3/0x1320 [xfs] > [21877.951991] [] xfs_iomap_write_allocate+0x1d8/0x3f0 [xfs] > [21877.951991] [] xfs_iomap+0x2c9/0x300 [xfs] > [21877.951991] [] xfs_map_blocks+0x38/0x60 [xfs] > [21877.951991] [] xfs_page_state_convert+0x3fa/0x720 [xfs] > [21877.951991] [] xfs_vm_writepage+0x84/0x160 [xfs] > [21877.951991] [] pageout+0x143/0x2b0 > [21877.951991] [] shrink_page_list+0x26e/0x650 > [21877.951991] [] shrink_inactive_list+0x2d3/0x7c0 > [21877.951991] [] shrink_list+0x5b/0x110 > [21877.951991] [] shrink_zone+0x171/0x250 > [21877.951991] [] shrink_zones+0x83/0x120 > [21877.951991] [] do_try_to_free_pages+0x9e/0x380 > [21877.951991] [] try_to_free_pages+0x77/0xa0 > [21877.951991] [] __alloc_pages_slowpath+0x2d3/0x5c0 > [21877.951991] [] __alloc_pages_nodemask+0x151/0x160 > [21877.951991] [] __page_cache_alloc+0x27/0x50 > [21877.951991] [] grab_cache_page_write_begin+0x9a/0xe0 > [21877.951991] [] block_write_begin+0xae/0x120 > [21877.951991] [] xfs_vm_write_begin+0x34/0x50 [xfs] > [21877.951991] [] generic_perform_write+0xc1/0x1f0 > [21877.951991] [] generic_file_buffered_write+0x90/0x160 > [21877.951991] [] xfs_write+0x521/0xb60 [xfs] > [21877.951991] [] xfs_file_aio_write+0x70/0xa0 [xfs] > [21877.951991] [] do_sync_write+0x102/0x160 > [21877.951991] [] vfs_write+0xd8/0x1c0 > [21877.951991] [] sys_write+0x5b/0xa0 > [21877.951991] [] system_call_fastpath+0x16/0x1b > [21877.951991] [<00007fc41b0fab10>] 0x7fc41b0fab10 > [21877.951991] Code: 00 48 29 c8 48 29 f0 48 c1 f8 03 48 01 f0 48 89 83 a0 00 00 00 4c 8b 43 08 4c 8b 8b 18 02 00 00 48 c7 c0 80 a3 00 00 41 8b 48 18 <48> 8b 0c cd 40 31 78 80 48 8b b4 08 40 08 00 00 31 c9 48 c7 83 > [21877.951991] RIP [] dequeue_task+0x72/0x110 > [21877.951991] RSP > [21877.951991] CR2: 0000000108743280 > [21877.951991] ---[ end trace 4e4e8115170a7eca ]--- > > > > > ------------------------------------------------------------------------ > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From michael.monnerie@is.it-management.at Fri May 21 17:06:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LM6H6B033366 for ; Fri, 21 May 2010 17:06:17 -0500 X-ASG-Debug-ID: 1274479714-6c0c02eb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0D00E142790A for ; Fri, 21 May 2010 15:08:34 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id edBel032LqgMB28v for ; Fri, 21 May 2010 15:08:34 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id C81CB80018A; Sat, 22 May 2010 00:08:32 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 8B22183C804; Sat, 22 May 2010 00:08:32 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: Eric Sandeen X-ASG-Orig-Subj: Re: kernel crash: scheduling while atomic Subject: Re: kernel crash: scheduling while atomic Date: Sat, 22 May 2010 00:08:31 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) Cc: xfs@oss.sgi.com References: <201005212344.41367@zmi.at> <4BF70199.1000607@sandeen.net> In-Reply-To: <4BF70199.1000607@sandeen.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1487769.sp1qCaCPRE"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005220008.32150@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1274479717 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.2, rules version 3.2.2.30433 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1487769.sp1qCaCPRE Content-Type: multipart/mixed; boundary="Boundary-01=_gRw9Li2eRhkno8Z" Content-Transfer-Encoding: 7bit --Boundary-01=_gRw9Li2eRhkno8Z Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline On Freitag, 21. Mai 2010 Eric Sandeen wrote: > So, this is a stack overrun issue. Reclaim recursed back into the > filesystem. This should be a _NOFS allocation I'd think, but I don't > have a suse kernel handy... =20 Would the /proc/config.gz be useful? I attach it here. =2D-=20 mit freundlichen Gr=C3=BCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=C3=A4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --Boundary-01=_gRw9Li2eRhkno8Z Content-Type: application/x-gzip; name="config.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="config.gz" 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 Jjj5C0seAq/aukWCsjj6HyasVLFsiwEA --Boundary-01=_gRw9Li2eRhkno8Z-- --nextPart1487769.sp1qCaCPRE Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkv3BGAACgkQzhSR9xwSCbRPSQCeNQnLYN4RW6KxPdOXKCy50mDR FBkAoK8lh36inj4osNQZ96IPNGizaflq =xtKv -----END PGP SIGNATURE----- --nextPart1487769.sp1qCaCPRE-- From sandeen@sandeen.net Fri May 21 17:21:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4LMLN0M034031 for ; Fri, 21 May 2010 17:21:23 -0500 X-ASG-Debug-ID: 1274480701-6a8802b80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7878BA1303C for ; Fri, 21 May 2010 15:25:02 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id C2BzM3QMyaNJoTXi for ; Fri, 21 May 2010 15:25:02 -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 mail.sandeen.net (Postfix) with ESMTP id E020B4966B5C; Fri, 21 May 2010 17:23:40 -0500 (CDT) Message-ID: <4BF707EC.1040509@sandeen.net> Date: Fri, 21 May 2010 17:23:40 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: xfs-oss CC: Michael Monnerie X-ASG-Orig-Subj: [PATCH] xfs: don't allow recursion into fs under write_begin Subject: [PATCH] xfs: don't allow recursion into fs under write_begin Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1274480703 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30434 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Michael Monnerie reported this fantastic stack overflow: [21877.948005] BUG: scheduling while atomic: rsync/2345/0xffff8800 [21877.948005] Modules linked in: af_packet nfs lockd fscache nfs_acl auth_rpcgss sunrpc ipv6 ramzswap xvmalloc lzo_decompress lzo_compress loop dm_mod reiserfs xfs exportfs xennet xenblk cdrom [21877.948005] Pid: 2345, comm: rsync Not tainted 2.6.31.12-0.2-xen #1 [21877.948005] Call Trace: [21877.949649] [] try_stack_unwind+0x189/0x1b0 [21877.949659] [] dump_trace+0xa6/0x1e0 [21877.949666] [] show_trace_log_lvl+0x64/0x90 [21877.949676] [] show_trace+0x23/0x40 [21877.949684] [] dump_stack+0x81/0x9e [21877.949695] [] __schedule_bug+0x78/0x90 [21877.949702] [] thread_return+0x1d7/0x3fb [21877.949709] [] schedule_timeout+0x195/0x200 [21877.949717] [] wait_for_common+0x10b/0x230 [21877.949726] [] wait_for_completion+0x2b/0x50 [21877.949768] [] xfs_buf_iowait+0x31/0x80 [xfs] [21877.949894] [] _xfs_buf_read+0x70/0x80 [xfs] [21877.949992] [] xfs_buf_read_flags+0x8b/0xd0 [xfs] [21877.950089] [] xfs_trans_read_buf+0x1e9/0x320 [xfs] [21877.950174] [] xfs_btree_read_buf_block+0x68/0xe0 [xfs] [21877.950232] [] xfs_btree_lookup_get_block+0x8e/0x110 [xfs] [21877.950281] [] xfs_btree_lookup+0xdf/0x4d0 [xfs] [21877.950329] [] xfs_alloc_lookup_eq+0x27/0x50 [xfs] [21877.950361] [] xfs_alloc_fixup_trees+0x249/0x370 [xfs] [21877.950397] [] xfs_alloc_ag_vextent_near+0x4e0/0x9a0 [xfs] [21877.950432] [] xfs_alloc_ag_vextent+0x105/0x160 [xfs] [21877.950471] [] xfs_alloc_vextent+0x3b4/0x4b0 [xfs] [21877.950504] [] xfs_bmbt_alloc_block+0xf8/0x210 [xfs] [21877.950550] [] xfs_btree_split+0xc7/0x720 [xfs] [21877.950597] [] xfs_btree_make_block_unfull+0x15c/0x1c0 [xfs] [21877.950643] [] xfs_btree_insrec+0x40f/0x5c0 [xfs] [21877.950689] [] xfs_btree_insert+0xa1/0x1b0 [xfs] [21877.950748] [] xfs_bmap_add_extent_delay_real+0x82e/0x12a0 [xfs] [21877.950787] [] xfs_bmap_add_extent+0x424/0x450 [xfs] [21877.950833] [] xfs_bmapi+0xda3/0x1320 [xfs] [21877.950879] [] xfs_iomap_write_allocate+0x1d8/0x3f0 [xfs] [21877.950953] [] xfs_iomap+0x2c9/0x300 [xfs] [21877.951021] [] xfs_map_blocks+0x38/0x60 [xfs] [21877.951108] [] xfs_page_state_convert+0x3fa/0x720 [xfs] [21877.951204] [] xfs_vm_writepage+0x84/0x160 [xfs] [21877.951301] [] pageout+0x143/0x2b0 [21877.951308] [] shrink_page_list+0x26e/0x650 [21877.951314] [] shrink_inactive_list+0x2d3/0x7c0 [21877.951320] [] shrink_list+0x5b/0x110 [21877.951325] [] shrink_zone+0x171/0x250 [21877.951330] [] shrink_zones+0x83/0x120 [21877.951336] [] do_try_to_free_pages+0x9e/0x380 [21877.951342] [] try_to_free_pages+0x77/0xa0 [21877.951349] [] __alloc_pages_slowpath+0x2d3/0x5c0 [21877.951355] [] __alloc_pages_nodemask+0x151/0x160 [21877.951362] [] __page_cache_alloc+0x27/0x50 [21877.951368] [] grab_cache_page_write_begin+0x9a/0xe0 [21877.951376] [] block_write_begin+0xae/0x120 [21877.951396] [] xfs_vm_write_begin+0x34/0x50 [xfs] [21877.951482] [] generic_perform_write+0xc1/0x1f0 [21877.951489] [] generic_file_buffered_write+0x90/0x160 [21877.951512] [] xfs_write+0x521/0xb60 [xfs] [21877.951624] [] xfs_file_aio_write+0x70/0xa0 [xfs] [21877.951711] [] do_sync_write+0x102/0x160 [21877.951718] [] vfs_write+0xd8/0x1c0 [21877.951723] [] sys_write+0x5b/0xa0 [21877.951729] [] system_call_fastpath+0x16/0x1b [21877.951736] [<00007fc41b0fab10>] 0x7fc41b0fab10 [21877.951750] BUG: unable to handle kernel paging request at 0000000108743280 [21877.951755] IP: [] dequeue_task+0x72/0x110 [21877.951766] PGD 31c6f067 PUD 0 [21877.951770] Thread overran stack, or stack corrupted I don't think we can afford to let write_begin recurse into the fs, so we can set AOP_FLAG_NOFS ... is this too big a hammer? Reported-by: Michael Monnerie Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 57c3827..3fb2cc8 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c @@ -1678,6 +1678,8 @@ xfs_vm_write_begin( void **fsdata) { *pagep = NULL; + /* can't afford to recurse into fs due to stack reasons */ + flags |= AOP_FLAG_NOFS; return block_write_begin(file, mapping, pos, len, flags, pagep, fsdata, xfs_get_blocks); } From SRS0+tQJI+81+fromorbit.com=david@internode.on.net Fri May 21 19:06:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4M06vKH038106 for ; Fri, 21 May 2010 19:06:58 -0500 X-ASG-Debug-ID: 1274486956-3e0f03760000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EC005365512 for ; Fri, 21 May 2010 17:09:16 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id 301Cqt3vzE1aqJsx for ; Fri, 21 May 2010 17:09:16 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25286614-1927428 for multiple; Sat, 22 May 2010 09:39:14 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OFcHB-00036q-NA; Sat, 22 May 2010 10:09:13 +1000 Date: Sat, 22 May 2010 10:09:13 +1000 From: Dave Chinner To: Christoph Hellwig Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/4] writeback: tracing and wbc->nr_to_write fixes Subject: Re: [PATCH 0/4] writeback: tracing and wbc->nr_to_write fixes Message-ID: <20100522000913.GZ8120@dastard> References: <1271731314-5893-1-git-send-email-david@fromorbit.com> <20100521150504.GA4598@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100521150504.GA4598@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1274486957 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.2, rules version 3.2.2.30441 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 21, 2010 at 11:05:04AM -0400, Christoph Hellwig wrote: > What happened to this series? Getting the trace events in will > defintively help with tuning the writeback code, and we'll also need > the nr_to_write issue fixed some way. I've been snowed under trying to get several different things done all at the same time, so this has slipped. I'm trying to get back to it early next week. The nr_to_pages fix is badly needed, as that causes severe fragmentation in XFS for the exact workloads it fixes the severe fragmentation in ext4.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+Tu8o+81+fromorbit.com=david@internode.on.net Fri May 21 19:37:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4M0b5bm038930 for ; Fri, 21 May 2010 19:37:06 -0500 X-ASG-Debug-ID: 1274488764-3e3e03cd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2ACE0365834 for ; Fri, 21 May 2010 17:39:25 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id rRa9URhSUHQGCIIO for ; Fri, 21 May 2010 17:39:25 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13550500-1927428 for multiple; Sat, 22 May 2010 10:09:23 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OFckM-00038q-JA; Sat, 22 May 2010 10:39:22 +1000 Date: Sat, 22 May 2010 10:39:22 +1000 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/12] xfs: delayed logging V6 Subject: Re: [PATCH 0/12] xfs: delayed logging V6 Message-ID: <20100522003922.GC8120@dastard> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> <1274476881.2255.47.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1274476881.2255.47.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1274488766 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-ASG-Whitelist: BODY (http://marc\.info/\?) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 21, 2010 at 04:21:21PM -0500, Alex Elder wrote: > On Tue, 2010-05-18 at 09:24 +1000, Dave Chinner wrote: > > Hi Folks, > > > > This is version 6 of the delayed logging series and is the first > > release candidate for incluŃ•ion in the xfs-dev tree and 2.6.35-rc1. > > > > I won't repeat everything about what it is, just point you > > here: > > > > http://marc.info/?l=linux-xfs&m=126862777118946&w=2 > > > > for the description, and here: > > > > git://git.kernel.org/pub/scm/linux/kernel/git/dgc/xfs.git delayed-logging > > I've reviewed the whole series. I see that you > rebased and updated the code on your delayed-logging > branch so I'll re-pull the updated version and after > I run it through some testing of my own I will > push the result to oss.sgi.com. Yeah, it addresses the busy extent tracking bug you found. I'm still testing it myself, but I haven't found any issues yet. Changelog is: Changes for V7: o fixed typos in comments in busy extent tracking changes. o fixed potential null pointer deference when inserting busy extents o cleaned up busy extent insert loop Cheers, Dave. -- Dave Chinner david@fromorbit.com From pedrib@gmail.com Sat May 22 07:20:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_14,J_CHICKENPOX_43,J_CHICKENPOX_52,J_CHICKENPOX_65, T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4MCKd26066253 for ; Sat, 22 May 2010 07:20:39 -0500 X-ASG-Debug-ID: 1274531059-7ab602fc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-wy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0A82F149B907 for ; Sat, 22 May 2010 05:24:19 -0700 (PDT) Received: from mail-wy0-f181.google.com (mail-wy0-f181.google.com [74.125.82.181]) by cuda.sgi.com with ESMTP id w7CajXigHUllczLP for ; Sat, 22 May 2010 05:24:19 -0700 (PDT) Received: by wyf19 with SMTP id 19so1297153wyf.26 for ; Sat, 22 May 2010 05:22:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type; bh=IPkI+yc6kAZuEG7CyzoAaT7FpZ3kHKGc9n8bQgqpPWk=; b=NgJGzkUn2rrQJxzmqLGX6x9Onayy5UHxkEbqHkPWBhn4NzZ4+XIbx2k+KXObnSWx5b IyJWMzmtqkG7l+uKgSbTQ9vxPLz3vFr5ZqtABeZqAl6fpjZW0a4cOT0YFEZCwgtZCu04 T1wvrSnZSNJfjfo6KIHX9ZQMdgVjhWAKlY2C4= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=L92iXSIYo5dEpNJ8Z7HBBz6usMGmTAjwDs5dWqq9IX0s1+7VW8OOPzjUUotUD9IubO 0/x6sq3Bcxy+Tk9UGoFuq6cpSAIXVnS2CZkzQksDw79ON/VWuA1v9/vakOb8uMumWLC2 B7v9KeKy1uFYEwud1XNSWFcV5Jr2+qpiKvWkU= MIME-Version: 1.0 Received: by 10.216.155.141 with SMTP id j13mr1670119wek.7.1274530899850; Sat, 22 May 2010 05:21:39 -0700 (PDT) Received: by 10.216.157.1 with HTTP; Sat, 22 May 2010 05:21:39 -0700 (PDT) In-Reply-To: <4BF68E74.8040305@hardwarefreak.com> References: <20100521041415.GW8120@dastard> <4BF62766.8070105@hardwarefreak.com> <4BF68E74.8040305@hardwarefreak.com> Date: Sat, 22 May 2010 13:21:39 +0100 Message-ID: X-ASG-Orig-Subj: Re: Tuning XFS for real time audio on a laptop with encrypted LVM Subject: Re: Tuning XFS for real time audio on a laptop with encrypted LVM From: Pedro Ribeiro To: Stan Hoeppner Cc: xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=0016e649831c8a751a04872dd9a2 X-Barracuda-Connect: mail-wy0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1274531063 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=BSF_SC0_SA085, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0016e649831c8a751a04872dd9a2 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On 21 May 2010 14:45, Stan Hoeppner wrote: > Pedro Ribeiro put forth on 5/21/2010 6:29 AM: > >> So it is agreed that CFQ sucks right now. I'll continue my testing but >> now with proper daily use to see which is better, deadline or noop. > > I'd be curious to see what your seek performance is with each elevator on= that laptop drive. =A0Give this basic parallel seek tester a spin. > > Make runs with 1, 8, 16, 32, and 64 threads to find peak seek throughput = and number of threads required to reach it. =A0Each run takes about 30 seco= nds. =A0For 7.2k rpm and up mechanical drives and SSDs you'd want to test 1= 28 and 256 threads also. =A0Due to the threaded nature good command queuing= will have a substantial effect on results, as will elevator choice on some= systems. =A0For background info and evolution of this code, see this threa= d: =A0http://www.linuxinsight.com/how_fast_is_your_disk.html > > compile with: > gcc -o seeker_baryluk -O2 -march=3Dnative seeker_baryluk.c -pthread > > run command: > ./seeker_baryluk device number_of_threads > > A nice feature is that you can test an entire drive or individual partiti= ons (or an entire SAN LUN or just partitions on said LUN). =A0This can tell= you how much slower inner cylinders are compared to outer cylinders, and e= ven works for local RAID and SAN LUNs. > > ./seeker_baryluk /dev/sda 64 > ./seeker_baryluk /dev/sda2 64 > ... > ./seeker_baryluk /dev/sda9 64 > > I find this a much more informative simple test of storage subsystem perf= ormance than something like hdparm which is very small sequential I/O. > > --- seeker_baryluk.c --- > > #define _LARGEFILE64_SOURCE > > #ifndef _REENTRANT > #define _REENTRANT > #endif > #include > > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > > #define BLOCKSIZE 512 > #define TIMEOUT 30 > > pthread_mutex_t muteks =3D PTHREAD_MUTEX_INITIALIZER; > > int count; > time_t start; > off64_t maxoffset =3D 0; > off64_t minoffset =3D 249994674176000uLL; > > > int threads; > > typedef struct { > =A0 =A0 =A0 =A0int id; > =A0 =A0 =A0 =A0int fd; > =A0 =A0 =A0 =A0int run; > =A0 =A0 =A0 =A0char* filename; > =A0 =A0 =A0 =A0unsigned int seed; > =A0 =A0 =A0 =A0unsigned long long numbytes; > =A0 =A0 =A0 =A0char* buffer; > =A0 =A0 =A0 =A0int count; > =A0 =A0 =A0 =A0off64_t maxoffset; > =A0 =A0 =A0 =A0off64_t minoffset; > } parm; > > parm *p; > > void done() { > =A0 =A0 =A0 =A0int i; > =A0 =A0 =A0 =A0time_t end; > > =A0 =A0 =A0 =A0time(&end); > > =A0 =A0 =A0 =A0if (end < start + TIMEOUT) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0printf("."); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0alarm(1); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return; > =A0 =A0 =A0 =A0} > > =A0 =A0 =A0 =A0for (i =3D 0; i < threads; i++) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p[i].run =3D 0; > =A0 =A0 =A0 =A0} > } > > void report() { > =A0 =A0 =A0 =A0if (count) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0printf(".\nResults: %d seeks/second, %.3f = ms random access time (%llu < offsets < %llu)\n", > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0count / TIMEOUT, 1000.0 * = TIMEOUT / count, (unsigned long long)minoffset, (unsigned long long)maxoffs= et); > =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0exit(EXIT_SUCCESS); > } > > void handle(const char *string, int error) { > =A0 =A0 =A0 =A0if (error) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0perror(string); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0exit(EXIT_FAILURE); > =A0 =A0 =A0 =A0} > } > > void* f(void *arg) { > =A0 =A0 =A0 =A0int retval; > =A0 =A0 =A0 =A0off64_t offset; > > =A0 =A0 =A0 =A0parm *p =3D (parm*)arg; > > =A0 =A0 =A0 =A0srand(p->seed); > > =A0 =A0 =A0 =A0/* wait for all processes */ > =A0 =A0 =A0 =A0pthread_mutex_lock(&muteks); > =A0 =A0 =A0 =A0pthread_mutex_unlock(&muteks); > > =A0 =A0 =A0 =A0while (p->run) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0offset =3D (off64_t) ( (unsigned long long= ) (p->numbytes * (rand_r(&(p->seed)) / (RAND_MAX + 1.0) ))); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0//printf("%d %llu\n", p->id, (unsigned lon= g long )offset); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0retval =3D lseek64(p->fd, offset, SEEK_SET= ); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0handle("lseek64", retval =3D=3D (off64_t) = -1); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0retval =3D read(p->fd, p->buffer, BLOCKSIZ= E); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0handle("read", retval < 0); > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p->count++; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (offset > p->maxoffset) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p->maxoffset =3D offset; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} else if (offset < p->minoffset) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p->minoffset =3D offset; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0} > > =A0 =A0 =A0 =A0//pthread_exit(NULL); > =A0 =A0 =A0 =A0return NULL; > } > > int main(int argc, char **argv) { > =A0 =A0 =A0 =A0int fd, retval; > =A0 =A0 =A0 =A0int physical_sector_size =3D 0; > =A0 =A0 =A0 =A0size_t logical_sector_size =3D 0ULL; > =A0 =A0 =A0 =A0unsigned long long numblocks, numbytes; > =A0 =A0 =A0 =A0unsigned long long ull; > =A0 =A0 =A0 =A0unsigned long ul; > =A0 =A0 =A0 =A0pthread_t *t_id; > =A0 =A0 =A0 =A0pthread_attr_t pthread_custom_attr; > =A0 =A0 =A0 =A0int i; > > =A0 =A0 =A0 =A0setvbuf(stdout, NULL, _IONBF, 0); > > =A0 =A0 =A0 =A0printf("Seeker v3.0, 2009-06-17, " > =A0 =A0 =A0 =A0 =A0 =A0 =A0 "http://www.linuxinsight.com/how_fast_is_your= _disk.html\n"); > > =A0 =A0 =A0 =A0if (!(argc =3D=3D 2 || argc =3D=3D 3)) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0printf("Usage: %s device [threads]\n", arg= v[0]); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0exit(1); > =A0 =A0 =A0 =A0} > > =A0 =A0 =A0 =A0threads =3D 1; > =A0 =A0 =A0 =A0if (argc =3D=3D 3) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0threads =3D atoi(argv[2]); > =A0 =A0 =A0 =A0} > > =A0 =A0 =A0 =A0//pthread_mutex_init(&muteks, NULL); > > =A0 =A0 =A0 =A0fd =3D open(argv[1], O_RDONLY | O_LARGEFILE); > =A0 =A0 =A0 =A0handle("open", fd < 0); > > #ifdef BLKGETSIZE64 > =A0 =A0 =A0 =A0retval =3D ioctl(fd, BLKGETSIZE64, &ull); > =A0 =A0 =A0 =A0numbytes =3D (unsigned long long)ull; > #else > =A0 =A0 =A0 =A0retval =3D ioctl(fd, BLKGETSIZE, &ul); > =A0 =A0 =A0 =A0numbytes =3D (unsigned long long)ul; > #endif > =A0 =A0 =A0 =A0handle("ioctl", retval =3D=3D -1); > =A0 =A0 =A0 =A0retval =3D ioctl(fd, BLKBSZGET, &logical_sector_size); > =A0 =A0 =A0 =A0handle("ioctl", retval =3D=3D -1 && logical_sector_size > = 0); > =A0 =A0 =A0 =A0retval =3D ioctl(fd, BLKSSZGET, &physical_sector_size); > =A0 =A0 =A0 =A0handle("ioctl", retval =3D=3D -1 && physical_sector_size >= 0); > =A0 =A0 =A0 =A0numblocks =3D ((unsigned long long)numbytes)/(unsigned lon= g long)BLOCKSIZE; > =A0 =A0 =A0 =A0printf("Benchmarking %s [%llu blocks, %llu bytes, %llu GB,= %llu MB, %llu GiB, %llu MiB]\n", > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0argv[1], numblocks, numbytes, numbytes/(10= 24uLL*1024uLL*1024uLL), numbytes / (1024uLL*1024uLL), numbytes/(1000uLL*100= 0uLL*1000uLL), numbytes / (1000uLL*1000uLL)); > =A0 =A0 =A0 =A0printf("[%d logical sector size, %d physical sector size]\= n", physical_sector_size, physical_sector_size); > =A0 =A0 =A0 =A0printf("[%d threads]\n", threads); > =A0 =A0 =A0 =A0printf("Wait %d seconds", TIMEOUT); > > =A0 =A0 =A0 =A0t_id =3D (pthread_t *)malloc(threads*sizeof(pthread_t)); > =A0 =A0 =A0 =A0handle("malloc", t_id =3D=3D NULL); > =A0 =A0 =A0 =A0pthread_attr_init(&pthread_custom_attr); > =A0 =A0 =A0 =A0p =3D (parm *)malloc(sizeof(parm)*threads); > =A0 =A0 =A0 =A0handle("malloc", p =3D=3D NULL); > > =A0 =A0 =A0 =A0time(&start); > > =A0 =A0 =A0 =A0pthread_mutex_lock(&muteks); > > > =A0 =A0 =A0 =A0srand((unsigned int)start*(unsigned int)getpid()); > > =A0 =A0 =A0 =A0for (i =3D 0; i < threads; i++) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p[i].id =3D i; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p[i].filename =3D argv[1]; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p[i].seed =3D rand()+i; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p[i].fd =3D dup(fd); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0handle("dup", p[i].fd < 0); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p[i].buffer =3D malloc(sizeof(char)*BLOCKS= IZE); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p[i].numbytes =3D numbytes; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0handle("malloc", p[i].buffer =3D=3D NULL); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p[i].run =3D 1; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p[i].count =3D 0; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p[i].minoffset =3D minoffset; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p[i].maxoffset =3D maxoffset; > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0retval =3D pthread_create(&(t_id[i]), NULL= , f, (void*)(p+i)); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0handle("pthread_create", retval !=3D 0); > =A0 =A0 =A0 =A0} > > =A0 =A0 =A0 =A0sleep(1); > > =A0 =A0 =A0 =A0time(&start); > =A0 =A0 =A0 =A0signal(SIGALRM, &done); > =A0 =A0 =A0 =A0alarm(1); > > =A0 =A0 =A0 =A0pthread_mutex_unlock(&muteks); > > =A0 =A0 =A0 =A0for (i =3D 0; i < threads; i++) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0pthread_join(t_id[i], NULL); > =A0 =A0 =A0 =A0} > > =A0 =A0 =A0 =A0for (i =3D 0; i < threads; i++) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0count +=3D p[i].count; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (p[i].maxoffset > maxoffset) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0maxoffset =3D p[i].maxoffs= et; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (p[i].minoffset < minoffset) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0minoffset =3D p[i].minoffs= et; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0} > > =A0 =A0 =A0 =A0report(); > > =A0 =A0 =A0 =A0/* notreached */ > =A0 =A0 =A0 =A0return 0; > } > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > Hi, results are attached. There appears to be no difference between any of the schedulers. Regards, Pedro --0016e649831c8a751a04872dd9a2 Content-Type: application/octet-stream; name="seeker.results" Content-Disposition: attachment; filename="seeker.results" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g9ies7kf0 L2Rldi9zZGE6CgpBVEEgZGV2aWNlLCB3aXRoIG5vbi1yZW1vdmFibGUgbWVkaWEKCU1vZGVsIE51 bWJlcjogICAgICAgV0RDIFdEMzIwMEJFVlMtMDhWQVQyICAgICAgICAgICAgICAgICAgIAoJU2Vy aWFsIE51bWJlcjogICAgICBXRC1XWEswRTU5QVdZMjgKCUZpcm13YXJlIFJldmlzaW9uOiAgMTQu MDFBMTQKCVRyYW5zcG9ydDogICAgICAgICAgU2VyaWFsLCBTQVRBIDEuMGEsIFNBVEEgSUkgRXh0 ZW5zaW9ucywgU0FUQSBSZXYgMi41ClN0YW5kYXJkczoKCVN1cHBvcnRlZDogOCA3IDYgNSAKCUxp a2VseSB1c2VkOiA4CkNvbmZpZ3VyYXRpb246CglMb2dpY2FsCQltYXgJY3VycmVudAoJY3lsaW5k ZXJzCTE2MzgzCTE2MzgzCgloZWFkcwkJMTYJMTYKCXNlY3RvcnMvdHJhY2sJNjMJNjMKCS0tCglD SFMgY3VycmVudCBhZGRyZXNzYWJsZSBzZWN0b3JzOiAgIDE2NTE0MDY0CglMQkEgICAgdXNlciBh ZGRyZXNzYWJsZSBzZWN0b3JzOiAgMjY4NDM1NDU1CglMQkE0OCAgdXNlciBhZGRyZXNzYWJsZSBz ZWN0b3JzOiAgNjI1MTQyNDQ4CglMb2dpY2FsL1BoeXNpY2FsIFNlY3RvciBzaXplOiAgICAgICAg ICAgNTEyIGJ5dGVzCglkZXZpY2Ugc2l6ZSB3aXRoIE0gPSAxMDI0KjEwMjQ6ICAgICAgMzA1MjQ1 IE1CeXRlcwoJZGV2aWNlIHNpemUgd2l0aCBNID0gMTAwMCoxMDAwOiAgICAgIDMyMDA3MiBNQnl0 ZXMgKDMyMCBHQikKCWNhY2hlL2J1ZmZlciBzaXplICA9IDgxOTIgS0J5dGVzCglOb21pbmFsIE1l ZGlhIFJvdGF0aW9uIFJhdGU6IDU0MDAKQ2FwYWJpbGl0aWVzOgoJTEJBLCBJT1JEWShjYW4gYmUg ZGlzYWJsZWQpCglRdWV1ZSBkZXB0aDogMzIKCVN0YW5kYnkgdGltZXIgdmFsdWVzOiBzcGVjJ2Qg YnkgU3RhbmRhcmQsIG5vIGRldmljZSBzcGVjaWZpYyBtaW5pbXVtCglSL1cgbXVsdGlwbGUgc2Vj dG9yIHRyYW5zZmVyOiBNYXggPSAxNglDdXJyZW50ID0gMTYKCUFkdmFuY2VkIHBvd2VyIG1hbmFn ZW1lbnQgbGV2ZWw6IDE5MgoJUmVjb21tZW5kZWQgYWNvdXN0aWMgbWFuYWdlbWVudCB2YWx1ZTog MTI4LCBjdXJyZW50IHZhbHVlOiAyNTQKCURNQTogbWRtYTAgbWRtYTEgbWRtYTIgdWRtYTAgdWRt YTEgdWRtYTIgdWRtYTMgdWRtYTQgdWRtYTUgKnVkbWE2IAoJICAgICBDeWNsZSB0aW1lOiBtaW49 MTIwbnMgcmVjb21tZW5kZWQ9MTIwbnMKCVBJTzogcGlvMCBwaW8xIHBpbzIgcGlvMyBwaW80IAoJ ICAgICBDeWNsZSB0aW1lOiBubyBmbG93IGNvbnRyb2w9MTIwbnMgIElPUkRZIGZsb3cgY29udHJv bD0xMjBucwpDb21tYW5kcy9mZWF0dXJlczoKCUVuYWJsZWQJU3VwcG9ydGVkOgoJICAgKglTTUFS VCBmZWF0dXJlIHNldAoJICAgIAlTZWN1cml0eSBNb2RlIGZlYXR1cmUgc2V0CgkgICAqCVBvd2Vy IE1hbmFnZW1lbnQgZmVhdHVyZSBzZXQKCSAgICoJV3JpdGUgY2FjaGUKCSAgICoJTG9vay1haGVh ZAoJICAgKglIb3N0IFByb3RlY3RlZCBBcmVhIGZlYXR1cmUgc2V0CgkgICAqCVdSSVRFX0JVRkZF UiBjb21tYW5kCgkgICAqCVJFQURfQlVGRkVSIGNvbW1hbmQKCSAgICoJRE9XTkxPQURfTUlDUk9D T0RFCgkgICAqCUFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQgZmVhdHVyZSBzZXQKCSAgICAJU0VU X01BWCBzZWN1cml0eSBleHRlbnNpb24KCSAgICoJQXV0b21hdGljIEFjb3VzdGljIE1hbmFnZW1l bnQgZmVhdHVyZSBzZXQKCSAgICoJNDgtYml0IEFkZHJlc3MgZmVhdHVyZSBzZXQKCSAgICoJRGV2 aWNlIENvbmZpZ3VyYXRpb24gT3ZlcmxheSBmZWF0dXJlIHNldAoJICAgKglNYW5kYXRvcnkgRkxV U0hfQ0FDSEUKCSAgICoJRkxVU0hfQ0FDSEVfRVhUCgkgICAqCVNNQVJUIGVycm9yIGxvZ2dpbmcK CSAgICoJU01BUlQgc2VsZi10ZXN0CgkgICAqCUdlbmVyYWwgUHVycG9zZSBMb2dnaW5nIGZlYXR1 cmUgc2V0CgkgICAqCVdSSVRFX3tETUF8TVVMVElQTEV9X0ZVQV9FWFQKCSAgICoJNjQtYml0IFdv cmxkIHdpZGUgbmFtZQoJICAgKglJRExFX0lNTUVESUFURSB3aXRoIFVOTE9BRAoJICAgKglEaXNh YmxlIERhdGEgVHJhbnNmZXIgQWZ0ZXIgRXJyb3IgRGV0ZWN0aW9uCgkgICAqCVdSSVRFX1VOQ09S UkVDVEFCTEVfRVhUIGNvbW1hbmQKCSAgICoJU2VnbWVudGVkIERPV05MT0FEX01JQ1JPQ09ERQoJ ICAgKglHZW4xIHNpZ25hbGluZyBzcGVlZCAoMS41R2IvcykKCSAgICoJTmF0aXZlIENvbW1hbmQg UXVldWVpbmcgKE5DUSkKCSAgICoJSG9zdC1pbml0aWF0ZWQgaW50ZXJmYWNlIHBvd2VyIG1hbmFn ZW1lbnQKCSAgICoJUGh5IGV2ZW50IGNvdW50ZXJzCgkgICAqCURNQSBTZXR1cCBBdXRvLUFjdGl2 YXRlIG9wdGltaXphdGlvbgoJICAgIAlEZXZpY2UtaW5pdGlhdGVkIGludGVyZmFjZSBwb3dlciBt YW5hZ2VtZW50CgkgICAqCVNvZnR3YXJlIHNldHRpbmdzIHByZXNlcnZhdGlvbgoJICAgKglTTUFS VCBDb21tYW5kIFRyYW5zcG9ydCAoU0NUKSBmZWF0dXJlIHNldAoJICAgKglTQ1QgTG9uZyBTZWN0 b3IgQWNjZXNzIChBQzEpCgkgICAqCVNDVCBMQkEgU2VnbWVudCBBY2Nlc3MgKEFDMikKCSAgICoJ U0NUIEVycm9yIFJlY292ZXJ5IENvbnRyb2wgKEFDMykKCSAgICoJU0NUIEZlYXR1cmVzIENvbnRy b2wgKEFDNCkKCSAgICoJU0NUIERhdGEgVGFibGVzIChBQzUpCgkgICAgCXVua25vd24gMjA2WzEy XSAodmVuZG9yIHNwZWNpZmljKQoJICAgIAl1bmtub3duIDIwNlsxM10gKHZlbmRvciBzcGVjaWZp YykKU2VjdXJpdHk6IAoJTWFzdGVyIHBhc3N3b3JkIHJldmlzaW9uIGNvZGUgPSA2NTUzNAoJCXN1 cHBvcnRlZAoJbm90CWVuYWJsZWQKCW5vdAlsb2NrZWQKCQlmcm96ZW4KCW5vdAlleHBpcmVkOiBz ZWN1cml0eSBjb3VudAoJCXN1cHBvcnRlZDogZW5oYW5jZWQgZXJhc2UKCTEwMm1pbiBmb3IgU0VD VVJJVFkgRVJBU0UgVU5JVC4gMTAybWluIGZvciBFTkhBTkNFRCBTRUNVUklUWSBFUkFTRSBVTklU LgpMb2dpY2FsIFVuaXQgV1dOIERldmljZSBJZGVudGlmaWVyOiA1MDAxNGVlMjAzMDkzMDA2CglO QUEJCTogNQoJSUVFRSBPVUkJOiAwMDE0ZWUKCVVuaXF1ZSBJRAk6IDIwMzA5MzAwNgpDaGVja3N1 bTogY29ycmVjdAoKVGVzdGluZyB3aXRoIG5vb3AKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KMSB0aHJlYWRzIG5vb3AKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0 dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5j aG1hcmtpbmcgL2Rldi9zZGExIFs2OTA3MzIgYmxvY2tzLCAzNTM2NTQ3ODQgYnl0ZXMsIDAgR0Is IDMzNyBNQiwgMCBHaUIsIDM1MyBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBo eXNpY2FsIHNlY3RvciBzaXplXQpbMSB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMuLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czogMTI3IHNlZWtzL3NlY29uZCwgNy44NTUgbXMg cmFuZG9tIGFjY2VzcyB0aW1lICgzNTE3IDwgb2Zmc2V0cyA8IDM1MzUzODY1OSkKU2Vla2VyIHYz LjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195 b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9zZGEyIFs2MjQ0NDY1NTAgYmxvY2tzLCAz MTk3MTY2MzM2MDAgYnl0ZXMsIDI5NyBHQiwgMzA0OTA1IE1CLCAzMTkgR2lCLCAzMTk3MTYgTWlC XQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzEg dGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJl c3VsdHM6IDU3IHNlZWtzL3NlY29uZCwgMTcuMjcxIG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoMjc3 ODg3MDEwIDwgb2Zmc2V0cyA8IDMxOTY3MTM4NTA1MSkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcs IGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApC ZW5jaG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3VwLVJPT1QgWzUyNDI4ODAwIGJsb2NrcywgMjY4 NDM1NDU2MDAgYnl0ZXMsIDI1IEdCLCAyNTYwMCBNQiwgMjYgR2lCLCAyNjg0MyBNaUJdCls1MTIg bG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbMSB0aHJlYWRz XQpXYWl0IDMwIHNlY29uZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czog Nzkgc2Vla3Mvc2Vjb25kLCAxMi41ODQgbXMgcmFuZG9tIGFjY2VzcyB0aW1lICg0ODA0MjUwIDwg b2Zmc2V0cyA8IDI2ODQyMjU3MDAwKQpTZWVrZXIgdjMuMCwgMjAwOS0wNi0xNywgaHR0cDovL3d3 dy5saW51eGluc2lnaHQuY29tL2hvd19mYXN0X2lzX3lvdXJfZGlzay5odG1sCkJlbmNobWFya2lu ZyAvZGV2L21hcHBlci92Z3JvdXAtU1dBUCBbMjA5NzE1MjAgYmxvY2tzLCAxMDczNzQxODI0MCBi eXRlcywgMTAgR0IsIDEwMjQwIE1CLCAxMCBHaUIsIDEwNzM3IE1pQl0KWzUxMiBsb2dpY2FsIHNl Y3RvciBzaXplLCA1MTIgcGh5c2ljYWwgc2VjdG9yIHNpemVdClsxIHRocmVhZHNdCldhaXQgMzAg c2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiA3OCBzZWVrcy9z ZWNvbmQsIDEyLjcyOCBtcyByYW5kb20gYWNjZXNzIHRpbWUgKDM0MzYyNTUgPCBvZmZzZXRzIDwg MTA3MzcyNjM3NTUpClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5z aWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvbWFw cGVyL3Zncm91cC1IT01FIFs1NTEwNDMwNzIgYmxvY2tzLCAyODIxMzQwNTI4NjQgYnl0ZXMsIDI2 MiBHQiwgMjY5MDY0IE1CLCAyODIgR2lCLCAyODIxMzQgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9y IHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzEgdGhyZWFkc10KV2FpdCAzMCBzZWNv bmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDUzIHNlZWtzL3NlY29u ZCwgMTguNjIyIG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoMTI2OTExNjI5IDwgb2Zmc2V0cyA8IDI4 MjA2MDY3MzE0NikKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KOCB0 aHJlYWRzIG5vb3AKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNp Z2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9zZGEx IFs2OTA3MzIgYmxvY2tzLCAzNTM2NTQ3ODQgYnl0ZXMsIDAgR0IsIDMzNyBNQiwgMCBHaUIsIDM1 MyBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXpl XQpbOCB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4KUmVzdWx0czogMzE2IHNlZWtzL3NlY29uZCwgMy4xNTkgbXMgcmFuZG9tIGFjY2VzcyB0aW1l ICgxMDYwMCA8IG9mZnNldHMgPCAzNTM2MTU5NzcpClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBo dHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVu Y2htYXJraW5nIC9kZXYvc2RhMiBbNjI0NDQ2NTUwIGJsb2NrcywgMzE5NzE2NjMzNjAwIGJ5dGVz LCAyOTcgR0IsIDMwNDkwNSBNQiwgMzE5IEdpQiwgMzE5NzE2IE1pQl0KWzUxMiBsb2dpY2FsIHNl Y3RvciBzaXplLCA1MTIgcGh5c2ljYWwgc2VjdG9yIHNpemVdClsxIHRocmVhZHNdCldhaXQgMzAg c2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiA1OCBzZWVrcy9z ZWNvbmQsIDE3LjA3NSBtcyByYW5kb20gYWNjZXNzIHRpbWUgKDUzMTE0MzA3MiA8IG9mZnNldHMg PCAzMTk2MTE5OTI3ODcpClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4 aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYv bWFwcGVyL3Zncm91cC1ST09UIFs1MjQyODgwMCBibG9ja3MsIDI2ODQzNTQ1NjAwIGJ5dGVzLCAy NSBHQiwgMjU2MDAgTUIsIDI2IEdpQiwgMjY4NDMgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNp emUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzggdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRz Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDEyNCBzZWVrcy9zZWNvbmQs IDguMDEzIG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoMTAyMjgzODcgPCBvZmZzZXRzIDwgMjY4Mjk1 NTI4MzcpClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5j b20vaG93X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvbWFwcGVyL3Zn cm91cC1TV0FQIFsyMDk3MTUyMCBibG9ja3MsIDEwNzM3NDE4MjQwIGJ5dGVzLCAxMCBHQiwgMTAy NDAgTUIsIDEwIEdpQiwgMTA3MzcgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBw aHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzggdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDE1OSBzZWVrcy9zZWNvbmQsIDYuMjcyIG1z IHJhbmRvbSBhY2Nlc3MgdGltZSAoODgwMzYwIDwgb2Zmc2V0cyA8IDEwNzM0NjI4OTY1KQpTZWVr ZXIgdjMuMCwgMjAwOS0wNi0xNywgaHR0cDovL3d3dy5saW51eGluc2lnaHQuY29tL2hvd19mYXN0 X2lzX3lvdXJfZGlzay5odG1sCkJlbmNobWFya2luZyAvZGV2L21hcHBlci92Z3JvdXAtSE9NRSBb NTUxMDQzMDcyIGJsb2NrcywgMjgyMTM0MDUyODY0IGJ5dGVzLCAyNjIgR0IsIDI2OTA2NCBNQiwg MjgyIEdpQiwgMjgyMTM0IE1pQl0KWzUxMiBsb2dpY2FsIHNlY3RvciBzaXplLCA1MTIgcGh5c2lj YWwgc2VjdG9yIHNpemVdCls4IHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiA4OSBzZWVrcy9zZWNvbmQsIDExLjIxNSBtcyByYW5k b20gYWNjZXNzIHRpbWUgKDU2NzI3OTY2IDwgb2Zmc2V0cyA8IDI4MjA4NzE0NjI1OCkKLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMTYgdGhyZWFkcyBub29wClNlZWtl ciB2My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3Rf aXNfeW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvc2RhMSBbNjkwNzMyIGJsb2Nrcywg MzUzNjU0Nzg0IGJ5dGVzLCAwIEdCLCAzMzcgTUIsIDAgR2lCLCAzNTMgTWlCXQpbNTEyIGxvZ2lj YWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzE2IHRocmVhZHNdCldh aXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiA2MDEg c2Vla3Mvc2Vjb25kLCAxLjY2MiBtcyByYW5kb20gYWNjZXNzIHRpbWUgKDI0NDQ0IDwgb2Zmc2V0 cyA8IDM1MzY0NDAzMykKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhp bnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9z ZGEyIFs2MjQ0NDY1NTAgYmxvY2tzLCAzMTk3MTY2MzM2MDAgYnl0ZXMsIDI5NyBHQiwgMzA0OTA1 IE1CLCAzMTkgR2lCLCAzMTk3MTYgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBw aHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzE2IHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiAxMDEgc2Vla3Mvc2Vjb25kLCA5Ljg1OSBt cyByYW5kb20gYWNjZXNzIHRpbWUgKDE5ODY5MzQ1MyA8IG9mZnNldHMgPCAzMTk3MTAzNzAwODMp ClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93 X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvbWFwcGVyL3Zncm91cC1S T09UIFs1MjQyODgwMCBibG9ja3MsIDI2ODQzNTQ1NjAwIGJ5dGVzLCAyNSBHQiwgMjU2MDAgTUIs IDI2IEdpQiwgMjY4NDMgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNh bCBzZWN0b3Igc2l6ZV0KWzE2IHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiAxNTAgc2Vla3Mvc2Vjb25kLCA2LjY1NSBtcyByYW5k b20gYWNjZXNzIHRpbWUgKDQ5NTg2ODcgPCBvZmZzZXRzIDwgMjY4NDE1ODkwMTIpClNlZWtlciB2 My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNf eW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvbWFwcGVyL3Zncm91cC1TV0FQIFsyMDk3 MTUyMCBibG9ja3MsIDEwNzM3NDE4MjQwIGJ5dGVzLCAxMCBHQiwgMTAyNDAgTUIsIDEwIEdpQiwg MTA3MzcgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Ig c2l6ZV0KWzE2IHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLgpSZXN1bHRzOiAxODcgc2Vla3Mvc2Vjb25kLCA1LjM0NyBtcyByYW5kb20gYWNjZXNz IHRpbWUgKDgzMDA4NSA8IG9mZnNldHMgPCAxMDczNzI1ODI2MCkKU2Vla2VyIHYzLjAsIDIwMDkt MDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2su aHRtbApCZW5jaG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3VwLUhPTUUgWzU1MTA0MzA3MiBibG9j a3MsIDI4MjEzNDA1Mjg2NCBieXRlcywgMjYyIEdCLCAyNjkwNjQgTUIsIDI4MiBHaUIsIDI4MjEz NCBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXpl XQpbMTYgdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uClJlc3VsdHM6IDk5IHNlZWtzL3NlY29uZCwgMTAuMDMzIG1zIHJhbmRvbSBhY2Nlc3MgdGlt ZSAoNTc2MjQxMCA8IG9mZnNldHMgPCAyODIwNjI3NzczMTEpCi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCjMyIHRocmVhZHMgbm9vcApTZWVrZXIgdjMuMCwgMjAwOS0w Ni0xNywgaHR0cDovL3d3dy5saW51eGluc2lnaHQuY29tL2hvd19mYXN0X2lzX3lvdXJfZGlzay5o dG1sCkJlbmNobWFya2luZyAvZGV2L3NkYTEgWzY5MDczMiBibG9ja3MsIDM1MzY1NDc4NCBieXRl cywgMCBHQiwgMzM3IE1CLCAwIEdpQiwgMzUzIE1pQl0KWzUxMiBsb2dpY2FsIHNlY3RvciBzaXpl LCA1MTIgcGh5c2ljYWwgc2VjdG9yIHNpemVdClszMiB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMu Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czogNDkzNzY3IHNlZWtzL3NlY29u ZCwgMC4wMDIgbXMgcmFuZG9tIGFjY2VzcyB0aW1lICg2NCA8IG9mZnNldHMgPCAzNTM2NTQ3Nzkp ClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93 X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvc2RhMiBbNjI0NDQ2NTUw IGJsb2NrcywgMzE5NzE2NjMzNjAwIGJ5dGVzLCAyOTcgR0IsIDMwNDkwNSBNQiwgMzE5IEdpQiwg MzE5NzE2IE1pQl0KWzUxMiBsb2dpY2FsIHNlY3RvciBzaXplLCA1MTIgcGh5c2ljYWwgc2VjdG9y IHNpemVdClszMiB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4KUmVzdWx0czogMTEyIHNlZWtzL3NlY29uZCwgOC45MjYgbXMgcmFuZG9tIGFjY2Vz cyB0aW1lICg1NzU3OTM1NyA8IG9mZnNldHMgPCAzMTk0NTI0NDM4MTYpClNlZWtlciB2My4wLCAy MDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9k aXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvbWFwcGVyL3Zncm91cC1ST09UIFs1MjQyODgwMCBi bG9ja3MsIDI2ODQzNTQ1NjAwIGJ5dGVzLCAyNSBHQiwgMjU2MDAgTUIsIDI2IEdpQiwgMjY4NDMg TWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0K WzMyIHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u LgpSZXN1bHRzOiAxODAgc2Vla3Mvc2Vjb25kLCA1LjU0MSBtcyByYW5kb20gYWNjZXNzIHRpbWUg KDcyOTUwODcgPCBvZmZzZXRzIDwgMjY4MzY3MTU2ODcpClNlZWtlciB2My4wLCAyMDA5LTA2LTE3 LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwK QmVuY2htYXJraW5nIC9kZXYvbWFwcGVyL3Zncm91cC1TV0FQIFsyMDk3MTUyMCBibG9ja3MsIDEw NzM3NDE4MjQwIGJ5dGVzLCAxMCBHQiwgMTAyNDAgTUIsIDEwIEdpQiwgMTA3MzcgTWlCXQpbNTEy IGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzMyIHRocmVh ZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRz OiAyMTIgc2Vla3Mvc2Vjb25kLCA0LjcwNCBtcyByYW5kb20gYWNjZXNzIHRpbWUgKDYyNjg3NSA8 IG9mZnNldHMgPCAxMDczNjAwOTA3NSkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93 d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtp bmcgL2Rldi9tYXBwZXIvdmdyb3VwLUhPTUUgWzU1MTA0MzA3MiBibG9ja3MsIDI4MjEzNDA1Mjg2 NCBieXRlcywgMjYyIEdCLCAyNjkwNjQgTUIsIDI4MiBHaUIsIDI4MjEzNCBNaUJdCls1MTIgbG9n aWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbMzIgdGhyZWFkc10K V2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDEx NSBzZWVrcy9zZWNvbmQsIDguNjMzIG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoODQyOTk1MzcgPCBv ZmZzZXRzIDwgMjgyMDk3NTU0NzUyKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQo2NCB0aHJlYWRzIG5vb3AKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93 d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtp bmcgL2Rldi9zZGExIFs2OTA3MzIgYmxvY2tzLCAzNTM2NTQ3ODQgYnl0ZXMsIDAgR0IsIDMzNyBN QiwgMCBHaUIsIDM1MyBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2Fs IHNlY3RvciBzaXplXQpbNjQgdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDExMzYwODIgc2Vla3Mvc2Vjb25kLCAwLjAwMSBtcyBy YW5kb20gYWNjZXNzIHRpbWUgKDAgPCBvZmZzZXRzIDwgMzUzNjU0NzgzKQpTZWVrZXIgdjMuMCwg MjAwOS0wNi0xNywgaHR0cDovL3d3dy5saW51eGluc2lnaHQuY29tL2hvd19mYXN0X2lzX3lvdXJf ZGlzay5odG1sCkJlbmNobWFya2luZyAvZGV2L3NkYTIgWzYyNDQ0NjU1MCBibG9ja3MsIDMxOTcx NjYzMzYwMCBieXRlcywgMjk3IEdCLCAzMDQ5MDUgTUIsIDMxOSBHaUIsIDMxOTcxNiBNaUJdCls1 MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbNjQgdGhy ZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3Vs dHM6IDExMyBzZWVrcy9zZWNvbmQsIDguNzgwIG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoMTUwNDIy OTQ1IDwgb2Zmc2V0cyA8IDMxOTUwODQ0MjUxNykKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0 dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5j aG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3VwLVJPT1QgWzUyNDI4ODAwIGJsb2NrcywgMjY4NDM1 NDU2MDAgYnl0ZXMsIDI1IEdCLCAyNTYwMCBNQiwgMjYgR2lCLCAyNjg0MyBNaUJdCls1MTIgbG9n aWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbNjQgdGhyZWFkc10K V2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDE3 OSBzZWVrcy9zZWNvbmQsIDUuNTcxIG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoMjcxMjQ2MiA8IG9m ZnNldHMgPCAyNjgzNzAwMjk1MCkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cu bGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcg L2Rldi9tYXBwZXIvdmdyb3VwLVNXQVAgWzIwOTcxNTIwIGJsb2NrcywgMTA3Mzc0MTgyNDAgYnl0 ZXMsIDEwIEdCLCAxMDI0MCBNQiwgMTAgR2lCLCAxMDczNyBNaUJdCls1MTIgbG9naWNhbCBzZWN0 b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbNjQgdGhyZWFkc10KV2FpdCAzMCBz ZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDIxMSBzZWVrcy9z ZWNvbmQsIDQuNzM1IG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoOTA2NTc1IDwgb2Zmc2V0cyA8IDEw NzM1MDAwODgwKQpTZWVrZXIgdjMuMCwgMjAwOS0wNi0xNywgaHR0cDovL3d3dy5saW51eGluc2ln aHQuY29tL2hvd19mYXN0X2lzX3lvdXJfZGlzay5odG1sCkJlbmNobWFya2luZyAvZGV2L21hcHBl ci92Z3JvdXAtSE9NRSBbNTUxMDQzMDcyIGJsb2NrcywgMjgyMTM0MDUyODY0IGJ5dGVzLCAyNjIg R0IsIDI2OTA2NCBNQiwgMjgyIEdpQiwgMjgyMTM0IE1pQl0KWzUxMiBsb2dpY2FsIHNlY3RvciBz aXplLCA1MTIgcGh5c2ljYWwgc2VjdG9yIHNpemVdCls2NCB0aHJlYWRzXQpXYWl0IDMwIHNlY29u ZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czogMTE5IHNlZWtzL3NlY29u ZCwgOC40MDMgbXMgcmFuZG9tIGFjY2VzcyB0aW1lICg0MTk3NDExNSA8IG9mZnNldHMgPCAyODIw MTgxMzMzMTMpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRlc3Rp bmcgd2l0aCBkZWFkbGluZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQoxIHRocmVhZHMgZGVhZGxpbmUKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cu bGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcg L2Rldi9zZGExIFs2OTA3MzIgYmxvY2tzLCAzNTM2NTQ3ODQgYnl0ZXMsIDAgR0IsIDMzNyBNQiwg MCBHaUIsIDM1MyBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNl Y3RvciBzaXplXQpbMSB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMuLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4KUmVzdWx0czogOTMwNjAzIHNlZWtzL3NlY29uZCwgMC4wMDEgbXMgcmFuZG9t IGFjY2VzcyB0aW1lICg2IDwgb2Zmc2V0cyA8IDM1MzY1NDc2MikKU2Vla2VyIHYzLjAsIDIwMDkt MDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2su aHRtbApCZW5jaG1hcmtpbmcgL2Rldi9zZGEyIFs2MjQ0NDY1NTAgYmxvY2tzLCAzMTk3MTY2MzM2 MDAgYnl0ZXMsIDI5NyBHQiwgMzA0OTA1IE1CLCAzMTkgR2lCLCAzMTk3MTYgTWlCXQpbNTEyIGxv Z2ljYWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzEgdGhyZWFkc10K V2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDU4 IHNlZWtzL3NlY29uZCwgMTcuMDY1IG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoMzgwOTkwMDQ1IDwg b2Zmc2V0cyA8IDMxOTcwMzIyNDAwOSkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93 d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtp bmcgL2Rldi9tYXBwZXIvdmdyb3VwLVJPT1QgWzUyNDI4ODAwIGJsb2NrcywgMjY4NDM1NDU2MDAg Ynl0ZXMsIDI1IEdCLCAyNTYwMCBNQiwgMjYgR2lCLCAyNjg0MyBNaUJdCls1MTIgbG9naWNhbCBz ZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbMSB0aHJlYWRzXQpXYWl0IDMw IHNlY29uZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czogNzMgc2Vla3Mv c2Vjb25kLCAxMy41MjAgbXMgcmFuZG9tIGFjY2VzcyB0aW1lICgxNTQ0MDk3NSA8IG9mZnNldHMg PCAyNjc5OTEzMDcyNSkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhp bnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9t YXBwZXIvdmdyb3VwLVNXQVAgWzIwOTcxNTIwIGJsb2NrcywgMTA3Mzc0MTgyNDAgYnl0ZXMsIDEw IEdCLCAxMDI0MCBNQiwgMTAgR2lCLCAxMDczNyBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6 ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbMSB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMu Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czogOTQgc2Vla3Mvc2Vjb25kLCAx MC42MzEgbXMgcmFuZG9tIGFjY2VzcyB0aW1lICgyMTUzNzIwIDwgb2Zmc2V0cyA8IDEwNzMxODU1 MzgwKQpTZWVrZXIgdjMuMCwgMjAwOS0wNi0xNywgaHR0cDovL3d3dy5saW51eGluc2lnaHQuY29t L2hvd19mYXN0X2lzX3lvdXJfZGlzay5odG1sCkJlbmNobWFya2luZyAvZGV2L21hcHBlci92Z3Jv dXAtSE9NRSBbNTUxMDQzMDcyIGJsb2NrcywgMjgyMTM0MDUyODY0IGJ5dGVzLCAyNjIgR0IsIDI2 OTA2NCBNQiwgMjgyIEdpQiwgMjgyMTM0IE1pQl0KWzUxMiBsb2dpY2FsIHNlY3RvciBzaXplLCA1 MTIgcGh5c2ljYWwgc2VjdG9yIHNpemVdClsxIHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiA1MyBzZWVrcy9zZWNvbmQsIDE4Ljc3 MyBtcyByYW5kb20gYWNjZXNzIHRpbWUgKDM3MTEzNTgxOSA8IG9mZnNldHMgPCAyODIwNzU1NDM2 NjIpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjggdGhyZWFkcyBk ZWFkbGluZQpTZWVrZXIgdjMuMCwgMjAwOS0wNi0xNywgaHR0cDovL3d3dy5saW51eGluc2lnaHQu Y29tL2hvd19mYXN0X2lzX3lvdXJfZGlzay5odG1sCkJlbmNobWFya2luZyAvZGV2L3NkYTEgWzY5 MDczMiBibG9ja3MsIDM1MzY1NDc4NCBieXRlcywgMCBHQiwgMzM3IE1CLCAwIEdpQiwgMzUzIE1p Ql0KWzUxMiBsb2dpY2FsIHNlY3RvciBzaXplLCA1MTIgcGh5c2ljYWwgc2VjdG9yIHNpemVdCls4 IHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpS ZXN1bHRzOiAxMjc2OTc2IHNlZWtzL3NlY29uZCwgMC4wMDEgbXMgcmFuZG9tIGFjY2VzcyB0aW1l ICgyIDwgb2Zmc2V0cyA8IDM1MzY1NDc2NSkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6 Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1h cmtpbmcgL2Rldi9zZGEyIFs2MjQ0NDY1NTAgYmxvY2tzLCAzMTk3MTY2MzM2MDAgYnl0ZXMsIDI5 NyBHQiwgMzA0OTA1IE1CLCAzMTkgR2lCLCAzMTk3MTYgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9y IHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzEgdGhyZWFkc10KV2FpdCAzMCBzZWNv bmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDU3IHNlZWtzL3NlY29u ZCwgMTcuMzYxIG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoMzAwNjkwMTYzIDwgb2Zmc2V0cyA8IDMx OTA3Mzg2MTE1NCkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNp Z2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9tYXBw ZXIvdmdyb3VwLVJPT1QgWzUyNDI4ODAwIGJsb2NrcywgMjY4NDM1NDU2MDAgYnl0ZXMsIDI1IEdC LCAyNTYwMCBNQiwgMjYgR2lCLCAyNjg0MyBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwg NTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbOCB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMuLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czogMTI2IHNlZWtzL3NlY29uZCwgNy45 MzAgbXMgcmFuZG9tIGFjY2VzcyB0aW1lICgxMDMyNjUyNSA8IG9mZnNldHMgPCAyNjgzOTI0MzUx MikKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9o b3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3Vw LVNXQVAgWzIwOTcxNTIwIGJsb2NrcywgMTA3Mzc0MTgyNDAgYnl0ZXMsIDEwIEdCLCAxMDI0MCBN QiwgMTAgR2lCLCAxMDczNyBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNp Y2FsIHNlY3RvciBzaXplXQpbOCB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMuLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czogMTU5IHNlZWtzL3NlY29uZCwgNi4yODQgbXMgcmFu ZG9tIGFjY2VzcyB0aW1lICg1NDQyOTUgPCBvZmZzZXRzIDwgMTA3MzcxMTc1NzUpClNlZWtlciB2 My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNf eW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvbWFwcGVyL3Zncm91cC1IT01FIFs1NTEw NDMwNzIgYmxvY2tzLCAyODIxMzQwNTI4NjQgYnl0ZXMsIDI2MiBHQiwgMjY5MDY0IE1CLCAyODIg R2lCLCAyODIxMzQgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBz ZWN0b3Igc2l6ZV0KWzggdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uClJlc3VsdHM6IDg4IHNlZWtzL3NlY29uZCwgMTEuMzY0IG1zIHJhbmRvbSBh Y2Nlc3MgdGltZSAoNDY2ODEyOTAgPCBvZmZzZXRzIDwgMjgyMDY5OTE0NDcwKQotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoxNiB0aHJlYWRzIGRlYWRsaW5lClNlZWtl ciB2My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3Rf aXNfeW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvc2RhMSBbNjkwNzMyIGJsb2Nrcywg MzUzNjU0Nzg0IGJ5dGVzLCAwIEdCLCAzMzcgTUIsIDAgR2lCLCAzNTMgTWlCXQpbNTEyIGxvZ2lj YWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzE2IHRocmVhZHNdCldh aXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiAxMTk5 MjMxIHNlZWtzL3NlY29uZCwgMC4wMDEgbXMgcmFuZG9tIGFjY2VzcyB0aW1lICg2IDwgb2Zmc2V0 cyA8IDM1MzY1NDc4MykKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhp bnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9z ZGEyIFs2MjQ0NDY1NTAgYmxvY2tzLCAzMTk3MTY2MzM2MDAgYnl0ZXMsIDI5NyBHQiwgMzA0OTA1 IE1CLCAzMTkgR2lCLCAzMTk3MTYgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBw aHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzE2IHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiAxMDEgc2Vla3Mvc2Vjb25kLCA5Ljg0MyBt cyByYW5kb20gYWNjZXNzIHRpbWUgKDIwNjk0NTcwIDwgb2Zmc2V0cyA8IDMxOTQ2Mzk1NzcyMikK U2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3df ZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3VwLVJP T1QgWzUyNDI4ODAwIGJsb2NrcywgMjY4NDM1NDU2MDAgYnl0ZXMsIDI1IEdCLCAyNTYwMCBNQiwg MjYgR2lCLCAyNjg0MyBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2Fs IHNlY3RvciBzaXplXQpbMTYgdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDEzOSBzZWVrcy9zZWNvbmQsIDcuMTYwIG1zIHJhbmRv bSBhY2Nlc3MgdGltZSAoNzkwMjQ2MiA8IG9mZnNldHMgPCAyNjgxOTQzNDMwMCkKU2Vla2VyIHYz LjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195 b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3VwLVNXQVAgWzIwOTcx NTIwIGJsb2NrcywgMTA3Mzc0MTgyNDAgYnl0ZXMsIDEwIEdCLCAxMDI0MCBNQiwgMTAgR2lCLCAx MDczNyBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBz aXplXQpbMTYgdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uClJlc3VsdHM6IDE4NCBzZWVrcy9zZWNvbmQsIDUuNDExIG1zIHJhbmRvbSBhY2Nlc3Mg dGltZSAoNDQ0NTY3MCA8IG9mZnNldHMgPCAxMDczNDk4MzgzMCkKU2Vla2VyIHYzLjAsIDIwMDkt MDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2su aHRtbApCZW5jaG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3VwLUhPTUUgWzU1MTA0MzA3MiBibG9j a3MsIDI4MjEzNDA1Mjg2NCBieXRlcywgMjYyIEdCLCAyNjkwNjQgTUIsIDI4MiBHaUIsIDI4MjEz NCBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXpl XQpbMTYgdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uClJlc3VsdHM6IDk5IHNlZWtzL3NlY29uZCwgMTAuMDc3IG1zIHJhbmRvbSBhY2Nlc3MgdGlt ZSAoNDkxNTkwOTYgPCBvZmZzZXRzIDwgMjgyMDQ4OTQ3NTc5KQotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQozMiB0aHJlYWRzIGRlYWRsaW5lClNlZWtlciB2My4wLCAy MDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9k aXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvc2RhMSBbNjkwNzMyIGJsb2NrcywgMzUzNjU0Nzg0 IGJ5dGVzLCAwIEdCLCAzMzcgTUIsIDAgR2lCLCAzNTMgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9y IHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzMyIHRocmVhZHNdCldhaXQgMzAgc2Vj b25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiAxMTYyNTU3IHNlZWtz L3NlY29uZCwgMC4wMDEgbXMgcmFuZG9tIGFjY2VzcyB0aW1lICgwIDwgb2Zmc2V0cyA8IDM1MzY1 NDc2MykKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNv bS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9zZGEyIFs2MjQ0 NDY1NTAgYmxvY2tzLCAzMTk3MTY2MzM2MDAgYnl0ZXMsIDI5NyBHQiwgMzA0OTA1IE1CLCAzMTkg R2lCLCAzMTk3MTYgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBz ZWN0b3Igc2l6ZV0KWzMyIHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLgpSZXN1bHRzOiAxMTIgc2Vla3Mvc2Vjb25kLCA4Ljg5OSBtcyByYW5kb20g YWNjZXNzIHRpbWUgKDE2OTI0MzQxIDwgb2Zmc2V0cyA8IDMxOTYzMjA1NTM2MykKU2Vla2VyIHYz LjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195 b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3VwLVJPT1QgWzUyNDI4 ODAwIGJsb2NrcywgMjY4NDM1NDU2MDAgYnl0ZXMsIDI1IEdCLCAyNTYwMCBNQiwgMjYgR2lCLCAy Njg0MyBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBz aXplXQpbMzIgdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uClJlc3VsdHM6IDE3NyBzZWVrcy9zZWNvbmQsIDUuNjQyIG1zIHJhbmRvbSBhY2Nlc3Mg dGltZSAoNDAzNjA1MCA8IG9mZnNldHMgPCAyNjg0MjY1NTIxMikKU2Vla2VyIHYzLjAsIDIwMDkt MDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2su aHRtbApCZW5jaG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3VwLVNXQVAgWzIwOTcxNTIwIGJsb2Nr cywgMTA3Mzc0MTgyNDAgYnl0ZXMsIDEwIEdCLCAxMDI0MCBNQiwgMTAgR2lCLCAxMDczNyBNaUJd Cls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbMzIg dGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJl c3VsdHM6IDIxMCBzZWVrcy9zZWNvbmQsIDQuNzYwIG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoMTQx MDA4NSA8IG9mZnNldHMgPCAxMDczNTQwMjgyMCkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0 dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5j aG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3VwLUhPTUUgWzU1MTA0MzA3MiBibG9ja3MsIDI4MjEz NDA1Mjg2NCBieXRlcywgMjYyIEdCLCAyNjkwNjQgTUIsIDI4MiBHaUIsIDI4MjEzNCBNaUJdCls1 MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbMzIgdGhy ZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3Vs dHM6IDExNSBzZWVrcy9zZWNvbmQsIDguNjQ2IG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoNzQzMTg1 NTEgPCBvZmZzZXRzIDwgMjgyMDY2NTU2Njg4KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQo2NCB0aHJlYWRzIGRlYWRsaW5lClNlZWtlciB2My4wLCAyMDA5LTA2LTE3 LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwK QmVuY2htYXJraW5nIC9kZXYvc2RhMSBbNjkwNzMyIGJsb2NrcywgMzUzNjU0Nzg0IGJ5dGVzLCAw IEdCLCAzMzcgTUIsIDAgR2lCLCAzNTMgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUx MiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzY0IHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiAxMTIxNDUxIHNlZWtzL3NlY29uZCwg MC4wMDEgbXMgcmFuZG9tIGFjY2VzcyB0aW1lICg4IDwgb2Zmc2V0cyA8IDM1MzY1NDc3NSkKU2Vl a2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFz dF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9zZGEyIFs2MjQ0NDY1NTAgYmxv Y2tzLCAzMTk3MTY2MzM2MDAgYnl0ZXMsIDI5NyBHQiwgMzA0OTA1IE1CLCAzMTkgR2lCLCAzMTk3 MTYgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6 ZV0KWzY0IHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLgpSZXN1bHRzOiAxMTYgc2Vla3Mvc2Vjb25kLCA4LjU3MSBtcyByYW5kb20gYWNjZXNzIHRp bWUgKDM3NzA5MTAzNSA8IG9mZnNldHMgPCAzMTk1NDc2MzAwMjYpClNlZWtlciB2My4wLCAyMDA5 LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9kaXNr Lmh0bWwKQmVuY2htYXJraW5nIC9kZXYvbWFwcGVyL3Zncm91cC1ST09UIFs1MjQyODgwMCBibG9j a3MsIDI2ODQzNTQ1NjAwIGJ5dGVzLCAyNSBHQiwgMjU2MDAgTUIsIDI2IEdpQiwgMjY4NDMgTWlC XQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzY0 IHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpS ZXN1bHRzOiAxODAgc2Vla3Mvc2Vjb25kLCA1LjUzOSBtcyByYW5kb20gYWNjZXNzIHRpbWUgKDMz NjY1NjIgPCBvZmZzZXRzIDwgMjY4NDM0MTM1NzUpClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBo dHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVu Y2htYXJraW5nIC9kZXYvbWFwcGVyL3Zncm91cC1TV0FQIFsyMDk3MTUyMCBibG9ja3MsIDEwNzM3 NDE4MjQwIGJ5dGVzLCAxMCBHQiwgMTAyNDAgTUIsIDEwIEdpQiwgMTA3MzcgTWlCXQpbNTEyIGxv Z2ljYWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzY0IHRocmVhZHNd CldhaXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiAy MTIgc2Vla3Mvc2Vjb25kLCA0LjY5OCBtcyByYW5kb20gYWNjZXNzIHRpbWUgKDkwNzcyNTAgPCBv ZmZzZXRzIDwgMTA3MzYyNTUxODApClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3 LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5n IC9kZXYvbWFwcGVyL3Zncm91cC1IT01FIFs1NTEwNDMwNzIgYmxvY2tzLCAyODIxMzQwNTI4NjQg Ynl0ZXMsIDI2MiBHQiwgMjY5MDY0IE1CLCAyODIgR2lCLCAyODIxMzQgTWlCXQpbNTEyIGxvZ2lj YWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzY0IHRocmVhZHNdCldh aXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiAxMTcg c2Vla3Mvc2Vjb25kLCA4LjU0NyBtcyByYW5kb20gYWNjZXNzIHRpbWUgKDE0MTc3MzYwIDwgb2Zm c2V0cyA8IDI4MjAzNTQ3ODc0NSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KVGVzdGluZyB3aXRoIGNmcQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQoxIHRocmVhZHMgY2ZxClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3 LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5n IC9kZXYvc2RhMSBbNjkwNzMyIGJsb2NrcywgMzUzNjU0Nzg0IGJ5dGVzLCAwIEdCLCAzMzcgTUIs IDAgR2lCLCAzNTMgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBz ZWN0b3Igc2l6ZV0KWzEgdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uClJlc3VsdHM6IDkyMTY3OCBzZWVrcy9zZWNvbmQsIDAuMDAxIG1zIHJhbmRv bSBhY2Nlc3MgdGltZSAoOCA8IG9mZnNldHMgPCAzNTM2NTQ3NzgpClNlZWtlciB2My4wLCAyMDA5 LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9kaXNr Lmh0bWwKQmVuY2htYXJraW5nIC9kZXYvc2RhMiBbNjI0NDQ2NTUwIGJsb2NrcywgMzE5NzE2NjMz NjAwIGJ5dGVzLCAyOTcgR0IsIDMwNDkwNSBNQiwgMzE5IEdpQiwgMzE5NzE2IE1pQl0KWzUxMiBs b2dpY2FsIHNlY3RvciBzaXplLCA1MTIgcGh5c2ljYWwgc2VjdG9yIHNpemVdClsxIHRocmVhZHNd CldhaXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiA1 OCBzZWVrcy9zZWNvbmQsIDE3LjE3MiBtcyByYW5kb20gYWNjZXNzIHRpbWUgKDE2MjM5MTk3IDwg b2Zmc2V0cyA8IDMxOTQ5MDEyNTQwNikKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93 d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtp bmcgL2Rldi9tYXBwZXIvdmdyb3VwLVJPT1QgWzUyNDI4ODAwIGJsb2NrcywgMjY4NDM1NDU2MDAg Ynl0ZXMsIDI1IEdCLCAyNTYwMCBNQiwgMjYgR2lCLCAyNjg0MyBNaUJdCls1MTIgbG9naWNhbCBz ZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbMSB0aHJlYWRzXQpXYWl0IDMw IHNlY29uZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czogODUgc2Vla3Mv c2Vjb25kLCAxMS43MTAgbXMgcmFuZG9tIGFjY2VzcyB0aW1lICg2OTM1NzUgPCBvZmZzZXRzIDwg MjY4MDIyMDUzMjUpClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5z aWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvbWFw cGVyL3Zncm91cC1TV0FQIFsyMDk3MTUyMCBibG9ja3MsIDEwNzM3NDE4MjQwIGJ5dGVzLCAxMCBH QiwgMTAyNDAgTUIsIDEwIEdpQiwgMTA3MzcgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUs IDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzEgdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDk5IHNlZWtzL3NlY29uZCwgMTAu MDk4IG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoNzk4NTc0MCA8IG9mZnNldHMgPCAxMDczNDIwNjEz NSkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9o b3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3Vw LUhPTUUgWzU1MTA0MzA3MiBibG9ja3MsIDI4MjEzNDA1Mjg2NCBieXRlcywgMjYyIEdCLCAyNjkw NjQgTUIsIDI4MiBHaUIsIDI4MjEzNCBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEy IHBoeXNpY2FsIHNlY3RvciBzaXplXQpbMSB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMuLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czogNTkgc2Vla3Mvc2Vjb25kLCAxNi42ODUg bXMgcmFuZG9tIGFjY2VzcyB0aW1lICgxMTQ5NzA5OSA8IG9mZnNldHMgPCAyODE3NzEyNzkwNDkp Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjggdGhyZWFkcyBjZnEK U2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3df ZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9zZGExIFs2OTA3MzIgYmxv Y2tzLCAzNTM2NTQ3ODQgYnl0ZXMsIDAgR0IsIDMzNyBNQiwgMCBHaUIsIDM1MyBNaUJdCls1MTIg bG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbOCB0aHJlYWRz XQpXYWl0IDMwIHNlY29uZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czog MTI3OTEyNSBzZWVrcy9zZWNvbmQsIDAuMDAxIG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoMCA8IG9m ZnNldHMgPCAzNTM2NTQ3ODMpClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3Lmxp bnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5nIC9k ZXYvc2RhMiBbNjI0NDQ2NTUwIGJsb2NrcywgMzE5NzE2NjMzNjAwIGJ5dGVzLCAyOTcgR0IsIDMw NDkwNSBNQiwgMzE5IEdpQiwgMzE5NzE2IE1pQl0KWzUxMiBsb2dpY2FsIHNlY3RvciBzaXplLCA1 MTIgcGh5c2ljYWwgc2VjdG9yIHNpemVdClsxIHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiA1OCBzZWVrcy9zZWNvbmQsIDE3LjIw MiBtcyByYW5kb20gYWNjZXNzIHRpbWUgKDY5NzcyNjAxIDwgb2Zmc2V0cyA8IDMxOTY3NDUzNjY4 NSkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9o b3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3Vw LVJPT1QgWzUyNDI4ODAwIGJsb2NrcywgMjY4NDM1NDU2MDAgYnl0ZXMsIDI1IEdCLCAyNTYwMCBN QiwgMjYgR2lCLCAyNjg0MyBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNp Y2FsIHNlY3RvciBzaXplXQpbOCB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMuLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czogMTI4IHNlZWtzL3NlY29uZCwgNy43OTIgbXMgcmFu ZG9tIGFjY2VzcyB0aW1lICg0MDgwNjYyIDwgb2Zmc2V0cyA8IDI2ODQyMjU2NTEyKQpTZWVrZXIg djMuMCwgMjAwOS0wNi0xNywgaHR0cDovL3d3dy5saW51eGluc2lnaHQuY29tL2hvd19mYXN0X2lz X3lvdXJfZGlzay5odG1sCkJlbmNobWFya2luZyAvZGV2L21hcHBlci92Z3JvdXAtU1dBUCBbMjA5 NzE1MjAgYmxvY2tzLCAxMDczNzQxODI0MCBieXRlcywgMTAgR0IsIDEwMjQwIE1CLCAxMCBHaUIs IDEwNzM3IE1pQl0KWzUxMiBsb2dpY2FsIHNlY3RvciBzaXplLCA1MTIgcGh5c2ljYWwgc2VjdG9y IHNpemVdCls4IHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLgpSZXN1bHRzOiAxNjEgc2Vla3Mvc2Vjb25kLCA2LjE4NiBtcyByYW5kb20gYWNjZXNz IHRpbWUgKDkzMDEzNSA8IG9mZnNldHMgPCAxMDczNDg4ODc0MCkKU2Vla2VyIHYzLjAsIDIwMDkt MDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2su aHRtbApCZW5jaG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3VwLUhPTUUgWzU1MTA0MzA3MiBibG9j a3MsIDI4MjEzNDA1Mjg2NCBieXRlcywgMjYyIEdCLCAyNjkwNjQgTUIsIDI4MiBHaUIsIDI4MjEz NCBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXpl XQpbOCB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4KUmVzdWx0czogODcgc2Vla3Mvc2Vjb25kLCAxMS4zNjggbXMgcmFuZG9tIGFjY2VzcyB0aW1l ICgyMTExNTA4NjQgPCBvZmZzZXRzIDwgMjgyMDIzMDcxOTc4KQotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoxNiB0aHJlYWRzIGNmcQpTZWVrZXIgdjMuMCwgMjAwOS0w Ni0xNywgaHR0cDovL3d3dy5saW51eGluc2lnaHQuY29tL2hvd19mYXN0X2lzX3lvdXJfZGlzay5o dG1sCkJlbmNobWFya2luZyAvZGV2L3NkYTEgWzY5MDczMiBibG9ja3MsIDM1MzY1NDc4NCBieXRl cywgMCBHQiwgMzM3IE1CLCAwIEdpQiwgMzUzIE1pQl0KWzUxMiBsb2dpY2FsIHNlY3RvciBzaXpl LCA1MTIgcGh5c2ljYWwgc2VjdG9yIHNpemVdClsxNiB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMu Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czogMTIzMTg3OSBzZWVrcy9zZWNv bmQsIDAuMDAxIG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoNiA8IG9mZnNldHMgPCAzNTM2NTQ3NzUp ClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93 X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvc2RhMiBbNjI0NDQ2NTUw IGJsb2NrcywgMzE5NzE2NjMzNjAwIGJ5dGVzLCAyOTcgR0IsIDMwNDkwNSBNQiwgMzE5IEdpQiwg MzE5NzE2IE1pQl0KWzUxMiBsb2dpY2FsIHNlY3RvciBzaXplLCA1MTIgcGh5c2ljYWwgc2VjdG9y IHNpemVdClsxNiB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4KUmVzdWx0czogMTAxIHNlZWtzL3NlY29uZCwgOS44NDkgbXMgcmFuZG9tIGFjY2Vz cyB0aW1lICgzNTMwNDcyNiA8IG9mZnNldHMgPCAzMTk0NzI5NDYzMzEpClNlZWtlciB2My4wLCAy MDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9k aXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvbWFwcGVyL3Zncm91cC1ST09UIFs1MjQyODgwMCBi bG9ja3MsIDI2ODQzNTQ1NjAwIGJ5dGVzLCAyNSBHQiwgMjU2MDAgTUIsIDI2IEdpQiwgMjY4NDMg TWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBwaHlzaWNhbCBzZWN0b3Igc2l6ZV0K WzE2IHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u LgpSZXN1bHRzOiAxNDMgc2Vla3Mvc2Vjb25kLCA2Ljk5MyBtcyByYW5kb20gYWNjZXNzIHRpbWUg KDE0NzQ1OTEyIDwgb2Zmc2V0cyA8IDI2ODM4OTcyODc1KQpTZWVrZXIgdjMuMCwgMjAwOS0wNi0x NywgaHR0cDovL3d3dy5saW51eGluc2lnaHQuY29tL2hvd19mYXN0X2lzX3lvdXJfZGlzay5odG1s CkJlbmNobWFya2luZyAvZGV2L21hcHBlci92Z3JvdXAtU1dBUCBbMjA5NzE1MjAgYmxvY2tzLCAx MDczNzQxODI0MCBieXRlcywgMTAgR0IsIDEwMjQwIE1CLCAxMCBHaUIsIDEwNzM3IE1pQl0KWzUx MiBsb2dpY2FsIHNlY3RvciBzaXplLCA1MTIgcGh5c2ljYWwgc2VjdG9yIHNpemVdClsxNiB0aHJl YWRzXQpXYWl0IDMwIHNlY29uZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0 czogMTg4IHNlZWtzL3NlY29uZCwgNS4zMTcgbXMgcmFuZG9tIGFjY2VzcyB0aW1lICgxNTI5MTcw IDwgb2Zmc2V0cyA8IDEwNzM3MjgxNzYwKQpTZWVrZXIgdjMuMCwgMjAwOS0wNi0xNywgaHR0cDov L3d3dy5saW51eGluc2lnaHQuY29tL2hvd19mYXN0X2lzX3lvdXJfZGlzay5odG1sCkJlbmNobWFy a2luZyAvZGV2L21hcHBlci92Z3JvdXAtSE9NRSBbNTUxMDQzMDcyIGJsb2NrcywgMjgyMTM0MDUy ODY0IGJ5dGVzLCAyNjIgR0IsIDI2OTA2NCBNQiwgMjgyIEdpQiwgMjgyMTM0IE1pQl0KWzUxMiBs b2dpY2FsIHNlY3RvciBzaXplLCA1MTIgcGh5c2ljYWwgc2VjdG9yIHNpemVdClsxNiB0aHJlYWRz XQpXYWl0IDMwIHNlY29uZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czog OTkgc2Vla3Mvc2Vjb25kLCAxMC4wOTEgbXMgcmFuZG9tIGFjY2VzcyB0aW1lICgxMDYwMjI3IDwg b2Zmc2V0cyA8IDI4MjA4NjAzODQ3MikKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KMzIgdGhyZWFkcyBjZnEKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93 d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtp bmcgL2Rldi9zZGExIFs2OTA3MzIgYmxvY2tzLCAzNTM2NTQ3ODQgYnl0ZXMsIDAgR0IsIDMzNyBN QiwgMCBHaUIsIDM1MyBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2Fs IHNlY3RvciBzaXplXQpbMzIgdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDExNDAzMTUgc2Vla3Mvc2Vjb25kLCAwLjAwMSBtcyBy YW5kb20gYWNjZXNzIHRpbWUgKDYgPCBvZmZzZXRzIDwgMzUzNjU0NzY1KQpTZWVrZXIgdjMuMCwg MjAwOS0wNi0xNywgaHR0cDovL3d3dy5saW51eGluc2lnaHQuY29tL2hvd19mYXN0X2lzX3lvdXJf ZGlzay5odG1sCkJlbmNobWFya2luZyAvZGV2L3NkYTIgWzYyNDQ0NjU1MCBibG9ja3MsIDMxOTcx NjYzMzYwMCBieXRlcywgMjk3IEdCLCAzMDQ5MDUgTUIsIDMxOSBHaUIsIDMxOTcxNiBNaUJdCls1 MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbMzIgdGhy ZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3Vs dHM6IDExNCBzZWVrcy9zZWNvbmQsIDguNzQ0IG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoMTIzMTM3 NjIxIDwgb2Zmc2V0cyA8IDMxOTcwODkxNTM4MCkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0 dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5j aG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3VwLVJPT1QgWzUyNDI4ODAwIGJsb2NrcywgMjY4NDM1 NDU2MDAgYnl0ZXMsIDI1IEdCLCAyNTYwMCBNQiwgMjYgR2lCLCAyNjg0MyBNaUJdCls1MTIgbG9n aWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbMzIgdGhyZWFkc10K V2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDE3 NiBzZWVrcy9zZWNvbmQsIDUuNjU4IG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoNTQ0ODE2MiA8IG9m ZnNldHMgPCAyNjg0MDAxODQwMCkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cu bGludXhpbnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcg L2Rldi9tYXBwZXIvdmdyb3VwLVNXQVAgWzIwOTcxNTIwIGJsb2NrcywgMTA3Mzc0MTgyNDAgYnl0 ZXMsIDEwIEdCLCAxMDI0MCBNQiwgMTAgR2lCLCAxMDczNyBNaUJdCls1MTIgbG9naWNhbCBzZWN0 b3Igc2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbMzIgdGhyZWFkc10KV2FpdCAzMCBz ZWNvbmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDIxMiBzZWVrcy9z ZWNvbmQsIDQuNzAxIG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoMjUyMDg4MCA8IG9mZnNldHMgPCAx MDczNzA0MTAzMCkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNp Z2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9tYXBw ZXIvdmdyb3VwLUhPTUUgWzU1MTA0MzA3MiBibG9ja3MsIDI4MjEzNDA1Mjg2NCBieXRlcywgMjYy IEdCLCAyNjkwNjQgTUIsIDI4MiBHaUIsIDI4MjEzNCBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Ig c2l6ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbMzIgdGhyZWFkc10KV2FpdCAzMCBzZWNv bmRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDExNSBzZWVrcy9zZWNv bmQsIDguNjYxIG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoMjA1OTc1ODQgPCBvZmZzZXRzIDwgMjgy MDI0NjYxNjYyKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo2NCB0 aHJlYWRzIGNmcQpTZWVrZXIgdjMuMCwgMjAwOS0wNi0xNywgaHR0cDovL3d3dy5saW51eGluc2ln aHQuY29tL2hvd19mYXN0X2lzX3lvdXJfZGlzay5odG1sCkJlbmNobWFya2luZyAvZGV2L3NkYTEg WzY5MDczMiBibG9ja3MsIDM1MzY1NDc4NCBieXRlcywgMCBHQiwgMzM3IE1CLCAwIEdpQiwgMzUz IE1pQl0KWzUxMiBsb2dpY2FsIHNlY3RvciBzaXplLCA1MTIgcGh5c2ljYWwgc2VjdG9yIHNpemVd Cls2NCB0aHJlYWRzXQpXYWl0IDMwIHNlY29uZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4KUmVzdWx0czogMTEzOTM0MCBzZWVrcy9zZWNvbmQsIDAuMDAxIG1zIHJhbmRvbSBhY2Nlc3Mg dGltZSAoMCA8IG9mZnNldHMgPCAzNTM2NTQ3ODEpClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBo dHRwOi8vd3d3LmxpbnV4aW5zaWdodC5jb20vaG93X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVu Y2htYXJraW5nIC9kZXYvc2RhMiBbNjI0NDQ2NTUwIGJsb2NrcywgMzE5NzE2NjMzNjAwIGJ5dGVz LCAyOTcgR0IsIDMwNDkwNSBNQiwgMzE5IEdpQiwgMzE5NzE2IE1pQl0KWzUxMiBsb2dpY2FsIHNl Y3RvciBzaXplLCA1MTIgcGh5c2ljYWwgc2VjdG9yIHNpemVdCls2NCB0aHJlYWRzXQpXYWl0IDMw IHNlY29uZHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KUmVzdWx0czogMTE1IHNlZWtz L3NlY29uZCwgOC42NTEgbXMgcmFuZG9tIGFjY2VzcyB0aW1lICgzMDM1MDYwIDwgb2Zmc2V0cyA8 IDMxOTQ0OTYzOTIyMSkKU2Vla2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhp bnNpZ2h0LmNvbS9ob3dfZmFzdF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9t YXBwZXIvdmdyb3VwLVJPT1QgWzUyNDI4ODAwIGJsb2NrcywgMjY4NDM1NDU2MDAgYnl0ZXMsIDI1 IEdCLCAyNTYwMCBNQiwgMjYgR2lCLCAyNjg0MyBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6 ZSwgNTEyIHBoeXNpY2FsIHNlY3RvciBzaXplXQpbNjQgdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRz Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDE3OCBzZWVrcy9zZWNvbmQs IDUuNTg5IG1zIHJhbmRvbSBhY2Nlc3MgdGltZSAoMTgwNzM4MjUgPCBvZmZzZXRzIDwgMjY4Mzkx ODk2NjIpClNlZWtlciB2My4wLCAyMDA5LTA2LTE3LCBodHRwOi8vd3d3LmxpbnV4aW5zaWdodC5j b20vaG93X2Zhc3RfaXNfeW91cl9kaXNrLmh0bWwKQmVuY2htYXJraW5nIC9kZXYvbWFwcGVyL3Zn cm91cC1TV0FQIFsyMDk3MTUyMCBibG9ja3MsIDEwNzM3NDE4MjQwIGJ5dGVzLCAxMCBHQiwgMTAy NDAgTUIsIDEwIEdpQiwgMTA3MzcgTWlCXQpbNTEyIGxvZ2ljYWwgc2VjdG9yIHNpemUsIDUxMiBw aHlzaWNhbCBzZWN0b3Igc2l6ZV0KWzY0IHRocmVhZHNdCldhaXQgMzAgc2Vjb25kcy4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgpSZXN1bHRzOiAyMTcgc2Vla3Mvc2Vjb25kLCA0LjYwNyBt cyByYW5kb20gYWNjZXNzIHRpbWUgKDI2MDI2NSA8IG9mZnNldHMgPCAxMDczNjY2MzkwMCkKU2Vl a2VyIHYzLjAsIDIwMDktMDYtMTcsIGh0dHA6Ly93d3cubGludXhpbnNpZ2h0LmNvbS9ob3dfZmFz dF9pc195b3VyX2Rpc2suaHRtbApCZW5jaG1hcmtpbmcgL2Rldi9tYXBwZXIvdmdyb3VwLUhPTUUg WzU1MTA0MzA3MiBibG9ja3MsIDI4MjEzNDA1Mjg2NCBieXRlcywgMjYyIEdCLCAyNjkwNjQgTUIs IDI4MiBHaUIsIDI4MjEzNCBNaUJdCls1MTIgbG9naWNhbCBzZWN0b3Igc2l6ZSwgNTEyIHBoeXNp Y2FsIHNlY3RvciBzaXplXQpbNjQgdGhyZWFkc10KV2FpdCAzMCBzZWNvbmRzLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uClJlc3VsdHM6IDExOCBzZWVrcy9zZWNvbmQsIDguNDcwIG1zIHJh bmRvbSBhY2Nlc3MgdGltZSAoMjM4MTMyMTUgPCBvZmZzZXRzIDwgMjgyMTI5OTA4NTE2KQotLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo= --0016e649831c8a751a04872dd9a2-- From xfs@tlinx.org Sat May 22 08:07:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4MD7AVP067946 for ; Sat, 22 May 2010 08:07:10 -0500 X-ASG-Debug-ID: 1274533770-1d9e02600000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from Ishtar.sc.tlinx.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0FCA63665AB for ; Sat, 22 May 2010 06:09:30 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id ZafG9DvPpTRUJq5F for ; Sat, 22 May 2010 06:09:30 -0700 (PDT) Received: from [192.168.3.12] (Athenae [192.168.3.12]) by Ishtar.sc.tlinx.org (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4MD9QHV030521 for ; Sat, 22 May 2010 06:09:29 -0700 Message-ID: <4BF7D787.4020903@tlinx.org> Date: Sat, 22 May 2010 06:09:27 -0700 From: "Linda A. Walsh" User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: xfsdump -- not enough memory to dump attributes? w/>20G free -- how much does it need? Subject: xfsdump -- not enough memory to dump attributes? w/>20G free -- how much does it need? X-Stationery: 0.5.1 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1274533771 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0202 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30487 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I've seen the problem in the dump below and was wondering what could possibly cause this -- because shows loads of free memory (>20G)... how much memory do non-root attributes take to dump? Dump fsname home, Mountpoint /home, Dumplevel=0 Notice: "-e" used in Xfsdump_options to allow exclusions xfsdump -b 1m -l 0 -L home -e - /home | ( su -f -m backup -c " umask 027;nice -19 ionice -c3 lzop > home/home-100522-0-0349.dump.lzo " ) xfsdump: using file dump (drive_simple) strategy xfsdump: version 3.0.1 (dump format 3.0) - Running single-threaded xfsdump: level 0 dump of Ishtar:/home xfsdump: dump date: Sat May 22 03:49:45 2010 xfsdump: session id: 5132d03a-d58f-4899-8a3c-a2dc86efe915 xfsdump: session label: "home" xfsdump: ino map phase 1: constructing initial dump list xfsdump: ino map phase 2: skipping (no pruning necessary) xfsdump: ino map phase 3: skipping (only one dump stream) xfsdump: ino map construction complete xfsdump: estimated dump size: 537916877696 bytes xfsdump: creating dump session media file 0 (media 0, file 0) xfsdump: dumping ino map xfsdump: dumping directories xfsdump: dumping non-directory files xfsdump: WARNING: could not get list of non-root attributes for nondir ino 75466: Cannot allocate memory (12) xfsdump: WARNING: could not get list of non-root attributes for nondir ino 75468: Cannot allocate memory (12) xfsdump: WARNING: could not get list of root attributes for nondir ino 75468: Cannot allocate memory (12) xfsdump: WARNING: could not get list of non-root attributes for nondir ino 75470: Cannot allocate memory (12) xfsdump: WARNING: could not get list of root attributes for nondir ino 75470: Cannot allocate memory (12) xfsdump: WARNING: could not get list of non-root attributes for nondir ino 75497: Cannot allocate memory (12) kernel = 2.6.34-Vanilla xfsdump from package numberd 3.0.1-2.1 (x86_64) From sandeen@sandeen.net Sat May 22 08:19:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4MDJkXV068513 for ; Sat, 22 May 2010 08:19:46 -0500 X-ASG-Debug-ID: 1274534526-1dbc02850000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B843736655B for ; Sat, 22 May 2010 06:22:06 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id aLq0EW3MnaetDDyK for ; Sat, 22 May 2010 06:22:06 -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 mail.sandeen.net (Postfix) with ESMTP id 06DD542C0DA2; Sat, 22 May 2010 08:22:06 -0500 (CDT) Message-ID: <4BF7DA7D.5070405@sandeen.net> Date: Sat, 22 May 2010 08:22:05 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Pedro Ribeiro CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Tuning XFS for real time audio on a laptop with encrypted LVM Subject: Re: Tuning XFS for real time audio on a laptop with encrypted LVM References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1274534526 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=BSF_SC5_SA210e, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30488 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Pedro Ribeiro wrote: > Hi all, > > I was wondering what is the best scheduler for my use case given my > current hardware. > > I have a laptop with a fast Core 2 duo at 2.26 and a nice amount of > ram (4GB) which I use primarily for real time audio (though without a > -rt kernel). All my partitions are XFS under LVM which itself is > contained on a LUKS partition (encrypted with AES 128). > > CFQ currently does not perform very well and causes a lot of thrashing > and high latencies when I/O usage is high. Changing it to the noop > scheduler solves some of the problems and makes it more responsive. > Still performance is a bit of a let down: it takes 1m30s to unpack the > linux-2.6.34 tarball and a massive 2m30s to rm -r. > I have lazy-count=1, noatime, logbufs=8, logbsize=256k and a 128m log. Are you optimizing for kernel untars, or "real time audio?" I would expect that even suboptimal tuning would keep up just fine with audio demands. -Eric > Is there any tunable I should mess with to solve this? And what do you > think of my scheduler change (I haven't tested it that much to be > honest)? > > Regards, > Pedro From pedrib@gmail.com Sat May 22 08:52:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4MDqJkK069842 for ; Sat, 22 May 2010 08:52:19 -0500 X-ASG-Debug-ID: 1274536479-1d9a02f00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-wy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B786E366332 for ; Sat, 22 May 2010 06:54:39 -0700 (PDT) Received: from mail-wy0-f181.google.com (mail-wy0-f181.google.com [74.125.82.181]) by cuda.sgi.com with ESMTP id 51KzgJFnmcQxpqGR for ; Sat, 22 May 2010 06:54:39 -0700 (PDT) Received: by wyf19 with SMTP id 19so1331340wyf.26 for ; Sat, 22 May 2010 06:54:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type; bh=1so8/E03+b2+26RHZ2zdwzVF35ty9EL4653n6KhxVP8=; b=DHsZaAMCmgcItikB+MLW38oveysJEaOL7i9SO9g9xbr6v3wJfVTkBfVee6XVNLUpin YHHQZKC0LPYFuw1RqZcKCIQQI5AXdZyBQItgcoaAdxhxxHZ02yzOLhoS3X30obSPFT0Y ju1yi6OAG0VgwWh8tfoWt8rfnUq+sICjZeIxQ= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=ZvqwKe/yU2rOreOKjNQrd48Eup73Z5uAciIweIdaWBn41WrA/sJCQirwc488I0TaMI 3bU7FNFUJBfGMP9Iol9QzeYzk54CPSlezeMYYXNfP2Wwn0F9KT7wVft+s3pPPfpdjffl SsgfnVQZHrS3BPjD2Y4DQ15J1dtGqTghVYbXw= MIME-Version: 1.0 Received: by 10.216.93.19 with SMTP id k19mr1719060wef.223.1274536478052; Sat, 22 May 2010 06:54:38 -0700 (PDT) Received: by 10.216.157.1 with HTTP; Sat, 22 May 2010 06:54:38 -0700 (PDT) In-Reply-To: <4BF7DA7D.5070405@sandeen.net> References: <4BF7DA7D.5070405@sandeen.net> Date: Sat, 22 May 2010 14:54:38 +0100 Message-ID: X-ASG-Orig-Subj: Re: Tuning XFS for real time audio on a laptop with encrypted LVM Subject: Re: Tuning XFS for real time audio on a laptop with encrypted LVM From: Pedro Ribeiro To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-wy0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1274536479 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=BSF_SC5_SA210e, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30491 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 22 May 2010 14:22, Eric Sandeen wrote: > Pedro Ribeiro wrote: >> Hi all, >> >> I was wondering what is the best scheduler for my use case given my >> current hardware. >> >> I have a laptop with a fast Core 2 duo at 2.26 and a nice amount of >> ram (4GB) which I use primarily for real time audio (though without a >> -rt kernel). All my partitions are XFS under LVM which itself is >> contained on a LUKS partition (encrypted with AES 128). >> >> CFQ currently does not perform very well and causes a lot of thrashing >> and high latencies when I/O usage is high. Changing it to the noop >> scheduler solves some of the problems and makes it more responsive. >> Still performance is a bit of a let down: it takes 1m30s to unpack the >> linux-2.6.34 tarball and a massive 2m30s to rm -r. >> I have lazy-count=1, noatime, logbufs=8, logbsize=256k and a 128m log. > > Are you optimizing for kernel untars, or "real time audio?" > > I would expect that even suboptimal tuning would keep up just fine with > audio demands. > > -Eric > "real-time audio" is very different from normal audio. In particular, it requires <10ms response time for jitter free operation. Up to and including kernel 2.6.33 this was not possible to do reliably without the -rt patch, no matter how tuned it was. The big difference came with 2.6.34-rcX and now the stable 2.6.34. It is now possible to make it work reliable without any audio drops. But then again, this probably has nothing to do with XFS. My point was just that while my primary goal is optimum real-time audio, I still want top reliability (which I could not get with the -rt patch) and good filesystem performance. Of course the fact that I am using encryption does not help, but that is another story. Bottom line, I'm quite happy with XFS and do not plan to change it in the near future. The only complaint I have is the slow deletion of large directories like the kernel tree. But I'll trade the reliability of XFS for that. Regards, Pedro From sandeen@sandeen.net Sat May 22 11:23:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4MGN2sV075562 for ; Sat, 22 May 2010 11:23:03 -0500 X-ASG-Debug-ID: 1274545606-24c101590000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 62041157397D for ; Sat, 22 May 2010 09:26:46 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id ibaVHAChZNylLlyv for ; Sat, 22 May 2010 09:26:46 -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 mail.sandeen.net (Postfix) with ESMTP id 8CC0842E480C; Sat, 22 May 2010 11:25:21 -0500 (CDT) Message-ID: <4BF8056E.8080900@sandeen.net> Date: Sat, 22 May 2010 11:25:18 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: xfs-oss , "linux-fsdevel@vger.kernel.org" , linux-mm@kvack.org CC: Michael Monnerie X-ASG-Orig-Subj: [PATCH (resend)] xfs: don't allow recursion into fs under write_begin Subject: [PATCH (resend)] xfs: don't allow recursion into fs under write_begin Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1274545607 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Michael Monnerie reported this fantastic stack overflow: [21877.948005] BUG: scheduling while atomic: rsync/2345/0xffff8800 [21877.948005] Modules linked in: af_packet nfs lockd fscache nfs_acl auth_rpcgss sunrpc ipv6 ramzswap xvmalloc lzo_decompress lzo_compress loop dm_mod reiserfs xfs exportfs xennet xenblk cdrom [21877.948005] Pid: 2345, comm: rsync Not tainted 2.6.31.12-0.2-xen #1 [21877.948005] Call Trace: [21877.949649] [] try_stack_unwind+0x189/0x1b0 [21877.949659] [] dump_trace+0xa6/0x1e0 [21877.949666] [] show_trace_log_lvl+0x64/0x90 [21877.949676] [] show_trace+0x23/0x40 [21877.949684] [] dump_stack+0x81/0x9e [21877.949695] [] __schedule_bug+0x78/0x90 [21877.949702] [] thread_return+0x1d7/0x3fb [21877.949709] [] schedule_timeout+0x195/0x200 [21877.949717] [] wait_for_common+0x10b/0x230 [21877.949726] [] wait_for_completion+0x2b/0x50 [21877.949768] [] xfs_buf_iowait+0x31/0x80 [xfs] [21877.949894] [] _xfs_buf_read+0x70/0x80 [xfs] [21877.949992] [] xfs_buf_read_flags+0x8b/0xd0 [xfs] [21877.950089] [] xfs_trans_read_buf+0x1e9/0x320 [xfs] [21877.950174] [] xfs_btree_read_buf_block+0x68/0xe0 [xfs] [21877.950232] [] xfs_btree_lookup_get_block+0x8e/0x110 [xfs] [21877.950281] [] xfs_btree_lookup+0xdf/0x4d0 [xfs] [21877.950329] [] xfs_alloc_lookup_eq+0x27/0x50 [xfs] [21877.950361] [] xfs_alloc_fixup_trees+0x249/0x370 [xfs] [21877.950397] [] xfs_alloc_ag_vextent_near+0x4e0/0x9a0 [xfs] [21877.950432] [] xfs_alloc_ag_vextent+0x105/0x160 [xfs] [21877.950471] [] xfs_alloc_vextent+0x3b4/0x4b0 [xfs] [21877.950504] [] xfs_bmbt_alloc_block+0xf8/0x210 [xfs] [21877.950550] [] xfs_btree_split+0xc7/0x720 [xfs] [21877.950597] [] xfs_btree_make_block_unfull+0x15c/0x1c0 [xfs] [21877.950643] [] xfs_btree_insrec+0x40f/0x5c0 [xfs] [21877.950689] [] xfs_btree_insert+0xa1/0x1b0 [xfs] [21877.950748] [] xfs_bmap_add_extent_delay_real+0x82e/0x12a0 [xfs] [21877.950787] [] xfs_bmap_add_extent+0x424/0x450 [xfs] [21877.950833] [] xfs_bmapi+0xda3/0x1320 [xfs] [21877.950879] [] xfs_iomap_write_allocate+0x1d8/0x3f0 [xfs] [21877.950953] [] xfs_iomap+0x2c9/0x300 [xfs] [21877.951021] [] xfs_map_blocks+0x38/0x60 [xfs] [21877.951108] [] xfs_page_state_convert+0x3fa/0x720 [xfs] [21877.951204] [] xfs_vm_writepage+0x84/0x160 [xfs] [21877.951301] [] pageout+0x143/0x2b0 [21877.951308] [] shrink_page_list+0x26e/0x650 [21877.951314] [] shrink_inactive_list+0x2d3/0x7c0 [21877.951320] [] shrink_list+0x5b/0x110 [21877.951325] [] shrink_zone+0x171/0x250 [21877.951330] [] shrink_zones+0x83/0x120 [21877.951336] [] do_try_to_free_pages+0x9e/0x380 [21877.951342] [] try_to_free_pages+0x77/0xa0 [21877.951349] [] __alloc_pages_slowpath+0x2d3/0x5c0 [21877.951355] [] __alloc_pages_nodemask+0x151/0x160 [21877.951362] [] __page_cache_alloc+0x27/0x50 [21877.951368] [] grab_cache_page_write_begin+0x9a/0xe0 [21877.951376] [] block_write_begin+0xae/0x120 [21877.951396] [] xfs_vm_write_begin+0x34/0x50 [xfs] [21877.951482] [] generic_perform_write+0xc1/0x1f0 [21877.951489] [] generic_file_buffered_write+0x90/0x160 [21877.951512] [] xfs_write+0x521/0xb60 [xfs] [21877.951624] [] xfs_file_aio_write+0x70/0xa0 [xfs] [21877.951711] [] do_sync_write+0x102/0x160 [21877.951718] [] vfs_write+0xd8/0x1c0 [21877.951723] [] sys_write+0x5b/0xa0 [21877.951729] [] system_call_fastpath+0x16/0x1b [21877.951736] [<00007fc41b0fab10>] 0x7fc41b0fab10 [21877.951750] BUG: unable to handle kernel paging request at 0000000108743280 [21877.951755] IP: [] dequeue_task+0x72/0x110 [21877.951766] PGD 31c6f067 PUD 0 [21877.951770] Thread overran stack, or stack corrupted I don't think we can afford to let write_begin recurse into the fs, so we can set AOP_FLAG_NOFS ... is this too big a hammer? Reported-by: Michael Monnerie Signed-off-by: Eric Sandeen --- (resend with linux-fsdevel and linux-mm per Christoph's request) diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 57c3827..3fb2cc8 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c @@ -1678,6 +1678,8 @@ xfs_vm_write_begin( void **fsdata) { *pagep = NULL; + /* can't afford to recurse into fs due to stack reasons */ + flags |= AOP_FLAG_NOFS; return block_write_begin(file, mapping, pos, len, flags, pagep, fsdata, xfs_get_blocks); } From weiyi.huang@gmail.com Sat May 22 12:11:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_NJABL_PROXY,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4MHB4h5077318 for ; Sat, 22 May 2010 12:11:04 -0500 X-ASG-Debug-ID: 1274548404-0ef203390000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-pw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3CDE7142D386 for ; Sat, 22 May 2010 10:13:24 -0700 (PDT) Received: from mail-pw0-f53.google.com (mail-pw0-f53.google.com [209.85.160.53]) by cuda.sgi.com with ESMTP id RWWYS4vYnKDTqEqL for ; Sat, 22 May 2010 10:13:24 -0700 (PDT) Received: by pwj2 with SMTP id 2so1141909pwj.26 for ; Sat, 22 May 2010 10:13:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer; bh=F1oL8sLVSHngFBPMhmasV8deWFC5BHkPkYJrgQ03flI=; b=i9hquIRkJP73YagtCz8+ijd4Moql5rwy7aSD9Otdfw4x7muEFcTqG03DHAe2tsKqy4 DfVw99IHVL9UihCz0JyKVyI4HTHZvdq3zAVT85H1DT13szJLG1hyGBxVPhaYeKV6lzWk hH2z/jgPInrzh9nKqF9D4SAOfRt4ywE/FokTw= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=tcu6amH1rL4jlBJji1gYEWGXpdzIyXkaNWgjJXQMEqM1TGTzbe6oE3DcCI6qxjXYtP SSX8FuRwa7lYBgg/GyAtBj9d9808tmvfnVMTo/WpWc5VWJctJZ8IKAaH/BxTeMPvlJ9n Tg16O+o+y/RUa4S2op2PYbALOUWOj8+8PqFlk= Received: by 10.142.7.41 with SMTP id 41mr2183445wfg.320.1274548404035; Sat, 22 May 2010 10:13:24 -0700 (PDT) Received: from localhost.localdomain ([222.95.173.142]) by mx.google.com with ESMTPS id 20sm2040128pzk.3.2010.05.22.10.13.21 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sat, 22 May 2010 10:13:23 -0700 (PDT) From: Huang Weiyi To: aelder@sgi.com Cc: xfs@oss.sgi.com, Huang Weiyi X-ASG-Orig-Subj: [PATCH 11/12] xfs: xfs_trace.c: remove duplicated #include Subject: [PATCH 11/12] xfs: xfs_trace.c: remove duplicated #include Date: Sun, 23 May 2010 01:13:20 +0800 Message-Id: <1274548400-3404-1-git-send-email-weiyi.huang@gmail.com> X-Mailer: git-send-email 1.6.1.2 X-Barracuda-Connect: mail-pw0-f53.google.com[209.85.160.53] X-Barracuda-Start-Time: 1274548405 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30502 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Remove duplicated #include('s) in fs/xfs/linux-2.6/xfs_trace.c Signed-off-by: Huang Weiyi --- fs/xfs/linux-2.6/xfs_trace.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.c b/fs/xfs/linux-2.6/xfs_trace.c index 207fa77..d12be84 100644 --- a/fs/xfs/linux-2.6/xfs_trace.c +++ b/fs/xfs/linux-2.6/xfs_trace.c @@ -50,7 +50,6 @@ #include "quota/xfs_dquot_item.h" #include "quota/xfs_dquot.h" #include "xfs_log_recover.h" -#include "xfs_buf_item.h" #include "xfs_inode_item.h" /* -- 1.6.1.3 From stan@hardwarefreak.com Sat May 22 17:08:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4MM8JTG087321 for ; Sat, 22 May 2010 17:08:19 -0500 X-ASG-Debug-ID: 1274566239-689c02890000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BE0E8142DADD for ; Sat, 22 May 2010 15:10:39 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id PGChH3SiQC5dxYRT for ; Sat, 22 May 2010 15:10:39 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 9A8946C2B1 for ; Sat, 22 May 2010 17:10:38 -0500 (CDT) Message-ID: <4BF8571A.8020605@hardwarefreak.com> Date: Sat, 22 May 2010 17:13:46 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Tuning XFS for real time audio on a laptop with encrypted LVM Subject: Re: Tuning XFS for real time audio on a laptop with encrypted LVM References: <20100521041415.GW8120@dastard> <4BF62766.8070105@hardwarefreak.com> <4BF68E74.8040305@hardwarefreak.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274566239 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0195 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30522 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Pedro Ribeiro put forth on 5/22/2010 7:21 AM: > Hi, > results are attached. There appears to be no difference between any of > the schedulers. That's a bit more... thorough than what we need, and makes digesting it and making comparisons difficult. Can you make just 4 runs, one with each elevator, on /dev/sda with 64 threads and post results? I saw some outrageously high numbers in your data due to caching of that tiny 337MB /dev/sda partition. Also, can you show confirmation of the elevator change between each run? Thanks. -- Stan From SRS0+tMOI+82+fromorbit.com=dave@internode.on.net Sat May 22 21:22:31 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4N2MU2X096175 for ; Sat, 22 May 2010 21:22:31 -0500 X-ASG-Debug-ID: 1274581575-481400660000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9484515741AA for ; Sat, 22 May 2010 19:26:15 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id RYXWge907j1qOcLx for ; Sat, 22 May 2010 19:26:15 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25493829-1927428 for ; Sun, 23 May 2010 11:54:47 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OG0rt-0004LE-NU for xfs@oss.sgi.com; Sun, 23 May 2010 12:24:45 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OG0rm-000512-Gj for xfs@oss.sgi.com; Sun, 23 May 2010 12:24:38 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: fix race in inode cluster freeing failing to stale inodes Subject: [PATCH] xfs: fix race in inode cluster freeing failing to stale inodes Date: Sun, 23 May 2010 12:24:38 +1000 Message-Id: <1274581478-19260-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1274581577 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.2, rules version 3.2.2.30536 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean When an inode cluster is freed, it needs to mark all inodes in memory as XFS_ISTALE before marking the buffer as stale. This is eeded because the inodes have a different life cycle to the buffer, and once the buffer is torn down during transaction completion, we must ensure none of the inodes get written back (which is what XFS_ISTALE does). Unfortunately, xfs_ifree_cluster() has some bugs that lead to inodes not being marked with XFS_ISTALE. This shows up when xfs_iflush() is called on these inodes either during inode reclaim or tail pushing on the AIL. The buffer is read back, but no longer contains inodes and so triggers assert failures and shutdowns. This was reproducable with at run.dbench10 invocation from xfstests. There are two main causes of xfs_ifree_cluster() failing. The first is simple - it checks in-memory inodes it finds in the per-ag icache to see if they are clean without holding the flush lock. if they are clean it skips them completely. However, If an inode is flushed delwri, it will appear clean, but is not guaranteed to be written back until the flush lock has been dropped. Hence we may have raced on the clean check and the inode may actually be dirty. Hence always mark inodes found in memory stale before we check properly if they are clean. The second is more complex, and makes the first problem easier to hit. Basically the in-memory inode scan is done with full knowledge it can be racing with inode flushing and AIl tail pushing, which means that inodes that it can't get the flush lock on might not be attached to the buffer after then in-memory inode scan due to IO completion occurring. This is actually documented in the code as "needs better interlocking". i.e. this is a zero-day bug. Effectively, the in-memory scan must be done while the inode buffer is locked and Io cannot be issued on it while we do the in-memory inode scan. This ensures that inodes we couldn't get the flush lock on are guaranteed to be attached to the cluster buffer, so we can then catch all in-memory inodes and mark them stale. Now that the inode cluster buffer is locked before the in-memory scan is done, there is no need for the two-phase update of the in-memory inodes, so simplify the code into two loops and remove the allocation of the temporary buffer used to hold locked inodes across the phases. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 141 ++++++++++++++++++++++------------------------------ 1 files changed, 60 insertions(+), 81 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8cd6e8d..791e762 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1940,10 +1940,10 @@ xfs_ifree_cluster( int blks_per_cluster; int nbufs; int ninodes; - int i, j, found, pre_flushed; + int i, j; xfs_daddr_t blkno; xfs_buf_t *bp; - xfs_inode_t *ip, **ip_found; + xfs_inode_t *ip; xfs_inode_log_item_t *iip; xfs_log_item_t *lip; struct xfs_perag *pag; @@ -1960,114 +1960,94 @@ xfs_ifree_cluster( nbufs = XFS_IALLOC_BLOCKS(mp) / blks_per_cluster; } - ip_found = kmem_alloc(ninodes * sizeof(xfs_inode_t *), KM_NOFS); - for (j = 0; j < nbufs; j++, inum += ninodes) { + int found = 0; + blkno = XFS_AGB_TO_DADDR(mp, XFS_INO_TO_AGNO(mp, inum), XFS_INO_TO_AGBNO(mp, inum)); + /* + * We obtain and lock the backing buffer first in the process + * here, as we have to ensure that any dirty inode that we + * can't get the flush lock on is attached to the buffer. + * If we scan the in-memory inodes first, then buffer IO can + * complete before we get a lock on it, and hence we may fail + * to mark all the active inodes on the buffer stale. + */ + bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, blkno, + mp->m_bsize * blks_per_cluster, + XBF_LOCK); + + /* + * Walk the inodes already attached to the buffer and mark them + * stale. These will all have the flush locks held, so an + * in-memory inode walk can't lock them. + */ + lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); + while (lip) { + if (lip->li_type == XFS_LI_INODE) { + iip = (xfs_inode_log_item_t *)lip; + ASSERT(iip->ili_logged == 1); + lip->li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) xfs_istale_done; + xfs_trans_ail_copy_lsn(mp->m_ail, + &iip->ili_flush_lsn, + &iip->ili_item.li_lsn); + xfs_iflags_set(iip->ili_inode, XFS_ISTALE); + found++; + } + lip = lip->li_bio_list; + } /* - * Look for each inode in memory and attempt to lock it, - * we can be racing with flush and tail pushing here. - * any inode we get the locks on, add to an array of - * inode items to process later. - * - * The get the buffer lock, we could beat a flush - * or tail pushing thread to the lock here, in which - * case they will go looking for the inode buffer - * and fail, we need some other form of interlock - * here. + * Now we've locked out tail pushing and flushing by locking + * the buffer, look for each inode in memory and attempt to + * lock it. Any inode we get the locks on add it to the inode + * buffer and set it up for being staled on buffer IO + * completion. */ - found = 0; for (i = 0; i < ninodes; i++) { read_lock(&pag->pag_ici_lock); ip = radix_tree_lookup(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, (inum + i))); - /* Inode not in memory or we found it already, - * nothing to do - */ + /* Inode not in memory or stale, nothing to do */ if (!ip || xfs_iflags_test(ip, XFS_ISTALE)) { read_unlock(&pag->pag_ici_lock); continue; } - if (xfs_inode_clean(ip)) { - read_unlock(&pag->pag_ici_lock); - continue; - } - - /* If we can get the locks then add it to the - * list, otherwise by the time we get the bp lock - * below it will already be attached to the - * inode buffer. - */ - - /* This inode will already be locked - by us, lets - * keep it that way. - */ - - if (ip == free_ip) { - if (xfs_iflock_nowait(ip)) { - xfs_iflags_set(ip, XFS_ISTALE); - if (xfs_inode_clean(ip)) { - xfs_ifunlock(ip); - } else { - ip_found[found++] = ip; - } - } + /* don't try to lock/unlock the current inode */ + if (ip != free_ip && + !xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) { read_unlock(&pag->pag_ici_lock); continue; } + read_unlock(&pag->pag_ici_lock); - if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) { - if (xfs_iflock_nowait(ip)) { - xfs_iflags_set(ip, XFS_ISTALE); - - if (xfs_inode_clean(ip)) { - xfs_ifunlock(ip); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - } else { - ip_found[found++] = ip; - } - } else { + if (!xfs_iflock_nowait(ip)) { + if (ip != free_ip) xfs_iunlock(ip, XFS_ILOCK_EXCL); - } + continue; } - read_unlock(&pag->pag_ici_lock); - } - bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, blkno, - mp->m_bsize * blks_per_cluster, - XBF_LOCK); - - pre_flushed = 0; - lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); - while (lip) { - if (lip->li_type == XFS_LI_INODE) { - iip = (xfs_inode_log_item_t *)lip; - ASSERT(iip->ili_logged == 1); - lip->li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) xfs_istale_done; - xfs_trans_ail_copy_lsn(mp->m_ail, - &iip->ili_flush_lsn, - &iip->ili_item.li_lsn); - xfs_iflags_set(iip->ili_inode, XFS_ISTALE); - pre_flushed++; + xfs_iflags_set(ip, XFS_ISTALE); + if (xfs_inode_clean(ip)) { + ASSERT(ip != free_ip); + xfs_ifunlock(ip); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + continue; } - lip = lip->li_bio_list; - } - for (i = 0; i < found; i++) { - ip = ip_found[i]; iip = ip->i_itemp; - if (!iip) { + /* inode with unlogged changes only */ + ASSERT(ip != free_ip); ip->i_update_core = 0; xfs_ifunlock(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); continue; } + found++; iip->ili_last_fields = iip->ili_format.ilf_fields; iip->ili_format.ilf_fields = 0; @@ -2078,17 +2058,16 @@ xfs_ifree_cluster( xfs_buf_attach_iodone(bp, (void(*)(xfs_buf_t*,xfs_log_item_t*)) xfs_istale_done, (xfs_log_item_t *)iip); - if (ip != free_ip) { + + if (ip != free_ip) xfs_iunlock(ip, XFS_ILOCK_EXCL); - } } - if (found || pre_flushed) + if (found) xfs_trans_stale_inode_buf(tp, bp); xfs_trans_binval(tp, bp); } - kmem_free(ip_found); xfs_perag_put(pag); } -- 1.5.6.5 From roman@binarylife.net Sun May 23 00:18:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4N5I5Hw104355 for ; Sun, 23 May 2010 00:18:06 -0500 X-ASG-Debug-ID: 1274592025-26d203e30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from out3.smtp.messagingengine.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4E2B4142D98B for ; Sat, 22 May 2010 22:20:25 -0700 (PDT) Received: from out3.smtp.messagingengine.com (out3.smtp.messagingengine.com [66.111.4.27]) by cuda.sgi.com with ESMTP id NNFcEfT1Ls2yjidL for ; Sat, 22 May 2010 22:20:25 -0700 (PDT) Received: from compute1.internal (compute1.internal [10.202.2.41]) by gateway1.messagingengine.com (Postfix) with ESMTP id 3F2D4F58D2; Sun, 23 May 2010 01:20:25 -0400 (EDT) Received: from heartbeat2.messagingengine.com ([10.202.2.161]) by compute1.internal (MEProxy); Sun, 23 May 2010 01:20:25 -0400 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=messagingengine.com; h=date:from:to:subject:message-id:mime-version:content-type:content-transfer-encoding; s=smtpout; bh=eDDPGk75ZE/ND6+8ndgZJDlHLE8=; b=Fig6VEg6qGFyr5Mrh/KpAVqatt/U85PZKxaH6ikdfKZFxLZBlYeS0HGc+y91GHdvIofIsDMg64fXVGHE54PxL1Zwp11GGe605OyRmwD4xjhfXKPBJ6KbbtbwVsl+jN971CCK31SxtbaFg/dlbrzW3hnsjpyn0cDhdGgGXJ/8Jvo= X-Sasl-enc: pZWh6QxrO4xBmacCN3ZDpGIENOTjy9f7EjnDvn4o10Pj 1274592025 Received: from cave.pulp.binarylife.net (adsl-70-131-210-4.dsl.emhril.sbcglobal.net [70.131.210.4]) by mail.messagingengine.com (Postfix) with ESMTPSA id F153F1376A; Sun, 23 May 2010 01:20:24 -0400 (EDT) Received: from aaa.pulp.binarylife.net (aaa.pulp.binarylife.net [192.168.130.190]) by cave.pulp.binarylife.net (Postfix) with ESMTPS id 3BD5F96651C; Sun, 23 May 2010 00:20:24 -0500 (CDT) Date: Sun, 23 May 2010 00:20:23 -0500 From: Roman Kononov To: xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: WARNING in xfs_lwr.c, xfs_write() Subject: WARNING in xfs_lwr.c, xfs_write() Message-ID: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> X-Mailer: Claws Mail 3.7.6 (GTK+ 2.20.0; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: out3.smtp.messagingengine.com[66.111.4.27] X-Barracuda-Start-Time: 1274592026 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_RULE_7582B, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30547 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Under some workload, once per ~10 seconds, I'm getting the following warnings with 2.6.32.13 and 2.6.33.4 (x86_64). Why are they? Thanks. May 22 23:53:13 hrech kernel: WARNING: at /home/stuff/base/linux-2.6.32.13/fs/xfs/linux-2.6/xfs_lrw.c:714 xfs_write+0x8a2/0x8c0() May 22 23:53:13 hrech kernel: Modules linked in: ib_mthca sata_nv 3w_9xxx May 22 23:53:13 hrech kernel: Pid: 30650, comm: postmaster Not tainted 2.6.32.13 #2 May 22 23:53:13 hrech kernel: Call Trace: May 22 23:53:13 hrech kernel: [] ? xfs_write+0x8a2/0x8c0 May 22 23:53:13 hrech kernel: [] ? xfs_write+0x8a2/0x8c0 May 22 23:53:13 hrech kernel: [] ? warn_slowpath_common+0x85/0xb0 May 22 23:53:13 hrech kernel: [] ? xfs_write+0x8a2/0x8c0 May 22 23:53:13 hrech kernel: [] ? cpumask_next_and+0x23/0x40 May 22 23:53:13 hrech kernel: [] ? select_task_rq_fair+0x326/0x6a0 May 22 23:53:13 hrech kernel: [] ? do_sync_write+0xd9/0x120 May 22 23:53:13 hrech kernel: [] ? autoremove_wake_function+0x0/0x30 May 22 23:53:13 hrech kernel: [] ? wake_up_new_task+0x9d/0xc0 May 22 23:53:13 hrech kernel: [] ? do_fork+0x102/0x330 May 22 23:53:13 hrech kernel: [] ? vfs_write+0xc8/0x180 May 22 23:53:13 hrech kernel: [] ? sys_pwrite64+0x91/0xa0 May 22 23:53:13 hrech kernel: [] ? system_call_fastpath+0x16/0x1b May 22 23:53:13 hrech kernel: ---[ end trace 615b846a6bbdf833 ]--- May 22 09:06:25 hrech kernel: WARNING: at /home/stuff/base/linux-2.6.33.4/fs/xfs/linux-2.6/xfs_lrw.c:651 xfs_write+0x961/0x970() May 22 09:06:25 hrech kernel: Modules linked in: dm_mod ib_mthca sata_nv 3w_9xxx May 22 09:06:25 hrech kernel: Pid: 1937, comm: postmaster Not tainted 2.6.33.4 #2 May 22 09:06:25 hrech kernel: Call Trace: May 22 09:06:25 hrech kernel: [] ? warn_slowpath_common+0x73/0xb0 May 22 09:06:25 hrech kernel: [] ? xfs_write+0x961/0x970 May 22 09:06:25 hrech kernel: [] ? do_sync_write+0xbf/0x100 May 22 09:06:25 hrech kernel: [] ? wake_up_new_task+0xc2/0xe0 May 22 09:06:25 hrech kernel: [] ? do_fork+0xf0/0x380 May 22 09:06:25 hrech kernel: [] ? vfs_write+0xb6/0x170 May 22 09:06:25 hrech kernel: [] ? sys_pwrite64+0x83/0xa0 May 22 09:06:25 hrech kernel: [] ? system_call_fastpath+0x16/0x1b May 22 09:06:25 hrech kernel: ---[ end trace 62b123c1948e55fa ]--- From SRS0+oaHo+82+fromorbit.com=david@internode.on.net Sun May 23 05:16:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4NAGiT8116444 for ; Sun, 23 May 2010 05:16:44 -0500 X-ASG-Debug-ID: 1274610031-7f1900000000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9922DA18F80 for ; Sun, 23 May 2010 03:20:31 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id LHbKbb0zwXqKodF2 for ; Sun, 23 May 2010 03:20:31 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25386565-1927428 for multiple; Sun, 23 May 2010 19:48:58 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OG8Gm-0004gU-MZ; Sun, 23 May 2010 20:18:56 +1000 Date: Sun, 23 May 2010 20:18:56 +1000 From: Dave Chinner To: Roman Kononov Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: WARNING in xfs_lwr.c, xfs_write() Message-ID: <20100523101856.GL2150@dastard> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1274610033 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0444 1.0000 -1.7353 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.74 X-Barracuda-Spam-Status: No, SCORE=-1.74 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.2, rules version 3.2.2.30564 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, May 23, 2010 at 12:20:23AM -0500, Roman Kononov wrote: > Under some workload, once per ~10 seconds, I'm getting the following warnings > with 2.6.32.13 and 2.6.33.4 (x86_64). Why are they? You've got some workload that is mixing direct IO writes with some form of buffered or mmap IO on the same file and they are racing. Mixing different types of IO on the one inode is also known as A Really Bad Idea because there is no guarantee of coherency between them.... Can you find out what the application is triggering this? Cheers, Dave. -- Dave Chinner david@fromorbit.com From roman@binarylife.net Sun May 23 09:21:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4NELPV6125472 for ; Sun, 23 May 2010 09:21:26 -0500 X-ASG-Debug-ID: 1274624626-6bb5028b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from out3.smtp.messagingengine.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 167C23678C0 for ; Sun, 23 May 2010 07:23:46 -0700 (PDT) Received: from out3.smtp.messagingengine.com (out3.smtp.messagingengine.com [66.111.4.27]) by cuda.sgi.com with ESMTP id x3HbUoczSuBvNVNf for ; Sun, 23 May 2010 07:23:46 -0700 (PDT) Received: from compute2.internal (compute2.internal [10.202.2.42]) by gateway1.messagingengine.com (Postfix) with ESMTP id 1978CF7800; Sun, 23 May 2010 10:23:46 -0400 (EDT) Received: from heartbeat2.messagingengine.com ([10.202.2.161]) by compute2.internal (MEProxy); Sun, 23 May 2010 10:23:46 -0400 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=messagingengine.com; h=date:from:to:cc:subject:message-id:in-reply-to:references:mime-version:content-type:content-transfer-encoding; s=smtpout; bh=aZxoIRhMJgPurtwqV5ztfoZ6RKw=; b=LxkwfBjj6BTjGSKDCdeEIJX4YoJ6P7j1UDlLDzCwD01SU6YIvYGpb25eoOJZF8sfr10jRbqtvqWitdVwGO/4u/zC/VI9RYYLipBoqeT2BMtbc38myXp++JUwDqwjgBG1P4u/ArNOlaF5LsfDAwtPDuTaddNoKiITdn9gTsP5RhM= X-Sasl-enc: a7wWClySgyiqv513GizjPSi2AcPqz7XBfAR44DolpZx0 1274624625 Received: from cave.pulp.binarylife.net (adsl-70-131-210-4.dsl.emhril.sbcglobal.net [70.131.210.4]) by mail.messagingengine.com (Postfix) with ESMTPSA id BA05048571; Sun, 23 May 2010 10:23:45 -0400 (EDT) Received: from aaa.pulp.binarylife.net (aaa.pulp.binarylife.net [192.168.130.190]) by cave.pulp.binarylife.net (Postfix) with ESMTPS id D36A9966518; Sun, 23 May 2010 09:23:44 -0500 (CDT) Date: Sun, 23 May 2010 09:23:44 -0500 From: Roman Kononov To: Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: WARNING in xfs_lwr.c, xfs_write() Message-ID: <20100523092344.0fcaab42@aaa.pulp.binarylife.net> In-Reply-To: <20100523101856.GL2150@dastard> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> X-Mailer: Claws Mail 3.7.6 (GTK+ 2.20.0; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: out3.smtp.messagingengine.com[66.111.4.27] X-Barracuda-Start-Time: 1274624627 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0202 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30578 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 2010-05-23, 20:18:56 +1000, Dave Chinner wrote: > You've got some workload that is mixing direct IO writes with some > form of buffered or mmap IO on the same file and they are racing. > Mixing different types of IO on the one inode is also known as A > Really Bad Idea because there is no guarantee of coherency between > them.... > > Can you find out what the application is triggering this? This is severely modified Postgresql, which does mix direct IO with buffered one. You say "they are racing". Do you mean that this can cause file system corruption? Doest it simply warn that direct user data races with buffered user data and one of them wins? This warning "taints" the kernel. Should it be safe to do different types of IOs on different non-overlapping 4-KiB-aligned regions of the same file (I am unsure if this is what the application really does)? Thanks, Roman From SRS0+KbEd+83+fromorbit.com=david@internode.on.net Sun May 23 19:28:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4O0SOgD146504 for ; Sun, 23 May 2010 19:28:25 -0500 X-ASG-Debug-ID: 1274661133-337101310000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 82836A24B5C for ; Sun, 23 May 2010 17:32:14 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id mVgh6jo2qkCejY0c for ; Sun, 23 May 2010 17:32:14 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25569129-1927428 for ; Mon, 24 May 2010 10:00:40 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OGLZ1-0005Lw-IN for xfs@oss.sgi.com; Mon, 24 May 2010 10:30:39 +1000 Date: Mon, 24 May 2010 10:30:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/12] xfs: delayed logging V6 Subject: Re: [PATCH 0/12] xfs: delayed logging V6 Message-ID: <20100524003039.GB12087@dastard> References: <1274138668-1662-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1274138668-1662-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1274661137 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.2, rules version 3.2.2.30615 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 18, 2010 at 09:24:16AM +1000, Dave Chinner wrote: > > Hi Folks, > > This is version 6 of the delayed logging series and is the first > release candidate for incluŃ•ion in the xfs-dev tree and 2.6.35-rc1. BTW, here's a couple of quick benchmarks I've run over the last couple of days to check comparitive performance. I found that the previous scalability testing I did was limited by two factors: 1. Only 4 AGs in the test filesystem, so only 4-way parallelism on allocation/freeing. Hence it won't scale to 8 threads no matter what I do.... 2. lockdep checking limits scalability to around 4 threads. So I re-ran the pure-metadata, sequential create/remove fs_mark tests I've previously run with the following results. barriers were disabled on both XFS and ext4, and XFS also was configured with: MKFS_OPTIONS="-l size=128m -d agcount=16" MOUNT_OPTIONS="-o [no]delaylog,logbsize=262144,nobarrier" (./fs_mark -S0 -n 100000 -s 0 -d /mnt/scratch/0 ...) nodelaylog: fs_mark rate threads nodelaylog delaylog ext4 1 17k/s 19k/s 33k/s 2 30k/s 35k/s 66k/s 4 42k/s 63k/s 80k/s 8 39k/s 97k/s 45k/s This shows pure metadata operations scale much, much better, especially for multithreaded workloads. The log throughput at 8 threads is 3.5x lower for a 2.5x improvement in performance. Also worth noting is that the performance is competitive with ext4 and exceeds it at a higher parallelism. Also worth noting is the disk subsystem requirements to sustain this performance. These numbers were recorded of pmchart graphs w/ a 5s sample interval, so should be considered ballpark numbers (i.e close but not perfectly accurate): IOPS/s @ MB/s threads nodelaylog delaylog ext4 1 1.0k @ 280 50 @ 10 50 @ 20 2 2.0k @ 460 100 @ 20 500 @ 75 4 2.5k @ 520 300 @ 50 6.5k @ 150 8 3.7k @ 480 900 @ 150 9.8k @ 180 We can see why the curent XFS journalling mode is slow - it requires 500MB/s of log throughput to get to 40k creates/s and almost all the IOPs are servicing log IO. ext4, on the other hand, really strains the IOP capability of the disk subsystem and that is the limiting factor at greater than two threads. It's an interesting progression, too, in that the iops go up by an order of magnitude each time the thread count doubles. The best IO behaviour comes from the delayed logging version of XFS, with the lowest bandwidth and iops to sustain the highest performance. All the IO is to the log - no metadata is written to disk at all, which is the way this test should execute. As a reult, the delayed logging code was the only configuration not limited by the IO subsystem - instead it was completely CPU bound (8 CPUs worth)... However, it's not all roses, as dbench will show: # MKFS_OPTIONS="-l size=128m -d agcount=16" MOUNT_OPTIONS="-o nodelaylog,nobarrier" ./bench 1 dave dave dbenchmulti Throughput is in MB/s, latency in ms. nodelaylog delaylog Threads thruput max-lat thruput max-lat 1 153.011 45.450 157.036 59.685 2 319.534 18.096 330.062 41.458 10 1350.31 46.631 726.075 303.434 20 1497.93 365.092 547.380 541.223 100 1410.42 2488.105 477.964 177.471 200 1232.97 297.982 457.641 447.060 There is no difference for 1-2 threads (within the error margin of dbench), but delayed logging shows significant throughput reductions (>60% degradation) at higher thread counts. This appears to be due to the unoptimised log force implementation that the delayed logging code currently has. I'll probably use dbench over the next few weeks as a measure to try to bring this part of the delayed logging code up to the same performance. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+KbEd+83+fromorbit.com=david@internode.on.net Sun May 23 20:16:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4O1GsPQ148229 for ; Sun, 23 May 2010 20:16:54 -0500 X-ASG-Debug-ID: 1274663953-1dae03380000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 655B51DF7B8C for ; Sun, 23 May 2010 18:19:14 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id zqEP1s81IfTi8ITo for ; Sun, 23 May 2010 18:19:14 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13700387-1927428 for multiple; Mon, 24 May 2010 10:49:09 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OGMJv-0005ON-QI; Mon, 24 May 2010 11:19:07 +1000 Date: Mon, 24 May 2010 11:19:07 +1000 From: Dave Chinner To: Roman Kononov Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: WARNING in xfs_lwr.c, xfs_write() Message-ID: <20100524011907.GC12087@dastard> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100523092344.0fcaab42@aaa.pulp.binarylife.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1274663955 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.2, rules version 3.2.2.30618 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, May 23, 2010 at 09:23:44AM -0500, Roman Kononov wrote: > On 2010-05-23, 20:18:56 +1000, Dave Chinner wrote: > > You've got some workload that is mixing direct IO writes with some > > form of buffered or mmap IO on the same file and they are racing. > > Mixing different types of IO on the one inode is also known as A > > Really Bad Idea because there is no guarantee of coherency between > > them.... > > > > Can you find out what the application is triggering this? > > This is severely modified Postgresql, which does mix direct IO with > buffered one. I hope you keep plenty of backups, then... > You say "they are racing". Do you mean that this can cause file system > corruption? ... because it's Not filesystem corruption you need to be worried about, it's *silent data corruption* that these races can cause. > Doest it simply warn that direct user data races with > buffered user data and one of them wins? Yes, that's right. No guarantee of who wins is given, though. > This warning "taints" the kernel. Yup, the application is doing something dangerous, and this warning is there to let us know that the data corruption is the user's fault, not the filesystem... > Should it be safe to do different types of IOs on different > non-overlapping 4-KiB-aligned regions of the same file (I am unsure > if this is what the application really does)? Yes, it should be safe, but the kernel code can't know whether this is true or not - there are no specific interlocks with direct IO to prevent concurrent buffered IO to the same region while a direct IO is in progress. XFS does best effort attempts to maintain coherency does not provide any guarantees, hence the warning when known race conditions are tripped. Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Sun May 23 23:09:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4O49nq3154225 for ; Sun, 23 May 2010 23:09:49 -0500 X-ASG-Debug-ID: 1274674329-566402070000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A59AE368510 for ; Sun, 23 May 2010 21:12:09 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id d3p1QZYYnBljvpXF for ; Sun, 23 May 2010 21:12:09 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id BA7C66C2B0 for ; Sun, 23 May 2010 23:12:08 -0500 (CDT) Message-ID: <4BF9FCA8.8090906@hardwarefreak.com> Date: Sun, 23 May 2010 23:12:24 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: WARNING in xfs_lwr.c, xfs_write() References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> In-Reply-To: <20100523092344.0fcaab42@aaa.pulp.binarylife.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274674329 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1101 1.0000 -1.3323 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30628 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Roman Kononov put forth on 5/23/2010 9:23 AM: > On 2010-05-23, 20:18:56 +1000, Dave Chinner wrote: >> You've got some workload that is mixing direct IO writes with some >> form of buffered or mmap IO on the same file and they are racing. >> Mixing different types of IO on the one inode is also known as A >> Really Bad Idea because there is no guarantee of coherency between >> them.... >> >> Can you find out what the application is triggering this? > > This is severely modified Postgresql, which does mix direct IO with > buffered one. "The whole notion of "direct IO" is totally braindamaged. Just say no. This is your brain: O This is your brain on O_DIRECT: . Any questions?" Linus From: http://lkml.org/lkml/2007/1/10/235 -- Stan From stewart@flamingspork.com Mon May 24 00:14:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4O5Edfl159252 for ; Mon, 24 May 2010 00:14:40 -0500 X-ASG-Debug-ID: 1274678220-565703590000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kaylee.flamingspork.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4245E368747 for ; Sun, 23 May 2010 22:17:00 -0700 (PDT) Received: from kaylee.flamingspork.com (kaylee.flamingspork.com [74.207.245.61]) by cuda.sgi.com with ESMTP id QIfxBQDB2wopbkqs for ; Sun, 23 May 2010 22:17:00 -0700 (PDT) Received: from willster (localhost [127.0.0.1]) by kaylee.flamingspork.com (Postfix) with ESMTPS id 938836396; Mon, 24 May 2010 05:10:11 +0000 (UTC) Received: by willster (Postfix, from userid 1000) id B9D116622C; Mon, 24 May 2010 15:16:58 +1000 (EST) From: Stewart Smith To: Stan Hoeppner , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: WARNING in xfs_lwr.c, xfs_write() In-Reply-To: <4BF9FCA8.8090906@hardwarefreak.com> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <4BF9FCA8.8090906@hardwarefreak.com> User-Agent: Notmuch/0.3.1-17-gc50524e (http://notmuchmail.org) Emacs/23.1.1 (x86_64-pc-linux-gnu) Date: Mon, 24 May 2010 15:16:58 +1000 Message-ID: <87r5l1ev5h.fsf@willster.local.flamingspork.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: kaylee.flamingspork.com[74.207.245.61] X-Barracuda-Start-Time: 1274678221 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0095 1.0000 -1.9587 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.96 X-Barracuda-Spam-Status: No, SCORE=-1.96 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.2, rules version 3.2.2.30632 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, 23 May 2010 23:12:24 -0500, Stan Hoeppner wrote: > "The whole notion of "direct IO" is totally braindamaged. Just say no. > > This is your brain: O > This is your brain on O_DIRECT: . > > Any questions?" > > > Linus > > From: http://lkml.org/lkml/2007/1/10/235 and the alternative is...... \0 (null). We can have very explicit knowledge about buffers and IO in userspace. Much better than you are ever going to have guessing it in kernel IO paths. There currently exists *no* usable and reliable way of transmitting this information to the kernel other than O_DIRECT. -- Stewart Smith From shiwh@cn.fujitsu.com Mon May 24 01:34:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4O6Yj11163521 for ; Mon, 24 May 2010 01:34:46 -0500 X-ASG-Debug-ID: 1274683022-2bf502d20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from song.cn.fujitsu.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B3F18142FA76 for ; Sun, 23 May 2010 23:37:03 -0700 (PDT) Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id OjE9kXFb2fI4ohuB for ; Sun, 23 May 2010 23:37:03 -0700 (PDT) Received: from tang.cn.fujitsu.com (tang.cn.fujitsu.com [10.167.250.3]) by song.cn.fujitsu.com (Postfix) with ESMTP id 15D9717003F; Mon, 24 May 2010 14:37:00 +0800 (CST) Received: from fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id o4O6Yskv018106; Mon, 24 May 2010 14:34:54 +0800 Received: from [10.167.141.106] (unknown [10.167.141.106]) by fnst.cn.fujitsu.com (Postfix) with ESMTPA id 3B6AC10C0A6; Mon, 24 May 2010 14:40:40 +0800 (CST) Message-ID: <4BFA1E90.5050805@cn.fujitsu.com> Date: Mon, 24 May 2010 14:37:04 +0800 From: Shi Weihua User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.10) Gecko/20100512 Thunderbird/3.0.5 MIME-Version: 1.0 To: Christoph Hellwig CC: Miao Xie , Chris Mason , Linux Btrfs , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 07/10] btrfs: fix wrong ctime when adding link Subject: Re: [PATCH 07/10] btrfs: fix wrong ctime when adding link References: <4BF4E336.40603@cn.fujitsu.com> <20100520083300.GB11920@infradead.org> In-Reply-To: <20100520083300.GB11920@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1274683027 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-ASG-Whitelist: BODY (http://marc\.info/\?) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean cc xfstests ml at 2010-5-20 16:33, Christoph Hellwig wrote: > On Thu, May 20, 2010 at 03:22:30PM +0800, Miao Xie wrote: >> the ctime of file has not been updated when I create a link for it. >> >> Steps to reproduce: >> # touch file1 >> # stat -c %Z file1 >> 1273592239 >> # link flink1 file1 >> # stat -c %Z file1 >> 1273592239 <-- have not been updated >> >> This patch fix this problem. > > Care to add a test to xfstests to check for this regression? did it. Signed-off-by: Shi Weihua --- diff -urpN xfstests.orig/229 xfstests/229 --- xfstests.orig/229 1970-01-01 08:00:00.000000000 +0800 +++ xfstests/229 2010-05-28 11:27:14.000000000 +0800 @@ -0,0 +1,73 @@ +#! /bin/bash +# FS QA Test No. 229 +# +# Check ctime updated or not if file linked +# See also http://marc.info/?l=linux-btrfs&m=127434439020230&w=2 +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 FUJITSU LIMITED. 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=shiwh@cn.fujitsu.com + +seq=`basename $0` +echo "QA output created by $seq" + +_cleanup() +{ + if [ -a $TEST_DIR/ouch2 ]; then + rm -f $TEST_DIR/ouch2 + fi + if [ -a $TEST_DIR/ouch ]; then + rm -f $TEST_DIR/ouch + fi +} + +here=`pwd` + +# get standard environment, filters and checks +. ./common.rc + +# real QA test starts here +_supported_fs generic +# only Linux supports fallocate +_supported_os Linux + +# create a file and get its ctime +touch $TEST_DIR/ouch +ctime=`stat -c %Z $TEST_DIR/ouch` +sleep 1 + +# create a link to a file and get existing file's ctime +link $TEST_DIR/ouch $TEST_DIR/ouch2 +ctime2=`stat -c %Z $TEST_DIR/ouch` + +# check ctime updated +if [ $ctime2 -le $ctime ]; then + echo "ctime: $ctime -> $ctime2 " + echo "Fatal error: ctime not updated after link" + _cleanup + exit 1 +fi + +_cleanup + +echo "Test over." +# success, all done +status=0 +exit diff -urpN xfstests.orig/229.out xfstests/229.out --- xfstests.orig/229.out 1970-01-01 08:00:00.000000000 +0800 +++ xfstests/229.out 2010-05-28 11:27:14.000000000 +0800 @@ -0,0 +1,2 @@ +QA output created by 229 +Test over. diff -urpN xfstests.orig/group xfstests/group --- xfstests.orig/group 2010-05-07 23:32:13.000000000 +0800 +++ xfstests/group 2010-05-28 11:27:02.000000000 +0800 @@ -342,3 +342,4 @@ deprecated 226 auto enospc 227 auto fsr 228 rw auto prealloc quick +229 auto From shiwh@cn.fujitsu.com Mon May 24 01:36:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4O6aaLl163632 for ; Mon, 24 May 2010 01:36:37 -0500 X-ASG-Debug-ID: 1274683230-0f8a033c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from song.cn.fujitsu.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C79BFA255B1 for ; Sun, 23 May 2010 23:40:30 -0700 (PDT) Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id i54xfkiAgDVwGHEE for ; Sun, 23 May 2010 23:40:30 -0700 (PDT) Received: from tang.cn.fujitsu.com (tang.cn.fujitsu.com [10.167.250.3]) by song.cn.fujitsu.com (Postfix) with ESMTP id AEB3D170119; Mon, 24 May 2010 14:38:55 +0800 (CST) Received: from fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id o4O6anqn018171; Mon, 24 May 2010 14:36:49 +0800 Received: from [10.167.141.106] (unknown [10.167.141.106]) by fnst.cn.fujitsu.com (Postfix) with ESMTPA id 464C010C0A6; Mon, 24 May 2010 14:42:35 +0800 (CST) Message-ID: <4BFA1F03.6030909@cn.fujitsu.com> Date: Mon, 24 May 2010 14:38:59 +0800 From: Shi Weihua User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.10) Gecko/20100512 Thunderbird/3.0.5 MIME-Version: 1.0 To: Christoph Hellwig CC: chris.mason@oracle.com, "Yan, Zheng" , linux-btrfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] btrfs: should add a permission check for setfacl Subject: Re: [PATCH] btrfs: should add a permission check for setfacl References: <4BF1E458.7060500@cn.fujitsu.com> <20100520083340.GC11920@infradead.org> In-Reply-To: <20100520083340.GC11920@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1274683231 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-ASG-Whitelist: BODY (http://marc\.info/\?) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean cc xfstests ml at 2010-5-20 16:33, Christoph Hellwig wrote: > On Tue, May 18, 2010 at 08:50:32AM +0800, Shi Weihua wrote: >> On btrfs, do the following >> ------------------ >> # su user1 >> # cd btrfs-part/ >> # touch aaa >> # getfacl aaa >> # file: aaa >> # owner: user1 >> # group: user1 >> user::rw- >> group::rw- >> other::r-- >> # su user2 >> # cd btrfs-part/ >> # setfacl -m u::rwx aaa >> # getfacl aaa >> # file: aaa >> # owner: user1 >> # group: user1 >> user::rwx <- successed to setfacl >> group::rw- >> other::r-- >> ------------------ >> but we should prohibit it that user2 changing user1's acl. >> In fact, on ext3 and other fs, a message occurs: >> setfacl: aaa: Operation not permitted > > Can you add this as a new testcase to xfstests so that we can easiy > check for regressions and future filesystems implementing this > correctly? > did it. maybe it should be merged into 051 or 099. Signed-off-by: Shi Weihua --- diff -urpN xfstests.orig.229/230 xfstests/230 --- xfstests.orig.229/230 1970-01-01 08:00:00.000000000 +0800 +++ xfstests/230 2010-05-28 14:27:02.000000000 +0800 @@ -0,0 +1,80 @@ +#! /bin/bash +# FS QA Test No. 230 +# +# Check user B can setfacl a file which belongs to user A +# See also http://marc.info/?l=linux-btrfs&m=127434445620298&w=2 +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 FUJITSU LIMITED. 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=shiwh@cn.fujitsu.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +runas=$here/src/runas +status=1 # FAILure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.attr + +_cleanup() +{ + cd / + rm -f $tmp.* + [ -n "$testdir" ] && rm -rf $testdir/$seq.dir1 + _cleanup_testdir +} + +# real QA test starts here +_supported_fs generic +# only Linux supports fallocate +_supported_os Linux + +[ -x $runas ] || _notrun "$runas executable not found" + +rm -f $seq.full + +_setup_testdir + +_need_to_be_root +_acl_setup_ids +_require_acls + +# get dir +cd $testdir +rm -rf $seq.dir1 +mkdir $seq.dir1 +cd $seq.dir1 + +touch file1 +chown $acl1.$acl1 file1 + +echo "Expect to FAIL" +$runas -u $acl2 -g $acl2 -- `which setfacl` -m u::rwx file1 2>&1 + +echo "Test over." +# success, all done +status=0 +exit diff -urpN xfstests.orig.229/230.out xfstests/230.out --- xfstests.orig.229/230.out 1970-01-01 08:00:00.000000000 +0800 +++ xfstests/230.out 2010-05-28 14:27:05.000000000 +0800 @@ -0,0 +1,4 @@ +QA output created by 230 +Expect to FAIL +setfacl: file1: Operation not permitted +Test over. diff -urpN xfstests.orig.229/group xfstests/group --- xfstests.orig.229/group 2010-05-28 11:29:31.000000000 +0800 +++ xfstests/group 2010-05-28 14:26:48.000000000 +0800 @@ -343,3 +343,4 @@ deprecated 227 auto fsr 228 rw auto prealloc quick 229 auto +230 acl auto From lizf@cn.fujitsu.com Mon May 24 03:21:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4O8LJjD168438 for ; Mon, 24 May 2010 03:21:20 -0500 X-ASG-Debug-ID: 1274689513-78ad00910000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from song.cn.fujitsu.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9E7F01574727 for ; Mon, 24 May 2010 01:25:13 -0700 (PDT) Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id DRPez0SmHD6BpC9J for ; Mon, 24 May 2010 01:25:13 -0700 (PDT) Received: from tang.cn.fujitsu.com (tang.cn.fujitsu.com [10.167.250.3]) by song.cn.fujitsu.com (Postfix) with ESMTP id 6683417016E; Mon, 24 May 2010 16:23:37 +0800 (CST) Received: from fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id o4O8LVJa022579; Mon, 24 May 2010 16:21:31 +0800 Received: from lizf.localdomain (unknown [10.167.141.140]) by fnst.cn.fujitsu.com (Postfix) with ESMTPA id 76EEF10C0A6; Mon, 24 May 2010 16:27:17 +0800 (CST) Message-ID: <4BFA3815.7070000@cn.fujitsu.com> Date: Mon, 24 May 2010 16:25:57 +0800 From: Li Zefan User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b3pre) Gecko/20090513 Fedora/3.0-2.3.beta2.fc11 Thunderbird/3.0b2 MIME-Version: 1.0 To: Dave Chinner , Alex Elder CC: Christoph Hellwig , xfs@oss.sgi.com, LKML , Frederic Weisbecker , Steven Rostedt X-ASG-Orig-Subj: [PATCH] xfs: convert more trace events to DEFINE_EVENT Subject: [PATCH] xfs: convert more trace events to DEFINE_EVENT Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1274689514 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.2, rules version 3.2.2.30645 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Use DECLARE_EVENT_CLASS, and save ~15K: text data bss dec hex filename 171949 43028 48 215025 347f1 fs/xfs/linux-2.6/xfs_trace.o.orig 156521 43028 36 199585 30ba1 fs/xfs/linux-2.6/xfs_trace.o No change in functionality. Signed-off-by: Li Zefan --- fs/xfs/linux-2.6/xfs_trace.h | 356 ++++++++++++++++++++++-------------------- 1 files changed, 188 insertions(+), 168 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 8a319cf..7f5fb71 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -82,33 +82,6 @@ DECLARE_EVENT_CLASS(xfs_attr_list_class, ) ) -#define DEFINE_PERAG_REF_EVENT(name) \ -TRACE_EVENT(name, \ - TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, int refcount, \ - unsigned long caller_ip), \ - TP_ARGS(mp, agno, refcount, caller_ip), \ - TP_STRUCT__entry( \ - __field(dev_t, dev) \ - __field(xfs_agnumber_t, agno) \ - __field(int, refcount) \ - __field(unsigned long, caller_ip) \ - ), \ - TP_fast_assign( \ - __entry->dev = mp->m_super->s_dev; \ - __entry->agno = agno; \ - __entry->refcount = refcount; \ - __entry->caller_ip = caller_ip; \ - ), \ - TP_printk("dev %d:%d agno %u refcount %d caller %pf", \ - MAJOR(__entry->dev), MINOR(__entry->dev), \ - __entry->agno, \ - __entry->refcount, \ - (char *)__entry->caller_ip) \ -); - -DEFINE_PERAG_REF_EVENT(xfs_perag_get) -DEFINE_PERAG_REF_EVENT(xfs_perag_put) - #define DEFINE_ATTR_LIST_EVENT(name) \ DEFINE_EVENT(xfs_attr_list_class, name, \ TP_PROTO(struct xfs_attr_list_context *ctx), \ @@ -122,6 +95,37 @@ DEFINE_ATTR_LIST_EVENT(xfs_attr_list_add); DEFINE_ATTR_LIST_EVENT(xfs_attr_list_wrong_blk); DEFINE_ATTR_LIST_EVENT(xfs_attr_list_notfound); +DECLARE_EVENT_CLASS(xfs_perag_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, int refcount, + unsigned long caller_ip), + TP_ARGS(mp, agno, refcount, caller_ip), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(int, refcount) + __field(unsigned long, caller_ip) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->refcount = refcount; + __entry->caller_ip = caller_ip; + ), + TP_printk("dev %d:%d agno %u refcount %d caller %pf", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->refcount, + (char *)__entry->caller_ip) +); + +#define DEFINE_PERAG_REF_EVENT(name) \ +DEFINE_EVENT(xfs_perag_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, int refcount, \ + unsigned long caller_ip), \ + TP_ARGS(mp, agno, refcount, caller_ip)) +DEFINE_PERAG_REF_EVENT(xfs_perag_get); +DEFINE_PERAG_REF_EVENT(xfs_perag_put); + TRACE_EVENT(xfs_attr_list_node_descend, TP_PROTO(struct xfs_attr_list_context *ctx, struct xfs_da_node_entry *btree), @@ -775,165 +779,181 @@ DEFINE_LOGGRANT_EVENT(xfs_log_ungrant_enter); DEFINE_LOGGRANT_EVENT(xfs_log_ungrant_exit); DEFINE_LOGGRANT_EVENT(xfs_log_ungrant_sub); -#define DEFINE_RW_EVENT(name) \ -TRACE_EVENT(name, \ - TP_PROTO(struct xfs_inode *ip, size_t count, loff_t offset, int flags), \ - TP_ARGS(ip, count, offset, flags), \ - TP_STRUCT__entry( \ - __field(dev_t, dev) \ - __field(xfs_ino_t, ino) \ - __field(xfs_fsize_t, size) \ - __field(xfs_fsize_t, new_size) \ - __field(loff_t, offset) \ - __field(size_t, count) \ - __field(int, flags) \ - ), \ - TP_fast_assign( \ - __entry->dev = VFS_I(ip)->i_sb->s_dev; \ - __entry->ino = ip->i_ino; \ - __entry->size = ip->i_d.di_size; \ - __entry->new_size = ip->i_new_size; \ - __entry->offset = offset; \ - __entry->count = count; \ - __entry->flags = flags; \ - ), \ - TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx " \ - "offset 0x%llx count 0x%zx ioflags %s", \ - MAJOR(__entry->dev), MINOR(__entry->dev), \ - __entry->ino, \ - __entry->size, \ - __entry->new_size, \ - __entry->offset, \ - __entry->count, \ - __print_flags(__entry->flags, "|", XFS_IO_FLAGS)) \ +DECLARE_EVENT_CLASS(xfs_file_class, + TP_PROTO(struct xfs_inode *ip, size_t count, loff_t offset, int flags), + TP_ARGS(ip, count, offset, flags), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(xfs_fsize_t, size) + __field(xfs_fsize_t, new_size) + __field(loff_t, offset) + __field(size_t, count) + __field(int, flags) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->size = ip->i_d.di_size; + __entry->new_size = ip->i_new_size; + __entry->offset = offset; + __entry->count = count; + __entry->flags = flags; + ), + TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx " + "offset 0x%llx count 0x%zx ioflags %s", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->size, + __entry->new_size, + __entry->offset, + __entry->count, + __print_flags(__entry->flags, "|", XFS_IO_FLAGS)) ) + +#define DEFINE_RW_EVENT(name) \ +DEFINE_EVENT(xfs_file_class, name, \ + TP_PROTO(struct xfs_inode *ip, size_t count, loff_t offset, int flags), \ + TP_ARGS(ip, count, offset, flags)) DEFINE_RW_EVENT(xfs_file_read); DEFINE_RW_EVENT(xfs_file_buffered_write); DEFINE_RW_EVENT(xfs_file_direct_write); DEFINE_RW_EVENT(xfs_file_splice_read); DEFINE_RW_EVENT(xfs_file_splice_write); - -#define DEFINE_PAGE_EVENT(name) \ -TRACE_EVENT(name, \ - TP_PROTO(struct inode *inode, struct page *page, unsigned long off), \ - TP_ARGS(inode, page, off), \ - TP_STRUCT__entry( \ - __field(dev_t, dev) \ - __field(xfs_ino_t, ino) \ - __field(pgoff_t, pgoff) \ - __field(loff_t, size) \ - __field(unsigned long, offset) \ - __field(int, delalloc) \ - __field(int, unmapped) \ - __field(int, unwritten) \ - ), \ - TP_fast_assign( \ - int delalloc = -1, unmapped = -1, unwritten = -1; \ - \ - if (page_has_buffers(page)) \ - xfs_count_page_state(page, &delalloc, \ - &unmapped, &unwritten); \ - __entry->dev = inode->i_sb->s_dev; \ - __entry->ino = XFS_I(inode)->i_ino; \ - __entry->pgoff = page_offset(page); \ - __entry->size = i_size_read(inode); \ - __entry->offset = off; \ - __entry->delalloc = delalloc; \ - __entry->unmapped = unmapped; \ - __entry->unwritten = unwritten; \ - ), \ - TP_printk("dev %d:%d ino 0x%llx pgoff 0x%lx size 0x%llx offset %lx " \ - "delalloc %d unmapped %d unwritten %d", \ - MAJOR(__entry->dev), MINOR(__entry->dev), \ - __entry->ino, \ - __entry->pgoff, \ - __entry->size, \ - __entry->offset, \ - __entry->delalloc, \ - __entry->unmapped, \ - __entry->unwritten) \ +DECLARE_EVENT_CLASS(xfs_page_class, + TP_PROTO(struct inode *inode, struct page *page, unsigned long off), + TP_ARGS(inode, page, off), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(pgoff_t, pgoff) + __field(loff_t, size) + __field(unsigned long, offset) + __field(int, delalloc) + __field(int, unmapped) + __field(int, unwritten) + ), + TP_fast_assign( + int delalloc = -1, unmapped = -1, unwritten = -1; + + if (page_has_buffers(page)) + xfs_count_page_state(page, &delalloc, + &unmapped, &unwritten); + __entry->dev = inode->i_sb->s_dev; + __entry->ino = XFS_I(inode)->i_ino; + __entry->pgoff = page_offset(page); + __entry->size = i_size_read(inode); + __entry->offset = off; + __entry->delalloc = delalloc; + __entry->unmapped = unmapped; + __entry->unwritten = unwritten; + ), + TP_printk("dev %d:%d ino 0x%llx pgoff 0x%lx size 0x%llx offset %lx " + "delalloc %d unmapped %d unwritten %d", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->pgoff, + __entry->size, + __entry->offset, + __entry->delalloc, + __entry->unmapped, + __entry->unwritten) ) + +#define DEFINE_PAGE_EVENT(name) \ +DEFINE_EVENT(xfs_page_class, name, \ + TP_PROTO(struct inode *inode, struct page *page, unsigned long off), \ + TP_ARGS(inode, page, off)) DEFINE_PAGE_EVENT(xfs_writepage); DEFINE_PAGE_EVENT(xfs_releasepage); DEFINE_PAGE_EVENT(xfs_invalidatepage); -#define DEFINE_IOMAP_EVENT(name) \ -TRACE_EVENT(name, \ - TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count, \ - int flags, struct xfs_bmbt_irec *irec), \ - TP_ARGS(ip, offset, count, flags, irec), \ - TP_STRUCT__entry( \ - __field(dev_t, dev) \ - __field(xfs_ino_t, ino) \ - __field(loff_t, size) \ - __field(loff_t, new_size) \ - __field(loff_t, offset) \ - __field(size_t, count) \ - __field(int, flags) \ - __field(xfs_fileoff_t, startoff) \ - __field(xfs_fsblock_t, startblock) \ - __field(xfs_filblks_t, blockcount) \ - ), \ - TP_fast_assign( \ - __entry->dev = VFS_I(ip)->i_sb->s_dev; \ - __entry->ino = ip->i_ino; \ - __entry->size = ip->i_d.di_size; \ - __entry->new_size = ip->i_new_size; \ - __entry->offset = offset; \ - __entry->count = count; \ - __entry->flags = flags; \ - __entry->startoff = irec ? irec->br_startoff : 0; \ - __entry->startblock = irec ? irec->br_startblock : 0; \ - __entry->blockcount = irec ? irec->br_blockcount : 0; \ - ), \ - TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx " \ - "offset 0x%llx count %zd flags %s " \ - "startoff 0x%llx startblock %lld blockcount 0x%llx", \ - MAJOR(__entry->dev), MINOR(__entry->dev), \ - __entry->ino, \ - __entry->size, \ - __entry->new_size, \ - __entry->offset, \ - __entry->count, \ - __print_flags(__entry->flags, "|", BMAPI_FLAGS), \ - __entry->startoff, \ - (__int64_t)__entry->startblock, \ - __entry->blockcount) \ +DECLARE_EVENT_CLASS(xfs_iomap_class, + TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count, + int flags, struct xfs_bmbt_irec *irec), + TP_ARGS(ip, offset, count, flags, irec), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(loff_t, size) + __field(loff_t, new_size) + __field(loff_t, offset) + __field(size_t, count) + __field(int, flags) + __field(xfs_fileoff_t, startoff) + __field(xfs_fsblock_t, startblock) + __field(xfs_filblks_t, blockcount) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->size = ip->i_d.di_size; + __entry->new_size = ip->i_new_size; + __entry->offset = offset; + __entry->count = count; + __entry->flags = flags; + __entry->startoff = irec ? irec->br_startoff : 0; + __entry->startblock = irec ? irec->br_startblock : 0; + __entry->blockcount = irec ? irec->br_blockcount : 0; + ), + TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx " + "offset 0x%llx count %zd flags %s " + "startoff 0x%llx startblock %lld blockcount 0x%llx", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->size, + __entry->new_size, + __entry->offset, + __entry->count, + __print_flags(__entry->flags, "|", BMAPI_FLAGS), + __entry->startoff, + (__int64_t)__entry->startblock, + __entry->blockcount) ) + +#define DEFINE_IOMAP_EVENT(name) \ +DEFINE_EVENT(xfs_iomap_class, name, \ + TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count, \ + int flags, struct xfs_bmbt_irec *irec), \ + TP_ARGS(ip, offset, count, flags, irec)) DEFINE_IOMAP_EVENT(xfs_iomap_enter); DEFINE_IOMAP_EVENT(xfs_iomap_found); DEFINE_IOMAP_EVENT(xfs_iomap_alloc); -#define DEFINE_SIMPLE_IO_EVENT(name) \ -TRACE_EVENT(name, \ - TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count), \ - TP_ARGS(ip, offset, count), \ - TP_STRUCT__entry( \ - __field(dev_t, dev) \ - __field(xfs_ino_t, ino) \ - __field(loff_t, size) \ - __field(loff_t, new_size) \ - __field(loff_t, offset) \ - __field(size_t, count) \ - ), \ - TP_fast_assign( \ - __entry->dev = VFS_I(ip)->i_sb->s_dev; \ - __entry->ino = ip->i_ino; \ - __entry->size = ip->i_d.di_size; \ - __entry->new_size = ip->i_new_size; \ - __entry->offset = offset; \ - __entry->count = count; \ - ), \ - TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx " \ - "offset 0x%llx count %zd", \ - MAJOR(__entry->dev), MINOR(__entry->dev), \ - __entry->ino, \ - __entry->size, \ - __entry->new_size, \ - __entry->offset, \ - __entry->count) \ +DECLARE_EVENT_CLASS(xfs_simple_io_class, + TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count), + TP_ARGS(ip, offset, count), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(loff_t, size) + __field(loff_t, new_size) + __field(loff_t, offset) + __field(size_t, count) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->size = ip->i_d.di_size; + __entry->new_size = ip->i_new_size; + __entry->offset = offset; + __entry->count = count; + ), + TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx " + "offset 0x%llx count %zd", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->size, + __entry->new_size, + __entry->offset, + __entry->count) ); + +#define DEFINE_SIMPLE_IO_EVENT(name) \ +DEFINE_EVENT(xfs_simple_io_class, name, \ + TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count), \ + TP_ARGS(ip, offset, count)) DEFINE_SIMPLE_IO_EVENT(xfs_delalloc_enospc); DEFINE_SIMPLE_IO_EVENT(xfs_unwritten_convert); -- 1.6.3 From jack@suse.cz Mon May 24 09:12:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4OECGs5183240 for ; Mon, 24 May 2010 09:12:17 -0500 X-ASG-Debug-ID: 1274710478-6cf500600000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 02F33369D3E for ; Mon, 24 May 2010 07:14:38 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id igxPNlC7gyQCvw2h for ; Mon, 24 May 2010 07:14:38 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 860FF9428F; Mon, 24 May 2010 16:14:36 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 8AFCC2B1B2E; Mon, 24 May 2010 16:14:27 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: hch@infradead.org, david@fromorbit.com, Jan Kara X-ASG-Orig-Subj: [PATCH 8/8] Add test for quota accounting after remount read only Subject: [PATCH 8/8] Add test for quota accounting after remount read only Date: Mon, 24 May 2010 16:14:19 +0200 Message-Id: <1274710459-11446-9-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274710459-11446-1-git-send-email-jack@suse.cz> References: <1274710459-11446-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274710479 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Check that quota accounting works after remounting read-only and then back read-write. Signed-off-by: Jan Kara --- 235 | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 235.out | 34 +++++++++++++++++++++++++ group | 1 + 3 files changed, 118 insertions(+), 0 deletions(-) create mode 100755 235 create mode 100644 235.out diff --git a/235 b/235 new file mode 100755 index 0000000..97632e5 --- /dev/null +++ b/235 @@ -0,0 +1,83 @@ +#! /bin/bash +# FS QA Test No. 235 +# +# Test whether quota gets properly reenabled after remount read-write +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Jan Kara. All Rights Reserved. +# +# Based on test 219, +# Copyright (c) 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +filter_scratch() +{ + perl -ne " +s,$SCRATCH_MNT,[SCR_MNT],; +s,$SCRATCH_DEV,[SCR_DEV],; + print;" +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux #IRIX +_require_scratch +_require_quota +_require_user +_need_to_be_root + +# real QA test starts here +rm -f $seq.full + +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon $SCRATCH_MNT 2>/dev/null + +touch $SCRATCH_MNT/testfile +chown $qa_user:$qa_user $SCRATCH_MNT/testfile + +repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch + +mount -o remount,ro $SCRATCH_DEV 2>&1 | tee -a $seq.full | filter_scratch +touch $SCRATCH_MNT/failed 2>&1 | tee -a $seq.full | filter_scratch +mount -o remount,rw $SCRATCH_DEV 2>&1 | tee -a $seq.full | filter_scratch + +$XFS_IO_PROG -F -c 'pwrite 0 16k' -c 'fsync' \ + $SCRATCH_MNT/testfile >>$seq.full 2>&1 +repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch + +umount $SCRATCH_DEV 2>/dev/null + +status=0 +exit diff --git a/235.out b/235.out new file mode 100644 index 0000000..8d3eb1f --- /dev/null +++ b/235.out @@ -0,0 +1,34 @@ +QA output created by 235 +*** Report for user quotas on device [SCR_DEV] +Block grace time: 7days; Inode grace time: 7days + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa -- 0 0 0 1 0 0 + + +*** Report for group quotas on device [SCR_DEV] +Block grace time: 7days; Inode grace time: 7days + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa -- 0 0 0 1 0 0 + + +touch: cannot touch `[SCR_MNT]/failed': Read-only file system +*** Report for user quotas on device [SCR_DEV] +Block grace time: 7days; Inode grace time: 7days + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa -- 16 0 0 1 0 0 + + +*** Report for group quotas on device [SCR_DEV] +Block grace time: 7days; Inode grace time: 7days + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa -- 16 0 0 1 0 0 + + diff --git a/group b/group index 3a95e48..6b915b2 100644 --- a/group +++ b/group @@ -348,3 +348,4 @@ deprecated 232 auto quota 233 auto quota 234 auto quota +235 auto quota quick -- 1.6.4.2 From jack@suse.cz Mon May 24 09:12:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4OECGlR183221 for ; Mon, 24 May 2010 09:12:16 -0500 X-ASG-Debug-ID: 1274710477-3c2703140000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 307C4369D3C for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id 9yss86CdH2hNRDxY for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 54B6294033; Mon, 24 May 2010 16:14:36 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 548BD2B1B2E; Mon, 24 May 2010 16:14:26 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: hch@infradead.org, david@fromorbit.com X-ASG-Orig-Subj: [PATCH 0/8 v3] Quota tests for XFSQA Subject: [PATCH 0/8 v3] Quota tests for XFSQA Date: Mon, 24 May 2010 16:14:11 +0200 Message-Id: <1274710459-11446-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274710478 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello, this is a third version of my quota tests for XFSQA. The first two patches are just fixes of bugs I've found while adding new tests. Other six patches add new tests. Changes since last time: - Fixed detection of quota support for XFS and GFS2 as suggested by Christoph - Added fix for fallocate support detection - Added test to verify quota behavior after remount (based on recent kernel bug...) Comments welcome. Honza From jack@suse.cz Mon May 24 09:12:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4OECF1u183216 for ; Mon, 24 May 2010 09:12:16 -0500 X-ASG-Debug-ID: 1274710477-727d00170000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0566D369D38 for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id eXm42DS2IMKEPhAV for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 5439A93F19; Mon, 24 May 2010 16:14:36 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 87ECC2B163A; Mon, 24 May 2010 16:14:26 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: hch@infradead.org, david@fromorbit.com, Jan Kara X-ASG-Orig-Subj: [PATCH 2/8] Fix fallocate() test Subject: [PATCH 2/8] Fix fallocate() test Date: Mon, 24 May 2010 16:14:13 +0200 Message-Id: <1274710459-11446-3-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274710459-11446-1-git-send-email-jack@suse.cz> References: <1274710459-11446-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274710478 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The test for fallocate was broken because it used $TEST_DIR/$tmp.io. Because $tmp is usually something like /tmp/1234 or /mnt/1234 the file cannot be created and xfs_io fails regardless of existance of fallocate support. Moreover the subsequent message parsing decides that fallocate is actually supported because it does not expect this message. Fix the test to not use $tmp. Signed-off-by: Jan Kara --- common.rc | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/common.rc b/common.rc index e6d818d..6bf1e12 100644 --- a/common.rc +++ b/common.rc @@ -803,8 +803,9 @@ _require_user() # _require_xfs_io_falloc() { - testio=`$XFS_IO_PROG -F -f -c "falloc 0 1m" $TEST_DIR/$tmp.io 2>&1` - rm -f $TEST_DIR/$tmp.io 2>&1 > /dev/null + testfile=$TEST_DIR/$$.falloc + testio=`$XFS_IO_PROG -F -f -c "falloc 0 1m" $testfile 2>&1` + rm -f $testfile 2>&1 > /dev/null echo $testio | grep -q "not found" && \ _notrun "xfs_io fallocate support is missing" echo $testio | grep -q "Operation not supported" && \ -- 1.6.4.2 From jack@suse.cz Mon May 24 09:12:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4OECFhl183217 for ; Mon, 24 May 2010 09:12:16 -0500 X-ASG-Debug-ID: 1274710477-727c00170000-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 CB90A369D36 for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id gAbtavk5QeMCcs02 for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 4854D87104; Mon, 24 May 2010 16:14:35 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id AB8E12B1B61; Mon, 24 May 2010 16:14:26 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: hch@infradead.org, david@fromorbit.com, Jan Kara X-ASG-Orig-Subj: [PATCH 1/8] Fix test whether kernel supports quotas Subject: [PATCH 1/8] Fix test whether kernel supports quotas Date: Mon, 24 May 2010 16:14:12 +0200 Message-Id: <1274710459-11446-2-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274710459-11446-1-git-send-email-jack@suse.cz> References: <1274710459-11446-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274710477 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.2, rules version 3.2.2.30666 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean For all 2.6 kernels presence of quota support in kernel can be detected by checking /proc/sys/fs/quota. This is actually more reliable than trying to mount a filesystem with quota options (for example because SCRATCH_DEV does not have to contain a filesystem type we are going to test). Signed-off-by: Jan Kara --- common.quota | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) diff --git a/common.quota b/common.quota index 51bdc71..d32e285 100644 --- a/common.quota +++ b/common.quota @@ -27,10 +27,11 @@ _require_quota() { [ -x /usr/bin/quota ] || _notrun "Quota user tools not installed" - _scratch_mount "-o usrquota,grpquota" - ret=$? - umount $SCRATCH_MNT - [ $ret -ne 0 ] && _notrun "Installed kernel does not support quota" + if [ $FSTYP = "xfs" ]; then + [ -f /proc/fs/xfs/xqmstat ] || _notrun "Installed kernel does not support XFS quota" + elif [ $FSTYP != "gfs2" ]; then + [ -d /proc/sys/fs/quota ] || _notrun "Installed kernel does not support quota" + fi } # -- 1.6.4.2 From jack@suse.cz Mon May 24 09:12:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_LOTS_OF_MONEY autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4OECGPH183222 for ; Mon, 24 May 2010 09:12:16 -0500 X-ASG-Debug-ID: 1274710477-72d200080000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 23C62369D3A for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id zmOcPt9QuFqHAe7B for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 635E594109; Mon, 24 May 2010 16:14:36 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 593C22B163A; Mon, 24 May 2010 16:14:27 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: hch@infradead.org, david@fromorbit.com, Jan Kara X-ASG-Orig-Subj: [PATCH 6/8] Add quota accounting test when fsstress is run and quota limits are set low Subject: [PATCH 6/8] Add quota accounting test when fsstress is run and quota limits are set low Date: Mon, 24 May 2010 16:14:17 +0200 Message-Id: <1274710459-11446-7-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274710459-11446-1-git-send-email-jack@suse.cz> References: <1274710459-11446-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274710478 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Test various error recovery paths whether they properly handle EDQUOT failures. Signed-off-by: Jan Kara --- 233 | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 233.out | 6 +++ group | 1 + 3 files changed, 131 insertions(+), 0 deletions(-) create mode 100755 233 create mode 100644 233.out diff --git a/233 b/233 new file mode 100755 index 0000000..b967e0d --- /dev/null +++ b/233 @@ -0,0 +1,124 @@ +#! /bin/bash +# FSQA Test No. 233 +# +# Run fsstress with quotas enabled and limits set low and verify accounted +# quotas in the end +# +# Derived from test 231 +#----------------------------------------------------------------------- +# Copyright (c) 2006 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +FSX_FILE_SIZE=64000000 +FSX_ARGS="-q -l $FSX_FILE_SIZE -o 65536 -S 191110531 -N 100000" + +filter_scratch() +{ + perl -ne " +s,$SCRATCH_MNT,[SCR_MNT],; +s,$SCRATCH_DEV,[SCR_DEV],; + print;" +} + +check_usage() +{ + quotaon -f -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.orig + quotacheck -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.checked + quotaon -u -g $SCRATCH_MNT 2>/dev/null + diff $tmp.orig $tmp.checked +} + +_filter_num() +{ + tee -a $here/$seq.full |\ + sed -e 's/[0-9][0-9]* inodes/I inodes/g' \ + -e 's/[0-9][0-9]* paths/P paths/g' \ + -e 's/seed = [0-9][0-9]*/seed = S/' +} + +_fsstress() +{ + echo "" + echo "Testing fsstress" + echo "" + + out=$SCRATCH_MNT/fsstress.$$ + count=5000 + args="-z \ +-f rmdir=20 -f link=10 -f creat=10 -f mkdir=10 -f unlink=20 -f symlink=10 \ +-f rename=10 -f fsync=2 -f write=15 -f dwrite=15 \ +-n $count -d $out -p 7" + + echo "fsstress $args" | tee -a $here/$seq.full | sed -e "s#$out#outdir#" + if ! su $qa_user -c "$FSSTRESS_PROG $args" | tee -a $here/$seq.full | _filter_num + then + echo " fsstress $args returned $?" + cat $tmp.out | tee -a $here/$seq.full + status=1 + fi +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch +_require_quota +_require_user +_need_to_be_root + +umount $SCRATCH_DEV 2>/dev/null +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +chmod 777 $SCRATCH_MNT +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon -u -g $SCRATCH_MNT 2>/dev/null +setquota -u $qa_user 32000 32000 1000 1000 $SCRATCH_MNT 2>/dev/null + +if ! _fsstress; then + umount $SCRATCH_DEV 2>/dev/null + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +umount $SCRATCH_DEV 2>/dev/null +status=0 +exit diff --git a/233.out b/233.out new file mode 100644 index 0000000..208910d --- /dev/null +++ b/233.out @@ -0,0 +1,6 @@ +QA output created by 233 + +Testing fsstress + +fsstress -z -f rmdir=20 -f link=10 -f creat=10 -f mkdir=10 -f unlink=20 -f symlink=10 -f rename=10 -f fsync=2 -f write=15 -f dwrite=15 -n 5000 -d outdir -p 7 +seed = S diff --git a/group b/group index c8cd774..cc9bdb2 100644 --- a/group +++ b/group @@ -346,3 +346,4 @@ deprecated 230 auto quota quick 231 auto quota 232 auto quota +233 auto quota -- 1.6.4.2 From jack@suse.cz Mon May 24 09:12:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4OECGsZ183225 for ; Mon, 24 May 2010 09:12:16 -0500 X-ASG-Debug-ID: 1274710477-74c300c40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4833B1DF8988 for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id UQvIAdNyTsHK2Igc for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 682789417A; Mon, 24 May 2010 16:14:36 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 384F92B1B64; Mon, 24 May 2010 16:14:26 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: hch@infradead.org, david@fromorbit.com, Jan Kara X-ASG-Orig-Subj: [PATCH 5/8] Add quota test with fsstress Subject: [PATCH 5/8] Add quota test with fsstress Date: Mon, 24 May 2010 16:14:16 +0200 Message-Id: <1274710459-11446-6-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274710459-11446-1-git-send-email-jack@suse.cz> References: <1274710459-11446-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274710478 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Run fsstress and verify that quota accounting is correct after it finishes. Signed-off-by: Jan Kara --- 232 | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 232.out | 6 +++ group | 1 + 3 files changed, 122 insertions(+), 0 deletions(-) create mode 100755 232 create mode 100644 232.out diff --git a/232 b/232 new file mode 100755 index 0000000..cf4d25a --- /dev/null +++ b/232 @@ -0,0 +1,115 @@ +#! /bin/bash +# FSQA Test No. 232 +# +# Run fsstress with quotas enabled and verify accounted quotas in the end +# +# Derived from test 231 +#----------------------------------------------------------------------- +# Copyright (c) 2006 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +filter_scratch() +{ + perl -ne " +s,$SCRATCH_MNT,[SCR_MNT],; +s,$SCRATCH_DEV,[SCR_DEV],; + print;" +} + +check_usage() +{ + quotaon -f -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.orig + quotacheck -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.checked + quotaon -u -g $SCRATCH_MNT 2>/dev/null + diff $tmp.orig $tmp.checked +} + +_filter_num() +{ + tee -a $here/$seq.full |\ + sed -e 's/[0-9][0-9]* inodes/I inodes/g' \ + -e 's/[0-9][0-9]* paths/P paths/g' \ + -e 's/seed = [0-9][0-9]*/seed = S/' +} + +_fsstress() +{ + echo "" + echo "Testing fsstress" + echo "" + + out=$SCRATCH_MNT/fsstress.$$ + count=2000 + args="-n $count -d $out -p 7" + + echo "fsstress $args" | tee -a $here/$seq.full | sed -e "s#$out#outdir#" + if ! $FSSTRESS_PROG $args | tee -a $here/$seq.full | _filter_num + then + echo " fsstress $args returned $?" + cat $tmp.out | tee -a $here/$seq.full + status=1 + fi +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch +_require_quota +_need_to_be_root + +umount $SCRATCH_DEV 2>/dev/null +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +chmod 777 $SCRATCH_MNT +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon -u -g $SCRATCH_MNT 2>/dev/null + +if ! _fsstress; then + umount $SCRATCH_DEV 2>/dev/null + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +umount $SCRATCH_DEV 2>/dev/null +status=0 +exit diff --git a/232.out b/232.out new file mode 100644 index 0000000..744192e --- /dev/null +++ b/232.out @@ -0,0 +1,6 @@ +QA output created by 232 + +Testing fsstress + +fsstress -n 2000 -d outdir -p 7 +seed = S diff --git a/group b/group index 6b59c69..c8cd774 100644 --- a/group +++ b/group @@ -345,3 +345,4 @@ deprecated 229 auto rw 230 auto quota quick 231 auto quota +232 auto quota -- 1.6.4.2 From jack@suse.cz Mon May 24 09:12:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_LOTS_OF_MONEY autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4OECGbm183241 for ; Mon, 24 May 2010 09:12:17 -0500 X-ASG-Debug-ID: 1274710477-33ed03aa0000-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 6D728369D41 for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id Luwyb8zQHDUJRgjA for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 484FA8655F; Mon, 24 May 2010 16:14:35 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id DA2312B1B2D; Mon, 24 May 2010 16:14:26 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: hch@infradead.org, david@fromorbit.com, Jan Kara X-ASG-Orig-Subj: [PATCH 3/8] Test basic quota enforcement Subject: [PATCH 3/8] Test basic quota enforcement Date: Mon, 24 May 2010 16:14:14 +0200 Message-Id: <1274710459-11446-4-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274710459-11446-1-git-send-email-jack@suse.cz> References: <1274710459-11446-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274710478 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.2, rules version 3.2.2.30666 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Add a test which checks whether basic quota enforcement works. Signed-off-by: Jan Kara --- 230 | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 230.out | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ group | 1 + 3 files changed, 277 insertions(+), 0 deletions(-) create mode 100755 230 create mode 100644 230.out diff --git a/230 b/230 new file mode 100755 index 0000000..e75a828 --- /dev/null +++ b/230 @@ -0,0 +1,145 @@ +#! /bin/bash +# FS QA Test No. 230 +# +# Simple quota enforcement test. +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Jan Kara. All Rights Reserved. +# +# Based on test 219, +# Copyright (c) 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +filter_scratch() +{ + perl -ne " +s,$SCRATCH_MNT,[SCR_MNT],; +s,$SCRATCH_DEV,[SCR_DEV],; + print;" +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux #IRIX +_require_scratch +_require_quota +_require_user +_need_to_be_root + +test_files() +{ + echo; echo "### create files, setting up ownership (type=$type)" + touch $SCRATCH_MNT/file{1,2} 2>/dev/null + chown $qa_user $SCRATCH_MNT/file{1,2} 2>/dev/null + chgrp $qa_user $SCRATCH_MNT/file{1,2} 2>/dev/null + chmod 777 $SCRATCH_MNT 2>/dev/null +} + +test_enforcement() +{ + echo "### some buffered IO (type=$type)" + echo "--- initiating IO..." >>$seq.full + # Firstly fit below block soft limit + su $qa_user -c "$XFS_IO_PROG -F -c 'pwrite 0 4096' -c fsync \ + $SCRATCH_MNT/file1" 2>&1 >>$seq.full | tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + # Secondly overcome block soft limit + su $qa_user -c "$XFS_IO_PROG -F -c 'pwrite 0 4097' -c fsync \ + $SCRATCH_MNT/file1" 2>&1 >>$seq.full | tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + # Now try to overcome block hardlimit + su $qa_user -c "$XFS_IO_PROG -F -c 'pwrite 0 4097' -c fsync \ + $SCRATCH_MNT/file2" 2>&1 >>$seq.full | tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + # Now sleep for grace time and check that softlimit got enforced + sleep $grace + su $qa_user -c "$XFS_IO_PROG -F -c 'truncate 0' -c 'pwrite 0 1' \ + $SCRATCH_MNT/file2" 2>&1 >>$seq.full | tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + # And now the softlimit test for inodes + su $qa_user -c "touch $SCRATCH_MNT/file3" 2>&1 >>$seq.full | + filter_scratch | tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + # Try to exceed inode hardlimit + su $qa_user -c "touch $SCRATCH_MNT/file4 $SCRATCH_MNT/file5" 2>&1 \ + >>$seq.full | filter_scratch | tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + # Wait and check grace time enforcement + rm -f $SCRATCH_MNT/file4 >>$seq.full 2>&1 + sleep $grace + su $qa_user -c "touch $SCRATCH_MNT/file4" 2>&1 >>$seq.full | + filter_scratch | tee -a $seq.full + repquota -$type $SCRATCH_MNT | grep -v "^root" | filter_scratch + echo "--- completed IO ($type)" >>$seq.full +} + +cleanup_files() +{ + rm -f $SCRATCH_MNT/file{1,2,3,4,5} +} + +# real QA test starts here +rm -f $seq.full + +grace=2 + +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon $SCRATCH_MNT 2>/dev/null +setquota -u $qa_user 4 12 2 4 $SCRATCH_MNT +setquota -u -t $grace $grace $SCRATCH_MNT +setquota -g $qa_user 4 12 2 4 $SCRATCH_MNT +setquota -g -t $grace $grace $SCRATCH_MNT +umount $SCRATCH_DEV + +echo; echo "### test user limit enforcement" +_scratch_mount "-o usrquota" +quotaon $SCRATCH_MNT 2>/dev/null +type=u +test_files +test_enforcement +cleanup_files +umount $SCRATCH_DEV 2>/dev/null + +echo; echo "### test group limit enforcement" +_scratch_mount "-o grpquota" +quotaon $SCRATCH_MNT 2>/dev/null +type=g +test_files +test_enforcement +cleanup_files +umount $SCRATCH_DEV 2>/dev/null + +status=0 +exit diff --git a/230.out b/230.out new file mode 100644 index 0000000..e62d88f --- /dev/null +++ b/230.out @@ -0,0 +1,131 @@ +QA output created by 230 + +### test user limit enforcement + +### create files, setting up ownership (type=u) +### some buffered IO (type=u) +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa -- 4 4 12 2 2 4 + + +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa +- 8 4 12 00:00 2 2 4 + + +pwrite64: Disk quota exceeded +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa +- 12 4 12 00:00 2 2 4 + + +pwrite64: Disk quota exceeded +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa +- 8 4 12 none 2 2 4 + + +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa ++ 8 4 12 none 3 2 4 00:00 + + +touch: cannot touch `[SCR_MNT]/file5': Disk quota exceeded +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa ++ 8 4 12 none 4 2 4 00:00 + + +touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded +*** Report for user quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +User used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa ++ 8 4 12 none 3 2 4 none + + + +### test group limit enforcement + +### create files, setting up ownership (type=g) +### some buffered IO (type=g) +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa -- 4 4 12 2 2 4 + + +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa +- 8 4 12 00:00 2 2 4 + + +pwrite64: Disk quota exceeded +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa +- 12 4 12 00:00 2 2 4 + + +pwrite64: Disk quota exceeded +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa +- 8 4 12 none 2 2 4 + + +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa ++ 8 4 12 none 3 2 4 00:00 + + +touch: cannot touch `[SCR_MNT]/file5': Disk quota exceeded +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa ++ 8 4 12 none 4 2 4 00:00 + + +touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded +*** Report for group quotas on device [SCR_DEV] +Block grace time: 00:00; Inode grace time: 00:00 + Block limits File limits +Group used soft hard grace used soft hard grace +---------------------------------------------------------------------- +fsgqa ++ 8 4 12 none 3 2 4 none + + diff --git a/group b/group index 2c1ac50..441e0e9 100644 --- a/group +++ b/group @@ -343,3 +343,4 @@ deprecated 227 auto fsr 228 rw auto prealloc quick 229 auto rw +230 auto quota quick -- 1.6.4.2 From jack@suse.cz Mon May 24 09:12:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4OECGUh183220 for ; Mon, 24 May 2010 09:12:16 -0500 X-ASG-Debug-ID: 1274710477-41d402aa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 211EE369D39 for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id K3hwEXeGqwhV93Ao for ; Mon, 24 May 2010 07:14:37 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 54A8A93F46; Mon, 24 May 2010 16:14:36 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 0CFF62B1B63; Mon, 24 May 2010 16:14:26 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: hch@infradead.org, david@fromorbit.com, Jan Kara X-ASG-Orig-Subj: [PATCH 4/8] Add test of quota accounting using fsx Subject: [PATCH 4/8] Add test of quota accounting using fsx Date: Mon, 24 May 2010 16:14:15 +0200 Message-Id: <1274710459-11446-5-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274710459-11446-1-git-send-email-jack@suse.cz> References: <1274710459-11446-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274710478 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Run fsx (and also several fsx threads in parallel) and verify that quota accounting is correct after they finish. Signed-off-by: Jan Kara --- 231 | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 231.out | 10 ++++ group | 1 + 3 files changed, 152 insertions(+), 0 deletions(-) create mode 100755 231 create mode 100644 231.out diff --git a/231 b/231 new file mode 100755 index 0000000..ebbe11e --- /dev/null +++ b/231 @@ -0,0 +1,141 @@ +#! /bin/bash +# FSQA Test No. 231 +# +# Run fsx with quotas enabled and verify accounted quotas in the end +# +# Derived from test 127 +#----------------------------------------------------------------------- +# Copyright (c) 2006 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +FSX_FILE_SIZE=64000000 +FSX_ARGS="-q -l $FSX_FILE_SIZE -o 65536 -N 20000" + +filter_scratch() +{ + perl -ne " +s,$SCRATCH_MNT,[SCR_MNT],; +s,$SCRATCH_DEV,[SCR_DEV],; + print;" +} + +check_usage() +{ + quotaon -f -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch \ + >$tmp.orig + quotacheck -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch \ + >$tmp.checked + quotaon -u -g $SCRATCH_MNT 2>/dev/null + diff $tmp.orig $tmp.checked +} + +_fsx() +{ + tasks=$1 + echo "=== FSX Standard Mode, Memory Mapping, $tasks Tasks ===" + for (( i = 1; i <= $tasks; i++ )); do + SEED=$RANDOM + echo "ltp/fsx $FSX_ARGS -S $SEED $SCRATCH_MNT/fsx_file$i" >>$seq.full + su $qa_user -c "ltp/fsx $FSX_ARGS -S $SEED \ + $SCRATCH_MNT/fsx_file$i" >$tmp.output$i 2>&1 & + done + + for (( i = 1; i <= $tasks; i++ )); do + if ! wait %$i; then + cat $tmp.output$i | tee -a $seq.full + wait + return 1 + fi + $XFS_IO_PROG -F -c 'fsync' $SCRATCH_MNT/fsx_file$i + cat $tmp.output$i | tee -a $seq.full + done + return 0 +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch +_require_quota +_require_user +_need_to_be_root + +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +chmod 777 $SCRATCH_MNT +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon -u -g $SCRATCH_MNT 2>/dev/null + +if ! _fsx 1; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +if ! _fsx 4; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +#flush cache after write +FSX_ARGS="-f $FSX_ARGS" +if ! _fsx 1; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi + +umount $SCRATCH_DEV 2>/dev/null +status=0 +exit diff --git a/231.out b/231.out new file mode 100644 index 0000000..2f2d072 --- /dev/null +++ b/231.out @@ -0,0 +1,10 @@ +QA output created by 231 +=== FSX Standard Mode, Memory Mapping, 1 Tasks === +All operations completed A-OK! +=== FSX Standard Mode, Memory Mapping, 4 Tasks === +All operations completed A-OK! +All operations completed A-OK! +All operations completed A-OK! +All operations completed A-OK! +=== FSX Standard Mode, Memory Mapping, 1 Tasks === +All operations completed A-OK! diff --git a/group b/group index 441e0e9..6b59c69 100644 --- a/group +++ b/group @@ -344,3 +344,4 @@ deprecated 228 rw auto prealloc quick 229 auto rw 230 auto quota quick +231 auto quota -- 1.6.4.2 From jack@suse.cz Mon May 24 09:12:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_LOTS_OF_MONEY autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4OECH7X183246 for ; Mon, 24 May 2010 09:12:17 -0500 X-ASG-Debug-ID: 1274710572-6a9d02eb0000-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 B119D157525B for ; Mon, 24 May 2010 07:16:12 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 1NYWaHpFzLtI50He for ; Mon, 24 May 2010 07:16:12 -0700 (PDT) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 672AA8765C; Mon, 24 May 2010 16:14:36 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 6C8F52B1B2D; Mon, 24 May 2010 16:14:27 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: hch@infradead.org, david@fromorbit.com, Jan Kara X-ASG-Orig-Subj: [PATCH 7/8] Add test of quota limit and info setting Subject: [PATCH 7/8] Add test of quota limit and info setting Date: Mon, 24 May 2010 16:14:18 +0200 Message-Id: <1274710459-11446-8-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1274710459-11446-1-git-send-email-jack@suse.cz> References: <1274710459-11446-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274710573 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.2, rules version 3.2.2.30667 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Add test stressing addition and removal of quota structures and setting of quota grace time. Signed-off-by: Jan Kara --- 234 | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 234.out | 4 ++ group | 1 + 3 files changed, 113 insertions(+), 0 deletions(-) create mode 100755 234 create mode 100644 234.out diff --git a/234 b/234 new file mode 100755 index 0000000..4e98035 --- /dev/null +++ b/234 @@ -0,0 +1,108 @@ +#! /bin/bash +# FS QA Test No. 234 +# +# Stress setquota and setinfo handling. +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Jan Kara. All Rights Reserved. +# +# Based on test 219, +# Copyright (c) 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=jack@suse.cz + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +test_setting() +{ + echo; echo "### test limits and info setting" + count=2000 + procs=5 + idmod=200000 + seed=$RANDOM + RANDOM=$seed + echo "Starting test with procs=$procs, idmod=$idmod, and seed=$seed" >>$seq.full + + for (( i = 0; i < $procs; i++ )); do + ( SETUCOUNT=1; SETGCOUNT=1; SETUIDS[0]=0; SETGIDS[0]=0 + for (( j = 0; j < $count; j++ )); do + OP=$(($RANDOM%22)) + UG=$(($OP%2)) + OP=$(($OP/2)) + if [ $UG -eq 1 ]; then + type='u' + else + type='g' + fi + if [ $OP -eq 10 ]; then + setquota -t -$type $j $j $SCRATCH_MNT + elif [ $OP -lt 5 ]; then + ID=$((($RANDOM*32768+$RANDOM)%$idmod)) + if [ $UG -eq 1 ]; then + SETUIDS[$SETUCOUNT]=$ID + SETUCOUNT=$(($SETUCOUNT+1)) + else + SETGIDS[$SETGCOUNT]=$ID + SETGCOUNT=$(($SETGCOUNT+1)) + fi + setquota -$type $ID $j $j $j $j $SCRATCH_MNT + else + if [ $UG -eq 1 ]; then + ID=${SETUIDS[$(($RANDOM%$SETUCOUNT))]} + else + ID=${SETGIDS[$(($RANDOM%$SETGCOUNT))]} + fi + setquota -$type $ID 0 0 0 0 $SCRATCH_MNT + fi + done )& + done + wait + echo "### done with testing" +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux #IRIX +_require_scratch +_require_quota +_need_to_be_root + +# real QA test starts here +rm -f $seq.full + +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount "-o usrquota,grpquota" +quotacheck -u -g $SCRATCH_MNT 2>/dev/null +quotaon -u -g $SCRATCH_MNT 2>/dev/null +test_setting +umount $SCRATCH_DEV + +status=0 +exit diff --git a/234.out b/234.out new file mode 100644 index 0000000..78d1587 --- /dev/null +++ b/234.out @@ -0,0 +1,4 @@ +QA output created by 234 + +### test limits and info setting +### done with testing diff --git a/group b/group index cc9bdb2..3a95e48 100644 --- a/group +++ b/group @@ -347,3 +347,4 @@ deprecated 231 auto quota 232 auto quota 233 auto quota +234 auto quota -- 1.6.4.2 From aelder@oss.sgi.com Mon May 24 13:04:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4OI4cTt194275 for ; Mon, 24 May 2010 13:04:38 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o4OI4aZ2194197; Mon, 24 May 2010 13:04:36 -0500 Date: Mon, 24 May 2010 13:04:36 -0500 Message-Id: <201005241804.o4OI4aZ2194197@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v2.6.34-66-gccf7c23 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: b4ed4626a9775cd8cb77209280d24839526f94f2 X-Git-Newrev: ccf7c23fc129e75ef60e6f59f60a485b7a056598 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated ccf7c23 xfs: Ensure inode allocation buffers are fully replayed df80615 xfs: enable background pushing of the CIL 9da1ab1 xfs: forced unmounts need to push the CIL 71e330b xfs: Introduce delayed logging core code ed3b4d6 xfs: Improve scalability of busy extent tracking 955833c xfs: make the log ticket ID available outside the log infrastructure 169a7b0 xfs: clean up log ticket overrun debug output c115541 xfs: Clean up XFS_BLI_* flag namespace 64fc35d xfs: modify buffer item reference counting 3383ca5 xfs: allow log ticket allocation to take allocation flags 524ee36 xfs: Don't reuse the same transaction ID for duplicated transactions. from b4ed4626a9775cd8cb77209280d24839526f94f2 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit ccf7c23fc129e75ef60e6f59f60a485b7a056598 Author: Dave Chinner Date: Thu May 20 23:19:42 2010 +1000 xfs: Ensure inode allocation buffers are fully replayed With delayed logging, we can get inode allocation buffers in the same transaction inode unlink buffers. We don't currently mark inode allocation buffers in the log, so inode unlink buffers take precedence over allocation buffers. The result is that when they are combined into the same checkpoint, only the unlinked inode chain fields are replayed, resulting in uninitialised inode buffers being detected when the next inode modification is replayed. To fix this, we need to ensure that we do not set the inode buffer flag in the buffer log item format flags if the inode allocation has not already hit the log. To avoid requiring a change to log recovery, we really need to make this a modification that relies only on in-memory sate. We can do this by checking during buffer log formatting (while the CIL cannot be flushed) if we are still in the same sequence when we commit the unlink transaction as the inode allocation transaction. If we are, then we do not add the inode buffer flag to the buffer log format item flags. This means the entire buffer will be replayed, not just the unlinked fields. We do this while CIL flusheŃ• are locked out to ensure that we don't race with the sequence numbers changing and hence fail to put the inode buffer flag in the buffer format flags when we really need to. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit df806158b0f6eb24247773b4a19b8b59d7217e59 Author: Dave Chinner Date: Mon May 17 15:52:13 2010 +1000 xfs: enable background pushing of the CIL If we let the CIL grow without bound, it will grow large enough to violate recovery constraints (must be at least one complete transaction in the log at all times) or take forever to write out through the log buffers. Hence we need a check during asynchronous transactions as to whether the CIL needs to be pushed. We track the amount of log space the CIL consumes, so it is relatively simple to limit it on a pure size basis. Make the limit the minimum of just under half the log size (recovery constraint) or 8MB of log space (which is an awful lot of metadata). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 9da1ab181ac1790f86528b86ba5876f037e8dcdc Author: Dave Chinner Date: Mon May 17 15:51:59 2010 +1000 xfs: forced unmounts need to push the CIL If the filesystem is being shut down and the there is no log error, the current code forces out the current log buffers. This code now needs to push the CIL before it forces out the log buffers to acheive the same result. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 71e330b593905e40d6c5afa824d38ee02d70ce5f Author: Dave Chinner Date: Fri May 21 14:37:18 2010 +1000 xfs: Introduce delayed logging core code The delayed logging code only changes in-memory structures and as such can be enabled and disabled with a mount option. Add the mount option and emit a warning that this is an experimental feature that should not be used in production yet. We also need infrastructure to track committed items that have not yet been written to the log. This is what the Committed Item List (CIL) is for. The log item also needs to be extended to track the current log vector, the associated memory buffer and it's location in the Commit Item List. Extend the log item and log vector structures to enable this tracking. To maintain the current log format for transactions with delayed logging, we need to introduce a checkpoint transaction and a context for tracking each checkpoint from initiation to transaction completion. This includes adding a log ticket for tracking space log required/used by the context checkpoint. To track all the changes we need an io vector array per log item, rather than a single array for the entire transaction. Using the new log vector structure for this requires two passes - the first to allocate the log vector structures and chain them together, and the second to fill them out. This log vector chain can then be passed to the CIL for formatting, pinning and insertion into the CIL. Formatting of the log vector chain is relatively simple - it's just a loop over the iovecs on each log vector, but it is made slightly more complex because we re-write the iovec after the copy to point back at the memory buffer we just copied into. This code also needs to pin log items. If the log item is not already tracked in this checkpoint context, then it needs to be pinned. Otherwise it is already pinned and we don't need to pin it again. The only other complexity is calculating the amount of new log space the formatting has consumed. This needs to be accounted to the transaction in progress, and the accounting is made more complex becase we need also to steal space from it for log metadata in the checkpoint transaction. Calculate all this at insert time and update all the tickets, counters, etc correctly. Once we've formatted all the log items in the transaction, attach the busy extents to the checkpoint context so the busy extents live until checkpoint completion and can be processed at that point in time. Transactions can then be freed at this point in time. Now we need to issue checkpoints - we are tracking the amount of log space used by the items in the CIL, so we can trigger background checkpoints when the space usage gets to a certain threshold. Otherwise, checkpoints need ot be triggered when a log synchronisation point is reached - a log force event. Because the log write code already handles chained log vectors, writing the transaction is trivial, too. Construct a transaction header, add it to the head of the chain and write it into the log, then issue a commit record write. Then we can release the checkpoint log ticket and attach the context to the log buffer so it can be called during Io completion to complete the checkpoint. We also need to allow for synchronising multiple in-flight checkpoints. This is needed for two things - the first is to ensure that checkpoint commit records appear in the log in the correct sequence order (so they are replayed in the correct order). The second is so that xfs_log_force_lsn() operates correctly and only flushes and/or waits for the specific sequence it was provided with. To do this we need a wait variable and a list tracking the checkpoint commits in progress. We can walk this list and wait for the checkpoints to change state or complete easily, an this provides the necessary synchronisation for correct operation in both cases. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit ed3b4d6cdc81e8feefdbfa3c584614be301b6d39 Author: Dave Chinner Date: Fri May 21 12:07:08 2010 +1000 xfs: Improve scalability of busy extent tracking When we free a metadata extent, we record it in the per-AG busy extent array so that it is not re-used before the freeing transaction hits the disk. This array is fixed size, so when it overflows we make further allocation transactions synchronous because we cannot track more freed extents until those transactions hit the disk and are completed. Under heavy mixed allocation and freeing workloads with large log buffers, we can overflow this array quite easily. Further, the array is sparsely populated, which means that inserts need to search for a free slot, and array searches often have to search many more slots that are actually used to check all the busy extents. Quite inefficient, really. To enable this aspect of extent freeing to scale better, we need a structure that can grow dynamically. While in other areas of XFS we have used radix trees, the extents being freed are at random locations on disk so are better suited to being indexed by an rbtree. So, use a per-AG rbtree indexed by block number to track busy extents. This incures a memory allocation when marking an extent busy, but should not occur too often in low memory situations. This should scale to an arbitrary number of extents so should not be a limitation for features such as in-memory aggregation of transactions. However, there are still situations where we can't avoid allocating busy extents (such as allocation from the AGFL). To minimise the overhead of such occurences, we need to avoid doing a synchronous log force while holding the AGF locked to ensure that the previous transactions are safely on disk before we use the extent. We can do this by marking the transaction doing the allocation as synchronous rather issuing a log force. Because of the locking involved and the ordering of transactions, the synchronous transaction provides the same guarantees as a synchronous log force because it ensures that all the prior transactions are already on disk when the synchronous transaction hits the disk. i.e. it preserves the free->allocate order of the extent correctly in recovery. By doing this, we avoid holding the AGF locked while log writes are in progress, hence reducing the length of time the lock is held and therefore we increase the rate at which we can allocate and free from the allocation group, thereby increasing overall throughput. The only problem with this approach is that when a metadata buffer is marked stale (e.g. a directory block is removed), then buffer remains pinned and locked until the log goes to disk. The issue here is that if that stale buffer is reallocated in a subsequent transaction, the attempt to lock that buffer in the transaction will hang waiting the log to go to disk to unlock and unpin the buffer. Hence if someone tries to lock a pinned, stale, locked buffer we need to push on the log to get it unlocked ASAP. Effectively we are trading off a guaranteed log force for a much less common trigger for log force to occur. Ideally we should not reallocate busy extents. That is a much more complex fix to the problem as it involves direct intervention in the allocation btree searches in many places. This is left to a future set of modifications. Finally, now that we track busy extents in allocated memory, we don't need the descriptors in the transaction structure to point to them. We can replace the complex busy chunk infrastructure with a simple linked list of busy extents. This allows us to remove a large chunk of code, making the overall change a net reduction in code size. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 955833cf2ad0aa39b336e853cad212d867199984 Author: Dave Chinner Date: Fri May 14 21:41:46 2010 +1000 xfs: make the log ticket ID available outside the log infrastructure The ticket ID is needed to uniquely identify transactions when doing busy extent matching. Delayed logging changes the lifecycle of busy extents with respect to the transaction structure lifecycle. Hence we can no longer use the transaction structure as a means of determining the owner of the busy extent as it may be freed and reused while the busy extent is still active. This commit provides the infrastructure to access the xlog_tid_t held in the ticket from a transaction handle. This avoids the need for callers to peek into the transaction and log structures to find this out. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 169a7b078eaa765e6bd09865c985298ee9084a89 Author: Dave Chinner Date: Fri May 7 11:05:31 2010 +1000 xfs: clean up log ticket overrun debug output Push the error message output when a ticket overrun is detected into the ticket printing functions. Also remove the debug version of the code as the production version will still panic just as effectively on a debug kernel via the panic mask being set. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit c11554104f4dcb509fd43973389b097a04b9d51d Author: Dave Chinner Date: Fri May 7 11:05:19 2010 +1000 xfs: Clean up XFS_BLI_* flag namespace Clean up the buffer log format (XFS_BLI_*) flags because they have a polluted namespace. They XFS_BLI_ prefix is used for both in-memory and on-disk flag feilds, but have overlapping values for different flags. Rename the buffer log format flags to use the XFS_BLF_* prefix to avoid confusing them with the in-memory XFS_BLI_* prefixed flags. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 64fc35de60da3b1fe970168d10914bf1cf34a3e3 Author: Dave Chinner Date: Fri May 7 11:04:34 2010 +1000 xfs: modify buffer item reference counting The buffer log item reference counts used to take referenceŃ• for every transaction, similar to the pin counting. This is symmetric (like the pin/unpin) with respect to transaction completion, but with dleayed logging becomes assymetric as the pinning becomes assymetric w.r.t. transaction completion. To make both cases the same, allow the buffer pinning to take a reference to the buffer log item and always drop the reference the transaction has on it when being unlocked. This is balanced correctly because the unpin operation always drops a reference to the log item. Hence reference counting becomes symmetric w.r.t. item pinning as well as w.r.t active transactions and as a result the reference counting model remain consistent between normal and delayed logging. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 3383ca5780f88bb2c119174045ed77d5ece08072 Author: Dave Chinner Date: Fri May 7 11:04:17 2010 +1000 xfs: allow log ticket allocation to take allocation flags Delayed logging currently requires ticket allocation to succeed, so we need to be able to sleep on allocation. It also should not allow memory allocation to recurse into the filesystem. hence we need to pass allocation flags directing the type of allocation the caller requires. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 524ee36fa4661d745a467c3bba0e1034fd1f4b77 Author: Dave Chinner Date: Fri May 7 11:05:05 2010 +1000 xfs: Don't reuse the same transaction ID for duplicated transactions. The transaction ID is written into the log as the unique identifier for transactions during recover. When duplicating a transaction, we reuse the log ticket, which means it has the same transaction ID as the previous transaction. Rather than regenerating a random transaction ID for the duplicated transaction, just add one to the current ID so that duplicated transaction can be easily spotted in the log and during recovery during problem diagnosis. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_buf.c | 9 + fs/xfs/linux-2.6/xfs_quotaops.c | 1 + fs/xfs/linux-2.6/xfs_super.c | 12 +- fs/xfs/linux-2.6/xfs_trace.h | 83 +++-- fs/xfs/quota/xfs_dquot.c | 6 +- fs/xfs/xfs_ag.h | 24 +- fs/xfs/xfs_alloc.c | 357 ++++++++++++++------ fs/xfs/xfs_alloc.h | 7 +- fs/xfs/xfs_alloc_btree.c | 2 +- fs/xfs/xfs_buf_item.c | 166 +++++----- fs/xfs/xfs_buf_item.h | 18 +- fs/xfs/xfs_error.c | 2 +- fs/xfs/xfs_log.c | 120 +++++-- fs/xfs/xfs_log.h | 14 +- fs/xfs/xfs_log_cil.c | 725 +++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_log_priv.h | 118 ++++++- fs/xfs/xfs_log_recover.c | 46 ++-- fs/xfs/xfs_log_recover.h | 2 +- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 144 ++++++-- fs/xfs/xfs_trans.h | 44 +-- fs/xfs/xfs_trans_buf.c | 46 ++-- fs/xfs/xfs_trans_item.c | 114 +------ fs/xfs/xfs_trans_priv.h | 15 +- fs/xfs/xfs_types.h | 2 + 26 files changed, 1566 insertions(+), 513 deletions(-) create mode 100644 fs/xfs/xfs_log_cil.c hooks/post-receive -- XFS development tree From roman@binarylife.net Mon May 24 14:32:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4OJWVHw198141 for ; Mon, 24 May 2010 14:32:32 -0500 X-ASG-Debug-ID: 1274729692-380d00020000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from out1.smtp.messagingengine.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 29AF91DF9768 for ; Mon, 24 May 2010 12:34:52 -0700 (PDT) Received: from out1.smtp.messagingengine.com (out1.smtp.messagingengine.com [66.111.4.25]) by cuda.sgi.com with ESMTP id 99CVr3pPA1EV3J1v for ; Mon, 24 May 2010 12:34:52 -0700 (PDT) Received: from compute1.internal (compute1.internal [10.202.2.41]) by gateway1.messagingengine.com (Postfix) with ESMTP id 08C18F7FC0; Mon, 24 May 2010 15:34:42 -0400 (EDT) Received: from heartbeat2.messagingengine.com ([10.202.2.161]) by compute1.internal (MEProxy); Mon, 24 May 2010 15:34:42 -0400 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=messagingengine.com; h=date:from:to:subject:message-id:in-reply-to:references:mime-version:content-type:content-transfer-encoding; s=smtpout; bh=o1WZFFMFddCEWMz0saTFKOLePvY=; b=GCJWQkhzHYx9NXea2XXbv9CeojFOuzS6S7j3Gie6JBs21mEhXrOMxO4DINlFYXAy5wW9AbWzrBpvxR743zuSpqYhpDttdRxxK8hRjEqhxknXOUH3gMrYiwfktMlVM5l68IhNKyDSR3Pg6mhh7QtgBNOQSAAGWSUrGyDQ4H/wsks= X-Sasl-enc: V4TMGs3Wf4URbwx/ZahzoGUH0yymy8UpjB553tkKFHow 1274729671 Received: from smola.internal.xtremedata.com (adsl-75-61-228-198.dsl.chcgil.sbcglobal.net [75.61.228.198]) by mail.messagingengine.com (Postfix) with ESMTPSA id 8A7B559D09; Mon, 24 May 2010 15:34:31 -0400 (EDT) Received: from crux.internal.xtremedata.com (crux.internal.xtremedata.com [10.10.0.4]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by smola.internal.xtremedata.com (Postfix) with ESMTPS id A81891613C5; Mon, 24 May 2010 14:34:30 -0500 (CDT) Received: from abend.internal.xtremedata.com (abend.internal.xtremedata.com [10.10.0.248]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by crux.internal.xtremedata.com (Postfix) with ESMTPS id 62A003C15C; Mon, 24 May 2010 14:34:30 -0500 (CDT) Date: Mon, 24 May 2010 14:34:28 -0500 From: Roman Kononov To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: WARNING in xfs_lwr.c, xfs_write() Message-ID: <20100524143428.6f3a117c@abend.internal.xtremedata.com> In-Reply-To: <4BF9FCA8.8090906@hardwarefreak.com> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <4BF9FCA8.8090906@hardwarefreak.com> X-Mailer: Claws Mail 3.7.6 (GTK+ 2.20.0; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit X-Barracuda-Connect: out1.smtp.messagingengine.com[66.111.4.25] X-Barracuda-Start-Time: 1274729693 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30686 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, 23 May 2010 23:12:24 -0500 Stan Hoeppner wrote: > "The whole notion of "direct IO" is totally braindamaged. Just say no. ... > From: http://lkml.org/lkml/2007/1/10/235 I definitely measure dramatic overall performance benefit using O_DIRECT carefully. In that thread, it is doubtful that madvise+mmap+msync allow asynchronous zero-copy reads and writes to/from already pinned by a device driver memory of data produced/consumed by that device, without cache pollution and with intelligent handling of disk errors. Am I wrong? Thanks, Roman From cwilson@blackducksoftware.com Mon May 24 15:28:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,HTML_MESSAGE autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4OKSFiU200770 for ; Mon, 24 May 2010 15:28:18 -0500 X-ASG-Debug-ID: 1274733032-381900a20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from exchange.blackducksoftware.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B488F1DF6A18 for ; Mon, 24 May 2010 13:30:32 -0700 (PDT) Received: from exchange.blackducksoftware.com (68.233.172.16.static.rev.colospace.com [68.233.172.16]) by cuda.sgi.com with ESMTP id y5gARTdEvuULQ784 for ; Mon, 24 May 2010 13:30:32 -0700 (PDT) Received: from BDSEXCH2K7CLS.blackducksoftware.com ([10.9.8.116]) by exdirector.blackducksoftware.com ([10.9.8.114]) with mapi; Mon, 24 May 2010 16:30:31 -0400 From: Colin Wilson To: Eric Sandeen CC: Dave Chinner , "xfs@oss.sgi.com" Date: Mon, 24 May 2010 16:30:30 -0400 X-ASG-Orig-Subj: Re: xfs_repair memory usage and stopping on "Traversing filesystem..." Subject: Re: xfs_repair memory usage and stopping on "Traversing filesystem..." Thread-Topic: xfs_repair memory usage and stopping on "Traversing filesystem..." Thread-Index: Acr7f/QLG+P+2rmZT+eXySD7Zi12ng== Message-ID: <7A6C2FF2-7776-4417-9153-E6CE1265CC04@blackducksoftware.com> References: <00FB97ED-C684-4B81-B623-AB7EBD7B7091@blackducksoftware.com> <20100519001911.GJ2150@dastard> <4BF349D1.6050408@sandeen.net> In-Reply-To: <4BF349D1.6050408@sandeen.net> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: multipart/alternative; boundary="_000_7A6C2FF2777644179153E6CE1265CC04blackducksoftwarecom_" MIME-Version: 1.0 X-Barracuda-Connect: 68.233.172.16.static.rev.colospace.com[68.233.172.16] X-Barracuda-Start-Time: 1274733032 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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30689 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --_000_7A6C2FF2777644179153E6CE1265CC04blackducksoftwarecom_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable I got some down time this weekend and tried to run another xfs_repair with = the latest(3.1.2) version of XFS tools. This time the check ran much slowe= r than it had before and used much more swap. My system has 12GB of ram in= it right now and 16GB of swap space, do you guys have any rule of thumb to= use to figure out how much memory the system should need? I am thinking a= dding more memory is the only way to fix my problem as it is now since its = just slowness. I don't remember how much swap it ended up using but the pr= ocess ran until I killed it to bring the file system back on line without r= unning out of total memory. This may not be the biggest problem in the world but I tried to take a meta= data dump just incase that was helpful and the process ran till a certain p= oint and then hung with xfs_db using 100% of one of my cores. I've confirm= ed the same outcome three runs in a row. The output of xfs_metadump was: :~# xfs_metadump -gw /dev/mapper/sangroup-sandisk ./metadata.dump Copied 8192 of 1732067904 inodes (0 of 821 AGs) xfs_metadump: suspicious count 1152 in bmap extent 89 in dir2 ino 12743 xfs_metadump: suspicious count 1455 in bmap extent 135 in dir2 ino 12743 xfs_metadump: suspicious count 1074 in bmap extent 2 in dir2 ino 12743 Copied 8151232 of 1732067904 inodes (0 of 821 AGs) /usr/sbin/xfs_metadump: line 31: 5363 Terminated xfs_db$DBOPT= S -F -i -p xfs_metadump -c "metadump$OPTS $2" $1 The process would hang at "Copied 8151232 of 1732067904 inodes (0 of 821 AG= s)" and the rest of the output was me killing the xfs_db process. Thanks f= or all the help. --Colin Colin Wilson Linux Systems Administrator T +1.781.810.1331 F +1.781.891.5145 cwilson@blackducksoftware.com http://www.blackducksoftware.com On May 18, 2010, at 10:15 PM, Eric Sandeen wrote: Dave Chinner wrote: Hence I'd start by upgrading to 3.1.2 and running with the default options first to see whether it is faster and whether it hangs or not before going any further. If it still hangs, collecting an xfs_metadump of the fs would be useful for investigating the problem. But, I think I fixed that (the options you mentioned were workarounds for the bug I eventually fixed, IIRC) Thanks, -Eric Cheers, Dave. --_000_7A6C2FF2777644179153E6CE1265CC04blackducksoftwarecom_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable I got some down time this weekend an= d tried to run another xfs_repair with the latest(3.1.2) version of XFS too= ls.  This time the check ran much slower than it had before and used m= uch more swap.  My system has 12GB of ram in it right now and 16GB of = swap space, do you guys have any rule of thumb to use to figure out how muc= h memory the system should need?  I am thinking adding more memory is = the only way to fix my problem as it is now since its just slowness.  = I don't remember how much swap it ended up using but the process ran until = I killed it to bring the file system back on line without running out of to= tal memory.  

This may not be the biggest problem in the wor= ld but I tried to take a metadata dump just incase that was helpful and the= process ran till a certain point and then hung with xfs_db using 100% of o= ne of my cores.  I've confirmed the same outcome three runs in a row. =  The output of xfs_metadump was:

:~# xfs_= metadump -gw /dev/mapper/sangroup-sandisk ./metadata.dump
Copied = 8192 of 1732067904 inodes (0 of 821 AGs)
xfs_metadump: suspicious= count 1152 in bmap extent 89 in dir2 ino 12743
xfs_metadump: sus= picious count 1455 in bmap extent 135 in dir2 ino 12743
xfs_metad= ump: suspicious count 1074 in bmap extent 2 in dir2 ino 12743
Cop= ied 8151232 of 1732067904 inodes (0 of 821 AGs)

/u= sr/sbin/xfs_metadump: line 31:  5363 Terminated       &= nbsp;      xfs_db$DBOPTS -F -i -p xfs_metadump -c "metadump$= OPTS $2" $1

The process would hang at "Copied 8151= 232 of 1732067904 inodes (0 of 821 AGs)" and the rest of the output was me = killing the xfs_db process.  Thanks for all the help.

--Colin

Colin Wilson
Linux Systems Administrator



On May 18, 2010, at 10:15 PM, Eric Sandeen wrote:

Dave Chinn= er wrote:


Hence I'd start by upgrading= to 3.1.2 and running with the default
options first to see whether it is faster and whether it hangs or
=
not before going any further.

If it still hangs, collecting an xfs_metadump of the fs would= be
useful for investigating the problem.

But, I think I fixed t= hat (the options you mentioned were workarounds
for the bug I eventually= fixed, IIRC)

Thanks,
-Eric

Chee= rs,

Dave.


=
= --_000_7A6C2FF2777644179153E6CE1265CC04blackducksoftwarecom_-- From Jeff.Zheng@endace.com Mon May 24 21:04:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P24wgP216309 for ; Mon, 24 May 2010 21:04:58 -0500 X-ASG-Debug-ID: 1274753122-24e500bf0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smrn.endace.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6461536C2F3 for ; Mon, 24 May 2010 19:05:23 -0700 (PDT) Received: from smrn.endace.com (endace.smrn.com [209.234.97.14]) by cuda.sgi.com with ESMTP id wUQkqJ4SBvvPmOwL for ; Mon, 24 May 2010 19:05:23 -0700 (PDT) Received: from mail.ems.endace.com (105.host-203-152-102.compassnet.co.nz [203.152.102.105]) by smrn.endace.com (8.13.4/8.13.4/Debian-3sarge3) with ESMTP id o4P2JsU7022339 for ; Mon, 24 May 2010 19:19:55 -0700 Received: from NZAKLMBX01.ad.endace.com ([fe80::94fb:b5:caeb:674c]) by nzaklmbx01.ad.endace.com ([fe80::94fb:b5:caeb:674c%11]) with mapi; Tue, 25 May 2010 14:05:20 +1200 From: Jeff Zheng To: "xfs@oss.sgi.com" X-ASG-Orig-Subj: Is persistant preallocation possible? Subject: Is persistant preallocation possible? Thread-Topic: Is persistant preallocation possible? Thread-Index: Acr7rrsOyfRfg8IqSiu66ekbwZxWgQ== Date: Tue, 25 May 2010 02:05:21 +0000 Message-ID: <9256268935CF66428AC10E736C91455F024036@nzaklmbx01.ad.endace.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-cr-puzzleid: {B50FEA9D-1F8D-44CF-8F77-79DF14F12A00} x-cr-hashedpuzzle: qVY= AQwX AZ0n AqCz Cdjh C8R4 DLxG Db2q DoIr Dtsj D/9K E3Um Fh2p FpZx H7Ca IARi;1;eABmAHMAQABvAHMAcwAuAHMAZwBpAC4AYwBvAG0A;Sosha1_v1;7;{B50FEA9D-1F8D-44CF-8F77-79DF14F12A00};agBlAGYAZgAuAHoAaABlAG4AZwBAAGUAbgBkAGEAYwBlAC4AYwBvAG0A;Tue, 25 May 2010 02:05:21 GMT;SQBzACAAcABlAHIAcwBpAHMAdABhAG4AdAAgAHAAcgBlAGEAbABsAG8AYwBhAHQAaQBvAG4AIABwAG8AcwBzAGkAYgBsAGUAPwA= Content-Type: multipart/alternative; boundary="_000_9256268935CF66428AC10E736C91455F024036nzaklmbx01adendac_" MIME-Version: 1.0 X-Barracuda-Connect: endace.smrn.com[209.234.97.14] X-Barracuda-Start-Time: 1274753123 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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30708 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --_000_9256268935CF66428AC10E736C91455F024036nzaklmbx01adendac_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi, We are trying to control where the files are being allocated on the disk= s, and we tried xfs preallocation. What we found is that each time the file= being reopened the location of the pre-allocated space could change (not a= ll the time). Is there a way to do persistent preallocation in xfs, like th= e same file will always be on the same location on the disk given that the = requested size doesn't change? Thanks in advance. Jeff --_000_9256268935CF66428AC10E736C91455F024036nzaklmbx01adendac_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hi,

 

   We are trying to control where the files = are being allocated on the disks, and we tried xfs preallocation. What we found= is that each time the file being reopened the location of the pre-allocated sp= ace could change (not all the time). Is there a way to do persistent preallocat= ion in xfs, like the same file will always be on the same location on the disk given that the requested size doesn’t change?

 

Thanks in advance.

 

Jeff

--_000_9256268935CF66428AC10E736C91455F024036nzaklmbx01adendac_-- From nathans@aconex.com Mon May 24 21:24:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P2NxvC217163 for ; Mon, 24 May 2010 21:24:00 -0500 X-ASG-Debug-ID: 1274754380-24d801470000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from postoffice2.aconex.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2BAF736C393 for ; Mon, 24 May 2010 19:26:21 -0700 (PDT) Received: from postoffice2.aconex.com (mail.aconex.com [203.89.202.182]) by cuda.sgi.com with ESMTP id 6TffEb2YIDp15a82 for ; Mon, 24 May 2010 19:26:21 -0700 (PDT) Received: from postoffice.aconex.com (localhost [127.0.0.1]) by postoffice2.aconex.com (Spam & Virus Firewall) with ESMTP id 69B92617F0B; Tue, 25 May 2010 12:26:19 +1000 (EST) Received: from postoffice.aconex.com (postoffice.yarra.acx [192.168.102.1]) by postoffice2.aconex.com with ESMTP id z83hgRjoOoAcFuXz; Tue, 25 May 2010 12:26:19 +1000 (EST) Received: from gatekeeper.aconex.com (gatekeeper.yarra.acx [192.168.102.10]) by postoffice.aconex.com (Postfix) with ESMTP id CB4F4A501BD; Tue, 25 May 2010 12:22:55 +1000 (EST) Received: from localhost (localhost.localdomain [127.0.0.1]) by gatekeeper.aconex.com (Postfix) with ESMTP id 532F348873F; Tue, 25 May 2010 12:26:19 +1000 (EST) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at aconex.com Received: from gatekeeper.aconex.com ([127.0.0.1]) by localhost (gatekeeper.aconex.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id JJrBeYeeUniw; Tue, 25 May 2010 12:26:14 +1000 (EST) Received: from mail-au.aconex.com (mail-au.aconex.com [192.168.102.12]) by gatekeeper.aconex.com (Postfix) with ESMTP id 8DA5848873D; Tue, 25 May 2010 12:26:14 +1000 (EST) Received: from mail-au.aconex.com (mail-au.aconex.com [192.168.102.12]) by mail-au.aconex.com (Postfix) with ESMTP id 8771364B8657; Tue, 25 May 2010 12:26:14 +1000 (EST) Date: Tue, 25 May 2010 12:26:14 +1000 (EST) From: Nathan Scott To: Jeff Zheng Cc: xfs@oss.sgi.com Message-ID: <1374176788.272721274754374474.JavaMail.root@mail-au.aconex.com> In-Reply-To: <9256268935CF66428AC10E736C91455F024036@nzaklmbx01.ad.endace.com> X-ASG-Orig-Subj: Re: Is persistant preallocation possible? Subject: Re: Is persistant preallocation possible? MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [203.89.193.116] X-Mailer: Zimbra 5.0.18_GA_3011.RHEL5_64 (ZimbraWebClient - FF3.0 (Linux)/5.0.18_GA_3011.RHEL5_64) X-Barracuda-Connect: mail.aconex.com[203.89.202.182] X-Barracuda-Start-Time: 1274754382 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.2, rules version 3.2.2.30710 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean ----- "Jeff Zheng" wrote: > Hi, >=20 > We are trying to control where the files are being allocated on the > disks, and we tried xfs preallocation. What we found is that each time > the file being reopened the location of the pre-allocated space could > change (not all the time). Is there a way to do persistent > preallocation in xfs, like the same file will always be on the same > location on the disk given that the requested size doesn=E2=80=99t change= ? >=20 Sounds like you are truncating the file (on open?), and hence discarding the preallocation. XFS preallocation is persistent already, so I think something you are doing must be discarding those preallocated extents. Could you post a test program, or sequence of xfs_io commands, that would demonstrate the problem? cheers. --=20 Nathan From aelder@oss.sgi.com Mon May 24 22:04:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=ALL_TRUSTED,BAYES_00, J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P34p9L219158 for ; Mon, 24 May 2010 22:04:51 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o4P34nEj219040; Mon, 24 May 2010 22:04:49 -0500 Date: Mon, 24 May 2010 22:04:49 -0500 Message-Id: <201005250304.o4P34nEj219040@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus, updated. v2.6.34-7320-g88e8837 X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: e9cee8e6549b669080e9a7d02b8387086a5c911d X-Git-Newrev: 88e88374ee4958786397a57f684de6f1fc5e0242 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-linus has been updated 88e8837 Merge branch 'delayed-logging-for-2.6.35' into for-linus ccf7c23 xfs: Ensure inode allocation buffers are fully replayed df80615 xfs: enable background pushing of the CIL 9da1ab1 xfs: forced unmounts need to push the CIL 71e330b xfs: Introduce delayed logging core code ed3b4d6 xfs: Improve scalability of busy extent tracking 955833c xfs: make the log ticket ID available outside the log infrastructure 169a7b0 xfs: clean up log ticket overrun debug output c115541 xfs: Clean up XFS_BLI_* flag namespace 64fc35d xfs: modify buffer item reference counting 3383ca5 xfs: allow log ticket allocation to take allocation flags 524ee36 xfs: Don't reuse the same transaction ID for duplicated transactions. e8bebe2 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 46e5876 xfs: constify xattr_handler ee9a360 Merge branch 'master' into for-2.6.35 c472b43 quota: unify ->set_dqblk b9b2dd3 quota: unify ->get_dqblk 7407cf3 Merge branch 'master' into for-2.6.35 fbd9b09 blkdev: generalize flags for blkdev_issue_fn functions from e9cee8e6549b669080e9a7d02b8387086a5c911d (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 88e88374ee4958786397a57f684de6f1fc5e0242 Merge: 7e125f7b9cbfce4101191b8076d606c517a73066 ccf7c23fc129e75ef60e6f59f60a485b7a056598 Author: Alex Elder Date: Mon May 24 11:57:36 2010 -0500 Merge branch 'delayed-logging-for-2.6.35' into for-linus commit e8bebe2f71d26871b0970ae1d9cf0ed3cdd9569d Merge: 6109e2ce2600e2db26cd0424bb9c6ed019723288 82f3952c02add60b15eea9151d4d99b6b82066c6 Author: Linus Torvalds Date: Fri May 21 19:37:45 2010 -0700 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (69 commits) fix handling of offsets in cris eeprom.c, get rid of fake on-stack files get rid of home-grown mutex in cris eeprom.c switch ecryptfs_write() to struct inode *, kill on-stack fake files switch ecryptfs_get_locked_page() to struct inode * simplify access to ecryptfs inodes in ->readpage() and friends AFS: Don't put struct file on the stack Ban ecryptfs over ecryptfs logfs: replace inode uid,gid,mode initialization with helper function ufs: replace inode uid,gid,mode initialization with helper function udf: replace inode uid,gid,mode init with helper ubifs: replace inode uid,gid,mode initialization with helper function sysv: replace inode uid,gid,mode initialization with helper function reiserfs: replace inode uid,gid,mode initialization with helper function ramfs: replace inode uid,gid,mode initialization with helper function omfs: replace inode uid,gid,mode initialization with helper function bfs: replace inode uid,gid,mode initialization with helper function ocfs2: replace inode uid,gid,mode initialization with helper function nilfs2: replace inode uid,gid,mode initialization with helper function minix: replace inode uid,gid,mode init with helper ext4: replace inode uid,gid,mode init with helper ... Trivial conflict in fs/fs-writeback.c (mark bitfields unsigned) commit 46e58764f0c502847ed1f4662aa37eefa602a8f9 Author: Stephen Hemminger Date: Thu May 13 17:53:20 2010 -0700 xfs: constify xattr_handler Signed-off-by: Stephen Hemminger Signed-off-by: Al Viro commit ee9a3607fb03e804ddf624544105f4e34260c380 Merge: b492e95be0ae672922f4734acf3f5d35c30be948 d515e86e639890b33a09390d062b0831664f04a2 Author: Jens Axboe Date: Fri May 21 21:27:26 2010 +0200 Merge branch 'master' into for-2.6.35 Conflicts: fs/ext3/fsync.c Signed-off-by: Jens Axboe commit c472b43275976512e4c1c32da5ced03f339cb380 Author: Christoph Hellwig Date: Thu May 6 17:05:17 2010 -0400 quota: unify ->set_dqblk Pass the larger struct fs_disk_quota to the ->set_dqblk operation so that the Q_SETQUOTA and Q_XSETQUOTA operations can be implemented with a single filesystem operation and we can retire the ->set_xquota operation. The additional information (RT-subvolume accounting and warn counts) are left zero for the VFS quota implementation. Add new fieldmask values for setting the numer of blocks and inodes values which is required for the VFS quota, but wasn't for XFS. Signed-off-by: Christoph Hellwig Signed-off-by: Jan Kara commit b9b2dd36c1bc64430f8e13990ab135cbecc10076 Author: Christoph Hellwig Date: Thu May 6 17:04:58 2010 -0400 quota: unify ->get_dqblk Pass the larger struct fs_disk_quota to the ->get_dqblk operation so that the Q_GETQUOTA and Q_XGETQUOTA operations can be implemented with a single filesystem operation and we can retire the ->get_xquota operation. The additional information (RT-subvolume accounting and warn counts) are left zero for the VFS quota implementation. Signed-off-by: Christoph Hellwig Signed-off-by: Jan Kara commit 7407cf355fdf5500430be966dbbde84a27293bad Merge: 6a47dc1418682c83d603b491df1d048f73aa973e 79dba2eaa771c3173957eccfd288e0e0d12e4d3f Author: Jens Axboe Date: Thu Apr 29 09:36:24 2010 +0200 Merge branch 'master' into for-2.6.35 Conflicts: fs/block_dev.c Signed-off-by: Jens Axboe commit fbd9b09a177a481eda256447c881f014f29034fe Author: Dmitry Monakhov Date: Wed Apr 28 17:55:06 2010 +0400 blkdev: generalize flags for blkdev_issue_fn functions The patch just convert all blkdev_issue_xxx function to common set of flags. Wait/allocation semantics preserved. Signed-off-by: Dmitry Monakhov Signed-off-by: Jens Axboe ----------------------------------------------------------------------- Summary of changes: fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_acl.c | 4 +- fs/xfs/linux-2.6/xfs_buf.c | 9 + fs/xfs/linux-2.6/xfs_quotaops.c | 9 +- fs/xfs/linux-2.6/xfs_super.c | 15 +- fs/xfs/linux-2.6/xfs_super.h | 2 +- fs/xfs/linux-2.6/xfs_trace.h | 83 +++-- fs/xfs/linux-2.6/xfs_xattr.c | 8 +- fs/xfs/quota/xfs_dquot.c | 6 +- fs/xfs/quota/xfs_qm_syscalls.c | 10 +- fs/xfs/xfs_acl.h | 4 +- fs/xfs/xfs_ag.h | 24 +- fs/xfs/xfs_alloc.c | 357 ++++++++++++++------ fs/xfs/xfs_alloc.h | 7 +- fs/xfs/xfs_alloc_btree.c | 2 +- fs/xfs/xfs_buf_item.c | 166 +++++----- fs/xfs/xfs_buf_item.h | 18 +- fs/xfs/xfs_error.c | 2 +- fs/xfs/xfs_log.c | 120 +++++-- fs/xfs/xfs_log.h | 14 +- fs/xfs/xfs_log_cil.c | 725 +++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_log_priv.h | 118 ++++++- fs/xfs/xfs_log_recover.c | 46 ++-- fs/xfs/xfs_log_recover.h | 2 +- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 144 ++++++-- fs/xfs/xfs_trans.h | 44 +-- fs/xfs/xfs_trans_buf.c | 46 ++-- fs/xfs/xfs_trans_item.c | 114 +------ fs/xfs/xfs_trans_priv.h | 15 +- fs/xfs/xfs_types.h | 2 + 31 files changed, 1588 insertions(+), 530 deletions(-) create mode 100644 fs/xfs/xfs_log_cil.c hooks/post-receive -- XFS development tree From aelder@sgi.com Mon May 24 22:17:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P3HN9X219972 for ; Mon, 24 May 2010 22:17:23 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id B8D19AC005; Mon, 24 May 2010 20:19:42 -0700 (PDT) Received: from stout.americas.sgi.com (localhost6.localdomain6 [127.0.0.1]) by stout.americas.sgi.com (8.14.3/8.14.2) with ESMTP id o4P3JgrU027724; Mon, 24 May 2010 22:19:42 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o4P3JexR027722; Mon, 24 May 2010 22:19:40 -0500 From: Alex Elder Message-Id: <201005250319.o4P3JexR027722@stout.americas.sgi.com> Date: Mon, 24 May 2010 22:19:40 -0500 To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update for 2.6.35-rc1 (2 of 2) Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Here is the second set of changes for XFS for 2.6.35-rc1. -Alex The following changes since commit 7e125f7b9cbfce4101191b8076d606c517a73066: Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide-2.6 (2010-05-24 08:05:29 -0700) are available in the git repository at: git://oss.sgi.com/xfs/xfs for-linus Alex Elder (1): Merge branch 'delayed-logging-for-2.6.35' into for-linus Dave Chinner (12): xfs: Don't reuse the same transaction ID for duplicated transactions. xfs: allow log ticket allocation to take allocation flags xfs: modify buffer item reference counting xfs: Clean up XFS_BLI_* flag namespace xfs: clean up log ticket overrun debug output xfs: make the log ticket ID available outside the log infrastructure xfs: Improve scalability of busy extent tracking xfs: Delayed logging design documentation xfs: Introduce delayed logging core code xfs: forced unmounts need to push the CIL xfs: enable background pushing of the CIL xfs: Ensure inode allocation buffers are fully replayed .../filesystems/xfs-delayed-logging-design.txt | 816 ++++++++++++++++++++ fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_buf.c | 9 + fs/xfs/linux-2.6/xfs_quotaops.c | 1 + fs/xfs/linux-2.6/xfs_super.c | 12 +- fs/xfs/linux-2.6/xfs_trace.h | 83 ++- fs/xfs/quota/xfs_dquot.c | 6 +- fs/xfs/xfs_ag.h | 24 +- fs/xfs/xfs_alloc.c | 357 ++++++--- fs/xfs/xfs_alloc.h | 7 +- fs/xfs/xfs_alloc_btree.c | 2 +- fs/xfs/xfs_buf_item.c | 166 ++-- fs/xfs/xfs_buf_item.h | 18 +- fs/xfs/xfs_error.c | 2 +- fs/xfs/xfs_log.c | 120 +++- fs/xfs/xfs_log.h | 14 +- fs/xfs/xfs_log_cil.c | 725 +++++++++++++++++ fs/xfs/xfs_log_priv.h | 118 +++- fs/xfs/xfs_log_recover.c | 46 +- fs/xfs/xfs_log_recover.h | 2 +- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 144 +++- fs/xfs/xfs_trans.h | 44 +- fs/xfs/xfs_trans_buf.c | 46 +- fs/xfs/xfs_trans_item.c | 114 +--- fs/xfs/xfs_trans_priv.h | 15 +- fs/xfs/xfs_types.h | 2 + 27 files changed, 2382 insertions(+), 513 deletions(-) create mode 100644 Documentation/filesystems/xfs-delayed-logging-design.txt create mode 100644 fs/xfs/xfs_log_cil.c From sandeen@sandeen.net Mon May 24 22:17:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P3HVWF219996 for ; Mon, 24 May 2010 22:17:32 -0500 X-ASG-Debug-ID: 1274757593-3f9a03520000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 13BB9143D6EB for ; Mon, 24 May 2010 20:19:53 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id WfzEQrdcysiMhdRt for ; Mon, 24 May 2010 20:19:53 -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 mail.sandeen.net (Postfix) with ESMTP id 2BDB949632AC; Mon, 24 May 2010 22:19:53 -0500 (CDT) Message-ID: <4BFB41D8.3020402@sandeen.net> Date: Mon, 24 May 2010 22:19:52 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Nathan Scott CC: Jeff Zheng , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Is persistant preallocation possible? Subject: Re: Is persistant preallocation possible? References: <1374176788.272721274754374474.JavaMail.root@mail-au.aconex.com> In-Reply-To: <1374176788.272721274754374474.JavaMail.root@mail-au.aconex.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1274757594 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=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30714 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Nathan Scott wrote: > ----- "Jeff Zheng" wrote: > >> Hi, >> >> We are trying to control where the files are being allocated on the >> disks, and we tried xfs preallocation. What we found is that each time >> the file being reopened the location of the pre-allocated space could >> change (not all the time). Is there a way to do persistent >> preallocation in xfs, like the same file will always be on the same >> location on the disk given that the requested size doesn’t change? >> > > Sounds like you are truncating the file (on open?), and hence discarding > the preallocation. XFS preallocation is persistent already, so I think > something you are doing must be discarding those preallocated extents. > > Could you post a test program, or sequence of xfs_io commands, that would > demonstrate the problem? > > cheers. > ... maybe you mean that truncating / pre-allocating the same space repeatedly on the same filename ends up with blocks mapped in different locations...? That's entirely expected... nothing about the preallocation interface lets you "control *where* files are being allocated" as you said above... -Eric From rostedt@goodmis.org Mon May 24 22:34:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P3YZ07220744 for ; Mon, 24 May 2010 22:34:35 -0500 X-ASG-Debug-ID: 1274758617-24d102b80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from hrndva-omtalb.mail.rr.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8E57D36C569 for ; Mon, 24 May 2010 20:36:57 -0700 (PDT) Received: from hrndva-omtalb.mail.rr.com (hrndva-omtalb.mail.rr.com [71.74.56.123]) by cuda.sgi.com with ESMTP id pCqwKO4lXfqhRDSf for ; Mon, 24 May 2010 20:36:57 -0700 (PDT) X-Authority-Analysis: v=1.1 cv=muTmBHIsIIrvj5np50lvqqEF3x9MmSj/zDSU9q1ni6E= c=1 sm=0 a=4ERTW0lRcqgA:10 a=UBIxAjGgU1YA:10 a=7U3hwN5JcxgA:10 a=Q9fys5e9bTEA:10 a=gMqfjgEr1zLu/65IO0LwxA==:17 a=meVymXHHAAAA:8 a=omOdbC7AAAAA:8 a=LRNRf81RRmkgUL1l7jMA:9 a=hombTs-K5JDvkik8kQ5acpLe-XkA:4 a=PUjeQqilurYA:10 a=jeBq3FmKZ4MA:10 a=gMqfjgEr1zLu/65IO0LwxA==:117 X-Cloudmark-Score: 0 X-Originating-IP: 74.67.89.75 Received: from [74.67.89.75] ([74.67.89.75:46148] helo=[192.168.23.10]) by hrndva-oedge04.mail.rr.com (envelope-from ) (ecelerity 2.2.2.39 r()) with ESMTP id 85/BF-22658-7D54BFB4; Tue, 25 May 2010 03:36:56 +0000 X-ASG-Orig-Subj: Re: [PATCH] xfs: convert more trace events to DEFINE_EVENT Subject: Re: [PATCH] xfs: convert more trace events to DEFINE_EVENT From: Steven Rostedt Reply-To: rostedt@goodmis.org To: Li Zefan Cc: Dave Chinner , Alex Elder , Christoph Hellwig , xfs@oss.sgi.com, LKML , Frederic Weisbecker In-Reply-To: <4BFA3815.7070000@cn.fujitsu.com> References: <4BFA3815.7070000@cn.fujitsu.com> Content-Type: text/plain; charset="ISO-8859-15" Organization: Kihon Technologies Inc. Date: Mon, 24 May 2010 23:36:54 -0400 Message-ID: <1274758614.22648.205.camel@gandalf.stny.rr.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: hrndva-omtalb.mail.rr.com[71.74.56.123] X-Barracuda-Start-Time: 1274758617 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0205 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.2, rules version 3.2.2.30714 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 2010-05-24 at 16:25 +0800, Li Zefan wrote: > Use DECLARE_EVENT_CLASS, and save ~15K: > > text data bss dec hex filename > 171949 43028 48 215025 347f1 fs/xfs/linux-2.6/xfs_trace.o.orig > 156521 43028 36 199585 30ba1 fs/xfs/linux-2.6/xfs_trace.o > > No change in functionality. > Acked-by: Steven Rostedt -- Steve > Signed-off-by: Li Zefan > --- > fs/xfs/linux-2.6/xfs_trace.h | 356 ++++++++++++++++++++++-------------------- > 1 files changed, 188 insertions(+), 168 deletions(-) > From SRS0+uv1J+84+fromorbit.com=david@internode.on.net Tue May 25 00:40:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P5ekmW228822 for ; Tue, 25 May 2010 00:40:46 -0500 X-ASG-Debug-ID: 1274766186-461001b70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1E7EC1DF9DC8 for ; Mon, 24 May 2010 22:43:06 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id yrdHxAjBmIrRfyUq for ; Mon, 24 May 2010 22:43:06 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25315191-1927428 for multiple; Tue, 25 May 2010 15:12:56 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OGmuk-00074X-6O; Tue, 25 May 2010 15:42:54 +1000 Date: Tue, 25 May 2010 15:42:54 +1000 From: Dave Chinner To: Steven Rostedt Cc: Li Zefan , Dave Chinner , Alex Elder , Christoph Hellwig , xfs@oss.sgi.com, LKML , Frederic Weisbecker X-ASG-Orig-Subj: Re: [PATCH] xfs: convert more trace events to DEFINE_EVENT Subject: Re: [PATCH] xfs: convert more trace events to DEFINE_EVENT Message-ID: <20100525054254.GG12087@dastard> References: <4BFA3815.7070000@cn.fujitsu.com> <1274758614.22648.205.camel@gandalf.stny.rr.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274758614.22648.205.camel@gandalf.stny.rr.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1274766188 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.2, rules version 3.2.2.30719 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 24, 2010 at 11:36:54PM -0400, Steven Rostedt wrote: > On Mon, 2010-05-24 at 16:25 +0800, Li Zefan wrote: > > Use DECLARE_EVENT_CLASS, and save ~15K: > > > > text data bss dec hex filename > > 171949 43028 48 215025 347f1 fs/xfs/linux-2.6/xfs_trace.o.orig > > 156521 43028 36 199585 30ba1 fs/xfs/linux-2.6/xfs_trace.o > > > > No change in functionality. > > > > Acked-by: Steven Rostedt I'll get this pushed through the XFS tree. Cheers, Dave. -- Dave Chinner david@fromorbit.com From jane@p4001-ipbf610yosida.nagano.ocn.ne.jp Tue May 25 01:15:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=BAYES_40,T_URIBL_BLACK_OVERLAP, URIBL_BLACK,URIBL_WS_SURBL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P6FQRM230626 for ; Tue, 25 May 2010 01:15:26 -0500 X-ASG-Debug-ID: 1274768267-518001eb0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.legend-net.jp (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 700B336C9B2 for ; Mon, 24 May 2010 23:17:48 -0700 (PDT) Received: from mail.legend-net.jp (pee5b73.tokyff01.ap.so-net.ne.jp [202.238.91.115]) by cuda.sgi.com with ESMTP id wVhNlktVgIATHDca for ; Mon, 24 May 2010 23:17:48 -0700 (PDT) Received: from dielectric (unknown [192.168.0.81]) by mail.legend-net.jp (Postfix) with SMTP id D57BCDEC98E; Tue, 25 May 2010 13:23:30 +0900 (JST) To: marketing@max.co.uk, wharris@procountstaffing.com, olivsao07@sapo.pt, kgute@okcareertech.org X-ASG-Orig-Subj: Chiropractors mailing lists Subject: Chiropractors mailing lists Reply-To: jane@p4001-ipbf610yosida.nagano.ocn.ne.jp From: "stearns Blake" Message-Id: <20100525042330.D57BCDEC98E@mail.legend-net.jp> Date: Tue, 25 May 2010 13:23:30 +0900 (JST) X-Barracuda-Connect: pee5b73.tokyff01.ap.so-net.ne.jp[202.238.91.115] X-Barracuda-Start-Time: 1274768268 X-Barracuda-Bayes: INNOCENT GLOBAL 0.7688 1.0000 1.9368 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.94 X-Barracuda-Spam-Status: No, SCORE=1.94 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.2, rules version 3.2.2.30720 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Here's some of the healthcare lists we have: Massage Therapists - 76,701 records and 8,305 emails Acupuncturists - 23,988 records 1,826 emails Physical Therapists - 125,460 total records with 5,483 emails and 4,405 fax numbers Theres many more too, just send me an email here for additional info/samples: Grady.Todd@inspiresuccess.in to get off please email disappear@inspiresuccess.in From Philippe.DENIEL@CEA.FR Tue May 25 03:42:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_92 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P8gRBv236781 for ; Tue, 25 May 2010 03:42:27 -0500 X-ASG-Debug-ID: 1274777088-308a03780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from oxalide-out.extra.cea.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6F10136CF61 for ; Tue, 25 May 2010 01:44:48 -0700 (PDT) Received: from oxalide-out.extra.cea.fr (oxalide-out.extra.cea.fr [132.168.224.1]) by cuda.sgi.com with ESMTP id j3QqnZOycQd9OrQm for ; Tue, 25 May 2010 01:44:48 -0700 (PDT) Received: from pisaure.intra.cea.fr (pisaure.intra.cea.fr [132.166.88.21]) by oxalide.extra.cea.fr (8.14.2/8.14.2/CEAnet-Internet-out-2.0) with ESMTP id o4P8ilbk029441 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT) for ; Tue, 25 May 2010 10:44:48 +0200 Received: from muguet1.intra.cea.fr (muguet1.intra.cea.fr [132.166.192.6]) by pisaure.intra.cea.fr (8.14.4/8.14.4) with ESMTP id o4P8il2f019282 for ; Tue, 25 May 2010 10:44:47 +0200 (envelope-from Philippe.DENIEL@CEA.FR) Received: from zia.bruyeres.cea.fr (esteban.dam.intra.cea.fr [132.165.76.10]) by muguet1.intra.cea.fr (8.13.8/8.13.8/CEAnet-Intranet-out-1.1) with SMTP id o4P8ilG8005274 for ; Tue, 25 May 2010 10:44:47 +0200 Received: (qmail 14775 invoked from network); 25 May 2010 08:44:47 -0000 Message-ID: <4BFB8DFF.5040306@cea.fr> Date: Tue, 25 May 2010 10:44:47 +0200 From: DENIEL Philippe Organization: CEA-DAM User-Agent: Thunderbird 2.0.0.6 (X11/20070728) MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: open_by_handle on a file ? Subject: Re: open_by_handle on a file ? References: <4BEACBC0.3080300@cea.fr> <20100512222147.GD13617@dastard> In-Reply-To: <20100512222147.GD13617@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-OriginalArrivalTime: 25 May 2010 08:44:47.0634 (UTC) FILETIME=[8801A720:01CAFBE6] X-Barracuda-Connect: oxalide-out.extra.cea.fr[132.168.224.1] X-Barracuda-Start-Time: 1274777089 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.2, rules version 3.2.2.30730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Thank you Dave, you were definitely right. I used the XFS mount point as the argument to path_to_fshandle and it now woks perfectly. :-) This leads me to another question : now that I can convert a path to fhandle and use it to open a file or a directory, I can use getdents and the ATFILE_SOURCE functions (mkdirat, linkat, ....) to implement the NFS logic (I just have to "open_by_handle" to get the fs to the related fs object and operate on it). The idea behind this is implementing a NFS server in Userspace with XFS specific capabilites. In fact, the NFS on which a minor issue remains is LOOKUP (and it could become a major issue since LOOKUP is called very often). To lookup on an object knowing its parent directory's handle and its name, I can perform an "openat" followed by a xfs related "fd_to_handle" and close the fd once the operation is done. But it seems a bit "heavy" to me. Is there another (lighter) way of getting the handle to an object knowing its name and parent directory (may be by a call to xfsctl ?). Regards, Philippe Dave Chinner a écrit : > On Wed, May 12, 2010 at 05:39:44PM +0200, DENIEL Philippe wrote: > >> Hi, >> >> I start using libhandle.so from xfsprogs-3.0.3 package. I meet an >> issue here : I can get a handle from files or directory. >> When used on diretories, open_by_handle works fine : I can read >> entries in it by using getdents, create stuff / removing stuff by >> using the ATFILE_FUNCTION (mkdirat, renameat, ...) >> >> Trouble start when I want to open a file with open_by_handle. I have >> a small test program that does this : >> >> rc = path_to_fshandle( path_dir, (void **)(&fshandle), >> &fshandlelen) ; >> if( rc < 0 ) exit( -1) >> rc = path_to_handle( path_dir, (void **)(&filehandle), &handlelen) ; >> if( rc < 0 ) exit( -1 ) >> >> fd = open_by_handle( filehandle, handlelen, O_RDONLY ) ; >> printf( "open_by_handle: fd=%d \n", fd ) ; >> if( fd < 0 ) >> printf( "----> Error=%d | %s\n", errno, strerror( errno ) ) ; >> >> The open_by_handle failed with errno=20 aka ENOTDIR, which is true, >> this is a file and no directory. >> > > I think that is because the path_dir points to a regular file and > so path_to_fshandle() is generating a fshandle that points to a file > instead of a directory. This handle is cached inside libhandle, and > then use for subsequent handle calls like open_by_handle(). The > kernel rejects the request is the fshandle does not point to a > directory. > > Try using the mount point or a directory within the mount for > the path_to_fshandle() call and see if that fixes the problem. > > Cheers, > > Dave. > From SRS0+Kyl4+84+fromorbit.com=dave@internode.on.net Tue May 25 03:51:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_74 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P8oxLJ237137 for ; Tue, 25 May 2010 03:51:00 -0500 X-ASG-Debug-ID: 1274777599-71df03290000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5E7491DFA2AE for ; Tue, 25 May 2010 01:53:19 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id JK5sj3vI93aDLgBd for ; Tue, 25 May 2010 01:53:19 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25507797-1927428 for multiple; Tue, 25 May 2010 18:23:18 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OGpsy-0007GL-MW; Tue, 25 May 2010 18:53:16 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OGpsq-0005bF-A1; Tue, 25 May 2010 18:53:08 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/5] mm: add context argument to shrinker callback Subject: [PATCH 2/5] mm: add context argument to shrinker callback Date: Tue, 25 May 2010 18:53:05 +1000 Message-Id: <1274777588-21494-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274777588-21494-1-git-send-email-david@fromorbit.com> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1274777601 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.2, rules version 3.2.2.30731 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The current shrinker implementation requires the registered callback to have global state to work from. This makes it difficult to shrink caches that are not global (e.g. per-filesystem caches). Pass the shrinker structure to the callback so that users can embed the shrinker structure in the context the shrinker needs to operate on and get back to it in the callback via container_of(). Signed-off-by: Dave Chinner --- arch/x86/kvm/mmu.c | 2 +- drivers/gpu/drm/i915/i915_gem.c | 2 +- fs/dcache.c | 2 +- fs/gfs2/glock.c | 2 +- fs/gfs2/quota.c | 2 +- fs/gfs2/quota.h | 2 +- fs/inode.c | 2 +- fs/mbcache.c | 5 +++-- fs/nfs/dir.c | 2 +- fs/nfs/internal.h | 3 ++- fs/quota/dquot.c | 2 +- fs/ubifs/shrinker.c | 2 +- fs/ubifs/ubifs.h | 2 +- fs/xfs/linux-2.6/xfs_buf.c | 5 +++-- fs/xfs/linux-2.6/xfs_sync.c | 1 + fs/xfs/quota/xfs_qm.c | 7 +++++-- include/linux/mm.h | 2 +- mm/vmscan.c | 8 +++++--- 18 files changed, 31 insertions(+), 22 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 81563e7..ac3d107 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -2919,7 +2919,7 @@ static int kvm_mmu_remove_some_alloc_mmu_pages(struct kvm *kvm) return kvm_mmu_zap_page(kvm, page) + 1; } -static int mmu_shrink(int nr_to_scan, gfp_t gfp_mask) +static int mmu_shrink(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) { struct kvm *kvm; struct kvm *kvm_freed = NULL; diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 112699f..6cd2e7a 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -5216,7 +5216,7 @@ i915_gpu_is_active(struct drm_device *dev) } static int -i915_gem_shrink(int nr_to_scan, gfp_t gfp_mask) +i915_gem_shrink(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) { drm_i915_private_t *dev_priv, *next_dev; struct drm_i915_gem_object *obj_priv, *next_obj; diff --git a/fs/dcache.c b/fs/dcache.c index d96047b..dba6b6d 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -894,7 +894,7 @@ EXPORT_SYMBOL(shrink_dcache_parent); * * In this case we return -1 to tell the caller that we baled. */ -static int shrink_dcache_memory(int nr, gfp_t gfp_mask) +static int shrink_dcache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) { if (nr) { if (!(gfp_mask & __GFP_FS)) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index ddcdbf4..04b540c 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -1348,7 +1348,7 @@ void gfs2_glock_complete(struct gfs2_glock *gl, int ret) } -static int gfs2_shrink_glock_memory(int nr, gfp_t gfp_mask) +static int gfs2_shrink_glock_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) { struct gfs2_glock *gl; int may_demote; diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 49667d6..4ea548f 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -77,7 +77,7 @@ static LIST_HEAD(qd_lru_list); static atomic_t qd_lru_count = ATOMIC_INIT(0); static DEFINE_SPINLOCK(qd_lru_lock); -int gfs2_shrink_qd_memory(int nr, gfp_t gfp_mask) +int gfs2_shrink_qd_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) { struct gfs2_quota_data *qd; struct gfs2_sbd *sdp; diff --git a/fs/gfs2/quota.h b/fs/gfs2/quota.h index 195f60c..e7d236c 100644 --- a/fs/gfs2/quota.h +++ b/fs/gfs2/quota.h @@ -51,7 +51,7 @@ static inline int gfs2_quota_lock_check(struct gfs2_inode *ip) return ret; } -extern int gfs2_shrink_qd_memory(int nr, gfp_t gfp_mask); +extern int gfs2_shrink_qd_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask); extern const struct quotactl_ops gfs2_quotactl_ops; #endif /* __QUOTA_DOT_H__ */ diff --git a/fs/inode.c b/fs/inode.c index 3caa758..1e44ec5 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -577,7 +577,7 @@ static void prune_icache(int count) * This function is passed the number of inodes to scan, and it returns the * total number of remaining possibly-reclaimable inodes. */ -static int shrink_icache_memory(int nr, gfp_t gfp_mask) +static int shrink_icache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) { if (nr) { /* diff --git a/fs/mbcache.c b/fs/mbcache.c index ec88ff3..e28f21b 100644 --- a/fs/mbcache.c +++ b/fs/mbcache.c @@ -115,7 +115,7 @@ mb_cache_indexes(struct mb_cache *cache) * What the mbcache registers as to get shrunk dynamically. */ -static int mb_cache_shrink_fn(int nr_to_scan, gfp_t gfp_mask); +static int mb_cache_shrink_fn(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask); static struct shrinker mb_cache_shrinker = { .shrink = mb_cache_shrink_fn, @@ -191,13 +191,14 @@ forget: * This function is called by the kernel memory management when memory * gets low. * + * @shrink: (ignored) * @nr_to_scan: Number of objects to scan * @gfp_mask: (ignored) * * Returns the number of objects which are present in the cache. */ static int -mb_cache_shrink_fn(int nr_to_scan, gfp_t gfp_mask) +mb_cache_shrink_fn(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) { LIST_HEAD(free_list); struct list_head *l, *ltmp; diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index ee9a179..3f33bc0 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -1708,7 +1708,7 @@ static void nfs_access_free_list(struct list_head *head) } } -int nfs_access_cache_shrinker(int nr_to_scan, gfp_t gfp_mask) +int nfs_access_cache_shrinker(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) { LIST_HEAD(head); struct nfs_inode *nfsi; diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index d8bd619..e70f44b 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -205,7 +205,8 @@ extern struct rpc_procinfo nfs4_procedures[]; void nfs_close_context(struct nfs_open_context *ctx, int is_sync); /* dir.c */ -extern int nfs_access_cache_shrinker(int nr_to_scan, gfp_t gfp_mask); +extern int nfs_access_cache_shrinker(struct shrinker *shrink, + int nr_to_scan, gfp_t gfp_mask); /* inode.c */ extern struct workqueue_struct *nfsiod_workqueue; diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 655a4c5..cfd5437 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -697,7 +697,7 @@ static int dqstats_read(unsigned int type) * more memory */ -static int shrink_dqcache_memory(int nr, gfp_t gfp_mask) +static int shrink_dqcache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) { if (nr) { spin_lock(&dq_list_lock); diff --git a/fs/ubifs/shrinker.c b/fs/ubifs/shrinker.c index 02feb59..0b20111 100644 --- a/fs/ubifs/shrinker.c +++ b/fs/ubifs/shrinker.c @@ -277,7 +277,7 @@ static int kick_a_thread(void) return 0; } -int ubifs_shrinker(int nr, gfp_t gfp_mask) +int ubifs_shrinker(struct shrinker *shrink, int nr, gfp_t gfp_mask) { int freed, contention = 0; long clean_zn_cnt = atomic_long_read(&ubifs_clean_zn_cnt); diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index bd2542d..5a92345 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h @@ -1575,7 +1575,7 @@ int ubifs_tnc_start_commit(struct ubifs_info *c, struct ubifs_zbranch *zroot); int ubifs_tnc_end_commit(struct ubifs_info *c); /* shrinker.c */ -int ubifs_shrinker(int nr_to_scan, gfp_t gfp_mask); +int ubifs_shrinker(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask); /* commit.c */ int ubifs_bg_thread(void *info); diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index f01de3c..fe8bf82 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -44,7 +44,7 @@ static kmem_zone_t *xfs_buf_zone; STATIC int xfsbufd(void *); -STATIC int xfsbufd_wakeup(int, gfp_t); +STATIC int xfsbufd_wakeup(struct shrinker *, int, gfp_t); STATIC void xfs_buf_delwri_queue(xfs_buf_t *, int); static struct shrinker xfs_buf_shake = { .shrink = xfsbufd_wakeup, @@ -339,7 +339,7 @@ _xfs_buf_lookup_pages( __func__, gfp_mask); XFS_STATS_INC(xb_page_retries); - xfsbufd_wakeup(0, gfp_mask); + xfsbufd_wakeup(NULL, 0, gfp_mask); congestion_wait(BLK_RW_ASYNC, HZ/50); goto retry; } @@ -1753,6 +1753,7 @@ xfs_buf_runall_queues( STATIC int xfsbufd_wakeup( + struct shrinker *shrink, int priority, gfp_t mask) { diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 3884e20..c881a0c 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -842,6 +842,7 @@ static struct rw_semaphore xfs_mount_list_lock; static int xfs_reclaim_inode_shrink( + struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) { diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 38e7641..b8051aa 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -69,7 +69,7 @@ STATIC void xfs_qm_list_destroy(xfs_dqlist_t *); STATIC int xfs_qm_init_quotainos(xfs_mount_t *); STATIC int xfs_qm_init_quotainfo(xfs_mount_t *); -STATIC int xfs_qm_shake(int, gfp_t); +STATIC int xfs_qm_shake(struct shrinker *, int, gfp_t); static struct shrinker xfs_qm_shaker = { .shrink = xfs_qm_shake, @@ -2117,7 +2117,10 @@ xfs_qm_shake_freelist( */ /* ARGSUSED */ STATIC int -xfs_qm_shake(int nr_to_scan, gfp_t gfp_mask) +xfs_qm_shake( + struct shrinker *shrink, + int nr_to_scan, + gfp_t gfp_mask) { int ndqused, nfree, n; diff --git a/include/linux/mm.h b/include/linux/mm.h index fb19bb9..3d7eedc 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -994,7 +994,7 @@ static inline void sync_mm_rss(struct task_struct *task, struct mm_struct *mm) * querying the cache size, so a fastpath for that case is appropriate. */ struct shrinker { - int (*shrink)(int nr_to_scan, gfp_t gfp_mask); + int (*shrink)(struct shrinker *, int nr_to_scan, gfp_t gfp_mask); int seeks; /* seeks to recreate an obj */ /* These are for internal use */ diff --git a/mm/vmscan.c b/mm/vmscan.c index 3ff3311..9d56aaf 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -215,8 +215,9 @@ unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, list_for_each_entry(shrinker, &shrinker_list, list) { unsigned long long delta; unsigned long total_scan; - unsigned long max_pass = (*shrinker->shrink)(0, gfp_mask); + unsigned long max_pass; + max_pass = (*shrinker->shrink)(shrinker, 0, gfp_mask); delta = (4 * scanned) / shrinker->seeks; delta *= max_pass; do_div(delta, lru_pages + 1); @@ -244,8 +245,9 @@ unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, int shrink_ret; int nr_before; - nr_before = (*shrinker->shrink)(0, gfp_mask); - shrink_ret = (*shrinker->shrink)(this_scan, gfp_mask); + nr_before = (*shrinker->shrink)(shrinker, 0, gfp_mask); + shrink_ret = (*shrinker->shrink)(shrinker, this_scan, + gfp_mask); if (shrink_ret == -1) break; if (shrink_ret < nr_before) -- 1.5.6.5 From SRS0+91Ea+84+fromorbit.com=dave@internode.on.net Tue May 25 03:51:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P8p8eL237157 for ; Tue, 25 May 2010 03:51:08 -0500 X-ASG-Debug-ID: 1274777609-37b303480000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DE2D336CBF2 for ; Tue, 25 May 2010 01:53:29 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id KUgAuiSYIxGQDuPE for ; Tue, 25 May 2010 01:53:29 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13892362-1927428 for multiple; Tue, 25 May 2010 18:23:28 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OGpsy-0007GJ-MV; Tue, 25 May 2010 18:53:16 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OGpsq-0005bB-5S; Tue, 25 May 2010 18:53:08 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/5] Per superblock shrinkers V2 Subject: [PATCH 0/5] Per superblock shrinkers V2 Date: Tue, 25 May 2010 18:53:03 +1000 Message-Id: <1274777588-21494-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1274777610 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.2, rules version 3.2.2.30731 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This series reworks the filesystem shrinkers. We currently have a set of issues with the current filesystem shrinkers: 1. There is an dependency between dentry and inode cache shrinking that is only implicitly defined by the order of shrinker registration. 2. The shrinkers need to walk the superblock list and pin the superblock to avoid unmount races with the sb going away. 3. The dentry cache uses per-superblock LRUs and proportions reclaim between all the superblocks which means we are doing breadth based reclaim. This means we touch every superblock for every shrinker call, and may only reclaim a single dentry at a time from a given superblock. 4. The inode cache has a global LRU, so it has different reclaim patterns to the dentry cache, despite the fact that the dentry cache is generally the only thing that pins inodes in memory. 5. Filesystems need to register their own shrinkers for caches and can't co-ordinate them with the dentry and inode cache shrinkers. The series starts by converting the inode cache to per-superblock LRUs and changes the shrinker to match the dentry cache (#4). It then adds a context to the shrinker callouts by passing the shrinker structure with the callout. With this, a shrinker structure is added to the superblock structure and a per-superblock shrinker is registered. Both the inode and dentry caches are modified to shrunk via the superblock shrinker, and this directly encodes the dcache/icache dependency inside the shrinker (#1). This shrinker structure also avoids the need to pin the superblock inside the shrinker because the shrinker is unregistered before the superblock is freed (#2). Further, it pushes the proportioning of reclaim between superblocks back up into the shrinker and batches all the reclaim from a superblock into a tight call loop until the shrink cycle for that superblock is complete. This effectively converts reclaim to a depth-based reclaim mechanism which has a smaller CPU cache footprint than the current mechanism (#3). Then a pair of superblock operations that can be used to implement filesystem specific cache reclaim is added. This is split into two operations we don't need to overload the number of objects to scan to indicate that a count should be returned. Finally, the XFS inode cache shrinker is converted to use these superblock operations, removing the need to register a shrinker, keep a global list of XFS filesystems and locking to access the per-filesystem caches. This fixes several new lockdep warnings the XFS shrinker introduces because of the different contexts the shrinker is called in, and allows for correct proportioning of reclaim between the dentry, inode and XFS inode caches on the filesystem to be executed (#5). Version 2: - rebase on new superblock iterator code in 2.6.35 - move sb shrinker registration to sget() and unregister to deactivate_super() to avoid unregister_shrinker() being called inside a spinlock. From SRS0+91Ea+84+fromorbit.com=dave@internode.on.net Tue May 25 03:51:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P8p8VZ237155 for ; Tue, 25 May 2010 03:51:08 -0500 X-ASG-Debug-ID: 1274777608-308903ce0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 426E836CBEF for ; Tue, 25 May 2010 01:53:29 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id KSBz1VEXQYo6T6oA for ; Tue, 25 May 2010 01:53:29 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25467604-1927428 for multiple; Tue, 25 May 2010 18:23:27 +0930 (CST) Received: from [192.168.1.9] (helo=disturbed) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OGpt8-0007GK-EP; Tue, 25 May 2010 18:53:26 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OGpsq-0005bD-7h; Tue, 25 May 2010 18:53:08 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/5] inode: Make unused inode LRU per superblock Subject: [PATCH 1/5] inode: Make unused inode LRU per superblock Date: Tue, 25 May 2010 18:53:04 +1000 Message-Id: <1274777588-21494-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274777588-21494-1-git-send-email-david@fromorbit.com> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1274777610 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.2, rules version 3.2.2.30731 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The inode unused list is currently a global LRU. This does not match the other global filesystem cache - the dentry cache - which uses per-superblock LRU lists. Hence we have related filesystem object types using different LRU reclaimatin schemes. To enable a per-superblock filesystem cache shrinker, both of these caches need to have per-sb unused object LRU lists. Hence this patch converts the global inode LRU to per-sb LRUs. The patch only does rudimentary per-sb propotioning in the shrinker infrastructure, as this gets removed when the per-sb shrinker callouts are introduced later on. Signed-off-by: Dave Chinner --- fs/fs-writeback.c | 2 +- fs/inode.c | 87 +++++++++++++++++++++++++++++++++++++++----- fs/super.c | 1 + include/linux/fs.h | 4 ++ include/linux/writeback.h | 1 - 5 files changed, 83 insertions(+), 12 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 5c4161f..b1e76ef 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -565,7 +565,7 @@ select_queue: /* * The inode is clean, unused */ - list_move(&inode->i_list, &inode_unused); + list_move(&inode->i_list, &inode->i_sb->s_inode_lru); } } inode_sync_complete(inode); diff --git a/fs/inode.c b/fs/inode.c index 2bee20a..3caa758 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -25,6 +25,7 @@ #include #include #include +#include "internal.h" /* * This is needed for the following functions: @@ -74,7 +75,6 @@ static unsigned int i_hash_shift __read_mostly; */ LIST_HEAD(inode_in_use); -LIST_HEAD(inode_unused); static struct hlist_head *inode_hashtable __read_mostly; /* @@ -292,6 +292,7 @@ void __iget(struct inode *inode) if (!(inode->i_state & (I_DIRTY|I_SYNC))) list_move(&inode->i_list, &inode_in_use); inodes_stat.nr_unused--; + inode->i_sb->s_nr_inodes_unused--; } /** @@ -386,6 +387,7 @@ static int invalidate_list(struct list_head *head, struct list_head *dispose) invalidate_inode_buffers(inode); if (!atomic_read(&inode->i_count)) { list_move(&inode->i_list, dispose); + inode->i_sb->s_nr_inodes_unused--; WARN_ON(inode->i_state & I_NEW); inode->i_state |= I_FREEING; count++; @@ -444,32 +446,31 @@ static int can_unuse(struct inode *inode) * * Any inodes which are pinned purely because of attached pagecache have their * pagecache removed. We expect the final iput() on that inode to add it to - * the front of the inode_unused list. So look for it there and if the + * the front of the sb->s_inode_lru list. So look for it there and if the * inode is still freeable, proceed. The right inode is found 99.9% of the * time in testing on a 4-way. * * If the inode has metadata buffers attached to mapping->private_list then * try to remove them. */ -static void prune_icache(int nr_to_scan) +static void shrink_icache_sb(struct super_block *sb, int *nr_to_scan) { LIST_HEAD(freeable); int nr_pruned = 0; int nr_scanned; unsigned long reap = 0; - down_read(&iprune_sem); spin_lock(&inode_lock); - for (nr_scanned = 0; nr_scanned < nr_to_scan; nr_scanned++) { + for (nr_scanned = *nr_to_scan; nr_scanned >= 0; nr_scanned--) { struct inode *inode; - if (list_empty(&inode_unused)) + if (list_empty(&sb->s_inode_lru)) break; - inode = list_entry(inode_unused.prev, struct inode, i_list); + inode = list_entry(sb->s_inode_lru.prev, struct inode, i_list); if (inode->i_state || atomic_read(&inode->i_count)) { - list_move(&inode->i_list, &inode_unused); + list_move(&inode->i_list, &sb->s_inode_lru); continue; } if (inode_has_buffers(inode) || inode->i_data.nrpages) { @@ -481,7 +482,7 @@ static void prune_icache(int nr_to_scan) iput(inode); spin_lock(&inode_lock); - if (inode != list_entry(inode_unused.next, + if (inode != list_entry(sb->s_inode_lru.next, struct inode, i_list)) continue; /* wrong inode or list_empty */ if (!can_unuse(inode)) @@ -493,13 +494,77 @@ static void prune_icache(int nr_to_scan) nr_pruned++; } inodes_stat.nr_unused -= nr_pruned; + sb->s_nr_inodes_unused -= nr_pruned; if (current_is_kswapd()) __count_vm_events(KSWAPD_INODESTEAL, reap); else __count_vm_events(PGINODESTEAL, reap); spin_unlock(&inode_lock); + *nr_to_scan = nr_scanned; dispose_list(&freeable); +} + +static void prune_icache(int count) +{ + struct super_block *sb, *n; + int w_count; + int unused = inodes_stat.nr_unused; + int prune_ratio; + int pruned; + + if (unused == 0 || count == 0) + return; + down_read(&iprune_sem); + if (count >= unused) + prune_ratio = 1; + else + prune_ratio = unused / count; + spin_lock(&sb_lock); + list_for_each_entry_safe(sb, n, &super_blocks, s_list) { + if (list_empty(&sb->s_instances)) + continue; + if (sb->s_nr_inodes_unused == 0) + continue; + sb->s_count++; + /* Now, we reclaim unused dentrins with fairness. + * We reclaim them same percentage from each superblock. + * We calculate number of dentries to scan on this sb + * as follows, but the implementation is arranged to avoid + * overflows: + * number of dentries to scan on this sb = + * count * (number of dentries on this sb / + * number of dentries in the machine) + */ + spin_unlock(&sb_lock); + if (prune_ratio != 1) + w_count = (sb->s_nr_inodes_unused / prune_ratio) + 1; + else + w_count = sb->s_nr_inodes_unused; + pruned = w_count; + /* + * We need to be sure this filesystem isn't being unmounted, + * otherwise we could race with generic_shutdown_super(), and + * end up holding a reference to an inode while the filesystem + * is unmounted. So we try to get s_umount, and make sure + * s_root isn't NULL. + */ + if (down_read_trylock(&sb->s_umount)) { + if ((sb->s_root != NULL) && + (!list_empty(&sb->s_inode_lru))) { + shrink_icache_sb(sb, &w_count); + pruned -= w_count; + } + up_read(&sb->s_umount); + } + spin_lock(&sb_lock); + count -= pruned; + __put_super(sb); + /* more work left to do? */ + if (count <= 0) + break; + } + spin_unlock(&sb_lock); up_read(&iprune_sem); } @@ -1238,8 +1303,9 @@ int generic_detach_inode(struct inode *inode) if (!hlist_unhashed(&inode->i_hash)) { if (!(inode->i_state & (I_DIRTY|I_SYNC))) - list_move(&inode->i_list, &inode_unused); + list_move(&inode->i_list, &sb->s_inode_lru); inodes_stat.nr_unused++; + sb->s_nr_inodes_unused++; if (sb->s_flags & MS_ACTIVE) { spin_unlock(&inode_lock); return 0; @@ -1252,6 +1318,7 @@ int generic_detach_inode(struct inode *inode) WARN_ON(inode->i_state & I_NEW); inode->i_state &= ~I_WILL_FREE; inodes_stat.nr_unused--; + sb->s_nr_inodes_unused--; hlist_del_init(&inode->i_hash); } list_del_init(&inode->i_list); diff --git a/fs/super.c b/fs/super.c index 69688b1..c554c53 100644 --- a/fs/super.c +++ b/fs/super.c @@ -60,6 +60,7 @@ static struct super_block *alloc_super(struct file_system_type *type) INIT_HLIST_HEAD(&s->s_anon); INIT_LIST_HEAD(&s->s_inodes); INIT_LIST_HEAD(&s->s_dentry_lru); + INIT_LIST_HEAD(&s->s_inode_lru); init_rwsem(&s->s_umount); mutex_init(&s->s_lock); lockdep_set_class(&s->s_umount, &type->s_umount_key); diff --git a/include/linux/fs.h b/include/linux/fs.h index b336cb9..7b90c43 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1346,6 +1346,10 @@ struct super_block { struct list_head s_dentry_lru; /* unused dentry lru */ int s_nr_dentry_unused; /* # of dentry on lru */ + /* s_inode_lru and s_nr_inodes_unused are protected by inode_lock */ + struct list_head s_inode_lru; /* unused inode lru */ + int s_nr_inodes_unused; /* # of inodes on lru */ + struct block_device *s_bdev; struct backing_dev_info *s_bdi; struct mtd_info *s_mtd; diff --git a/include/linux/writeback.h b/include/linux/writeback.h index cc97d6c..a74837e 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -11,7 +11,6 @@ struct backing_dev_info; extern spinlock_t inode_lock; extern struct list_head inode_in_use; -extern struct list_head inode_unused; /* * fs/fs-writeback.c -- 1.5.6.5 From SRS0+91Ea+84+fromorbit.com=dave@internode.on.net Tue May 25 03:51:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P8pA9K237173 for ; Tue, 25 May 2010 03:51:10 -0500 X-ASG-Debug-ID: 1274777609-37b303480002-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7D96636CBF5 for ; Tue, 25 May 2010 01:53:31 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id LbvlsU2hnKtoHMDX for ; Tue, 25 May 2010 01:53:31 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13892361-1927428 for multiple; Tue, 25 May 2010 18:23:28 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OGpt8-0007GX-OP; Tue, 25 May 2010 18:53:26 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OGpt0-0005bS-FR; Tue, 25 May 2010 18:53:18 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 5/5] xfs: make use of new shrinker callout Subject: [PATCH 5/5] xfs: make use of new shrinker callout Date: Tue, 25 May 2010 18:53:08 +1000 Message-Id: <1274777588-21494-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274777588-21494-1-git-send-email-david@fromorbit.com> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1274777612 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.2, rules version 3.2.2.30731 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Convert the inode reclaim shrinker to use the new per-sb shrinker operations. This fixes a bunch of lockdep warnings about the xfs_mount_list_lock being taken in different reclaim contexts by removing it, and allows the reclaim to be proportioned across filesystems with no extra code. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 23 ++++++-- fs/xfs/linux-2.6/xfs_sync.c | 124 +++++++++++----------------------------- fs/xfs/linux-2.6/xfs_sync.h | 16 +++-- fs/xfs/quota/xfs_qm_syscalls.c | 2 +- fs/xfs/xfs_mount.h | 1 - 5 files changed, 61 insertions(+), 105 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index f24dbe5..b59886a 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1212,7 +1212,6 @@ xfs_fs_put_super( xfs_unmountfs(mp); xfs_freesb(mp); - xfs_inode_shrinker_unregister(mp); xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); xfs_dmops_put(mp); @@ -1626,8 +1625,6 @@ xfs_fs_fill_super( if (error) goto fail_vnrele; - xfs_inode_shrinker_register(mp); - kfree(mtpt); return 0; @@ -1681,6 +1678,22 @@ xfs_fs_get_sb( mnt); } +static int +xfs_fs_nr_cached_objects( + struct super_block *sb) +{ + return xfs_reclaim_inodes_count(XFS_M(sb)); +} + +static int +xfs_fs_free_cached_objects( + struct super_block *sb, + int nr_to_scan) +{ + xfs_reclaim_inodes_nr(XFS_M(sb), 0, nr_to_scan); + return 0; +} + static const struct super_operations xfs_super_operations = { .alloc_inode = xfs_fs_alloc_inode, .destroy_inode = xfs_fs_destroy_inode, @@ -1694,6 +1707,8 @@ static const struct super_operations xfs_super_operations = { .statfs = xfs_fs_statfs, .remount_fs = xfs_fs_remount, .show_options = xfs_fs_show_options, + .nr_cached_objects = xfs_fs_nr_cached_objects, + .free_cached_objects = xfs_fs_free_cached_objects, }; static struct file_system_type xfs_fs_type = { @@ -1873,7 +1888,6 @@ init_xfs_fs(void) goto out_cleanup_procfs; vfs_initquota(); - xfs_inode_shrinker_init(); error = register_filesystem(&xfs_fs_type); if (error) @@ -1901,7 +1915,6 @@ exit_xfs_fs(void) { vfs_exitquota(); unregister_filesystem(&xfs_fs_type); - xfs_inode_shrinker_destroy(); xfs_sysctl_unregister(); xfs_cleanup_procfs(); xfs_buf_terminate(); diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index c881a0c..6d74a0d 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -137,7 +137,7 @@ restart: } while ((*nr_to_scan)--); - if (skipped) { + if (skipped && *nr_to_scan > 0) { delay(1); goto restart; } @@ -152,14 +152,14 @@ xfs_inode_ag_iterator( int flags, int tag, int exclusive, - int *nr_to_scan) + int nr_to_scan) { int error = 0; int last_error = 0; xfs_agnumber_t ag; - int nr; - nr = nr_to_scan ? *nr_to_scan : INT_MAX; + if (nr_to_scan <= 0) + nr_to_scan = INT_MAX; for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { struct xfs_perag *pag; @@ -169,18 +169,16 @@ xfs_inode_ag_iterator( continue; } error = xfs_inode_ag_walk(mp, pag, execute, flags, tag, - exclusive, &nr); + exclusive, &nr_to_scan); xfs_perag_put(pag); if (error) { last_error = error; if (error == EFSCORRUPTED) break; } - if (nr <= 0) + if (nr_to_scan <= 0) break; } - if (nr_to_scan) - *nr_to_scan = nr; return XFS_ERROR(last_error); } @@ -299,7 +297,7 @@ xfs_sync_data( ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, - XFS_ICI_NO_TAG, 0, NULL); + XFS_ICI_NO_TAG, 0, 0); if (error) return XFS_ERROR(error); @@ -318,7 +316,7 @@ xfs_sync_attr( ASSERT((flags & ~SYNC_WAIT) == 0); return xfs_inode_ag_iterator(mp, xfs_sync_inode_attr, flags, - XFS_ICI_NO_TAG, 0, NULL); + XFS_ICI_NO_TAG, 0, 0); } STATIC int @@ -821,100 +819,44 @@ reclaim: } +/* + * Scan a certain number of inodes for reclaim. nr_to_scan <= 0 means reclaim + * every inode that has the reclaim tag set. + */ int -xfs_reclaim_inodes( +xfs_reclaim_inodes_nr( xfs_mount_t *mp, - int mode) + int mode, + int nr_to_scan) { return xfs_inode_ag_iterator(mp, xfs_reclaim_inode, mode, - XFS_ICI_RECLAIM_TAG, 1, NULL); + XFS_ICI_RECLAIM_TAG, 1, nr_to_scan); } /* - * Shrinker infrastructure. + * Return the number of reclaimable inodes in the filesystem for + * the shrinker to determine how much to reclaim. * - * This is all far more complex than it needs to be. It adds a global list of - * mounts because the shrinkers can only call a global context. We need to make - * the shrinkers pass a context to avoid the need for global state. + * Because the inode cache may not have any reclaimable inodes in it, but will + * be populated as part of the higher level cleaning, we need to count all + * those inodes as reclaimable here as well. */ -static LIST_HEAD(xfs_mount_list); -static struct rw_semaphore xfs_mount_list_lock; - -static int -xfs_reclaim_inode_shrink( - struct shrinker *shrink, - int nr_to_scan, - gfp_t gfp_mask) +int +xfs_reclaim_inodes_count( + xfs_mount_t *mp) { - struct xfs_mount *mp; - struct xfs_perag *pag; - xfs_agnumber_t ag; - int reclaimable = 0; - - if (nr_to_scan) { - if (!(gfp_mask & __GFP_FS)) - return -1; - - down_read(&xfs_mount_list_lock); - list_for_each_entry(mp, &xfs_mount_list, m_mplist) { - xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0, - XFS_ICI_RECLAIM_TAG, 1, &nr_to_scan); - if (nr_to_scan <= 0) - break; - } - up_read(&xfs_mount_list_lock); - } - - down_read(&xfs_mount_list_lock); - list_for_each_entry(mp, &xfs_mount_list, m_mplist) { - for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { + xfs_agnumber_t ag; + int reclaimable = 0; - pag = xfs_perag_get(mp, ag); - if (!pag->pag_ici_init) { - xfs_perag_put(pag); - continue; - } - reclaimable += pag->pag_ici_reclaimable; + for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { + struct xfs_perag *pag = xfs_perag_get(mp, ag); + if (!pag->pag_ici_init) { xfs_perag_put(pag); + continue; } + reclaimable += pag->pag_ici_reclaimable; + xfs_perag_put(pag); } - up_read(&xfs_mount_list_lock); - return reclaimable; -} - -static struct shrinker xfs_inode_shrinker = { - .shrink = xfs_reclaim_inode_shrink, - .seeks = DEFAULT_SEEKS, -}; - -void __init -xfs_inode_shrinker_init(void) -{ - init_rwsem(&xfs_mount_list_lock); - register_shrinker(&xfs_inode_shrinker); -} - -void -xfs_inode_shrinker_destroy(void) -{ - ASSERT(list_empty(&xfs_mount_list)); - unregister_shrinker(&xfs_inode_shrinker); -} - -void -xfs_inode_shrinker_register( - struct xfs_mount *mp) -{ - down_write(&xfs_mount_list_lock); - list_add_tail(&mp->m_mplist, &xfs_mount_list); - up_write(&xfs_mount_list_lock); + return reclaimable + mp->m_super->s_nr_inodes_unused; } -void -xfs_inode_shrinker_unregister( - struct xfs_mount *mp) -{ - down_write(&xfs_mount_list_lock); - list_del(&mp->m_mplist); - up_write(&xfs_mount_list_lock); -} diff --git a/fs/xfs/linux-2.6/xfs_sync.h b/fs/xfs/linux-2.6/xfs_sync.h index cdcbaac..c55f645 100644 --- a/fs/xfs/linux-2.6/xfs_sync.h +++ b/fs/xfs/linux-2.6/xfs_sync.h @@ -43,7 +43,14 @@ void xfs_quiesce_attr(struct xfs_mount *mp); void xfs_flush_inodes(struct xfs_inode *ip); -int xfs_reclaim_inodes(struct xfs_mount *mp, int mode); +int xfs_reclaim_inodes_count(struct xfs_mount *mp); +int xfs_reclaim_inodes_nr(struct xfs_mount *mp, int mode, int nr_to_scan); + +static inline int +xfs_reclaim_inodes(struct xfs_mount *mp, int mode) +{ + return xfs_reclaim_inodes_nr(mp, mode, 0); +} void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); void __xfs_inode_set_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip); @@ -53,11 +60,6 @@ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, int xfs_sync_inode_valid(struct xfs_inode *ip, struct xfs_perag *pag); int xfs_inode_ag_iterator(struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), - int flags, int tag, int write_lock, int *nr_to_scan); - -void xfs_inode_shrinker_init(void); -void xfs_inode_shrinker_destroy(void); -void xfs_inode_shrinker_register(struct xfs_mount *mp); -void xfs_inode_shrinker_unregister(struct xfs_mount *mp); + int flags, int tag, int write_lock, int nr_to_scan); #endif diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 92b002f..f5b0e4e 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -894,7 +894,7 @@ xfs_qm_dqrele_all_inodes( { ASSERT(mp->m_quotainfo); xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, - XFS_ICI_NO_TAG, 0, NULL); + XFS_ICI_NO_TAG, 0, 0); } /*------------------------------------------------------------------------*/ diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 9ff48a1..4fa0bc7 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -259,7 +259,6 @@ typedef struct xfs_mount { wait_queue_head_t m_wait_single_sync_task; __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ - struct list_head m_mplist; /* inode shrinker mount list */ } xfs_mount_t; /* -- 1.5.6.5 From SRS0+91Ea+84+fromorbit.com=dave@internode.on.net Tue May 25 03:51:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P8pIpK237206 for ; Tue, 25 May 2010 03:51:18 -0500 X-ASG-Debug-ID: 1274777619-78df02910000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8CB251DFA471 for ; Tue, 25 May 2010 01:53:39 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id 2SskzJMHoiUkahUG for ; Tue, 25 May 2010 01:53:39 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25768427-1927428 for multiple; Tue, 25 May 2010 18:23:38 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OGptI-0007GW-Lh; Tue, 25 May 2010 18:53:36 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OGpt0-0005bJ-DO; Tue, 25 May 2010 18:53:18 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/5] superblock: add filesystem shrinker operations Subject: [PATCH 4/5] superblock: add filesystem shrinker operations Date: Tue, 25 May 2010 18:53:07 +1000 Message-Id: <1274777588-21494-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274777588-21494-1-git-send-email-david@fromorbit.com> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1274777620 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.2, rules version 3.2.2.30731 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Now we have a per-superblock shrinker implementation, we can add a filesystem specific callout to it to allow filesystem internal caches to be shrunk by the superblock shrinker. Rather than perpetuate the multipurpose shrinker callback API (i.e. nr_to_scan == 0 meaning "tell me how many objects freeable in the cache), two operations will be added. The first will return the number of objects that are freeable, the second is the actual shrinker call. Signed-off-by: Dave Chinner --- fs/super.c | 43 +++++++++++++++++++++++++++++++------------ include/linux/fs.h | 11 +++++++++++ 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/fs/super.c b/fs/super.c index 07e22e3..9410218 100644 --- a/fs/super.c +++ b/fs/super.c @@ -40,7 +40,8 @@ DEFINE_SPINLOCK(sb_lock); static int prune_super(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) { struct super_block *sb; - int count; + int fs_objects = 0; + int total_objects; sb = container_of(shrink, struct super_block, s_shrink); @@ -63,22 +64,40 @@ static int prune_super(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) return -1; } - if (nr_to_scan) { - /* proportion the scan between the two cacheŃ• */ - int total; - - total = sb->s_nr_dentry_unused + sb->s_nr_inodes_unused + 1; - count = (nr_to_scan * sb->s_nr_dentry_unused) / total; + if (sb->s_op && sb->s_op->nr_cached_objects) + fs_objects = sb->s_op->nr_cached_objects(sb); - /* prune dcache first as icache is pinned by it */ - prune_dcache_sb(sb, count); - prune_icache_sb(sb, nr_to_scan - count); + total_objects = sb->s_nr_dentry_unused + + sb->s_nr_inodes_unused + fs_objects + 1; + if (nr_to_scan) { + int dentries; + int inodes; + + /* proportion the scan between the cacheŃ• */ + dentries = (nr_to_scan * sb->s_nr_dentry_unused) / + total_objects; + inodes = (nr_to_scan * sb->s_nr_inodes_unused) / + total_objects; + if (fs_objects) + fs_objects = (nr_to_scan * fs_objects) / + total_objects; + /* + * prune the dcache first as the icache is pinned by it, then + * prune the icache, followed by the filesystem specific caches + */ + prune_dcache_sb(sb, dentries); + prune_icache_sb(sb, inodes); + if (sb->s_op && sb->s_op->free_cached_objects) { + sb->s_op->free_cached_objects(sb, fs_objects); + fs_objects = sb->s_op->nr_cached_objects(sb); + } + total_objects = sb->s_nr_dentry_unused + + sb->s_nr_inodes_unused + fs_objects; } - count = ((sb->s_nr_dentry_unused + sb->s_nr_inodes_unused) / 100) - * sysctl_vfs_cache_pressure; + total_objects = (total_objects / 100) * sysctl_vfs_cache_pressure; up_read(&sb->s_umount); - return count; + return total_objects; } /** diff --git a/include/linux/fs.h b/include/linux/fs.h index 5bff2dc..efcdcc6 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1590,6 +1590,17 @@ struct super_operations { ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); #endif int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); + + /* + * memory shrinker operations. + * ->nr_cached_objects() should return the number of freeable cached + * objects the filesystem holds. + * ->free_cache_objects() should attempt to free the number of cached + * objects indicated. It should return how many objects it attempted to + * free. + */ + int (*nr_cached_objects)(struct super_block *); + int (*free_cached_objects)(struct super_block *, int); }; /* -- 1.5.6.5 From SRS0+91Ea+84+fromorbit.com=dave@internode.on.net Tue May 25 03:51:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P8pJaH237215 for ; Tue, 25 May 2010 03:51:19 -0500 X-ASG-Debug-ID: 1274777618-37b603370000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ACE5436CDB6 for ; Tue, 25 May 2010 01:53:39 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id ViLuWgiewku0SEM7 for ; Tue, 25 May 2010 01:53:39 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13892368-1927428 for ; Tue, 25 May 2010 18:23:38 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OGpsy-0007GM-MV; Tue, 25 May 2010 18:53:16 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OGpsq-0005bH-C5; Tue, 25 May 2010 18:53:08 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Date: Tue, 25 May 2010 18:53:06 +1000 Message-Id: <1274777588-21494-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274777588-21494-1-git-send-email-david@fromorbit.com> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1274777620 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.2, rules version 3.2.2.30731 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner With context based shrinkers, we can implement a per-superblock shrinker that shrinks the caches attached to the superblock. We currently have global shrinkers for the inode and dentry caches that split up into per-superblock operations via a coarse proportioning method that does not batch very well. The global shrinkers also have a dependency - dentries pin inodes - so we have to be very careful about how we register the global shrinkers so that the implicit call order is always correct. With a per-sb shrinker callout, we can encode this dependency directly into the per-sb shrinker, hence avoiding the need for strictly ordering shrinker registrations. We also have no need for any proportioning code for the shrinker subsystem already provides this functionality across all shrinkers. Allowing the shrinker to operate on a single superblock at a time means that we do less superblock list traversals and locking and reclaim should batch more effectively. This should result in less CPU overhead for reclaim and potentially faster reclaim of items from each filesystem. Signed-off-by: Dave Chinner --- fs/dcache.c | 133 ++++++++-------------------------------------------- fs/inode.c | 109 +++--------------------------------------- fs/super.c | 53 +++++++++++++++++++++ include/linux/fs.h | 7 +++ 4 files changed, 88 insertions(+), 214 deletions(-) diff --git a/fs/dcache.c b/fs/dcache.c index dba6b6d..d7bd781 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -456,21 +456,16 @@ static void prune_one_dentry(struct dentry * dentry) * which flags are set. This means we don't need to maintain multiple * similar copies of this loop. */ -static void __shrink_dcache_sb(struct super_block *sb, int *count, int flags) +static void __shrink_dcache_sb(struct super_block *sb, int count, int flags) { LIST_HEAD(referenced); LIST_HEAD(tmp); struct dentry *dentry; - int cnt = 0; BUG_ON(!sb); - BUG_ON((flags & DCACHE_REFERENCED) && count == NULL); + BUG_ON((flags & DCACHE_REFERENCED) && count == -1); spin_lock(&dcache_lock); - if (count != NULL) - /* called from prune_dcache() and shrink_dcache_parent() */ - cnt = *count; -restart: - if (count == NULL) + if (count == -1) list_splice_init(&sb->s_dentry_lru, &tmp); else { while (!list_empty(&sb->s_dentry_lru)) { @@ -492,13 +487,13 @@ restart: } else { list_move_tail(&dentry->d_lru, &tmp); spin_unlock(&dentry->d_lock); - cnt--; - if (!cnt) + if (--count == 0) break; } cond_resched_lock(&dcache_lock); } } +prune_more: while (!list_empty(&tmp)) { dentry = list_entry(tmp.prev, struct dentry, d_lru); dentry_lru_del_init(dentry); @@ -516,88 +511,29 @@ restart: /* dentry->d_lock was dropped in prune_one_dentry() */ cond_resched_lock(&dcache_lock); } - if (count == NULL && !list_empty(&sb->s_dentry_lru)) - goto restart; - if (count != NULL) - *count = cnt; + if (count == -1 && !list_empty(&sb->s_dentry_lru)) { + list_splice_init(&sb->s_dentry_lru, &tmp); + goto prune_more; + } if (!list_empty(&referenced)) list_splice(&referenced, &sb->s_dentry_lru); spin_unlock(&dcache_lock); } /** - * prune_dcache - shrink the dcache - * @count: number of entries to try to free + * prune_dcache_sb - shrink the dcache + * @nr_to_scan: number of entries to try to free * - * Shrink the dcache. This is done when we need more memory, or simply when we - * need to unmount something (at which point we need to unuse all dentries). + * Attempt to shrink the superblock dcache LRU by @nr_to_scan entries. This is + * done when we need more memory an called from the superblock shrinker + * function. * - * This function may fail to free any resources if all the dentries are in use. + * This function may fail to free any resources if all the dentries are in + * use. */ -static void prune_dcache(int count) +void prune_dcache_sb(struct super_block *sb, int nr_to_scan) { - struct super_block *sb, *n; - int w_count; - int unused = dentry_stat.nr_unused; - int prune_ratio; - int pruned; - - if (unused == 0 || count == 0) - return; - spin_lock(&dcache_lock); - if (count >= unused) - prune_ratio = 1; - else - prune_ratio = unused / count; - spin_lock(&sb_lock); - list_for_each_entry_safe(sb, n, &super_blocks, s_list) { - if (list_empty(&sb->s_instances)) - continue; - if (sb->s_nr_dentry_unused == 0) - continue; - sb->s_count++; - /* Now, we reclaim unused dentrins with fairness. - * We reclaim them same percentage from each superblock. - * We calculate number of dentries to scan on this sb - * as follows, but the implementation is arranged to avoid - * overflows: - * number of dentries to scan on this sb = - * count * (number of dentries on this sb / - * number of dentries in the machine) - */ - spin_unlock(&sb_lock); - if (prune_ratio != 1) - w_count = (sb->s_nr_dentry_unused / prune_ratio) + 1; - else - w_count = sb->s_nr_dentry_unused; - pruned = w_count; - /* - * We need to be sure this filesystem isn't being unmounted, - * otherwise we could race with generic_shutdown_super(), and - * end up holding a reference to an inode while the filesystem - * is unmounted. So we try to get s_umount, and make sure - * s_root isn't NULL. - */ - if (down_read_trylock(&sb->s_umount)) { - if ((sb->s_root != NULL) && - (!list_empty(&sb->s_dentry_lru))) { - spin_unlock(&dcache_lock); - __shrink_dcache_sb(sb, &w_count, - DCACHE_REFERENCED); - pruned -= w_count; - spin_lock(&dcache_lock); - } - up_read(&sb->s_umount); - } - spin_lock(&sb_lock); - count -= pruned; - __put_super(sb); - /* more work left to do? */ - if (count <= 0) - break; - } - spin_unlock(&sb_lock); - spin_unlock(&dcache_lock); + __shrink_dcache_sb(sb, nr_to_scan, DCACHE_REFERENCED); } /** @@ -610,7 +546,7 @@ static void prune_dcache(int count) */ void shrink_dcache_sb(struct super_block * sb) { - __shrink_dcache_sb(sb, NULL, 0); + __shrink_dcache_sb(sb, -1, 0); } EXPORT_SYMBOL(shrink_dcache_sb); @@ -878,37 +814,10 @@ void shrink_dcache_parent(struct dentry * parent) int found; while ((found = select_parent(parent)) != 0) - __shrink_dcache_sb(sb, &found, 0); + __shrink_dcache_sb(sb, found, 0); } EXPORT_SYMBOL(shrink_dcache_parent); -/* - * Scan `nr' dentries and return the number which remain. - * - * We need to avoid reentering the filesystem if the caller is performing a - * GFP_NOFS allocation attempt. One example deadlock is: - * - * ext2_new_block->getblk->GFP->shrink_dcache_memory->prune_dcache-> - * prune_one_dentry->dput->dentry_iput->iput->inode->i_sb->s_op->put_inode-> - * ext2_discard_prealloc->ext2_free_blocks->lock_super->DEADLOCK. - * - * In this case we return -1 to tell the caller that we baled. - */ -static int shrink_dcache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) -{ - if (nr) { - if (!(gfp_mask & __GFP_FS)) - return -1; - prune_dcache(nr); - } - return (dentry_stat.nr_unused / 100) * sysctl_vfs_cache_pressure; -} - -static struct shrinker dcache_shrinker = { - .shrink = shrink_dcache_memory, - .seeks = DEFAULT_SEEKS, -}; - /** * d_alloc - allocate a dcache entry * @parent: parent of entry to allocate @@ -2316,8 +2225,6 @@ static void __init dcache_init(void) */ dentry_cache = KMEM_CACHE(dentry, SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD); - - register_shrinker(&dcache_shrinker); /* Hash may have been set up in dcache_init_early */ if (!hashdist) diff --git a/fs/inode.c b/fs/inode.c index 1e44ec5..5fb4a39 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -25,7 +25,6 @@ #include #include #include -#include "internal.h" /* * This is needed for the following functions: @@ -441,8 +440,10 @@ static int can_unuse(struct inode *inode) } /* - * Scan `goal' inodes on the unused list for freeable ones. They are moved to - * a temporary list and then are freed outside inode_lock by dispose_list(). + * Walk the superblock inode LRU for freeable inodes and attempt to free them. + * This is called from the superblock shrinker function with a number of inodes + * to trim from the LRU. Inodes to be freed are moved to a temporary list and + * then are freed outside inode_lock by dispose_list(). * * Any inodes which are pinned purely because of attached pagecache have their * pagecache removed. We expect the final iput() on that inode to add it to @@ -450,10 +451,10 @@ static int can_unuse(struct inode *inode) * inode is still freeable, proceed. The right inode is found 99.9% of the * time in testing on a 4-way. * - * If the inode has metadata buffers attached to mapping->private_list then - * try to remove them. + * If the inode has metadata buffers attached to mapping->private_list then try + * to remove them. */ -static void shrink_icache_sb(struct super_block *sb, int *nr_to_scan) +void prune_icache_sb(struct super_block *sb, int nr_to_scan) { LIST_HEAD(freeable); int nr_pruned = 0; @@ -461,7 +462,7 @@ static void shrink_icache_sb(struct super_block *sb, int *nr_to_scan) unsigned long reap = 0; spin_lock(&inode_lock); - for (nr_scanned = *nr_to_scan; nr_scanned >= 0; nr_scanned--) { + for (nr_scanned = nr_to_scan; nr_scanned >= 0; nr_scanned--) { struct inode *inode; if (list_empty(&sb->s_inode_lru)) @@ -500,103 +501,10 @@ static void shrink_icache_sb(struct super_block *sb, int *nr_to_scan) else __count_vm_events(PGINODESTEAL, reap); spin_unlock(&inode_lock); - *nr_to_scan = nr_scanned; dispose_list(&freeable); } -static void prune_icache(int count) -{ - struct super_block *sb, *n; - int w_count; - int unused = inodes_stat.nr_unused; - int prune_ratio; - int pruned; - - if (unused == 0 || count == 0) - return; - down_read(&iprune_sem); - if (count >= unused) - prune_ratio = 1; - else - prune_ratio = unused / count; - spin_lock(&sb_lock); - list_for_each_entry_safe(sb, n, &super_blocks, s_list) { - if (list_empty(&sb->s_instances)) - continue; - if (sb->s_nr_inodes_unused == 0) - continue; - sb->s_count++; - /* Now, we reclaim unused dentrins with fairness. - * We reclaim them same percentage from each superblock. - * We calculate number of dentries to scan on this sb - * as follows, but the implementation is arranged to avoid - * overflows: - * number of dentries to scan on this sb = - * count * (number of dentries on this sb / - * number of dentries in the machine) - */ - spin_unlock(&sb_lock); - if (prune_ratio != 1) - w_count = (sb->s_nr_inodes_unused / prune_ratio) + 1; - else - w_count = sb->s_nr_inodes_unused; - pruned = w_count; - /* - * We need to be sure this filesystem isn't being unmounted, - * otherwise we could race with generic_shutdown_super(), and - * end up holding a reference to an inode while the filesystem - * is unmounted. So we try to get s_umount, and make sure - * s_root isn't NULL. - */ - if (down_read_trylock(&sb->s_umount)) { - if ((sb->s_root != NULL) && - (!list_empty(&sb->s_inode_lru))) { - shrink_icache_sb(sb, &w_count); - pruned -= w_count; - } - up_read(&sb->s_umount); - } - spin_lock(&sb_lock); - count -= pruned; - __put_super(sb); - /* more work left to do? */ - if (count <= 0) - break; - } - spin_unlock(&sb_lock); - up_read(&iprune_sem); -} - -/* - * shrink_icache_memory() will attempt to reclaim some unused inodes. Here, - * "unused" means that no dentries are referring to the inodes: the files are - * not open and the dcache references to those inodes have already been - * reclaimed. - * - * This function is passed the number of inodes to scan, and it returns the - * total number of remaining possibly-reclaimable inodes. - */ -static int shrink_icache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) -{ - if (nr) { - /* - * Nasty deadlock avoidance. We may hold various FS locks, - * and we don't want to recurse into the FS that called us - * in clear_inode() and friends.. - */ - if (!(gfp_mask & __GFP_FS)) - return -1; - prune_icache(nr); - } - return (inodes_stat.nr_unused / 100) * sysctl_vfs_cache_pressure; -} - -static struct shrinker icache_shrinker = { - .shrink = shrink_icache_memory, - .seeks = DEFAULT_SEEKS, -}; - static void __wait_on_freeing_inode(struct inode *inode); /* * Called with the inode lock held. @@ -1634,7 +1542,6 @@ void __init inode_init(void) (SLAB_RECLAIM_ACCOUNT|SLAB_PANIC| SLAB_MEM_SPREAD), init_once); - register_shrinker(&icache_shrinker); /* Hash may have been set up in inode_init_early */ if (!hashdist) diff --git a/fs/super.c b/fs/super.c index c554c53..07e22e3 100644 --- a/fs/super.c +++ b/fs/super.c @@ -37,6 +37,50 @@ LIST_HEAD(super_blocks); DEFINE_SPINLOCK(sb_lock); +static int prune_super(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) +{ + struct super_block *sb; + int count; + + sb = container_of(shrink, struct super_block, s_shrink); + + /* + * Deadlock avoidance. We may hold various FS locks, and we don't want + * to recurse into the FS that called us in clear_inode() and friends.. + */ + if (!(gfp_mask & __GFP_FS)) + return -1; + + /* + * if we can't get the umount lock, then there's no point having the + * shrinker try again because the sb is being torn down. + */ + if (!down_read_trylock(&sb->s_umount)) + return -1; + + if (!sb->s_root) { + up_read(&sb->s_umount); + return -1; + } + + if (nr_to_scan) { + /* proportion the scan between the two cacheŃ• */ + int total; + + total = sb->s_nr_dentry_unused + sb->s_nr_inodes_unused + 1; + count = (nr_to_scan * sb->s_nr_dentry_unused) / total; + + /* prune dcache first as icache is pinned by it */ + prune_dcache_sb(sb, count); + prune_icache_sb(sb, nr_to_scan - count); + } + + count = ((sb->s_nr_dentry_unused + sb->s_nr_inodes_unused) / 100) + * sysctl_vfs_cache_pressure; + up_read(&sb->s_umount); + return count; +} + /** * alloc_super - create new superblock * @type: filesystem type superblock should belong to @@ -99,6 +143,13 @@ static struct super_block *alloc_super(struct file_system_type *type) s->s_qcop = sb_quotactl_ops; s->s_op = &default_op; s->s_time_gran = 1000000000; + + /* + * The shrinker is set up here but not registered until after + * the superblock has been filled out successfully. + */ + s->s_shrink.shrink = prune_super; + s->s_shrink.seeks = DEFAULT_SEEKS; } out: return s; @@ -162,6 +213,7 @@ void deactivate_locked_super(struct super_block *s) struct file_system_type *fs = s->s_type; if (atomic_dec_and_test(&s->s_active)) { vfs_dq_off(s, 0); + unregister_shrinker(&s->s_shrink); fs->kill_sb(s); put_filesystem(fs); put_super(s); @@ -335,6 +387,7 @@ retry: list_add_tail(&s->s_list, &super_blocks); list_add(&s->s_instances, &type->fs_supers); spin_unlock(&sb_lock); + register_shrinker(&s->s_shrink); get_filesystem(type); return s; } diff --git a/include/linux/fs.h b/include/linux/fs.h index 7b90c43..5bff2dc 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -382,6 +382,7 @@ struct inodes_stat_t { #include #include #include +#include #include #include @@ -1385,8 +1386,14 @@ struct super_block { * generic_show_options() */ char *s_options; + + struct shrinker s_shrink; /* per-sb shrinker handle */ }; +/* superblock cache pruning functions */ +void prune_icache_sb(struct super_block *sb, int nr_to_scan); +void prune_dcache_sb(struct super_block *sb, int nr_to_scan); + extern struct timespec current_fs_time(struct super_block *sb); /* -- 1.5.6.5 From BATV+dc1ae48fd67a4d6e194a+2466+infradead.org+hch@bombadil.srs.infradead.org Tue May 25 04:43:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_22, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P9h2T4239546 for ; Tue, 25 May 2010 04:43:03 -0500 X-ASG-Debug-ID: 1274780724-0bef00ae0000-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 098AE36D1D8 for ; Tue, 25 May 2010 02:45:24 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id CJQ4j1aoAuRHEviW for ; Tue, 25 May 2010 02:45:24 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OGqhQ-00012a-C8 for xfs@oss.sgi.com; Tue, 25 May 2010 09:45:24 +0000 Date: Tue, 25 May 2010 05:45:24 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/2 v2] xfs: drop dmapi hooks Subject: [PATCH 1/2 v2] xfs: drop dmapi hooks Message-ID: <20100525094524.GA1647@infradead.org> References: <20100510140823.GA16540@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100510140823.GA16540@infradead.org> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274780725 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dmapi support was never merged upstream, but we still have a lot of hooks bloating XFS for it, all over the fast pathes of the filesystem. This patch drops over 700 lines of dmapi overhead. If we'll ever get HSM support in mainline at least the namespace events can be done much saner in the VFS instead of the individual filesystem, so it's not like this is much help for future work. Signed-off-by: Christoph Hellwig --- V1 -> V2 - updated to account for the delayed logging branch merge - remove a few more left overs pointed out by Eric Index: xfs/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_file.c 2010-05-22 00:40:37.890004594 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-05-25 11:14:59.236274548 +0200 @@ -24,7 +24,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_trans.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" @@ -275,20 +274,6 @@ xfs_file_aio_read( mutex_lock(&inode->i_mutex); xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { - int dmflags = FILP_DELAY_FLAG(file) | DM_SEM_FLAG_RD(ioflags); - int iolock = XFS_IOLOCK_SHARED; - - ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, ip, iocb->ki_pos, size, - dmflags, &iolock); - if (ret) { - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - if (unlikely(ioflags & IO_ISDIRECT)) - mutex_unlock(&inode->i_mutex); - return ret; - } - } - if (unlikely(ioflags & IO_ISDIRECT)) { if (inode->i_mapping->nrpages) { ret = -xfs_flushinval_pages(ip, @@ -321,7 +306,6 @@ xfs_file_splice_read( unsigned int flags) { struct xfs_inode *ip = XFS_I(infilp->f_mapping->host); - struct xfs_mount *mp = ip->i_mount; int ioflags = 0; ssize_t ret; @@ -335,18 +319,6 @@ xfs_file_splice_read( xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { - int iolock = XFS_IOLOCK_SHARED; - int error; - - error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, *ppos, count, - FILP_DELAY_FLAG(infilp), &iolock); - if (error) { - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - return -error; - } - } - trace_xfs_file_splice_read(ip, count, *ppos, ioflags); ret = generic_file_splice_read(infilp, ppos, pipe, count, flags); @@ -367,7 +339,6 @@ xfs_file_splice_write( { struct inode *inode = outfilp->f_mapping->host; struct xfs_inode *ip = XFS_I(inode); - struct xfs_mount *mp = ip->i_mount; xfs_fsize_t isize, new_size; int ioflags = 0; ssize_t ret; @@ -382,18 +353,6 @@ xfs_file_splice_write( xfs_ilock(ip, XFS_IOLOCK_EXCL); - if (DM_EVENT_ENABLED(ip, DM_EVENT_WRITE) && !(ioflags & IO_INVIS)) { - int iolock = XFS_IOLOCK_EXCL; - int error; - - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, *ppos, count, - FILP_DELAY_FLAG(outfilp), &iolock); - if (error) { - xfs_iunlock(ip, XFS_IOLOCK_EXCL); - return -error; - } - } - new_size = *ppos + count; xfs_ilock(ip, XFS_ILOCK_EXCL); @@ -627,7 +586,6 @@ xfs_file_aio_write( int ioflags = 0; xfs_fsize_t isize, new_size; int iolock; - int eventsent = 0; size_t ocount = 0, count; int need_i_mutex; @@ -673,33 +631,6 @@ start: goto out_unlock_mutex; } - if ((DM_EVENT_ENABLED(ip, DM_EVENT_WRITE) && - !(ioflags & IO_INVIS) && !eventsent)) { - int dmflags = FILP_DELAY_FLAG(file); - - if (need_i_mutex) - dmflags |= DM_FLAGS_IMUX; - - xfs_iunlock(ip, XFS_ILOCK_EXCL); - error = XFS_SEND_DATA(ip->i_mount, DM_EVENT_WRITE, ip, - pos, count, dmflags, &iolock); - if (error) { - goto out_unlock_internal; - } - xfs_ilock(ip, XFS_ILOCK_EXCL); - eventsent = 1; - - /* - * The iolock was dropped and reacquired in XFS_SEND_DATA - * so we have to recheck the size when appending. - * We will only "goto start;" once, since having sent the - * event prevents another call to XFS_SEND_DATA, which is - * what allows the size to change in the first place. - */ - if ((file->f_flags & O_APPEND) && pos != ip->i_size) - goto start; - } - if (ioflags & IO_ISDIRECT) { xfs_buftarg_t *target = XFS_IS_REALTIME_INODE(ip) ? @@ -830,22 +761,6 @@ write_retry: xfs_iunlock(ip, XFS_ILOCK_EXCL); } - if (ret == -ENOSPC && - DM_EVENT_ENABLED(ip, DM_EVENT_NOSPACE) && !(ioflags & IO_INVIS)) { - xfs_iunlock(ip, iolock); - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); - error = XFS_SEND_NAMESP(ip->i_mount, DM_EVENT_NOSPACE, ip, - DM_RIGHT_NULL, ip, DM_RIGHT_NULL, NULL, NULL, - 0, 0, 0); /* Delay flag intentionally unused */ - if (need_i_mutex) - mutex_lock(&inode->i_mutex); - xfs_ilock(ip, iolock); - if (error) - goto out_unlock_internal; - goto start; - } - error = -ret; if (ret <= 0) goto out_unlock_internal; Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-25 11:14:59.237275526 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" @@ -1117,16 +1116,7 @@ xfs_ioctl_setattr( xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); - if (code) - return code; - - if (DM_EVENT_ENABLED(ip, DM_EVENT_ATTRIBUTE)) { - XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL, - NULL, DM_RIGHT_NULL, NULL, NULL, 0, 0, - (mask & FSX_NONBLOCK) ? DM_FLAGS_NDELAY : 0); - } - - return 0; + return code; error_return: xfs_qm_dqrele(udqp); Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2010-05-24 23:11:41.018253918 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-05-25 11:15:23.496005936 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" @@ -116,9 +115,6 @@ mempool_t *xfs_ioend_pool; #define MNTOPT_GQUOTANOENF "gqnoenforce"/* group quota limit enforcement */ #define MNTOPT_PQUOTANOENF "pqnoenforce"/* project quota limit enforcement */ #define MNTOPT_QUOTANOENF "qnoenforce" /* same as uqnoenforce */ -#define MNTOPT_DMAPI "dmapi" /* DMI enabled (DMAPI / XDSM) */ -#define MNTOPT_XDSM "xdsm" /* DMI enabled (DMAPI / XDSM) */ -#define MNTOPT_DMI "dmi" /* DMI enabled (DMAPI / XDSM) */ #define MNTOPT_DELAYLOG "delaylog" /* Delayed loging enabled */ #define MNTOPT_NODELAYLOG "nodelaylog" /* Delayed loging disabled */ @@ -172,15 +168,13 @@ suffix_strtoul(char *s, char **endp, uns STATIC int xfs_parseargs( struct xfs_mount *mp, - char *options, - char **mtpt) + char *options) { struct super_block *sb = mp->m_super; char *this_char, *value, *eov; int dsunit = 0; int dswidth = 0; int iosize = 0; - int dmapi_implies_ikeep = 1; __uint8_t iosizelog = 0; /* @@ -243,15 +237,10 @@ xfs_parseargs( if (!mp->m_logname) return ENOMEM; } else if (!strcmp(this_char, MNTOPT_MTPT)) { - if (!value || !*value) { - cmn_err(CE_WARN, - "XFS: %s option requires an argument", - this_char); - return EINVAL; - } - *mtpt = kstrndup(value, MAXNAMELEN, GFP_KERNEL); - if (!*mtpt) - return ENOMEM; + cmn_err(CE_WARN, + "XFS: %s option not allowed on this system", + this_char); + return EINVAL; } else if (!strcmp(this_char, MNTOPT_RTDEV)) { if (!value || !*value) { cmn_err(CE_WARN, @@ -329,7 +318,6 @@ xfs_parseargs( } else if (!strcmp(this_char, MNTOPT_IKEEP)) { mp->m_flags |= XFS_MOUNT_IKEEP; } else if (!strcmp(this_char, MNTOPT_NOIKEEP)) { - dmapi_implies_ikeep = 0; mp->m_flags &= ~XFS_MOUNT_IKEEP; } else if (!strcmp(this_char, MNTOPT_LARGEIO)) { mp->m_flags &= ~XFS_MOUNT_COMPAT_IOSIZE; @@ -370,12 +358,6 @@ xfs_parseargs( } else if (!strcmp(this_char, MNTOPT_GQUOTANOENF)) { mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE); mp->m_qflags &= ~XFS_OQUOTA_ENFD; - } else if (!strcmp(this_char, MNTOPT_DMAPI)) { - mp->m_flags |= XFS_MOUNT_DMAPI; - } else if (!strcmp(this_char, MNTOPT_XDSM)) { - mp->m_flags |= XFS_MOUNT_DMAPI; - } else if (!strcmp(this_char, MNTOPT_DMI)) { - mp->m_flags |= XFS_MOUNT_DMAPI; } else if (!strcmp(this_char, MNTOPT_DELAYLOG)) { mp->m_flags |= XFS_MOUNT_DELAYLOG; cmn_err(CE_WARN, @@ -430,12 +412,6 @@ xfs_parseargs( return EINVAL; } - if ((mp->m_flags & XFS_MOUNT_DMAPI) && (!*mtpt || *mtpt[0] == '\0')) { - printk("XFS: %s option needs the mount point option as well\n", - MNTOPT_DMAPI); - return EINVAL; - } - if ((dsunit && !dswidth) || (!dsunit && dswidth)) { cmn_err(CE_WARN, "XFS: sunit and swidth must be specified together"); @@ -449,18 +425,6 @@ xfs_parseargs( return EINVAL; } - /* - * Applications using DMI filesystems often expect the - * inode generation number to be monotonically increasing. - * If we delete inode chunks we break this assumption, so - * keep unused inode chunks on disk for DMI filesystems - * until we come up with a better solution. - * Note that if "ikeep" or "noikeep" mount options are - * supplied, then they are honored. - */ - if ((mp->m_flags & XFS_MOUNT_DMAPI) && dmapi_implies_ikeep) - mp->m_flags |= XFS_MOUNT_IKEEP; - done: if (!(mp->m_flags & XFS_MOUNT_NOALIGN)) { /* @@ -542,7 +506,6 @@ xfs_showargs( { XFS_MOUNT_OSYNCISOSYNC, "," MNTOPT_OSYNCISOSYNC }, { XFS_MOUNT_ATTR2, "," MNTOPT_ATTR2 }, { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, - { XFS_MOUNT_DMAPI, "," MNTOPT_DMAPI }, { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, { XFS_MOUNT_DELAYLOG, "," MNTOPT_DELAYLOG }, { 0, NULL } @@ -1206,8 +1169,6 @@ xfs_fs_put_super( xfs_sync_attr(mp, 0); } - XFS_SEND_PREUNMOUNT(mp); - /* * Blow away any referenced inode in the filestreams cache. * This can and will cause log traffic as inodes go inactive @@ -1217,14 +1178,11 @@ xfs_fs_put_super( XFS_bflush(mp->m_ddev_targp); - XFS_SEND_UNMOUNT(mp); - xfs_unmountfs(mp); xfs_freesb(mp); xfs_inode_shrinker_unregister(mp); xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); - xfs_dmops_put(mp); xfs_free_fsname(mp); kfree(mp); } @@ -1542,7 +1500,6 @@ xfs_fs_fill_super( struct inode *root; struct xfs_mount *mp = NULL; int flags = 0, error = ENOMEM; - char *mtpt = NULL; mp = kzalloc(sizeof(struct xfs_mount), GFP_KERNEL); if (!mp) @@ -1558,7 +1515,7 @@ xfs_fs_fill_super( mp->m_super = sb; sb->s_fs_info = mp; - error = xfs_parseargs(mp, (char *)data, &mtpt); + error = xfs_parseargs(mp, (char *)data); if (error) goto out_free_fsname; @@ -1570,16 +1527,12 @@ xfs_fs_fill_super( #endif sb->s_op = &xfs_super_operations; - error = xfs_dmops_get(mp); - if (error) - goto out_free_fsname; - if (silent) flags |= XFS_MFSI_QUIET; error = xfs_open_devices(mp); if (error) - goto out_put_dmops; + goto out_free_fsname; if (xfs_icsb_init_counters(mp)) mp->m_flags |= XFS_MOUNT_NO_PERCPU_SB; @@ -1607,8 +1560,6 @@ xfs_fs_fill_super( if (error) goto out_filestream_unmount; - XFS_SEND_MOUNT(mp, DM_RIGHT_NULL, mtpt, mp->m_fsname); - sb->s_magic = XFS_SB_MAGIC; sb->s_blocksize = mp->m_sb.sb_blocksize; sb->s_blocksize_bits = ffs(sb->s_blocksize) - 1; @@ -1637,7 +1588,6 @@ xfs_fs_fill_super( xfs_inode_shrinker_register(mp); - kfree(mtpt); return 0; out_filestream_unmount: @@ -1647,11 +1597,8 @@ xfs_fs_fill_super( out_destroy_counters: xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); - out_put_dmops: - xfs_dmops_put(mp); out_free_fsname: xfs_free_fsname(mp); - kfree(mtpt); kfree(mp); out: return -error; Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2010-05-25 11:14:59.261004260 +0200 @@ -34,7 +34,6 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_ialloc.h" #include "xfs_itable.h" @@ -5605,28 +5604,6 @@ xfs_getbmap( prealloced = 0; fixlen = 1LL << 32; } else { - /* - * If the BMV_IF_NO_DMAPI_READ interface bit specified, do - * not generate a DMAPI read event. Otherwise, if the - * DM_EVENT_READ bit is set for the file, generate a read - * event in order that the DMAPI application may do its thing - * before we return the extents. Usually this means restoring - * user file data to regions of the file that look like holes. - * - * The "old behavior" (from XFS_IOC_GETBMAP) is to not specify - * BMV_IF_NO_DMAPI_READ so that read events are generated. - * If this were not true, callers of ioctl(XFS_IOC_GETBMAP) - * could misinterpret holes in a DMAPI file as true holes, - * when in fact they may represent offline user data. - */ - if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && - !(iflags & BMV_IF_NO_DMAPI_READ)) { - error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, - 0, 0, 0, NULL); - if (error) - return XFS_ERROR(error); - } - if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS && ip->i_d.di_format != XFS_DINODE_FMT_BTREE && ip->i_d.di_format != XFS_DINODE_FMT_LOCAL) Index: xfs/fs/xfs/xfs_rename.c =================================================================== --- xfs.orig/fs/xfs/xfs_rename.c 2010-05-22 00:39:04.104004455 +0200 +++ xfs/fs/xfs/xfs_rename.c 2010-05-25 11:14:59.266265051 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" @@ -119,18 +118,6 @@ xfs_rename( xfs_itrace_entry(src_dp); xfs_itrace_entry(target_dp); - if (DM_EVENT_ENABLED(src_dp, DM_EVENT_RENAME) || - DM_EVENT_ENABLED(target_dp, DM_EVENT_RENAME)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_RENAME, - src_dp, DM_RIGHT_NULL, - target_dp, DM_RIGHT_NULL, - src_name->name, target_name->name, - 0, 0, 0); - if (error) - return error; - } - /* Return through std_return after this point. */ - new_parent = (src_dp != target_dp); src_is_directory = ((src_ip->i_d.di_mode & S_IFMT) == S_IFDIR); @@ -369,26 +356,13 @@ xfs_rename( * trans_commit will unlock src_ip, target_ip & decrement * the vnode references. */ - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - - /* Fall through to std_return with error = 0 or errno from - * xfs_trans_commit */ -std_return: - if (DM_EVENT_ENABLED(src_dp, DM_EVENT_POSTRENAME) || - DM_EVENT_ENABLED(target_dp, DM_EVENT_POSTRENAME)) { - (void) XFS_SEND_NAMESP (mp, DM_EVENT_POSTRENAME, - src_dp, DM_RIGHT_NULL, - target_dp, DM_RIGHT_NULL, - src_name->name, target_name->name, - 0, error, 0); - } - return error; + return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); abort_return: cancel_flags |= XFS_TRANS_ABORT; - /* FALLTHROUGH */ error_return: xfs_bmap_cancel(&free_list); xfs_trans_cancel(tp, cancel_flags); - goto std_return; + std_return: + return error; } Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c 2010-05-22 00:40:37.991004874 +0200 +++ xfs/fs/xfs/xfs_vnodeops.c 2010-05-25 11:14:59.274016343 +0200 @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" @@ -143,16 +142,6 @@ xfs_setattr( goto error_return; } } else { - if (DM_EVENT_ENABLED(ip, DM_EVENT_TRUNCATE) && - !(flags & XFS_ATTR_DMI)) { - int dmflags = AT_DELAY_FLAG(flags) | DM_SEM_FLAG_WR; - code = XFS_SEND_DATA(mp, DM_EVENT_TRUNCATE, ip, - iattr->ia_size, 0, dmflags, NULL); - if (code) { - lock_flags = 0; - goto error_return; - } - } if (need_iolock) lock_flags |= XFS_IOLOCK_EXCL; } @@ -470,17 +459,10 @@ xfs_setattr( return XFS_ERROR(code); } - if (DM_EVENT_ENABLED(ip, DM_EVENT_ATTRIBUTE) && - !(flags & XFS_ATTR_DMI)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL, - NULL, DM_RIGHT_NULL, NULL, NULL, - 0, 0, AT_DELAY_FLAG(flags)); - } return 0; abort_return: commit_flags |= XFS_TRANS_ABORT; - /* FALLTHROUGH */ error_return: xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); @@ -1060,9 +1042,6 @@ xfs_inactive( mp = ip->i_mount; - if (ip->i_d.di_nlink == 0 && DM_EVENT_ENABLED(ip, DM_EVENT_DESTROY)) - XFS_SEND_DESTROY(mp, ip, DM_RIGHT_NULL); - error = 0; /* If this is a read-only mount, don't do this (would generate I/O) */ @@ -1314,16 +1293,6 @@ xfs_create( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - if (DM_EVENT_ENABLED(dp, DM_EVENT_CREATE)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE, - dp, DM_RIGHT_NULL, NULL, - DM_RIGHT_NULL, name->name, NULL, - mode, 0, 0); - - if (error) - return error; - } - if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) prid = dp->i_d.di_projid; else @@ -1487,16 +1456,7 @@ xfs_create( xfs_qm_dqrele(gdqp); *ipp = ip; - - /* Fallthrough to std_return with error = 0 */ - std_return: - if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTCREATE)) { - XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE, dp, DM_RIGHT_NULL, - ip, DM_RIGHT_NULL, name->name, NULL, mode, - error, 0); - } - - return error; + return 0; out_bmap_cancel: xfs_bmap_cancel(&free_list); @@ -1510,8 +1470,8 @@ xfs_create( if (unlock_dp_on_error) xfs_iunlock(dp, XFS_ILOCK_EXCL); - - goto std_return; + std_return: + return error; out_abort_rele: /* @@ -1732,14 +1692,6 @@ xfs_remove( 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, - ip->i_d.di_mode, 0, 0); - if (error) - return error; - } - error = xfs_qm_dqattach(dp, 0); if (error) goto std_return; @@ -1877,21 +1829,15 @@ xfs_remove( if (!is_dir && link_zero && xfs_inode_is_filestream(ip)) xfs_filestream_deassociate(ip); - std_return: - if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTREMOVE)) { - 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; + return 0; 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; + std_return: + return error; } int @@ -1917,17 +1863,6 @@ xfs_link( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - if (DM_EVENT_ENABLED(tdp, DM_EVENT_LINK)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_LINK, - tdp, DM_RIGHT_NULL, - sip, DM_RIGHT_NULL, - target_name->name, NULL, 0, 0, 0); - if (error) - return error; - } - - /* Return through std_return after this point. */ - error = xfs_qm_dqattach(sip, 0); if (error) goto std_return; @@ -2014,27 +1949,14 @@ xfs_link( goto abort_return; } - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - if (error) - goto std_return; - - /* Fall through to std_return with error = 0. */ -std_return: - if (DM_EVENT_ENABLED(sip, DM_EVENT_POSTLINK)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTLINK, - tdp, DM_RIGHT_NULL, - sip, DM_RIGHT_NULL, - target_name->name, NULL, 0, error, 0); - } - return error; + return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); abort_return: cancel_flags |= XFS_TRANS_ABORT; - /* FALLTHROUGH */ - error_return: xfs_trans_cancel(tp, cancel_flags); - goto std_return; + std_return: + return error; } int @@ -2086,17 +2008,6 @@ xfs_symlink( if (pathlen >= MAXPATHLEN) /* total string too long */ return XFS_ERROR(ENAMETOOLONG); - if (DM_EVENT_ENABLED(dp, DM_EVENT_SYMLINK)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_SYMLINK, dp, - DM_RIGHT_NULL, NULL, DM_RIGHT_NULL, - link_name->name, - (unsigned char *)target_path, 0, 0, 0); - if (error) - return error; - } - - /* Return through std_return after this point. */ - udqp = gdqp = NULL; if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) prid = dp->i_d.di_projid; @@ -2278,21 +2189,8 @@ xfs_symlink( xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); - /* Fall through to std_return with error = 0 or errno from - * xfs_trans_commit */ -std_return: - if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTSYMLINK)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTSYMLINK, - dp, DM_RIGHT_NULL, - error ? NULL : ip, - DM_RIGHT_NULL, link_name->name, - (unsigned char *)target_path, - 0, error, 0); - } - - if (!error) - *ipp = ip; - return error; + *ipp = ip; + return 0; error2: IRELE(ip); @@ -2306,8 +2204,8 @@ std_return: if (unlock_dp_on_error) xfs_iunlock(dp, XFS_ILOCK_EXCL); - - goto std_return; + std_return: + return error; } int @@ -2412,25 +2310,9 @@ xfs_alloc_file_space( startoffset_fsb = XFS_B_TO_FSBT(mp, offset); allocatesize_fsb = XFS_B_TO_FSB(mp, count); - /* Generate a DMAPI event if needed. */ - if (alloc_type != 0 && offset < ip->i_size && - (attr_flags & XFS_ATTR_DMI) == 0 && - DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) { - xfs_off_t end_dmi_offset; - - end_dmi_offset = offset+len; - if (end_dmi_offset > ip->i_size) - end_dmi_offset = ip->i_size; - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, offset, - end_dmi_offset - offset, 0, NULL); - if (error) - return error; - } - /* * Allocate file space until done or until there is an error */ -retry: while (allocatesize_fsb && !error) { xfs_fileoff_t s, e; @@ -2527,17 +2409,6 @@ retry: startoffset_fsb += allocated_fsb; allocatesize_fsb -= allocated_fsb; } -dmapi_enospc_check: - if (error == ENOSPC && (attr_flags & XFS_ATTR_DMI) == 0 && - DM_EVENT_ENABLED(ip, DM_EVENT_NOSPACE)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_NOSPACE, - ip, DM_RIGHT_NULL, - ip, DM_RIGHT_NULL, - NULL, NULL, 0, 0, 0); /* Delay flag intentionally unused */ - if (error == 0) - goto retry; /* Maybe DMAPI app. has made space */ - /* else fall through with error from XFS_SEND_DATA */ - } return error; @@ -2548,7 +2419,7 @@ error0: /* Cancel bmap, unlock inode, un error1: /* Just cancel transaction */ xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); xfs_iunlock(ip, XFS_ILOCK_EXCL); - goto dmapi_enospc_check; + return error; } /* @@ -2661,7 +2532,6 @@ xfs_free_file_space( { int committed; int done; - xfs_off_t end_dmi_offset; xfs_fileoff_t endoffset_fsb; int error; xfs_fsblock_t firstfsb; @@ -2691,19 +2561,7 @@ xfs_free_file_space( return error; rt = XFS_IS_REALTIME_INODE(ip); startoffset_fsb = XFS_B_TO_FSB(mp, offset); - end_dmi_offset = offset + len; - endoffset_fsb = XFS_B_TO_FSBT(mp, end_dmi_offset); - - if (offset < ip->i_size && (attr_flags & XFS_ATTR_DMI) == 0 && - DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) { - if (end_dmi_offset > ip->i_size) - end_dmi_offset = ip->i_size; - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, - offset, end_dmi_offset - offset, - AT_DELAY_FLAG(attr_flags), NULL); - if (error) - return error; - } + endoffset_fsb = XFS_B_TO_FSBT(mp, offset + len); if (attr_flags & XFS_ATTR_NOLOCK) need_iolock = 0; Index: xfs/fs/xfs/Makefile =================================================================== --- xfs.orig/fs/xfs/Makefile 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/Makefile 2010-05-25 11:14:59.282031778 +0200 @@ -90,8 +90,7 @@ xfs-y += xfs_alloc.o \ xfs_trans_item.o \ xfs_utils.o \ xfs_vnodeops.o \ - xfs_rw.o \ - xfs_dmops.o + xfs_rw.o xfs-$(CONFIG_XFS_TRACE) += xfs_btree_trace.o Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-05-25 11:14:59.286031150 +0200 @@ -23,7 +23,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_trans.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_buf.c 2010-05-25 11:14:59.297023956 +0200 @@ -39,7 +39,6 @@ #include "xfs_inum.h" #include "xfs_log.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trace.h" Index: xfs/fs/xfs/linux-2.6/xfs_export.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_export.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_export.c 2010-05-25 11:14:59.303023816 +0200 @@ -23,7 +23,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_export.h" #include "xfs_vnodeops.h" Index: xfs/fs/xfs/linux-2.6/xfs_fs_subr.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_fs_subr.c 2010-05-22 00:40:37.890004594 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_fs_subr.c 2010-05-25 11:14:59.310005937 +0200 @@ -21,10 +21,6 @@ #include "xfs_inode.h" #include "xfs_trace.h" -int fs_noerr(void) { return 0; } -int fs_nosys(void) { return ENOSYS; } -void fs_noval(void) { return; } - /* * note: all filemap functions return negative error codes. These * need to be inverted before returning to the xfs core functions. Index: xfs/fs/xfs/linux-2.6/xfs_fs_subr.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_fs_subr.h 2010-05-22 00:39:04.000000000 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2000,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 - */ -#ifndef __XFS_FS_SUBR_H__ -#define __XFS_FS_SUBR_H__ - -extern int fs_noerr(void); -extern int fs_nosys(void); -extern void fs_noval(void); - -#endif /* __XFS_FS_SUBR_H__ */ Index: xfs/fs/xfs/linux-2.6/xfs_ioctl32.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-05-25 11:14:59.317003422 +0200 @@ -29,7 +29,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_attr_sf.h" Index: xfs/fs/xfs/linux-2.6/xfs_iops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_iops.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_iops.c 2010-05-25 11:14:59.319042045 +0200 @@ -26,7 +26,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/linux-2.6/xfs_linux.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_linux.h 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_linux.h 2010-05-25 11:14:59.324043582 +0200 @@ -87,7 +87,6 @@ #include #include #include -#include #include /* Index: xfs/fs/xfs/linux-2.6/xfs_quotaops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_quotaops.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_quotaops.c 2010-05-25 11:14:59.329274410 +0200 @@ -16,7 +16,6 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" -#include "xfs_dmapi.h" #include "xfs_sb.h" #include "xfs_inum.h" #include "xfs_log.h" Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2010-05-25 11:14:59.335006286 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/linux-2.6/xfs_trace.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_trace.c 2010-05-25 11:14:59.338005727 +0200 @@ -34,7 +34,6 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_ialloc.h" #include "xfs_itable.h" Index: xfs/fs/xfs/quota/xfs_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_dquot.c 2010-05-25 11:14:59.344006076 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_dquot_item.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot_item.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_dquot_item.c 2010-05-25 11:14:59.350033035 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_qm.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm.c 2010-05-25 11:14:59.357004121 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_qm_bhv.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_bhv.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm_bhv.c 2010-05-25 11:14:59.361013061 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_qm_stats.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_stats.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm_stats.c 2010-05-25 11:14:59.363010267 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_qm_syscalls.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_syscalls.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm_syscalls.c 2010-05-25 11:14:59.368004121 +0200 @@ -28,7 +28,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_trans_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_trans_dquot.c 2010-05-25 11:14:59.372003632 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/support/debug.c =================================================================== --- xfs.orig/fs/xfs/support/debug.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/support/debug.c 2010-05-25 11:14:59.376020813 +0200 @@ -22,7 +22,6 @@ #include "xfs_sb.h" #include "xfs_inum.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_alloc.c 2010-05-25 11:14:59.381273222 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_alloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc_btree.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_alloc_btree.c 2010-05-25 11:14:59.386036737 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_attr.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_attr.c 2010-05-25 11:14:59.390255762 +0200 @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_attr_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr_leaf.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_attr_leaf.c 2010-05-25 11:14:59.398255692 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_bmap_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap_btree.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_bmap_btree.c 2010-05-25 11:14:59.404255552 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_btree.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_btree.c 2010-05-25 11:14:59.410003911 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_buf_item.c 2010-05-25 11:14:59.418034083 +0200 @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" Index: xfs/fs/xfs/xfs_da_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_da_btree.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_da_btree.c 2010-05-25 11:14:59.424006216 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dfrag.c =================================================================== --- xfs.orig/fs/xfs/xfs_dfrag.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_dfrag.c 2010-05-25 11:14:59.430031918 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_dir2.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2.c 2010-05-25 11:14:59.435037366 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_block.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_block.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_block.c 2010-05-25 11:14:59.440014527 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_data.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_data.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_data.c 2010-05-25 11:14:59.442011873 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_leaf.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_leaf.c 2010-05-25 11:14:59.454006216 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_node.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_node.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_node.c 2010-05-25 11:14:59.671255345 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_sf.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_sf.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_sf.c 2010-05-25 11:14:59.678033455 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dmapi.h =================================================================== --- xfs.orig/fs/xfs/xfs_dmapi.h 2010-05-22 00:39:04.000000000 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2000-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 - */ -#ifndef __XFS_DMAPI_H__ -#define __XFS_DMAPI_H__ - -/* Values used to define the on-disk version of dm_attrname_t. All - * on-disk attribute names start with the 8-byte string "SGI_DMI_". - * - * In the on-disk inode, DMAPI attribute names consist of the user-provided - * name with the DMATTR_PREFIXSTRING pre-pended. This string must NEVER be - * changed. - */ - -#define DMATTR_PREFIXLEN 8 -#define DMATTR_PREFIXSTRING "SGI_DMI_" - -typedef enum { - DM_EVENT_INVALID = -1, - DM_EVENT_CANCEL = 0, /* not supported */ - DM_EVENT_MOUNT = 1, - DM_EVENT_PREUNMOUNT = 2, - DM_EVENT_UNMOUNT = 3, - DM_EVENT_DEBUT = 4, /* not supported */ - DM_EVENT_CREATE = 5, - DM_EVENT_CLOSE = 6, /* not supported */ - DM_EVENT_POSTCREATE = 7, - DM_EVENT_REMOVE = 8, - DM_EVENT_POSTREMOVE = 9, - DM_EVENT_RENAME = 10, - DM_EVENT_POSTRENAME = 11, - DM_EVENT_LINK = 12, - DM_EVENT_POSTLINK = 13, - DM_EVENT_SYMLINK = 14, - DM_EVENT_POSTSYMLINK = 15, - DM_EVENT_READ = 16, - DM_EVENT_WRITE = 17, - DM_EVENT_TRUNCATE = 18, - DM_EVENT_ATTRIBUTE = 19, - DM_EVENT_DESTROY = 20, - DM_EVENT_NOSPACE = 21, - DM_EVENT_USER = 22, - DM_EVENT_MAX = 23 -} dm_eventtype_t; -#define HAVE_DM_EVENTTYPE_T - -typedef enum { - DM_RIGHT_NULL, - DM_RIGHT_SHARED, - DM_RIGHT_EXCL -} dm_right_t; -#define HAVE_DM_RIGHT_T - -/* Defines for determining if an event message should be sent. */ -#ifdef HAVE_DMAPI -#define DM_EVENT_ENABLED(ip, event) ( \ - unlikely ((ip)->i_mount->m_flags & XFS_MOUNT_DMAPI) && \ - ( ((ip)->i_d.di_dmevmask & (1 << event)) || \ - ((ip)->i_mount->m_dmevmask & (1 << event)) ) \ - ) -#else -#define DM_EVENT_ENABLED(ip, event) (0) -#endif - -#define DM_XFS_VALID_FS_EVENTS ( \ - (1 << DM_EVENT_PREUNMOUNT) | \ - (1 << DM_EVENT_UNMOUNT) | \ - (1 << DM_EVENT_NOSPACE) | \ - (1 << DM_EVENT_DEBUT) | \ - (1 << DM_EVENT_CREATE) | \ - (1 << DM_EVENT_POSTCREATE) | \ - (1 << DM_EVENT_REMOVE) | \ - (1 << DM_EVENT_POSTREMOVE) | \ - (1 << DM_EVENT_RENAME) | \ - (1 << DM_EVENT_POSTRENAME) | \ - (1 << DM_EVENT_LINK) | \ - (1 << DM_EVENT_POSTLINK) | \ - (1 << DM_EVENT_SYMLINK) | \ - (1 << DM_EVENT_POSTSYMLINK) | \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - -/* Events valid in dm_set_eventlist() when called with a file handle for - a regular file or a symlink. These events are persistent. -*/ - -#define DM_XFS_VALID_FILE_EVENTS ( \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - -/* Events valid in dm_set_eventlist() when called with a file handle for - a directory. These events are persistent. -*/ - -#define DM_XFS_VALID_DIRECTORY_EVENTS ( \ - (1 << DM_EVENT_CREATE) | \ - (1 << DM_EVENT_POSTCREATE) | \ - (1 << DM_EVENT_REMOVE) | \ - (1 << DM_EVENT_POSTREMOVE) | \ - (1 << DM_EVENT_RENAME) | \ - (1 << DM_EVENT_POSTRENAME) | \ - (1 << DM_EVENT_LINK) | \ - (1 << DM_EVENT_POSTLINK) | \ - (1 << DM_EVENT_SYMLINK) | \ - (1 << DM_EVENT_POSTSYMLINK) | \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - -/* Events supported by the XFS filesystem. */ -#define DM_XFS_SUPPORTED_EVENTS ( \ - (1 << DM_EVENT_MOUNT) | \ - (1 << DM_EVENT_PREUNMOUNT) | \ - (1 << DM_EVENT_UNMOUNT) | \ - (1 << DM_EVENT_NOSPACE) | \ - (1 << DM_EVENT_CREATE) | \ - (1 << DM_EVENT_POSTCREATE) | \ - (1 << DM_EVENT_REMOVE) | \ - (1 << DM_EVENT_POSTREMOVE) | \ - (1 << DM_EVENT_RENAME) | \ - (1 << DM_EVENT_POSTRENAME) | \ - (1 << DM_EVENT_LINK) | \ - (1 << DM_EVENT_POSTLINK) | \ - (1 << DM_EVENT_SYMLINK) | \ - (1 << DM_EVENT_POSTSYMLINK) | \ - (1 << DM_EVENT_READ) | \ - (1 << DM_EVENT_WRITE) | \ - (1 << DM_EVENT_TRUNCATE) | \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - - -/* - * Definitions used for the flags field on dm_send_*_event(). - */ - -#define DM_FLAGS_NDELAY 0x001 /* return EAGAIN after dm_pending() */ -#define DM_FLAGS_UNWANTED 0x002 /* event not in fsys dm_eventset_t */ -#define DM_FLAGS_IMUX 0x004 /* thread holds i_mutex */ -#define DM_FLAGS_IALLOCSEM_RD 0x010 /* thread holds i_alloc_sem rd */ -#define DM_FLAGS_IALLOCSEM_WR 0x020 /* thread holds i_alloc_sem wr */ - -/* - * Pull in platform specific event flags defines - */ -#include "xfs_dmapi_priv.h" - -/* - * Macros to turn caller specified delay/block flags into - * dm_send_xxxx_event flag DM_FLAGS_NDELAY. - */ - -#define FILP_DELAY_FLAG(filp) ((filp->f_flags&(O_NDELAY|O_NONBLOCK)) ? \ - DM_FLAGS_NDELAY : 0) -#define AT_DELAY_FLAG(f) ((f & XFS_ATTR_NONBLOCK) ? DM_FLAGS_NDELAY : 0) - -#endif /* __XFS_DMAPI_H__ */ Index: xfs/fs/xfs/xfs_dmops.c =================================================================== --- xfs.orig/fs/xfs/xfs_dmops.c 2010-05-22 00:39:04.000000000 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2000-2003,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_log.h" -#include "xfs_trans.h" -#include "xfs_sb.h" -#include "xfs_dmapi.h" -#include "xfs_inum.h" -#include "xfs_ag.h" -#include "xfs_mount.h" - - -static struct xfs_dmops xfs_dmcore_stub = { - .xfs_send_data = (xfs_send_data_t)fs_nosys, - .xfs_send_mmap = (xfs_send_mmap_t)fs_noerr, - .xfs_send_destroy = (xfs_send_destroy_t)fs_nosys, - .xfs_send_namesp = (xfs_send_namesp_t)fs_nosys, - .xfs_send_mount = (xfs_send_mount_t)fs_nosys, - .xfs_send_unmount = (xfs_send_unmount_t)fs_noerr, -}; - -int -xfs_dmops_get(struct xfs_mount *mp) -{ - if (mp->m_flags & XFS_MOUNT_DMAPI) { - cmn_err(CE_WARN, - "XFS: dmapi support not available in this kernel."); - return EINVAL; - } - - mp->m_dm_ops = &xfs_dmcore_stub; - return 0; -} - -void -xfs_dmops_put(struct xfs_mount *mp) -{ -} Index: xfs/fs/xfs/xfs_error.c =================================================================== --- xfs.orig/fs/xfs/xfs_error.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_error.c 2010-05-25 11:14:59.684255901 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" Index: xfs/fs/xfs/xfs_extfree_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_extfree_item.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_extfree_item.c 2010-05-25 11:14:59.687282511 +0200 @@ -24,7 +24,6 @@ #include "xfs_buf_item.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_extfree_item.h" Index: xfs/fs/xfs/xfs_filestream.c =================================================================== --- xfs.orig/fs/xfs/xfs_filestream.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_filestream.c 2010-05-25 11:14:59.694256111 +0200 @@ -24,7 +24,6 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" Index: xfs/fs/xfs/xfs_fsops.c =================================================================== --- xfs.orig/fs/xfs/xfs_fsops.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_fsops.c 2010-05-25 11:14:59.700275318 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_ialloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_ialloc.c 2010-05-25 11:14:59.705254086 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_ialloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc_btree.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/xfs_ialloc_btree.c 2010-05-25 11:14:59.709254155 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-05-25 11:14:59.713253736 +0200 @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_inode.c 2010-05-25 11:14:59.716253946 +0200 @@ -28,7 +28,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_inode_item.c 2010-05-25 11:14:59.722275178 +0200 @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_iomap.c 2010-05-25 11:14:59.733005937 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_itable.c =================================================================== --- xfs.orig/fs/xfs/xfs_itable.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_itable.c 2010-05-25 11:14:59.740006635 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_log.c =================================================================== --- xfs.orig/fs/xfs/xfs_log.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_log.c 2010-05-25 11:14:59.753006007 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_log_priv.h" Index: xfs/fs/xfs/xfs_log_recover.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_recover.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_log_recover.c 2010-05-25 11:14:59.762003492 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_mount.c =================================================================== --- xfs.orig/fs/xfs/xfs_mount.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_mount.c 2010-05-25 11:14:59.764011664 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_mount.h =================================================================== --- xfs.orig/fs/xfs/xfs_mount.h 2010-05-24 23:11:41.025253988 +0200 +++ xfs/fs/xfs/xfs_mount.h 2010-05-25 11:15:46.687030871 +0200 @@ -66,65 +66,6 @@ struct xfs_nameops; struct xfs_ail; struct xfs_quotainfo; - -/* - * Prototypes and functions for the Data Migration subsystem. - */ - -typedef int (*xfs_send_data_t)(int, struct xfs_inode *, - xfs_off_t, size_t, int, int *); -typedef int (*xfs_send_mmap_t)(struct vm_area_struct *, uint); -typedef int (*xfs_send_destroy_t)(struct xfs_inode *, dm_right_t); -typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct xfs_mount *, - struct xfs_inode *, dm_right_t, - struct xfs_inode *, dm_right_t, - const unsigned char *, const unsigned char *, - mode_t, int, int); -typedef int (*xfs_send_mount_t)(struct xfs_mount *, dm_right_t, - char *, char *); -typedef void (*xfs_send_unmount_t)(struct xfs_mount *, struct xfs_inode *, - dm_right_t, mode_t, int, int); - -typedef struct xfs_dmops { - xfs_send_data_t xfs_send_data; - xfs_send_mmap_t xfs_send_mmap; - xfs_send_destroy_t xfs_send_destroy; - xfs_send_namesp_t xfs_send_namesp; - xfs_send_mount_t xfs_send_mount; - xfs_send_unmount_t xfs_send_unmount; -} xfs_dmops_t; - -#define XFS_DMAPI_UNMOUNT_FLAGS(mp) \ - (((mp)->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? 0 : DM_FLAGS_UNWANTED) - -#define XFS_SEND_DATA(mp, ev,ip,off,len,fl,lock) \ - (*(mp)->m_dm_ops->xfs_send_data)(ev,ip,off,len,fl,lock) -#define XFS_SEND_MMAP(mp, vma,fl) \ - (*(mp)->m_dm_ops->xfs_send_mmap)(vma,fl) -#define XFS_SEND_DESTROY(mp, ip,right) \ - (*(mp)->m_dm_ops->xfs_send_destroy)(ip,right) -#define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ - (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) -#define XFS_SEND_MOUNT(mp,right,path,name) \ - (*(mp)->m_dm_ops->xfs_send_mount)(mp,right,path,name) -#define XFS_SEND_PREUNMOUNT(mp) \ -do { \ - if (mp->m_flags & XFS_MOUNT_DMAPI) { \ - (*(mp)->m_dm_ops->xfs_send_namesp)(DM_EVENT_PREUNMOUNT, mp, \ - (mp)->m_rootip, DM_RIGHT_NULL, \ - (mp)->m_rootip, DM_RIGHT_NULL, \ - NULL, NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ - } \ -} while (0) -#define XFS_SEND_UNMOUNT(mp) \ -do { \ - if (mp->m_flags & XFS_MOUNT_DMAPI) { \ - (*(mp)->m_dm_ops->xfs_send_unmount)(mp, (mp)->m_rootip, \ - DM_RIGHT_NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ - } \ -} while (0) - - #ifdef HAVE_PERCPU_SB /* @@ -241,8 +182,6 @@ typedef struct xfs_mount { uint m_chsize; /* size of next field */ struct xfs_chash *m_chash; /* fs private inode per-cluster * hash table */ - struct xfs_dmops *m_dm_ops; /* vector of DMI ops */ - struct xfs_qmops *m_qm_ops; /* vector of XQM ops */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB xfs_icsb_cnts_t __percpu *m_sb_cnts; /* per-cpu superblock counters */ @@ -269,7 +208,6 @@ typedef struct xfs_mount { must be synchronous except for space allocations */ #define XFS_MOUNT_DELAYLOG (1ULL << 1) /* delayed logging is enabled */ -#define XFS_MOUNT_DMAPI (1ULL << 2) /* dmapi is enabled */ #define XFS_MOUNT_WAS_CLEAN (1ULL << 3) #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem operations, typically for @@ -440,11 +378,6 @@ extern int xfs_sb_validate_fsb_count(str extern int xfs_dev_is_read_only(struct xfs_mount *, char *); -extern int xfs_dmops_get(struct xfs_mount *); -extern void xfs_dmops_put(struct xfs_mount *); - -extern struct xfs_dmops xfs_dmcore_xfs; - #endif /* __KERNEL__ */ extern void xfs_mod_sb(struct xfs_trans *, __int64_t); Index: xfs/fs/xfs/xfs_rtalloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_rtalloc.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/xfs_rtalloc.c 2010-05-25 11:14:59.778003841 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_rw.c =================================================================== --- xfs.orig/fs/xfs/xfs_rw.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_rw.c 2010-05-25 11:14:59.784026331 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_trans.c 2010-05-25 11:14:59.797257578 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_da_btree.h" Index: xfs/fs/xfs/xfs_trans_ail.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_ail.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_ail.c 2010-05-25 11:14:59.802255482 +0200 @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_error.h" Index: xfs/fs/xfs/xfs_trans_buf.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_buf.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_buf.c 2010-05-25 11:14:59.808006007 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_trans_extfree.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_extfree.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_extfree.c 2010-05-25 11:14:59.812006356 +0200 @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_extfree_item.h" Index: xfs/fs/xfs/xfs_trans_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_inode.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_inode.c 2010-05-25 11:14:59.816006845 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_utils.c =================================================================== --- xfs.orig/fs/xfs/xfs_utils.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/xfs_utils.c 2010-05-25 11:14:59.820006076 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" Index: xfs/fs/xfs/xfs_trans_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_item.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_item.c 2010-05-25 11:14:59.823006076 +0200 @@ -28,7 +28,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" STATIC int xfs_trans_unlock_chunk(xfs_log_item_chunk_t *, Index: xfs/fs/xfs/linux-2.6/xfs_dmapi_priv.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_dmapi_priv.h 2010-05-22 00:39:04.000000000 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2000-2006 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 - */ -#ifndef __XFS_DMAPI_PRIV_H__ -#define __XFS_DMAPI_PRIV_H__ - -/* - * Based on IO_ISDIRECT, decide which i_ flag is set. - */ -#define DM_SEM_FLAG_RD(ioflags) (((ioflags) & IO_ISDIRECT) ? \ - DM_FLAGS_IMUX : 0) -#define DM_SEM_FLAG_WR (DM_FLAGS_IALLOCSEM_WR | DM_FLAGS_IMUX) - -#endif /*__XFS_DMAPI_PRIV_H__*/ Index: xfs/fs/xfs/linux-2.6/xfs_super.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.h 2010-05-22 00:39:04.089004246 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.h 2010-05-25 11:14:59.826005657 +0200 @@ -56,12 +56,6 @@ extern void xfs_qm_exit(void); # define XFS_BIGFS_STRING #endif -#ifdef CONFIG_XFS_DMAPI -# define XFS_DMAPI_STRING "dmapi support, " -#else -# define XFS_DMAPI_STRING -#endif - #ifdef DEBUG # define XFS_DBG_STRING "debug" #else @@ -72,7 +66,6 @@ extern void xfs_qm_exit(void); XFS_SECURITY_STRING \ XFS_REALTIME_STRING \ XFS_BIGFS_STRING \ - XFS_DMAPI_STRING \ XFS_DBG_STRING /* DBG must be last */ struct xfs_inode; Index: xfs/fs/xfs/xfs_log_cil.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_cil.c 2010-05-25 11:16:08.428003561 +0200 +++ xfs/fs/xfs/xfs_log_cil.c 2010-05-25 11:16:11.151344325 +0200 @@ -27,7 +27,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_alloc.h" From BATV+dc1ae48fd67a4d6e194a+2466+infradead.org+hch@bombadil.srs.infradead.org Tue May 25 04:43:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4P9hJae239567 for ; Tue, 25 May 2010 04:43:19 -0500 X-ASG-Debug-ID: 1274780741-47d900ca0000-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 E5C691DFA83B for ; Tue, 25 May 2010 02:45:41 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id cEnzAowxSZiguoaa for ; Tue, 25 May 2010 02:45:41 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OGqhh-00012p-GT for xfs@oss.sgi.com; Tue, 25 May 2010 09:45:41 +0000 Date: Tue, 25 May 2010 05:45:41 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/2 v2] xfs: remove unneeded #include statements Subject: [PATCH 2/2 v2] xfs: remove unneeded #include statements Message-ID: <20100525094541.GB1647@infradead.org> References: <20100510140845.GB16540@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100510140845.GB16540@infradead.org> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274780741 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Christoph Hellwig --- V1 -> V2 - updated to account for the delayed logging branch merge Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-05-25 11:14:59.286031150 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-05-25 11:38:00.497004330 +0200 @@ -21,18 +21,12 @@ #include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_trans.h" #include "xfs_mount.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_alloc.h" -#include "xfs_btree.h" #include "xfs_error.h" #include "xfs_rw.h" #include "xfs_iomap.h" Index: xfs/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_file.c 2010-05-25 11:14:59.236274548 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-05-25 11:38:00.498004261 +0200 @@ -22,22 +22,15 @@ #include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_trans.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" #include "xfs_alloc.h" -#include "xfs_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_vnodeops.h" #include "xfs_da_btree.h" #include "xfs_ioctl.h" Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-25 11:14:59.237275526 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-25 11:38:00.505033035 +0200 @@ -23,23 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_ioctl.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" #include "xfs_rtalloc.h" #include "xfs_itable.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_bmap.h" #include "xfs_buf_item.h" Index: xfs/fs/xfs/linux-2.6/xfs_ioctl32.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-05-25 11:14:59.317003422 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-05-25 11:38:00.512033733 +0200 @@ -28,11 +28,8 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dir2_sf.h" #include "xfs_vnode.h" #include "xfs_dinode.h" #include "xfs_inode.h" Index: xfs/fs/xfs/linux-2.6/xfs_iops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_iops.c 2010-05-25 11:14:59.319042045 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_iops.c 2010-05-25 11:38:00.519033454 +0200 @@ -24,20 +24,13 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_bmap.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_itable.h" Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2010-05-25 11:15:23.496005936 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-05-25 11:38:00.525005726 +0200 @@ -30,8 +30,6 @@ #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" @@ -42,7 +40,6 @@ #include "xfs_error.h" #include "xfs_itable.h" #include "xfs_fsops.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_utils.h" Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2010-05-25 11:14:59.335006286 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2010-05-25 11:38:00.531005657 +0200 @@ -24,24 +24,14 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_inode.h" #include "xfs_dinode.h" #include "xfs_error.h" -#include "xfs_mru_cache.h" #include "xfs_filestream.h" #include "xfs_vnodeops.h" -#include "xfs_utils.h" -#include "xfs_buf_item.h" #include "xfs_inode_item.h" -#include "xfs_rw.h" #include "xfs_quota.h" #include "xfs_trace.h" Index: xfs/fs/xfs/linux-2.6/xfs_trace.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.c 2010-05-25 11:14:59.338005727 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_trace.c 2010-05-25 11:38:00.534004958 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_da_btree.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" Index: xfs/fs/xfs/quota/xfs_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot.c 2010-05-25 11:14:59.344006076 +0200 +++ xfs/fs/xfs/quota/xfs_dquot.c 2010-05-25 11:38:00.540006006 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_itable.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_space.h" Index: xfs/fs/xfs/quota/xfs_dquot_item.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot_item.c 2010-05-25 11:14:59.350033035 +0200 +++ xfs/fs/xfs/quota/xfs_dquot_item.c 2010-05-25 11:38:00.546006565 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_bmap.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_itable.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" Index: xfs/fs/xfs/quota/xfs_qm.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm.c 2010-05-25 11:14:59.357004121 +0200 +++ xfs/fs/xfs/quota/xfs_qm.c 2010-05-25 11:38:00.552267005 +0200 @@ -23,24 +23,18 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_itable.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_bmap.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_space.h" Index: xfs/fs/xfs/quota/xfs_qm_bhv.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_bhv.c 2010-05-25 11:14:59.361013061 +0200 +++ xfs/fs/xfs/quota/xfs_qm_bhv.c 2010-05-25 11:38:00.557255481 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_itable.h" -#include "xfs_btree.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_qm.h" Index: xfs/fs/xfs/quota/xfs_qm_stats.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_stats.c 2010-05-25 11:14:59.363010267 +0200 +++ xfs/fs/xfs/quota/xfs_qm_stats.c 2010-05-25 11:38:00.560284396 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_itable.h" #include "xfs_bmap.h" -#include "xfs_btree.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_qm.h" Index: xfs/fs/xfs/quota/xfs_qm_syscalls.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_syscalls.c 2010-05-25 11:14:59.368004121 +0200 +++ xfs/fs/xfs/quota/xfs_qm_syscalls.c 2010-05-25 11:38:00.565285095 +0200 @@ -26,24 +26,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_itable.h" #include "xfs_bmap.h" -#include "xfs_btree.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_utils.h" Index: xfs/fs/xfs/quota/xfs_trans_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c 2010-05-25 11:14:59.372003632 +0200 +++ xfs/fs/xfs/quota/xfs_trans_dquot.c 2010-05-25 11:38:00.570255481 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dir2_sf.h" -#include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_ialloc.h" #include "xfs_itable.h" -#include "xfs_btree.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2010-05-25 11:14:59.381273222 +0200 +++ xfs/fs/xfs/xfs_alloc.c 2010-05-25 11:38:00.578255621 +0200 @@ -24,17 +24,13 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_ialloc.h" #include "xfs_alloc.h" #include "xfs_error.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_alloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc_btree.c 2010-05-25 11:14:59.386036737 +0200 +++ xfs/fs/xfs/xfs_alloc_btree.c 2010-05-25 11:38:00.584254923 +0200 @@ -24,18 +24,14 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_btree_trace.h" -#include "xfs_ialloc.h" #include "xfs_alloc.h" #include "xfs_error.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_attr.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr.c 2010-05-25 11:14:59.390255762 +0200 +++ xfs/fs/xfs/xfs_attr.c 2010-05-25 11:38:00.592255901 +0200 @@ -25,18 +25,13 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_da_btree.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_alloc.h" -#include "xfs_btree.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_attr.h" Index: xfs/fs/xfs/xfs_attr_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr_leaf.c 2010-05-25 11:14:59.398255692 +0200 +++ xfs/fs/xfs/xfs_attr_leaf.c 2010-05-25 11:38:00.599285444 +0200 @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" @@ -32,7 +31,6 @@ #include "xfs_ialloc_btree.h" #include "xfs_alloc.h" #include "xfs_btree.h" -#include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" Index: xfs/fs/xfs/xfs_bmap_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap_btree.c 2010-05-25 11:14:59.404255552 +0200 +++ xfs/fs/xfs/xfs_bmap_btree.c 2010-05-25 11:38:00.605255621 +0200 @@ -24,20 +24,16 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" #include "xfs_alloc.h" #include "xfs_btree.h" #include "xfs_btree_trace.h" -#include "xfs_ialloc.h" #include "xfs_itable.h" #include "xfs_bmap.h" #include "xfs_error.h" Index: xfs/fs/xfs/xfs_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_btree.c 2010-05-25 11:14:59.410003911 +0200 +++ xfs/fs/xfs/xfs_btree.c 2010-05-25 11:38:00.611255412 +0200 @@ -24,19 +24,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" #include "xfs_btree.h" #include "xfs_btree_trace.h" -#include "xfs_ialloc.h" #include "xfs_error.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_dfrag.c =================================================================== --- xfs.orig/fs/xfs/xfs_dfrag.c 2010-05-25 11:14:59.430031918 +0200 +++ xfs/fs/xfs/xfs_dfrag.c 2010-05-25 11:38:00.613284745 +0200 @@ -24,23 +24,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" #include "xfs_bmap.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" #include "xfs_itable.h" #include "xfs_dfrag.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_vnodeops.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_error.c =================================================================== --- xfs.orig/fs/xfs/xfs_error.c 2010-05-25 11:14:59.684255901 +0200 +++ xfs/fs/xfs/xfs_error.c 2010-05-25 11:38:00.620282861 +0200 @@ -23,11 +23,8 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_utils.h" Index: xfs/fs/xfs/xfs_filestream.c =================================================================== --- xfs.orig/fs/xfs/xfs_filestream.c 2010-05-25 11:14:59.694256111 +0200 +++ xfs/fs/xfs/xfs_filestream.c 2010-05-25 11:38:00.627283908 +0200 @@ -18,9 +18,6 @@ #include "xfs.h" #include "xfs_bmap_btree.h" #include "xfs_inum.h" -#include "xfs_dir2.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_ag.h" Index: xfs/fs/xfs/xfs_fsops.c =================================================================== --- xfs.orig/fs/xfs/xfs_fsops.c 2010-05-25 11:14:59.700275318 +0200 +++ xfs/fs/xfs/xfs_fsops.c 2010-05-25 11:38:00.634282791 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" Index: xfs/fs/xfs/xfs_ialloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc.c 2010-05-25 11:14:59.705254086 +0200 +++ xfs/fs/xfs/xfs_ialloc.c 2010-05-25 11:38:00.640284956 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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" Index: xfs/fs/xfs/xfs_ialloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc_btree.c 2010-05-25 11:14:59.709254155 +0200 +++ xfs/fs/xfs/xfs_ialloc_btree.c 2010-05-25 11:38:00.646284886 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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" Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-05-25 11:14:59.713253736 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-05-25 11:38:00.653255482 +0200 @@ -25,13 +25,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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" Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-05-25 11:14:59.716253946 +0200 +++ xfs/fs/xfs/xfs_inode.c 2010-05-25 11:38:00.661255413 +0200 @@ -27,12 +27,10 @@ #include "xfs_trans_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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" @@ -43,7 +41,6 @@ #include "xfs_alloc.h" #include "xfs_ialloc.h" #include "xfs_bmap.h" -#include "xfs_rw.h" #include "xfs_error.h" #include "xfs_utils.h" #include "xfs_quota.h" Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-05-25 11:14:59.722275178 +0200 +++ xfs/fs/xfs/xfs_inode_item.c 2010-05-25 11:38:00.664256321 +0200 @@ -22,23 +22,14 @@ #include "xfs_log.h" #include "xfs_inum.h" #include "xfs_trans.h" -#include "xfs_buf_item.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_trans_priv.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_inode_item.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" -#include "xfs_rw.h" #include "xfs_error.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c 2010-05-25 11:14:59.733005937 +0200 +++ xfs/fs/xfs/xfs_iomap.c 2010-05-25 11:38:00.669284676 +0200 @@ -23,18 +23,14 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_btree.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" Index: xfs/fs/xfs/xfs_itable.c =================================================================== --- xfs.orig/fs/xfs/xfs_itable.c 2010-05-25 11:14:59.740006635 +0200 +++ xfs/fs/xfs/xfs_itable.c 2010-05-25 11:38:00.674285794 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_ialloc.h" Index: xfs/fs/xfs/xfs_log.c =================================================================== --- xfs.orig/fs/xfs/xfs_log.c 2010-05-25 11:14:59.753006007 +0200 +++ xfs/fs/xfs/xfs_log.c 2010-05-25 11:38:00.683255622 +0200 @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_log_priv.h" @@ -34,8 +33,6 @@ #include "xfs_ialloc_btree.h" #include "xfs_log_recover.h" #include "xfs_trans_priv.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_rw.h" Index: xfs/fs/xfs/xfs_log_recover.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_recover.c 2010-05-25 11:14:59.762003492 +0200 +++ xfs/fs/xfs/xfs_log_recover.c 2010-05-25 11:38:00.689033734 +0200 @@ -24,14 +24,11 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_error.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_inode_item.h" Index: xfs/fs/xfs/xfs_mount.c =================================================================== --- xfs.orig/fs/xfs/xfs_mount.c 2010-05-25 11:14:59.764011664 +0200 +++ xfs/fs/xfs/xfs_mount.c 2010-05-25 11:38:00.697283978 +0200 @@ -29,8 +29,6 @@ #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" Index: xfs/fs/xfs/xfs_rename.c =================================================================== --- xfs.orig/fs/xfs/xfs_rename.c 2010-05-25 11:14:59.266265051 +0200 +++ xfs/fs/xfs/xfs_rename.c 2010-05-25 11:38:00.703005448 +0200 @@ -27,8 +27,6 @@ #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_rtalloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_rtalloc.c 2010-05-25 11:14:59.778003841 +0200 +++ xfs/fs/xfs/xfs_rtalloc.c 2010-05-25 11:38:00.706025842 +0200 @@ -27,14 +27,8 @@ #include "xfs_dir2.h" #include "xfs_mount.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_ialloc.h" #include "xfs_alloc.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" Index: xfs/fs/xfs/xfs_rw.c =================================================================== --- xfs.orig/fs/xfs/xfs_rw.c 2010-05-25 11:14:59.784026331 +0200 +++ xfs/fs/xfs/xfs_rw.c 2010-05-25 11:38:00.711005378 +0200 @@ -24,26 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" -#include "xfs_itable.h" -#include "xfs_btree.h" -#include "xfs_alloc.h" -#include "xfs_ialloc.h" -#include "xfs_attr.h" -#include "xfs_bmap.h" #include "xfs_error.h" -#include "xfs_buf_item.h" #include "xfs_rw.h" -#include "xfs_trace.h" /* * Force a shutdown of the filesystem instantly while keeping Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-25 11:14:59.797257578 +0200 +++ xfs/fs/xfs/xfs_trans.c 2010-05-25 11:38:00.715067607 +0200 @@ -24,15 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_da_btree.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" Index: xfs/fs/xfs/xfs_trans_buf.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_buf.c 2010-05-25 11:14:59.808006007 +0200 +++ xfs/fs/xfs/xfs_trans_buf.c 2010-05-25 11:38:00.720005588 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_buf_item.h" Index: xfs/fs/xfs/xfs_trans_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_inode.c 2010-05-25 11:14:59.816006845 +0200 +++ xfs/fs/xfs/xfs_trans_inode.c 2010-05-25 11:38:00.729033873 +0200 @@ -24,17 +24,13 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_ialloc.h" #include "xfs_trans_priv.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_utils.c =================================================================== --- xfs.orig/fs/xfs/xfs_utils.c 2010-05-25 11:14:59.820006076 +0200 +++ xfs/fs/xfs/xfs_utils.c 2010-05-25 11:38:00.736033663 +0200 @@ -27,15 +27,12 @@ #include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_error.h" #include "xfs_quota.h" -#include "xfs_rw.h" #include "xfs_itable.h" #include "xfs_utils.h" Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c 2010-05-25 11:14:59.274016343 +0200 +++ xfs/fs/xfs/xfs_vnodeops.c 2010-05-25 11:38:00.742005377 +0200 @@ -29,15 +29,11 @@ #include "xfs_mount.h" #include "xfs_da_btree.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_inode_item.h" #include "xfs_itable.h" -#include "xfs_btree.h" #include "xfs_ialloc.h" #include "xfs_alloc.h" #include "xfs_bmap.h" Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-05-25 11:14:59.261004260 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2010-05-25 11:38:00.753005587 +0200 @@ -30,12 +30,10 @@ #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_mount.h" -#include "xfs_ialloc.h" #include "xfs_itable.h" #include "xfs_dir2_data.h" #include "xfs_dir2_leaf.h" Index: xfs/fs/xfs/xfs_da_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_da_btree.c 2010-05-25 11:14:59.424006216 +0200 +++ xfs/fs/xfs/xfs_da_btree.c 2010-05-25 11:38:00.760005726 +0200 @@ -28,15 +28,11 @@ #include "xfs_mount.h" #include "xfs_da_btree.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_inode_item.h" #include "xfs_alloc.h" -#include "xfs_btree.h" #include "xfs_bmap.h" #include "xfs_attr.h" #include "xfs_attr_leaf.h" Index: xfs/fs/xfs/xfs_dir2.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2.c 2010-05-25 11:14:59.435037366 +0200 +++ xfs/fs/xfs/xfs_dir2.c 2010-05-25 11:38:00.762068235 +0200 @@ -30,7 +30,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_dir2_block.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_block.c 2010-05-25 11:14:59.440014527 +0200 +++ xfs/fs/xfs/xfs_dir2_block.c 2010-05-25 11:38:00.767067886 +0200 @@ -28,7 +28,6 @@ #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_dir2_data.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_data.c 2010-05-25 11:14:59.442011873 +0200 +++ xfs/fs/xfs/xfs_dir2_data.c 2010-05-25 11:38:00.775006634 +0200 @@ -28,7 +28,6 @@ #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_dir2_data.h" Index: xfs/fs/xfs/xfs_dir2_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_leaf.c 2010-05-25 11:14:59.454006216 +0200 +++ xfs/fs/xfs/xfs_dir2_leaf.c 2010-05-25 11:38:00.780034013 +0200 @@ -28,7 +28,6 @@ #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_attr_sf.h" #include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" Index: xfs/fs/xfs/xfs_dir2_node.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_node.c 2010-05-25 11:14:59.671255345 +0200 +++ xfs/fs/xfs/xfs_dir2_node.c 2010-05-25 11:38:00.788005377 +0200 @@ -28,7 +28,6 @@ #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_bmap.h" Index: xfs/fs/xfs/xfs_dir2_sf.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_sf.c 2010-05-25 11:14:59.678033455 +0200 +++ xfs/fs/xfs/xfs_dir2_sf.c 2010-05-25 11:38:00.794039181 +0200 @@ -28,7 +28,6 @@ #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_log_cil.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_cil.c 2010-05-25 11:38:09.226004051 +0200 +++ xfs/fs/xfs/xfs_log_cil.c 2010-05-25 11:40:49.242004818 +0200 @@ -26,7 +26,6 @@ #include "xfs_log_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_alloc.h" From BATV+dc1ae48fd67a4d6e194a+2466+infradead.org+hch@bombadil.srs.infradead.org Tue May 25 05:04:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PA4Dcb240432 for ; Tue, 25 May 2010 05:04:13 -0500 X-ASG-Debug-ID: 1274781995-708403b70000-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 F272B36D309 for ; Tue, 25 May 2010 03:06:35 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id U6iYlI3fuGFKQLKZ for ; Tue, 25 May 2010 03:06:35 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OGr1v-0005jc-De; Tue, 25 May 2010 10:06:35 +0000 Date: Tue, 25 May 2010 06:06:35 -0400 From: Christoph Hellwig To: Jan Kara Cc: xfs@oss.sgi.com, hch@infradead.org X-ASG-Orig-Subj: Re: [PATCH 3/8] Test basic quota enforcement Subject: Re: [PATCH 3/8] Test basic quota enforcement Message-ID: <20100525100635.GA21252@infradead.org> References: <1274710459-11446-1-git-send-email-jack@suse.cz> <1274710459-11446-4-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274710459-11446-4-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274781995 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 24, 2010 at 04:14:14PM +0200, Jan Kara wrote: > Add a test which checks whether basic quota enforcement works. This one fails for me when testing and xfs filesystem on latest Linus' tree (with Debian -testing userspace): --- 230.out 2010-05-25 09:49:35.000000000 +0000 +++ 230.out.bad 2010-05-25 09:52:49.000000000 +0000 @@ -4,20 +4,22 @@ ### create files, setting up ownership (type=u) ### some buffered IO (type=u) +pwrite64: Disk quota exceeded *** Report for user quotas on device [SCR_DEV] Block grace time: 00:00; Inode grace time: 00:00 Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa -- 4 4 12 2 2 4 +fsgqa -- 0 4 12 2 2 4 00:00 +pwrite64: Disk quota exceeded *** Report for user quotas on device [SCR_DEV] Block grace time: 00:00; Inode grace time: 00:00 Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa +- 8 4 12 00:00 2 2 4 +fsgqa -- 0 4 12 2 2 4 00:00 pwrite64: Disk quota exceeded @@ -26,7 +28,7 @@ Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa +- 12 4 12 00:00 2 2 4 +fsgqa -- 0 4 12 2 2 4 00:00 pwrite64: Disk quota exceeded @@ -35,24 +37,26 @@ Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa +- 8 4 12 none 2 2 4 +fsgqa -- 0 4 12 2 2 4 none +touch: cannot touch `[SCR_MNT]/file3': Disk quota exceeded *** Report for user quotas on device [SCR_DEV] Block grace time: 00:00; Inode grace time: 00:00 Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa ++ 8 4 12 none 3 2 4 00:00 +fsgqa -- 0 4 12 2 2 4 none +touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded touch: cannot touch `[SCR_MNT]/file5': Disk quota exceeded *** Report for user quotas on device [SCR_DEV] Block grace time: 00:00; Inode grace time: 00:00 Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa ++ 8 4 12 none 4 2 4 00:00 +fsgqa -- 0 4 12 2 2 4 none touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded @@ -61,7 +65,7 @@ Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa ++ 8 4 12 none 3 2 4 none +fsgqa -- 0 4 12 2 2 4 none @@ -69,20 +73,22 @@ ### create files, setting up ownership (type=g) ### some buffered IO (type=g) +pwrite64: Disk quota exceeded *** Report for group quotas on device [SCR_DEV] Block grace time: 00:00; Inode grace time: 00:00 Block limits File limits Group used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa -- 4 4 12 2 2 4 +fsgqa -- 0 4 12 2 2 4 00:00 +pwrite64: Disk quota exceeded *** Report for group quotas on device [SCR_DEV] Block grace time: 00:00; Inode grace time: 00:00 Block limits File limits Group used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa +- 8 4 12 00:00 2 2 4 +fsgqa -- 0 4 12 2 2 4 00:00 pwrite64: Disk quota exceeded @@ -91,7 +97,7 @@ Block limits File limits Group used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa +- 12 4 12 00:00 2 2 4 +fsgqa -- 0 4 12 2 2 4 00:00 pwrite64: Disk quota exceeded @@ -100,24 +106,26 @@ Block limits File limits Group used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa +- 8 4 12 none 2 2 4 +fsgqa -- 0 4 12 2 2 4 none +touch: cannot touch `[SCR_MNT]/file3': Disk quota exceeded *** Report for group quotas on device [SCR_DEV] Block grace time: 00:00; Inode grace time: 00:00 Block limits File limits Group used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa ++ 8 4 12 none 3 2 4 00:00 +fsgqa -- 0 4 12 2 2 4 none +touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded touch: cannot touch `[SCR_MNT]/file5': Disk quota exceeded *** Report for group quotas on device [SCR_DEV] Block grace time: 00:00; Inode grace time: 00:00 Block limits File limits Group used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa ++ 8 4 12 none 4 2 4 00:00 +fsgqa -- 0 4 12 2 2 4 none touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded @@ -126,6 +134,6 @@ Block limits File limits Group used soft hard grace used soft hard grace ---------------------------------------------------------------------- -fsgqa ++ 8 4 12 none 3 2 4 none +fsgqa -- 0 4 12 2 2 4 none From BATV+dc1ae48fd67a4d6e194a+2466+infradead.org+hch@bombadil.srs.infradead.org Tue May 25 05:30:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PAUvTQ241662 for ; Tue, 25 May 2010 05:30:57 -0500 X-ASG-Debug-ID: 1274783598-355b003e0000-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 D23D836D444 for ; Tue, 25 May 2010 03:33:18 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id XbaElF4hN9Sx09Cz for ; Tue, 25 May 2010 03:33:18 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OGrRl-0003ix-Ju; Tue, 25 May 2010 10:33:17 +0000 Date: Tue, 25 May 2010 06:33:17 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss , "linux-fsdevel@vger.kernel.org" , linux-mm@kvack.org, Michael Monnerie X-ASG-Orig-Subj: Re: [PATCH (resend)] xfs: don't allow recursion into fs under write_begin Subject: Re: [PATCH (resend)] xfs: don't allow recursion into fs under write_begin Message-ID: <20100525103317.GB2864@infradead.org> References: <4BF8056E.8080900@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4BF8056E.8080900@sandeen.net> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274783599 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, May 22, 2010 at 11:25:18AM -0500, Eric Sandeen wrote: > Michael Monnerie reported this fantastic stack overflow: > I don't think we can afford to let write_begin recurse into the fs, > so we can set AOP_FLAG_NOFS ... is this too big a hammer? I don't really like it. There's nothing XFS-specific here - it's the same problem with direct reclaim calling back into the FS and causing massive amounts of problems. If we want to fix this class of problems we just need to do the same thing ext4 and btrfs already do and refuse to call the allocator from reclaim context. Just curious, how much stack does the path up to generic_perform_write use? From SRS0+91Ea+84+fromorbit.com=dave@internode.on.net Tue May 25 05:52:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PAqHcc242694 for ; Tue, 25 May 2010 05:52:18 -0500 X-ASG-Debug-ID: 1274784976-54eb00250000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BEB84A46806 for ; Tue, 25 May 2010 03:56:16 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id jEAoC2Fio7RI0MxF for ; Tue, 25 May 2010 03:56:16 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25478806-1927428 for multiple; Tue, 25 May 2010 20:24:22 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OGrm8-0007QH-Sr; Tue, 25 May 2010 20:54:20 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OGrm0-0007wU-Gw; Tue, 25 May 2010 20:54:12 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: [PATCH 2/6] writeback: Add tracing to balance_dirty_pages Subject: [PATCH 2/6] writeback: Add tracing to balance_dirty_pages Date: Tue, 25 May 2010 20:54:08 +1000 Message-Id: <1274784852-30502-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274784852-30502-1-git-send-email-david@fromorbit.com> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1274784978 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.2, rules version 3.2.2.30737 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Tracing high level background writeback events is good, but it doesn't give the entire picture. Add IO dispatched by foreground throttling to the writeback events. Signed-off-by: Dave Chinner --- fs/fs-writeback.c | 5 ++ include/trace/events/writeback.h | 80 ++++++++++++++++++++++++++++++++++++++ mm/page-writeback.c | 4 ++ 3 files changed, 89 insertions(+), 0 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index b44aba6..efa3d18 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -814,7 +814,11 @@ static long wb_writeback(struct bdi_writeback *wb, wbc.more_io = 0; wbc.nr_to_write = MAX_WRITEBACK_PAGES; wbc.pages_skipped = 0; + + trace_wbc_writeback_start(&wbc); writeback_inodes_wb(wb, &wbc); + trace_wbc_writeback_written(&wbc); + args->nr_pages -= MAX_WRITEBACK_PAGES - wbc.nr_to_write; wrote += MAX_WRITEBACK_PAGES - wbc.nr_to_write; @@ -842,6 +846,7 @@ static long wb_writeback(struct bdi_writeback *wb, if (!list_empty(&wb->b_more_io)) { inode = list_entry(wb->b_more_io.prev, struct inode, i_list); + trace_wbc_writeback_wait(&wbc); inode_wait_for_writeback(inode); } spin_unlock(&inode_lock); diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index df76457..72c1a12 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h @@ -7,6 +7,9 @@ #include #include +struct wb_writeback_args; +struct bdi_work; + TRACE_EVENT(writeback_queue, TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_args *args), @@ -165,6 +168,83 @@ TRACE_EVENT(writeback_bdi_register, TP_printk("%s: %s", __entry->name, __entry->start ? "registered" : "unregistered") ); + +/* pass flags explicitly */ +DECLARE_EVENT_CLASS(wbc_class, + TP_PROTO(struct writeback_control *wbc), + TP_ARGS(wbc), + TP_STRUCT__entry( + __field(unsigned int, wbc) + __array(char, name, 16) + __field(long, nr_to_write) + __field(long, pages_skipped) + __field(int, sb) + __field(int, sync_mode) + __field(int, nonblocking) + __field(int, encountered_congestion) + __field(int, for_kupdate) + __field(int, for_background) + __field(int, for_reclaim) + __field(int, range_cyclic) + __field(int, more_io) + __field(unsigned long, older_than_this) + __field(long, range_start) + __field(long, range_end) + ), + + TP_fast_assign( + char *__name = "(none)"; + + __entry->wbc = (unsigned long)wbc & 0xffff; + if (wbc->bdi) + strncpy(__entry->name, dev_name(wbc->bdi->dev), 16); + else + strncpy(__entry->name, __name, 16); + __entry->nr_to_write = wbc->nr_to_write; + __entry->pages_skipped = wbc->pages_skipped; + __entry->sb = !!wbc->sb; + __entry->sync_mode = wbc->sync_mode; + __entry->for_kupdate = wbc->for_kupdate; + __entry->for_background = wbc->for_background; + __entry->for_reclaim = wbc->for_reclaim; + __entry->range_cyclic = wbc->range_cyclic; + __entry->more_io = wbc->more_io; + __entry->older_than_this = wbc->older_than_this ? + *wbc->older_than_this : 0; + __entry->range_start = (long)wbc->range_start; + __entry->range_end = (long)wbc->range_end; + ), + + TP_printk("dev %s wbc=%x towrt=%ld skip=%ld sb=%d mode=%d kupd=%d " + "bgrd=%d reclm=%d cyclic=%d more=%d older=0x%lx " + "start=0x%lx end=0x%lx", + __entry->name, + __entry->wbc, + __entry->nr_to_write, + __entry->pages_skipped, + __entry->sb, + __entry->sync_mode, + __entry->for_kupdate, + __entry->for_background, + __entry->for_reclaim, + __entry->range_cyclic, + __entry->more_io, + __entry->older_than_this, + __entry->range_start, + __entry->range_end) +) + +#define DEFINE_WBC_EVENT(name) \ +DEFINE_EVENT(wbc_class, name, \ + TP_PROTO(struct writeback_control *wbc), \ + TP_ARGS(wbc)) +DEFINE_WBC_EVENT(wbc_writeback_start); +DEFINE_WBC_EVENT(wbc_writeback_written); +DEFINE_WBC_EVENT(wbc_writeback_wait); +DEFINE_WBC_EVENT(wbc_balance_dirty_start); +DEFINE_WBC_EVENT(wbc_balance_dirty_written); +DEFINE_WBC_EVENT(wbc_balance_dirty_wait); + #endif /* _TRACE_WRITEBACK_H */ /* This part must be outside protection */ diff --git a/mm/page-writeback.c b/mm/page-writeback.c index b289310..68eb727 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -34,6 +34,7 @@ #include #include #include +#include /* * After a CPU has dirtied this many pages, balance_dirty_pages_ratelimited @@ -536,11 +537,13 @@ static void balance_dirty_pages(struct address_space *mapping, * threshold otherwise wait until the disk writes catch * up. */ + trace_wbc_balance_dirty_start(&wbc); if (bdi_nr_reclaimable > bdi_thresh) { writeback_inodes_wbc(&wbc); pages_written += write_chunk - wbc.nr_to_write; get_dirty_limits(&background_thresh, &dirty_thresh, &bdi_thresh, bdi); + trace_wbc_balance_dirty_written(&wbc); } /* @@ -566,6 +569,7 @@ static void balance_dirty_pages(struct address_space *mapping, if (pages_written >= write_chunk) break; /* We've done our duty */ + trace_wbc_balance_dirty_wait(&wbc); __set_current_state(TASK_INTERRUPTIBLE); io_schedule_timeout(pause); -- 1.5.6.5 From SRS0+91Ea+84+fromorbit.com=dave@internode.on.net Tue May 25 05:52:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PAqToY242715 for ; Tue, 25 May 2010 05:52:29 -0500 X-ASG-Debug-ID: 1274784890-345e01170000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E972236D262 for ; Tue, 25 May 2010 03:54:50 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id DTAJZDC8TeIhR5ZS for ; Tue, 25 May 2010 03:54:50 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25780246-1927428 for multiple; Tue, 25 May 2010 20:24:32 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OGrmI-0007QM-O4; Tue, 25 May 2010 20:54:30 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OGrm0-0007wQ-C0; Tue, 25 May 2010 20:54:12 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: [PATCH 0/6] writeback: tracing and fixes Subject: [PATCH 0/6] writeback: tracing and fixes Date: Tue, 25 May 2010 20:54:06 +1000 Message-Id: <1274784852-30502-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1274784891 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.2, rules version 3.2.2.30738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This series contains the initial writeback tracing patches from Jens, as well as the extensions I added to provide visibility into writeback control structures as the are used by the writeback code. The visibility given is sufficient to understand what is happening in the writeback path - what path is writing data, what path is blocking on congestion, etc, and to determine the differences in behaviour for different sync modes and calling contexts. This tracing really needs to be integrated into mainline so that anyone can improve the tracing as they use it to track down problems in our convoluted writeback paths. The remaining patches are fixes to problems that the new tracing highlighted. Version 2: - included ext4 write_cache_pages separation patch from Ted Ts'o. - moved CREATE_TRACE_POINTS into fs-writeback.c as suggested by Christoph Hellwig. - moved include of trace/events/writeback.h until after structure definitions in fs-writeback.c - manually revert changes made to write_cache_pages() in 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4 that caused the regression. This restores the convention that if the fs writes back more than a single page, it subtracts (nr_written - 1) from wbc->nr_to_write, as suggested by Andrew Morton. - added patch to prevent sync from looping in write_cache_pages chasing a moving tail when an appending write workload is running concurrently with sync. From SRS0+Kyl4+84+fromorbit.com=dave@internode.on.net Tue May 25 05:52:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_21, J_CHICKENPOX_33,J_CHICKENPOX_35,J_CHICKENPOX_36 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PAqUio242723 for ; Tue, 25 May 2010 05:52:30 -0500 X-ASG-Debug-ID: 1274784891-1eae028f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A41A336D262 for ; Tue, 25 May 2010 03:54:51 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id bDXnTPuooAWSWQyv for ; Tue, 25 May 2010 03:54:51 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25519895-1927428 for multiple; Tue, 25 May 2010 20:24:42 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OGrmI-0007QP-Vo; Tue, 25 May 2010 20:54:31 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OGrm0-0007wW-Iw; Tue, 25 May 2010 20:54:12 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: [PATCH 3/6] ext4: Use our own write_cache_pages() Subject: [PATCH 3/6] ext4: Use our own write_cache_pages() Date: Tue, 25 May 2010 20:54:09 +1000 Message-Id: <1274784852-30502-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274784852-30502-1-git-send-email-david@fromorbit.com> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1274784892 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.2, rules version 3.2.2.30738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Theodore Ts'o Make a copy of write_cache_pages() for the benefit of ext4_da_writepages(). This allows us to simplify the code some, and will allow us to further customize the code in future patches. There are some nasty hacks in write_cache_pages(), which Linus has (correctly) characterized as vile. I've just copied it into write_cache_pages_da(), without trying to clean those bits up lest I break something in the ext4's delalloc implementation, which is a bit fragile right now. This will allow Dave Chinner to clean up write_cache_pages() in mm/page-writeback.c, without worrying about breaking ext4. Eventually write_cache_pages_da() will go away when I rewrite ext4's delayed allocation and create a general ext4_writepages() which is used for all of ext4's writeback. Until now this is the lowest risk way to clean up the core write_cache_pages() function. Signed-off-by: "Theodore Ts'o" --- fs/ext4/inode.c | 141 ++++++++++++++++++++++++++++++++++++------- include/trace/events/ext4.h | 5 +- 2 files changed, 120 insertions(+), 26 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 3e0f6af..cdd4abe 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2423,17 +2423,6 @@ static int __mpage_da_writepage(struct page *page, struct buffer_head *bh, *head; sector_t logical; - if (mpd->io_done) { - /* - * Rest of the page in the page_vec - * redirty then and skip then. We will - * try to write them again after - * starting a new transaction - */ - redirty_page_for_writepage(wbc, page); - unlock_page(page); - return MPAGE_DA_EXTENT_TAIL; - } /* * Can we merge this page to current extent? */ @@ -2828,6 +2817,124 @@ static int ext4_da_writepages_trans_blocks(struct inode *inode) return ext4_chunk_trans_blocks(inode, max_blocks); } +/* + * write_cache_pages_da - walk the list of dirty pages of the given + * address space and call the callback function (which usually writes + * the pages). + * + * This is a forked version of write_cache_pages(). Differences: + * Range cyclic is ignored. + * no_nrwrite_index_update is always presumed true + */ +static int write_cache_pages_da(struct address_space *mapping, + struct writeback_control *wbc, + struct mpage_da_data *mpd) +{ + int ret = 0; + int done = 0; + struct pagevec pvec; + int nr_pages; + pgoff_t index; + pgoff_t end; /* Inclusive */ + long nr_to_write = wbc->nr_to_write; + + pagevec_init(&pvec, 0); + index = wbc->range_start >> PAGE_CACHE_SHIFT; + end = wbc->range_end >> PAGE_CACHE_SHIFT; + + while (!done && (index <= end)) { + int i; + + nr_pages = pagevec_lookup_tag(&pvec, mapping, &index, + PAGECACHE_TAG_DIRTY, + min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1); + if (nr_pages == 0) + break; + + for (i = 0; i < nr_pages; i++) { + struct page *page = pvec.pages[i]; + + /* + * At this point, the page may be truncated or + * invalidated (changing page->mapping to NULL), or + * even swizzled back from swapper_space to tmpfs file + * mapping. However, page->index will not change + * because we have a reference on the page. + */ + if (page->index > end) { + done = 1; + break; + } + + lock_page(page); + + /* + * Page truncated or invalidated. We can freely skip it + * then, even for data integrity operations: the page + * has disappeared concurrently, so there could be no + * real expectation of this data interity operation + * even if there is now a new, dirty page at the same + * pagecache address. + */ + if (unlikely(page->mapping != mapping)) { +continue_unlock: + unlock_page(page); + continue; + } + + if (!PageDirty(page)) { + /* someone wrote it for us */ + goto continue_unlock; + } + + if (PageWriteback(page)) { + if (wbc->sync_mode != WB_SYNC_NONE) + wait_on_page_writeback(page); + else + goto continue_unlock; + } + + BUG_ON(PageWriteback(page)); + if (!clear_page_dirty_for_io(page)) + goto continue_unlock; + + ret = __mpage_da_writepage(page, wbc, mpd); + if (unlikely(ret)) { + if (ret == AOP_WRITEPAGE_ACTIVATE) { + unlock_page(page); + ret = 0; + } else { + done = 1; + break; + } + } + + if (nr_to_write > 0) { + nr_to_write--; + if (nr_to_write == 0 && + wbc->sync_mode == WB_SYNC_NONE) { + /* + * We stop writing back only if we are + * not doing integrity sync. In case of + * integrity sync we have to keep going + * because someone may be concurrently + * dirtying pages, and we might have + * synced a lot of newly appeared dirty + * pages, but have not synced all of the + * old dirty pages. + */ + done = 1; + break; + } + } + } + pagevec_release(&pvec); + cond_resched(); + } + return ret; +} + + static int ext4_da_writepages(struct address_space *mapping, struct writeback_control *wbc) { @@ -2836,7 +2943,6 @@ static int ext4_da_writepages(struct address_space *mapping, handle_t *handle = NULL; struct mpage_da_data mpd; struct inode *inode = mapping->host; - int no_nrwrite_index_update; int pages_written = 0; long pages_skipped; unsigned int max_pages; @@ -2916,12 +3022,6 @@ static int ext4_da_writepages(struct address_space *mapping, mpd.wbc = wbc; mpd.inode = mapping->host; - /* - * we don't want write_cache_pages to update - * nr_to_write and writeback_index - */ - no_nrwrite_index_update = wbc->no_nrwrite_index_update; - wbc->no_nrwrite_index_update = 1; pages_skipped = wbc->pages_skipped; retry: @@ -2963,8 +3063,7 @@ retry: mpd.io_done = 0; mpd.pages_written = 0; mpd.retval = 0; - ret = write_cache_pages(mapping, wbc, __mpage_da_writepage, - &mpd); + ret = write_cache_pages_da(mapping, wbc, &mpd); /* * If we have a contiguous extent of pages and we * haven't done the I/O yet, map the blocks and submit @@ -3030,8 +3129,6 @@ retry: mapping->writeback_index = index; out_writepages: - if (!no_nrwrite_index_update) - wbc->no_nrwrite_index_update = 0; wbc->nr_to_write -= nr_to_writebump; wbc->range_start = range_start; trace_ext4_da_writepages_result(inode, wbc, ret, pages_written); diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 2aa6aa3..fe76c15 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -306,7 +306,6 @@ TRACE_EVENT(ext4_da_writepages_result, __field( int, pages_written ) __field( long, pages_skipped ) __field( char, more_io ) - __field( char, no_nrwrite_index_update ) __field( pgoff_t, writeback_index ) ), @@ -317,16 +316,14 @@ TRACE_EVENT(ext4_da_writepages_result, __entry->pages_written = pages_written; __entry->pages_skipped = wbc->pages_skipped; __entry->more_io = wbc->more_io; - __entry->no_nrwrite_index_update = wbc->no_nrwrite_index_update; __entry->writeback_index = inode->i_mapping->writeback_index; ), - TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld more_io %d no_nrwrite_index_update %d writeback_index %lu", + TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld more_io %d writeback_index %lu", jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, __entry->ret, __entry->pages_written, __entry->pages_skipped, __entry->more_io, - __entry->no_nrwrite_index_update, (unsigned long) __entry->writeback_index) ); -- 1.5.6.5 From SRS0+91Ea+84+fromorbit.com=dave@internode.on.net Tue May 25 05:52:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PAqW9b242744 for ; Tue, 25 May 2010 05:52:32 -0500 X-ASG-Debug-ID: 1274784992-2a7f035b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F1944A46A52 for ; Tue, 25 May 2010 03:56:32 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id INC1lYzZrZ6x0ZM9 for ; Tue, 25 May 2010 03:56:32 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13903828-1927428 for ; Tue, 25 May 2010 20:24:52 +0930 (CST) Received: from [192.168.1.9] (helo=disturbed) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OGrmI-0007QG-Nu; Tue, 25 May 2010 20:54:30 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OGrm0-0007wS-EA; Tue, 25 May 2010 20:54:12 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: [PATCH 1/6] writeback: initial tracing support Subject: [PATCH 1/6] writeback: initial tracing support Date: Tue, 25 May 2010 20:54:07 +1000 Message-Id: <1274784852-30502-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274784852-30502-1-git-send-email-david@fromorbit.com> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1274784993 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.2, rules version 3.2.2.30737 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: From: Jens Axboe Trace queue/sched/exec parts of the writeback loop. Signed-off-by: Jens Axboe Signed-off-by: Dave Chinner --- fs/fs-writeback.c | 40 +++++++-- include/trace/events/writeback.h | 171 ++++++++++++++++++++++++++++++++++++++ mm/backing-dev.c | 3 + 3 files changed, 204 insertions(+), 10 deletions(-) create mode 100644 include/trace/events/writeback.h diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index b1e76ef..b44aba6 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -26,15 +26,9 @@ #include #include #include +#include #include "internal.h" -#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) - -/* - * We don't actually have pdflush, but this one is exported though /proc... - */ -int nr_pdflush_threads; - /* * Passed into wb_writeback(), essentially a subset of writeback_control */ @@ -63,6 +57,16 @@ struct bdi_work { unsigned long state; /* flag bits, see WS_* */ }; +#define CREATE_TRACE_POINTS +#include + +#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) + +/* + * We don't actually have pdflush, but this one is exported though /proc... + */ +int nr_pdflush_threads; + enum { WS_USED_B = 0, WS_ONSTACK_B, @@ -137,6 +141,8 @@ static void wb_work_complete(struct bdi_work *work) static void wb_clear_pending(struct bdi_writeback *wb, struct bdi_work *work) { + trace_writeback_clear(work); + /* * The caller has retrieved the work arguments from this work, * drop our reference. If this is the last ref, delete and free it @@ -172,12 +178,16 @@ static void bdi_queue_work(struct backing_dev_info *bdi, struct bdi_work *work) * If the default thread isn't there, make sure we add it. When * it gets created and wakes up, we'll run this work. */ - if (unlikely(list_empty_careful(&bdi->wb_list))) + if (unlikely(list_empty_careful(&bdi->wb_list))) { + trace_writeback_sched(bdi, work, "default"); wake_up_process(default_backing_dev_info.wb.task); - else { + } else { struct bdi_writeback *wb = &bdi->wb; + struct task_struct *task = wb->task; - if (wb->task) + trace_writeback_sched(bdi, work, task ? "task" : "notask"); + + if (task) wake_up_process(wb->task); } } @@ -205,6 +215,7 @@ static void bdi_alloc_queue_work(struct backing_dev_info *bdi, work = kmalloc(sizeof(*work), GFP_ATOMIC); if (work) { bdi_work_init(work, args); + trace_writeback_queue(bdi, args); bdi_queue_work(bdi, work); if (wait) bdi_wait_on_work_clear(work); @@ -245,6 +256,7 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi, bdi_work_init(&work, &args); work.state |= WS_ONSTACK; + trace_writeback_queue(bdi, &args); bdi_queue_work(bdi, &work); bdi_wait_on_work_clear(&work); } @@ -914,6 +926,8 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait) struct wb_writeback_args args = work->args; int post_clear; + trace_writeback_exec(work); + /* * Override sync mode, in case we must wait for completion */ @@ -957,9 +971,13 @@ int bdi_writeback_task(struct bdi_writeback *wb) unsigned long wait_jiffies = -1UL; long pages_written; + trace_writeback_thread_start(1); + while (!kthread_should_stop()) { pages_written = wb_do_writeback(wb, 0); + trace_writeback_pages_written(pages_written); + if (pages_written) last_active = jiffies; else if (wait_jiffies != -1UL) { @@ -989,6 +1007,8 @@ int bdi_writeback_task(struct bdi_writeback *wb) try_to_freeze(); } + trace_writeback_thread_start(0); + return 0; } diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h new file mode 100644 index 0000000..df76457 --- /dev/null +++ b/include/trace/events/writeback.h @@ -0,0 +1,171 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM writeback + +#if !defined(_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_WRITEBACK_H + +#include +#include + +TRACE_EVENT(writeback_queue, + + TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_args *args), + + TP_ARGS(bdi, args), + + TP_STRUCT__entry( + __array(char, name, 16) + __field(long, nr_pages) + __field(int, sb) + __field(int, sync_mode) + __field(int, for_kupdate) + __field(int, range_cyclic) + __field(int, for_background) + ), + + TP_fast_assign( + strncpy(__entry->name, dev_name(bdi->dev), 16); + __entry->nr_pages = args->nr_pages; + __entry->sb = !!args->sb; + __entry->for_kupdate = args->for_kupdate; + __entry->range_cyclic = args->range_cyclic; + __entry->for_background = args->for_background; + ), + + TP_printk("%s: pages=%ld, sb=%d, kupdate=%d, range_cyclic=%d " + "for_background=%d", __entry->name, __entry->nr_pages, + __entry->sb, __entry->for_kupdate, + __entry->range_cyclic, __entry->for_background) +); + +TRACE_EVENT(writeback_sched, + + TP_PROTO(struct backing_dev_info *bdi, struct bdi_work *work, + const char *msg), + + TP_ARGS(bdi, work, msg), + + TP_STRUCT__entry( + __array(char, name, 16) + __field(unsigned int, work) + __array(char, task, 8) + ), + + TP_fast_assign( + strncpy(__entry->name, dev_name(bdi->dev), 16); + __entry->work = (unsigned long) work & 0xffff; + snprintf(__entry->task, 8, "%s", msg); + ), + + TP_printk("work=%x, task=%s", __entry->work, __entry->task) +); + +TRACE_EVENT(writeback_exec, + + TP_PROTO(struct bdi_work *work), + + TP_ARGS(work), + + TP_STRUCT__entry( + __field(unsigned int, work) + __field(long, nr_pages) + __field(int, sb) + __field(int, sync_mode) + __field(int, for_kupdate) + __field(int, range_cyclic) + __field(int, for_background) + ), + + TP_fast_assign( + __entry->work = (unsigned long) work & 0xffff; + __entry->nr_pages = work->args.nr_pages; + __entry->sb = !!work->args.sb; + __entry->for_kupdate = work->args.for_kupdate; + __entry->range_cyclic = work->args.range_cyclic; + __entry->for_background = work->args.for_background; + + ), + + TP_printk("work=%x pages=%ld, sb=%d, kupdate=%d, range_cyclic=%d" + " for_background=%d", __entry->work, + __entry->nr_pages, __entry->sb, __entry->for_kupdate, + __entry->range_cyclic, __entry->for_background) +); + +TRACE_EVENT(writeback_clear, + + TP_PROTO(struct bdi_work *work), + + TP_ARGS(work), + + TP_STRUCT__entry( + __field(struct bdi_work *, work) + __field(int, refs) + ), + + TP_fast_assign( + __entry->work = work; + __entry->refs = atomic_read(&work->pending); + ), + + TP_printk("work=%p, refs=%d", __entry->work, __entry->refs) +); + +TRACE_EVENT(writeback_pages_written, + + TP_PROTO(long pages_written), + + TP_ARGS(pages_written), + + TP_STRUCT__entry( + __field(long, pages) + ), + + TP_fast_assign( + __entry->pages = pages_written; + ), + + TP_printk("%ld", __entry->pages) +); + + +TRACE_EVENT(writeback_thread_start, + + TP_PROTO(int start), + + TP_ARGS(start), + + TP_STRUCT__entry( + __field(int, start) + ), + + TP_fast_assign( + __entry->start = start; + ), + + TP_printk("%s", __entry->start ? "started" : "exited") +); + +TRACE_EVENT(writeback_bdi_register, + + TP_PROTO(const char *name, int start), + + TP_ARGS(name, start), + + TP_STRUCT__entry( + __array(char, name, 16) + __field(int, start) + ), + + TP_fast_assign( + strncpy(__entry->name, name, 16); + __entry->start = start; + ), + + TP_printk("%s: %s", __entry->name, + __entry->start ? "registered" : "unregistered") +); +#endif /* _TRACE_WRITEBACK_H */ + +/* This part must be outside protection */ +#include diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 660a87a..1f7723b 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -10,6 +10,7 @@ #include #include #include +#include static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0); @@ -585,6 +586,7 @@ int bdi_register(struct backing_dev_info *bdi, struct device *parent, bdi_debug_register(bdi, dev_name(dev)); set_bit(BDI_registered, &bdi->state); + trace_writeback_bdi_register(dev_name(dev), 1); exit: return ret; } @@ -647,6 +649,7 @@ static void bdi_prune_sb(struct backing_dev_info *bdi) void bdi_unregister(struct backing_dev_info *bdi) { if (bdi->dev) { + trace_writeback_bdi_register(dev_name(bdi->dev), 0); bdi_prune_sb(bdi); if (!bdi_cap_flush_forker(bdi)) -- 1.5.6.5 From SRS0+jgKn+84+fromorbit.com=dave@internode.on.net Tue May 25 05:52:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PAqZAO242760 for ; Tue, 25 May 2010 05:52:36 -0500 X-ASG-Debug-ID: 1274784896-252c023c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5CB5A36D26A for ; Tue, 25 May 2010 03:54:56 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id tKYJVeMyE3v7GM54 for ; Tue, 25 May 2010 03:54:56 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25350873-1927428 for multiple; Tue, 25 May 2010 20:24:42 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OGrmT-0007QQ-2o; Tue, 25 May 2010 20:54:41 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OGrm0-0007wb-P0; Tue, 25 May 2010 20:54:12 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: [PATCH 5/6] xfs: remove nr_to_write writeback windup. Subject: [PATCH 5/6] xfs: remove nr_to_write writeback windup. Date: Tue, 25 May 2010 20:54:11 +1000 Message-Id: <1274784852-30502-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274784852-30502-1-git-send-email-david@fromorbit.com> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1274784898 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.2, rules version 3.2.2.30738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Now that the background flush code has been fixed, we shouldn't need to silently multiply the wbc->nr_to_write to get good writeback. Remove that code. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_aops.c | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 089eaca..4c89db3 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c @@ -1366,14 +1366,6 @@ xfs_vm_writepage( if (!page_has_buffers(page)) create_empty_buffers(page, 1 << inode->i_blkbits, 0); - - /* - * VM calculation for nr_to_write seems off. Bump it way - * up, this gets simple streaming writes zippy again. - * To be reviewed again after Jens' writeback changes. - */ - wbc->nr_to_write *= 4; - /* * Convert delayed allocate, unwritten or unmapped space * to real space and flush out to disk. -- 1.5.6.5 From SRS0+91Ea+84+fromorbit.com=dave@internode.on.net Tue May 25 05:52:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_ATTENTION autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PAqedY242788 for ; Tue, 25 May 2010 05:52:40 -0500 X-ASG-Debug-ID: 1274784900-4c08035f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 46A18143FFC6 for ; Tue, 25 May 2010 03:55:00 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id kIiiRRUQFNAkCwUr for ; Tue, 25 May 2010 03:55:00 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13903829-1927428 for multiple; Tue, 25 May 2010 20:24:52 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OGrmT-0007Qc-1W; Tue, 25 May 2010 20:54:41 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OGrm0-0007wY-N2; Tue, 25 May 2010 20:54:12 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Date: Tue, 25 May 2010 20:54:10 +1000 Message-Id: <1274784852-30502-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274784852-30502-1-git-send-email-david@fromorbit.com> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1274784902 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.2, rules version 3.2.2.30738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner If a filesystem writes more than one page in ->writepage, write_cache_pages fails to notice this and continues to attempt writeback when wbc->nr_to_write has gone negative - this trace was captured from XFS: wbc_writeback_start: towrt=1024 wbc_writepage: towrt=1024 wbc_writepage: towrt=0 wbc_writepage: towrt=-1 wbc_writepage: towrt=-5 wbc_writepage: towrt=-21 wbc_writepage: towrt=-85 This has adverse effects on filesystem writeback behaviour. write_cache_pages() needs to terminate after a certain number of pages are written, not after a certain number of calls to ->writepage are made. This is a regression introduced by 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4, but cannot be reverted directly due to subsequent bug fixes that have gone in on top of it. This commit adds a ->writepage tracepoint inside write_cache_pages() (how the above trace was generated) and does the revert manually leaving the subsequent bug fixes in tact. ext4 is not affected by this as a previous commit in the series stops ext4 from using the generic function. Signed-off-by: Dave Chinner --- include/linux/writeback.h | 9 --------- include/trace/events/writeback.h | 1 + mm/page-writeback.c | 16 ++++++---------- 3 files changed, 7 insertions(+), 19 deletions(-) diff --git a/include/linux/writeback.h b/include/linux/writeback.h index a74837e..488ac1c 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -55,15 +55,6 @@ struct writeback_control { unsigned for_reclaim:1; /* Invoked from the page allocator */ unsigned range_cyclic:1; /* range_start is cyclic */ unsigned more_io:1; /* more io to be dispatched */ - /* - * write_cache_pages() won't update wbc->nr_to_write and - * mapping->writeback_index if no_nrwrite_index_update - * is set. write_cache_pages() may write more than we - * requested and we want to make sure nr_to_write and - * writeback_index are updated in a consistent manner - * so we use a single control to update them - */ - unsigned no_nrwrite_index_update:1; /* * For WB_SYNC_ALL, the sb must always be pinned. For WB_SYNC_NONE, diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index 72c1a12..5dda40e 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h @@ -244,6 +244,7 @@ DEFINE_WBC_EVENT(wbc_writeback_wait); DEFINE_WBC_EVENT(wbc_balance_dirty_start); DEFINE_WBC_EVENT(wbc_balance_dirty_written); DEFINE_WBC_EVENT(wbc_balance_dirty_wait); +DEFINE_WBC_EVENT(wbc_writepage); #endif /* _TRACE_WRITEBACK_H */ diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 68eb727..0fe713d 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -839,7 +839,6 @@ int write_cache_pages(struct address_space *mapping, pgoff_t done_index; int cycled; int range_whole = 0; - long nr_to_write = wbc->nr_to_write; pagevec_init(&pvec, 0); if (wbc->range_cyclic) { @@ -921,6 +920,7 @@ continue_unlock: if (!clear_page_dirty_for_io(page)) goto continue_unlock; + trace_wbc_writepage(wbc); ret = (*writepage)(page, wbc, data); if (unlikely(ret)) { if (ret == AOP_WRITEPAGE_ACTIVATE) { @@ -939,11 +939,10 @@ continue_unlock: done = 1; break; } - } + } - if (nr_to_write > 0) { - nr_to_write--; - if (nr_to_write == 0 && + if (wbc->nr_to_write > 0) { + if (--wbc->nr_to_write == 0 && wbc->sync_mode == WB_SYNC_NONE) { /* * We stop writing back only if we are @@ -974,11 +973,8 @@ continue_unlock: end = writeback_index - 1; goto retry; } - if (!wbc->no_nrwrite_index_update) { - if (wbc->range_cyclic || (range_whole && nr_to_write > 0)) - mapping->writeback_index = done_index; - wbc->nr_to_write = nr_to_write; - } + if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) + mapping->writeback_index = done_index; return ret; } -- 1.5.6.5 From SRS0+z1ZS+84+fromorbit.com=dave@internode.on.net Tue May 25 05:52:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PAqZCm242762 for ; Tue, 25 May 2010 05:52:36 -0500 X-ASG-Debug-ID: 1274784896-356800fb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6FD4736D26E for ; Tue, 25 May 2010 03:54:57 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id hlOgvMi29z7qR3d8 for ; Tue, 25 May 2010 03:54:57 -0700 (PDT) Received: from dastard (unverified [121.44.31.48]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25646791-1927428 for multiple; Tue, 25 May 2010 20:24:43 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OGrmJ-0007QU-6B; Tue, 25 May 2010 20:54:31 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OGrm0-0007we-Rf; Tue, 25 May 2010 20:54:12 +1000 From: Dave Chinner To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Subject: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Date: Tue, 25 May 2010 20:54:12 +1000 Message-Id: <1274784852-30502-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1274784852-30502-1-git-send-email-david@fromorbit.com> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1274784898 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.2, rules version 3.2.2.30738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner sync can currently take a really long time if a concurrent writer is extending a file. The problem is that the dirty pages on the address space grow in the same direction as write_cache_pages scans, so if the writer keeps ahead of writeback, the writeback will not terminate until the writer stops adding dirty pages. For a data integrity sync, we only need to write the pages dirty at the time we start the writeback, so we can stop scanning once we get to the page that was at the end of the file at the time the scan started. This will prevent operations like copying a large file preventing sync from completing as it will not write back pages that were dirtied after the sync was started. This does not impact the existing integrity guarantees, as any dirty page (old or new) within the EOF range at the start of the scan will still be captured. Signed-off-by: Dave Chinner --- mm/page-writeback.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 0fe713d..c97e973 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -855,7 +855,22 @@ int write_cache_pages(struct address_space *mapping, if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) range_whole = 1; cycled = 1; /* ignore range_cyclic tests */ + + /* + * If this is a data integrity sync, cap the writeback to the + * current end of file. Any extension to the file that occurs + * after this is a new write and we don't need to write those + * pages out to fulfil our data integrity requirements. If we + * try to write them out, we can get stuck in this scan until + * the concurrent writer stops adding dirty pages and extending + * EOF. + */ + if (wbc->sync_mode == WB_SYNC_ALL && + wbc->range_end == LLONG_MAX) { + end = i_size_read(mapping->host) >> PAGE_CACHE_SHIFT; + } } + retry: done_index = index; while (!done && (index <= end)) { -- 1.5.6.5 From BATV+dc1ae48fd67a4d6e194a+2466+infradead.org+hch@bombadil.srs.infradead.org Tue May 25 06:08:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_ATTENTION autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PB8k1n243491 for ; Tue, 25 May 2010 06:08:47 -0500 X-ASG-Debug-ID: 1274785868-0da501580000-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 C7B261440466 for ; Tue, 25 May 2010 04:11:08 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 9T2jAeIJh5F4BTnC for ; Tue, 25 May 2010 04:11:08 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OGs2M-0002Gl-2q; Tue, 25 May 2010 11:11:06 +0000 Date: Tue, 25 May 2010 07:11:06 -0400 From: Christoph Hellwig To: Dave Chinner Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: Re: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Message-ID: <20100525111106.GA6076@infradead.org> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274784852-30502-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274785868 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 08:54:10PM +1000, Dave Chinner wrote: > This commit adds a ->writepage tracepoint inside write_cache_pages() (how the > above trace was generated) and does the revert manually leaving the subsequent The tracepoint really should be a separate commit, probably ordered before the ext4 revert. From BATV+dc1ae48fd67a4d6e194a+2466+infradead.org+hch@bombadil.srs.infradead.org Tue May 25 06:11:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PBB42B243622 for ; Tue, 25 May 2010 06:11:05 -0500 X-ASG-Debug-ID: 1274786007-19b5005d0000-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 6DEA214404F9 for ; Tue, 25 May 2010 04:13:27 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id mzmnVUpesT1CSbs5 for ; Tue, 25 May 2010 04:13:27 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OGs4c-0002N1-JZ; Tue, 25 May 2010 11:13:26 +0000 Date: Tue, 25 May 2010 07:13:26 -0400 From: Christoph Hellwig To: Dave Chinner Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 1/6] writeback: initial tracing support Subject: Re: [PATCH 1/6] writeback: initial tracing support Message-ID: <20100525111326.GA8931@infradead.org> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274784852-30502-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274786007 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > +#define CREATE_TRACE_POINTS > +#include It might be worth to add a comment why this is in an unusal place. Otherwise looks good, Reviewed-by: Christoph Hellwig From BATV+dc1ae48fd67a4d6e194a+2466+infradead.org+hch@bombadil.srs.infradead.org Tue May 25 06:11:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PBBNj4243643 for ; Tue, 25 May 2010 06:11:23 -0500 X-ASG-Debug-ID: 1274786026-1eae03570000-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 412AA36D5CC for ; Tue, 25 May 2010 04:13:46 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id MF7Lhjpy40ina3Np for ; Tue, 25 May 2010 04:13:46 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OGs4v-0002O9-6P; Tue, 25 May 2010 11:13:45 +0000 Date: Tue, 25 May 2010 07:13:45 -0400 From: Christoph Hellwig To: Dave Chinner Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 2/6] writeback: Add tracing to balance_dirty_pages Subject: Re: [PATCH 2/6] writeback: Add tracing to balance_dirty_pages Message-ID: <20100525111345.GB8931@infradead.org> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274784852-30502-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274786026 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 08:54:08PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Tracing high level background writeback events is good, but it doesn't > give the entire picture. Add IO dispatched by foreground throttling to the > writeback events. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+dc1ae48fd67a4d6e194a+2466+infradead.org+hch@bombadil.srs.infradead.org Tue May 25 06:11:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PBBqKB243674 for ; Tue, 25 May 2010 06:11:52 -0500 X-ASG-Debug-ID: 1274786054-1afd003a0000-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 EE699144056F for ; Tue, 25 May 2010 04:14:14 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id MhElVvfboWnNMmhs for ; Tue, 25 May 2010 04:14:14 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OGs5O-0002Pl-47; Tue, 25 May 2010 11:14:14 +0000 Date: Tue, 25 May 2010 07:14:14 -0400 From: Christoph Hellwig To: Dave Chinner Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 5/6] xfs: remove nr_to_write writeback windup. Subject: Re: [PATCH 5/6] xfs: remove nr_to_write writeback windup. Message-ID: <20100525111414.GC8931@infradead.org> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274784852-30502-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274786054 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 08:54:11PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Now that the background flush code has been fixed, we shouldn't need to > silently multiply the wbc->nr_to_write to get good writeback. Remove > that code. > > Signed-off-by: Dave Chinner Ok, Reviewed-by: Christoph Hellwig From roger@filmlight.ltd.uk Tue May 25 07:30:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PCUmAD248156 for ; Tue, 25 May 2010 07:30:48 -0500 X-ASG-Debug-ID: 1274790889-7c3601960000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from a.mx.filmlight.ltd.uk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id D62221576706 for ; Tue, 25 May 2010 05:34:50 -0700 (PDT) Received: from a.mx.filmlight.ltd.uk (alto.filmlight.ltd.uk [77.107.81.250]) by cuda.sgi.com with SMTP id odDxoOya6ET8pZxH for ; Tue, 25 May 2010 05:34:50 -0700 (PDT) Received: (qmail 26397 invoked from network); 25 May 2010 12:33:08 -0000 Received: from montana.filmlight.ltd.uk (HELO ?10.44.0.177?) (roger@10.44.0.177) by a.mx.filmlight.ltd.uk with ESMTPA; 25 May 2010 12:33:08 -0000 X-ASG-Orig-Subj: Re: Is persistant preallocation possible? Subject: Re: Is persistant preallocation possible? From: Roger Willcocks To: Eric Sandeen Cc: Nathan Scott , Jeff Zheng , xfs@oss.sgi.com In-Reply-To: <4BFB41D8.3020402@sandeen.net> References: <1374176788.272721274754374474.JavaMail.root@mail-au.aconex.com> <4BFB41D8.3020402@sandeen.net> Content-Type: text/plain; charset=UTF-8 Date: Tue, 25 May 2010 13:33:07 +0100 Message-Id: <1274790787.17233.281.camel@montana.filmlight.ltd.uk> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-8.el5_2.2) Content-Transfer-Encoding: 8bit X-Barracuda-Connect: alto.filmlight.ltd.uk[77.107.81.250] X-Barracuda-Start-Time: 1274790890 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.2, rules version 3.2.2.30738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 2010-05-24 at 22:19 -0500, Eric Sandeen wrote: > Nathan Scott wrote: > > ----- "Jeff Zheng" wrote: > > > >> Hi, > >> > >> We are trying to control where the files are being allocated on the > >> disks, and we tried xfs preallocation. What we found is that each time > >> the file being reopened the location of the pre-allocated space could > >> change (not all the time). Is there a way to do persistent > >> preallocation in xfs, like the same file will always be on the same > >> location on the disk given that the requested size doesn’t change? > >> > > > > Sounds like you are truncating the file (on open?), and hence discarding > > the preallocation. XFS preallocation is persistent already, so I think > > something you are doing must be discarding those preallocated extents. > > > > Could you post a test program, or sequence of xfs_io commands, that would > > demonstrate the problem? > > > > cheers. > > > > ... maybe you mean that truncating / pre-allocating the same space repeatedly > on the same filename ends up with blocks mapped in different locations...? > That's entirely expected... nothing about the preallocation interface lets > you "control *where* files are being allocated" as you said above... > Way back when I wrote some code to do just this, but I've never had the time to wrap it all up. The basic idea is to add another argument to preallocate, as a hint where to try first. The allocator then uses the 'extend file' path, with the hint taking the place of the current eof. See http://oss.sgi.com/archives/xfs/2006-07/msg01005.html for my original patches. I'd still like to have these pushed through - what would it take? -- Roger Willcocks From tytso@thunk.org Tue May 25 08:04:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PD48Pb249826 for ; Tue, 25 May 2010 08:04:08 -0500 X-ASG-Debug-ID: 1274792790-61de02690000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from thunker.thunk.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A631436DEA4 for ; Tue, 25 May 2010 06:06:30 -0700 (PDT) Received: from thunker.thunk.org (thunk.org [69.25.196.29]) by cuda.sgi.com with ESMTP id xDgktCoyxyMskGA9 for ; Tue, 25 May 2010 06:06:30 -0700 (PDT) Received: from root (helo=closure.thunk.org) by thunker.thunk.org with local-esmtp (Exim 4.50 #1 (Debian)) id 1OGtpy-0007YB-VX; Tue, 25 May 2010 09:06:27 -0400 Received: from tytso by closure.thunk.org with local (Exim 4.69) (envelope-from ) id 1OGtpy-0003gY-4H; Tue, 25 May 2010 09:06:26 -0400 Date: Tue, 25 May 2010 09:06:26 -0400 From: tytso@mit.edu To: Dave Chinner Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 3/6] ext4: Use our own write_cache_pages() Subject: Re: [PATCH 3/6] ext4: Use our own write_cache_pages() Message-ID: <20100525130626.GD5556@thunk.org> Mail-Followup-To: tytso@mit.edu, Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, jens.axboe@oracle.com References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274784852-30502-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on thunker.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: thunk.org[69.25.196.29] X-Barracuda-Start-Time: 1274792790 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=NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 08:54:09PM +1000, Dave Chinner wrote: > From: Theodore Ts'o > > Make a copy of write_cache_pages() for the benefit of > ext4_da_writepages(). This allows us to simplify the code some, and > will allow us to further customize the code in future patches. I'm going to be pushing this to Linus shortly, so it's likely you'll be able to drop this from your patch series. I just wanted to give you a heads up about what I was planning on doing, which hopefully simplified your life a little. - Ted From michael.monnerie@is.it-management.at Tue May 25 10:23:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PFNTQK261970 for ; Tue, 25 May 2010 10:23:30 -0500 X-ASG-Debug-ID: 1274801251-221502100000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D632A10A0F12 for ; Tue, 25 May 2010 08:27:31 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id hBKg38Kw1nvds8aM for ; Tue, 25 May 2010 08:27:31 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 364FF800183 for ; Tue, 25 May 2010 17:25:49 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id DDD8283C804 for ; Tue, 25 May 2010 17:25:48 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: LVM snapshot not mountable Subject: LVM snapshot not mountable Date: Tue, 25 May 2010 17:25:44 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-vanilla; KDE/4.3.5; x86_64; ; ) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1564460.s3vZlzesEH"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005251725.48452@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1274801251 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0055 1.0000 -1.9849 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.98 X-Barracuda-Spam-Status: No, SCORE=-1.98 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.2, rules version 3.2.2.30745 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1564460.s3vZlzesEH Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable This might be LVM specific, please apologize. For the first time I play=20 around with LVM snapshots. I tried this: lvcreate -s -n dbsnap -L 4G -v /dev/db/mysql mount /dev/db/dbnap /mnt but the mount fails, dmesg says: [ 598.440324] XFS: Filesystem dm-1 has duplicate UUID - can't mount How could I mount it? =2D-=20 mit freundlichen Gr=C3=BCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=C3=A4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart1564460.s3vZlzesEH Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkv76/wACgkQzhSR9xwSCbQUhwCg5UidsleNzChOWteN2G9OYapE 6V0AmwXkcwASoM3lbmkRvFUQyY4upLO9 =ntmi -----END PGP SIGNATURE----- --nextPart1564460.s3vZlzesEH-- From BATV+dc1ae48fd67a4d6e194a+2466+infradead.org+hch@bombadil.srs.infradead.org Tue May 25 10:47:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_210 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PFl6Fv003924 for ; Tue, 25 May 2010 10:47:08 -0500 X-ASG-Debug-ID: 1274802569-21bf00b00000-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 CAB5F36F29F for ; Tue, 25 May 2010 08:49:29 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id 4G8gs9Qx8ZG3kvp3 for ; Tue, 25 May 2010 08:49:29 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OGwNj-00072E-Gy; Tue, 25 May 2010 15:49:27 +0000 Date: Tue, 25 May 2010 11:49:27 -0400 From: Christoph Hellwig To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: LVM snapshot not mountable Subject: Re: LVM snapshot not mountable Message-ID: <20100525154927.GA25353@infradead.org> References: <201005251725.48452@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201005251725.48452@zmi.at> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1274802569 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 05:25:44PM +0200, Michael Monnerie wrote: > This might be LVM specific, please apologize. For the first time I play > around with LVM snapshots. I tried this: > lvcreate -s -n dbsnap -L 4G -v /dev/db/mysql > mount /dev/db/dbnap /mnt > but the mount fails, dmesg says: > [ 598.440324] XFS: Filesystem dm-1 has duplicate UUID - can't mount > > How could I mount it? mount -o ro,norecovery,nouuid /dev/db/dbnap /mnt or use xfs_admin -U generate /dev/db/dbnap to give it a different uuid first in case you're dealing with a writeable snapshot. From eflorac@intellique.com Tue May 25 11:17:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PGH8gj008682 for ; Tue, 25 May 2010 11:17:08 -0500 X-ASG-Debug-ID: 1274804365-221401790000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2A52F36F64B for ; Tue, 25 May 2010 09:19:29 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id ZSuSv0HMw0HIIj4r for ; Tue, 25 May 2010 09:19:29 -0700 (PDT) Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by smtp4-g21.free.fr (Postfix) with ESMTP id 92F864C870E; Tue, 25 May 2010 18:19:23 +0200 (CEST) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP; Tue, 25 May 2010 18:19:21 +0200 (CEST) Date: Tue, 25 May 2010 18:19:09 +0200 From: Emmanuel Florac To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: LVM snapshot not mountable Subject: Re: LVM snapshot not mountable Message-ID: <20100525181909.70496ce1@harpe.intellique.com> In-Reply-To: <201005251725.48452@zmi.at> References: <201005251725.48452@zmi.at> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/=+k0FWBg/FEN135IOAsvHTM"; protocol="application/pgp-signature" X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1274804371 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.2, rules version 3.2.2.30748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --Sig_/=+k0FWBg/FEN135IOAsvHTM Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Le Tue, 25 May 2010 17:25:44 +0200 Michael Monnerie =E9crivait: > but the mount fails, dmesg says: > [ 598.440324] XFS: Filesystem dm-1 has duplicate UUID - can't mount >=20 > How could I mount it? Simply read the message : you cannot mount 2 xfs filesystems with the same UUID at the same time. Obviously the snapshot carries the same UUID as the original. Use the "nouuid" option to mount it. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ --Sig_/=+k0FWBg/FEN135IOAsvHTM Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkv7+H0ACgkQX3jQXNUicVZRKQCghEnAmMpMDCiK3nb6JsMwbrq7 yK8AnR/i2yXgC0rziXk3t2JPkygPDIy/ =Pzm7 -----END PGP SIGNATURE----- --Sig_/=+k0FWBg/FEN135IOAsvHTM-- From BATV+dc1ae48fd67a4d6e194a+2466+infradead.org+hch@bombadil.srs.infradead.org Tue May 25 11:38:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PGcWdK011875 for ; Tue, 25 May 2010 11:38:32 -0500 X-ASG-Debug-ID: 1274805755-221903780000-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 D31EE1577222 for ; Tue, 25 May 2010 09:42:35 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id DeCEsDBhpib6OV0I for ; Tue, 25 May 2010 09:42:35 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OGxBU-0006FW-CI; Tue, 25 May 2010 16:40:52 +0000 Date: Tue, 25 May 2010 12:40:52 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: fix race in inode cluster freeing failing to stale inodes Subject: Re: [PATCH] xfs: fix race in inode cluster freeing failing to stale inodes Message-ID: <20100525164052.GA18666@infradead.org> References: <1274581478-19260-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274581478-19260-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1274805755 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good, but some minor nits on the comments below: Reviewed-by: Christoph Hellwig > /* > + * Now we've locked out tail pushing and flushing by locking > + * the buffer, look for each inode in memory and attempt to > + * lock it. Any inode we get the locks on add it to the inode > + * buffer and set it up for being staled on buffer IO > + * completion. This comment reads a bit odd. The first thing we do in the loop is locking the buffer, so the "Now" at the beginning of the comment feels rather out of place. What about: /* * For each inode in memory attempt to add it to the inode * buffer and set it up for being staled on buffer IO * completion. This is safe as we've locked out tail * pushing and flushing by locking the buffer. * * We have already marked every inode that was part of * a transaction stale above, which means there is no * point in even trying to lock them. */ From BATV+dc1ae48fd67a4d6e194a+2466+infradead.org+hch@bombadil.srs.infradead.org Tue May 25 11:40:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PGeNHC012147 for ; Tue, 25 May 2010 11:40:23 -0500 X-ASG-Debug-ID: 1274805766-3d6201150000-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 7D4B51DFBBB5 for ; Tue, 25 May 2010 09:42:46 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id iDA1oyAB6OWerYhI for ; Tue, 25 May 2010 09:42:46 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OGxDI-0006Nv-RJ; Tue, 25 May 2010 16:42:44 +0000 Date: Tue, 25 May 2010 12:42:44 -0400 From: Christoph Hellwig To: "Linda A. Walsh" Cc: xfs-oss X-ASG-Orig-Subj: Re: xfsdump -- not enough memory to dump attributes? w/>20G free -- how much does it need? Subject: Re: xfsdump -- not enough memory to dump attributes? w/>20G free -- how much does it need? Message-ID: <20100525164244.GB18666@infradead.org> References: <4BF7D787.4020903@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4BF7D787.4020903@tlinx.org> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1274805766 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, May 22, 2010 at 06:09:27AM -0700, Linda A. Walsh wrote: > I've seen the problem in the dump below and was wondering what could > possibly cause this -- because > shows loads of free memory (>20G)... how much memory do non-root > attributes take to dump? The error comes directly from the libhandle listing routine, which is a straight forward wrapper around the kernel syscall in current xfsprogs. What xfsprogs version are you using? I noticed your xfsdump is rather old, so making sure you have recent XFS userspace and possibly also the kernel would help debugging this. Also can you check using strace if the ENOMEM comes directly from the attr_list_by_handle ioctl? From BATV+dc1ae48fd67a4d6e194a+2466+infradead.org+hch@bombadil.srs.infradead.org Tue May 25 13:14:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PIEn7t025978 for ; Tue, 25 May 2010 13:14:51 -0500 X-ASG-Debug-ID: 1274811432-417203200000-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 7F0551DFC738 for ; Tue, 25 May 2010 11:17:12 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id 3bHnAKqaRRWIyZ2N for ; Tue, 25 May 2010 11:17:12 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OGygh-0001Ap-8w; Tue, 25 May 2010 18:17:11 +0000 Date: Tue, 25 May 2010 14:17:11 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org X-ASG-Orig-Subj: [PATCH] xfs: skip writeback from reclaim context Subject: [PATCH] xfs: skip writeback from reclaim context Message-ID: <20100525181711.GA4119@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1274811432 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Allowing writeback from reclaim context causes massive problems with stack overflows as we can call into the writeback code which tends to be a heavy stack user both in the generic code and XFS from random contexts that perform memory allocations. Follow the example of btrfs (and in slightly different form ext4) and refuse to write out data from reclaim context. This issue should really be handled by the VM so that we can tune better for this case, but until we get it sorted out there we have to hack around this in each filesystem with a complex writeback path. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-05-25 11:40:59.068253457 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-05-25 18:25:39.575011803 +0200 @@ -1326,6 +1326,21 @@ xfs_vm_writepage( trace_xfs_writepage(inode, page, 0); /* + * Refuse to write the page out if we are called from reclaim context. + * + * This is primarily to avoid stack overflows when called from deep + * used stacks in random callers for direct reclaim, but disabling + * reclaim for kswap is a nice side-effect as kswapd causes rather + * suboptimal I/O patters, too. + * + * This should really be done by the core VM, but until that happens + * filesystems like XFS, btrfs and ext4 have to take care of this + * by themselves. + */ + if (current->flags & PF_MEMALLOC) + goto out_fail; + + /* * We need a transaction if: * 1. There are delalloc buffers on the page * 2. The page is uptodate and we have unmapped buffers From michael.monnerie@is.it-management.at Tue May 25 14:03:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_210 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PJ3sY5033050 for ; Tue, 25 May 2010 14:03:54 -0500 X-ASG-Debug-ID: 1274814373-4c8d00cc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3708C1440AAF for ; Tue, 25 May 2010 12:06:14 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id NYJBCd7CAjf7kxYd for ; Tue, 25 May 2010 12:06:14 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id B6FA9800183 for ; Tue, 25 May 2010 21:06:11 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 617F383C804 for ; Tue, 25 May 2010 21:06:11 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: LVM snapshot not mountable Subject: Re: LVM snapshot not mountable Date: Tue, 25 May 2010 21:06:06 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-vanilla; KDE/4.3.5; x86_64; ; ) References: <201005251725.48452@zmi.at> <20100525154927.GA25353@infradead.org> In-Reply-To: <20100525154927.GA25353@infradead.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart5316389.8ZGQzqQ1Wc"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005252106.10889@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1274814376 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0003 1.0000 -2.0194 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.2, rules version 3.2.2.30758 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart5316389.8ZGQzqQ1Wc Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Dienstag, 25. Mai 2010 Christoph Hellwig wrote: > mount -o ro,norecovery,nouuid /dev/db/dbnap /mnt > or use > xfs_admin -U generate /dev/db/dbnap Gracias, merci, grazie, danke, thanks. =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart5316389.8ZGQzqQ1Wc Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkv8H6IACgkQzhSR9xwSCbTKHgCgvF5S5QxNcbhL92C0tnfJFdDT nkQAoNIZ1clJJ3uXpnAoJJ06jMrmhy7O =wrLC -----END PGP SIGNATURE----- --nextPart5316389.8ZGQzqQ1Wc-- From weiyi.huang@gmail.com Tue May 25 17:13:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PMDAfj044558 for ; Tue, 25 May 2010 17:13:10 -0500 X-ASG-Debug-ID: 1274825732-690a01610000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-px0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EE708371329 for ; Tue, 25 May 2010 15:15:32 -0700 (PDT) Received: from mail-px0-f181.google.com (mail-px0-f181.google.com [209.85.212.181]) by cuda.sgi.com with ESMTP id 0VSkdCvb6NSOeqjF for ; Tue, 25 May 2010 15:15:32 -0700 (PDT) Received: by pxi15 with SMTP id 15so2959758pxi.26 for ; Tue, 25 May 2010 15:15:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer; bh=rlHoIYOmq796fBEwr/hidHSsAo747uFSI2PO9LwHadg=; b=RHAKZZijfUot/ThQukGrlfoPAlpw5Nc6F78qXlMEfRcfoQI73ncr/cQO3BQPAPCnQO paUdQVV3W7VrInZSBKbQMHX/9q3hzRSWyep98ic6kEbjdzEWLwL1sGkXQ+o3NdJ8M4yt TVZyCMAVp16g8A1VmIQ4mCrmKC53f83KJawWU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=g23YI6vshorJESC/1mbhqF8FgPnIy0qjkEhOOvKkn2UxFdp/WIZuALVhX5n8pD09CO GBvzz6Eh1Iv6vp+rJ33fLgdgvnIs9b3U/o8T1Zm2dwwyoSIg610KyaNObedllSZfLw0+ k+cYD6R0uX5nEc8B5KDLd86IUH+jJb/rfcngQ= Received: by 10.115.113.31 with SMTP id q31mr6769602wam.1.1274825731723; Tue, 25 May 2010 15:15:31 -0700 (PDT) Received: from localhost.localdomain ([222.95.174.185]) by mx.google.com with ESMTPS id n29sm51199030wae.16.2010.05.25.15.15.28 (version=TLSv1/SSLv3 cipher=RC4-MD5); Tue, 25 May 2010 15:15:30 -0700 (PDT) From: Huang Weiyi To: aelder@sgi.com Cc: xfs@oss.sgi.com, Huang Weiyi X-ASG-Orig-Subj: [PATCH] xfs: remove duplicated #include Subject: [PATCH] xfs: remove duplicated #include Date: Wed, 26 May 2010 06:15:26 +0800 Message-Id: <1274825726-4364-1-git-send-email-weiyi.huang@gmail.com> X-Mailer: git-send-email 1.6.1.2 X-Barracuda-Connect: mail-px0-f181.google.com[209.85.212.181] X-Barracuda-Start-Time: 1274825732 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30763 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Remove duplicated #include('s) in fs/xfs/linux-2.6/xfs_quotaops.c Signed-off-by: Huang Weiyi --- fs/xfs/linux-2.6/xfs_quotaops.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_quotaops.c b/fs/xfs/linux-2.6/xfs_quotaops.c index 9ac8aea..067cafb 100644 --- a/fs/xfs/linux-2.6/xfs_quotaops.c +++ b/fs/xfs/linux-2.6/xfs_quotaops.c @@ -23,7 +23,6 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_quota.h" -#include "xfs_log.h" #include "xfs_trans.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" -- 1.6.1.3 From SRS0+uv1J+84+fromorbit.com=david@internode.on.net Tue May 25 17:40:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PMesT3045610 for ; Tue, 25 May 2010 17:40:54 -0500 X-ASG-Debug-ID: 1274827495-1dd702ef0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8E33FA4C0BD for ; Tue, 25 May 2010 15:44:55 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id JgW1z3Uy7u2n1kLo for ; Tue, 25 May 2010 15:44:55 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25402720-1927428 for multiple; Wed, 26 May 2010 08:13:01 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OH2pv-0008Iv-PN; Wed, 26 May 2010 08:42:59 +1000 Date: Wed, 26 May 2010 08:42:59 +1000 From: Dave Chinner To: tytso@mit.edu, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 3/6] ext4: Use our own write_cache_pages() Subject: Re: [PATCH 3/6] ext4: Use our own write_cache_pages() Message-ID: <20100525224259.GM2150@dastard> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-4-git-send-email-david@fromorbit.com> <20100525130626.GD5556@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100525130626.GD5556@thunk.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1274827498 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.2, rules version 3.2.2.30764 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 09:06:26AM -0400, tytso@mit.edu wrote: > On Tue, May 25, 2010 at 08:54:09PM +1000, Dave Chinner wrote: > > From: Theodore Ts'o > > > > Make a copy of write_cache_pages() for the benefit of > > ext4_da_writepages(). This allows us to simplify the code some, and > > will allow us to further customize the code in future patches. > > I'm going to be pushing this to Linus shortly, so it's likely you'll > be able to drop this from your patch series. Great! > I just wanted to give > you a heads up about what I was planning on doing, which hopefully > simplified your life a little. And that's appreciated. I included it to make sure everyone could see how this all fitted together and others could test it if they so desired. i.e. make sure I wasn't breaking ext4 by reverting the changes to write_cache_pages. I'll leave it in the series until the ext4 change is upstream, then I'll drop it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+sY6z+84+fromorbit.com=david@internode.on.net Tue May 25 17:56:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4PMuAQU046723 for ; Tue, 25 May 2010 17:56:10 -0500 X-ASG-Debug-ID: 1274828311-2869018b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1EB7D14426EE for ; Tue, 25 May 2010 15:58:31 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id ZgRnH9H4oPi5KUsO for ; Tue, 25 May 2010 15:58:31 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25530285-1927428 for multiple; Wed, 26 May 2010 08:28:30 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OH34v-0008Jz-8x; Wed, 26 May 2010 08:58:29 +1000 Date: Wed, 26 May 2010 08:58:29 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: fix race in inode cluster freeing failing to stale inodes Subject: Re: [PATCH] xfs: fix race in inode cluster freeing failing to stale inodes Message-ID: <20100525225829.GO2150@dastard> References: <1274581478-19260-1-git-send-email-david@fromorbit.com> <20100525164052.GA18666@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100525164052.GA18666@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1274828313 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.2, rules version 3.2.2.30765 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 12:40:52PM -0400, Christoph Hellwig wrote: > Looks good, but some minor nits on the comments below: > > > Reviewed-by: Christoph Hellwig > > > /* > > + * Now we've locked out tail pushing and flushing by locking > > + * the buffer, look for each inode in memory and attempt to > > + * lock it. Any inode we get the locks on add it to the inode > > + * buffer and set it up for being staled on buffer IO > > + * completion. > > This comment reads a bit odd. The first thing we do in the loop is > locking the buffer, so the "Now" at the beginning of the comment feels > rather out of place. What about: > > /* > * For each inode in memory attempt to add it to the inode > * buffer and set it up for being staled on buffer IO > * completion. This is safe as we've locked out tail > * pushing and flushing by locking the buffer. > * > * We have already marked every inode that was part of > * a transaction stale above, which means there is no > * point in even trying to lock them. > */ That reads better. I'll update it to match. Cheers, Dave. -- Dave Chinner david@fromorbit.com From stewart@flamingspork.com Tue May 25 21:58:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4Q2whrb056166 for ; Tue, 25 May 2010 21:58:43 -0500 X-ASG-Debug-ID: 1274842968-2462014c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kaylee.flamingspork.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A8D31129E5A9 for ; Tue, 25 May 2010 20:02:48 -0700 (PDT) Received: from kaylee.flamingspork.com (kaylee.flamingspork.com [74.207.245.61]) by cuda.sgi.com with ESMTP id BpwtkzfBTSx1CvjG for ; Tue, 25 May 2010 20:02:48 -0700 (PDT) Received: from willster (localhost [127.0.0.1]) by kaylee.flamingspork.com (Postfix) with ESMTPS id 7611E6396; Wed, 26 May 2010 02:54:11 +0000 (UTC) Received: by willster (Postfix, from userid 1000) id 2B97B7A23; Wed, 26 May 2010 13:01:03 +1000 (EST) From: Stewart Smith To: Christoph Hellwig , "Linda A. Walsh" Cc: xfs-oss X-ASG-Orig-Subj: Re: xfsdump -- not enough memory to dump attributes? w/>20G free -- how much does it need? Subject: Re: xfsdump -- not enough memory to dump attributes? w/>20G free -- how much does it need? In-Reply-To: <20100525164244.GB18666@infradead.org> References: <4BF7D787.4020903@tlinx.org> <20100525164244.GB18666@infradead.org> User-Agent: Notmuch/0.3.1-17-gc50524e (http://notmuchmail.org) Emacs/23.1.1 (x86_64-pc-linux-gnu) Date: Wed, 26 May 2010 13:01:03 +1000 Message-ID: <87zkznicy8.fsf@willster.local.flamingspork.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: kaylee.flamingspork.com[74.207.245.61] X-Barracuda-Start-Time: 1274842969 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30771 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 25 May 2010 12:42:44 -0400, Christoph Hellwig wrote: > On Sat, May 22, 2010 at 06:09:27AM -0700, Linda A. Walsh wrote: > > I've seen the problem in the dump below and was wondering what could > > possibly cause this -- because > > shows loads of free memory (>20G)... how much memory do non-root > > attributes take to dump? > > The error comes directly from the libhandle listing routine, which > is a straight forward wrapper around the kernel syscall in current > xfsprogs. > > What xfsprogs version are you using? I noticed your xfsdump is > rather old, so making sure you have recent XFS userspace and > possibly also the kernel would help debugging this. I just saw this last night. All from ubuntu lucid: xfsdump 3.0.4 Linux willster 2.6.32-22-generic #33-Ubuntu SMP Wed Apr 28 13:28:05 UTC 2010 x86_64 GNU/Linux > Also can you check using strace if the ENOMEM comes directly from > the attr_list_by_handle ioctl? Will try another dump tonight with strace on and see if i get it. -- Stewart Smith From SRS0+21CU+85+fromorbit.com=david@internode.on.net Wed May 26 01:10:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4Q6A9cm065337 for ; Wed, 26 May 2010 01:10:09 -0500 X-ASG-Debug-ID: 1274854452-168301610000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 97765A52B76 for ; Tue, 25 May 2010 23:14:13 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id EtfOdjU1cDoqwGcT for ; Tue, 25 May 2010 23:14:13 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14013129-1927428 for multiple; Wed, 26 May 2010 15:42:28 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OH9qs-0000HJ-TL; Wed, 26 May 2010 16:12:26 +1000 Date: Wed, 26 May 2010 16:12:26 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2 v2] xfs: drop dmapi hooks Subject: Re: [PATCH 1/2 v2] xfs: drop dmapi hooks Message-ID: <20100526061226.GP2150@dastard> References: <20100510140823.GA16540@infradead.org> <20100525094524.GA1647@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100525094524.GA1647@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1274854454 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0200 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.2, rules version 3.2.2.30785 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 05:45:24AM -0400, Christoph Hellwig wrote: > Dmapi support was never merged upstream, but we still have a lot of hooks > bloating XFS for it, all over the fast pathes of the filesystem. > > This patch drops over 700 lines of dmapi overhead. If we'll ever get HSM > support in mainline at least the namespace events can be done much saner > in the VFS instead of the individual filesystem, so it's not like this > is much help for future work. > > Signed-off-by: Christoph Hellwig Looks good to me. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+351p+85+fromorbit.com=david@internode.on.net Wed May 26 01:10:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4Q6AuLS065375 for ; Wed, 26 May 2010 01:10:57 -0500 X-ASG-Debug-ID: 1274854397-6c8f02b40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 073C0140CF7F for ; Tue, 25 May 2010 23:13:18 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id 8gZ7jVE1l5dUu5BZ for ; Tue, 25 May 2010 23:13:18 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25461716-1927428 for multiple; Wed, 26 May 2010 15:43:15 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OH9rd-0000HS-UZ; Wed, 26 May 2010 16:13:13 +1000 Date: Wed, 26 May 2010 16:13:13 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2 v2] xfs: remove unneeded #include statements Subject: Re: [PATCH 2/2 v2] xfs: remove unneeded #include statements Message-ID: <20100526061313.GQ2150@dastard> References: <20100510140845.GB16540@infradead.org> <20100525094541.GB1647@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100525094541.GB1647@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1274854400 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.2, rules version 3.2.2.30784 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 05:45:41AM -0400, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig > > --- > > V1 -> V2 > > - updated to account for the delayed logging branch merge Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+SGWR+85+fromorbit.com=david@internode.on.net Wed May 26 01:12:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4Q6CUvi065433 for ; Wed, 26 May 2010 01:12:30 -0500 X-ASG-Debug-ID: 1274854595-2b4400920000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 208ECA01A46 for ; Tue, 25 May 2010 23:16:36 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id LJF7aKQD7A1ON4a9 for ; Tue, 25 May 2010 23:16:36 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25492857-1927428 for multiple; Wed, 26 May 2010 15:44:51 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OH9tC-0000Hb-2s; Wed, 26 May 2010 16:14:50 +1000 Date: Wed, 26 May 2010 16:14:50 +1000 From: Dave Chinner To: Huang Weiyi Cc: aelder@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 11/12] xfs: xfs_trace.c: remove duplicated #include Subject: Re: [PATCH 11/12] xfs: xfs_trace.c: remove duplicated #include Message-ID: <20100526061450.GR2150@dastard> References: <1274548400-3404-1-git-send-email-weiyi.huang@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274548400-3404-1-git-send-email-weiyi.huang@gmail.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1274854597 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0206 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.2, rules version 3.2.2.30785 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, May 23, 2010 at 01:13:20AM +0800, Huang Weiyi wrote: > Remove duplicated #include('s) in > fs/xfs/linux-2.6/xfs_trace.c > > Signed-off-by: Huang Weiyi Looks good, will push through the XFS tree. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+jdLB+85+fromorbit.com=david@internode.on.net Wed May 26 01:13:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4Q6D1b3065585 for ; Wed, 26 May 2010 01:13:02 -0500 X-ASG-Debug-ID: 1274854523-487601330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0BF87373669 for ; Tue, 25 May 2010 23:15:23 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id A6RsIHCRSkK253lO for ; Tue, 25 May 2010 23:15:23 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25759307-1927428 for multiple; Wed, 26 May 2010 15:45:22 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OH9ti-0000Hm-0o; Wed, 26 May 2010 16:15:22 +1000 Date: Wed, 26 May 2010 16:15:21 +1000 From: Dave Chinner To: Huang Weiyi Cc: aelder@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: remove duplicated #include Subject: Re: [PATCH] xfs: remove duplicated #include Message-ID: <20100526061521.GS2150@dastard> References: <1274825726-4364-1-git-send-email-weiyi.huang@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274825726-4364-1-git-send-email-weiyi.huang@gmail.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1274854525 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.2, rules version 3.2.2.30784 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 26, 2010 at 06:15:26AM +0800, Huang Weiyi wrote: > Remove duplicated #include('s) in > fs/xfs/linux-2.6/xfs_quotaops.c > > Signed-off-by: Huang Weiyi Looks good, will push through the XFS tree. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+21CU+85+fromorbit.com=david@internode.on.net Wed May 26 02:04:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4Q743ZA067504 for ; Wed, 26 May 2010 02:04:03 -0500 X-ASG-Debug-ID: 1274857687-1647026a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 87FB4A4CD28 for ; Wed, 26 May 2010 00:08:08 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id qbziKBRd5iHa2Dp5 for ; Wed, 26 May 2010 00:08:08 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25900962-1927428 for multiple; Wed, 26 May 2010 16:36:22 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHAh2-0000LV-Q9; Wed, 26 May 2010 17:06:20 +1000 Date: Wed, 26 May 2010 17:06:20 +1000 From: Dave Chinner To: Roman Kononov Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: WARNING in xfs_lwr.c, xfs_write() Message-ID: <20100526070620.GT2150@dastard> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <4BF9FCA8.8090906@hardwarefreak.com> <20100524143428.6f3a117c@abend.internal.xtremedata.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100524143428.6f3a117c@abend.internal.xtremedata.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1274857689 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.2, rules version 3.2.2.30789 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 24, 2010 at 02:34:28PM -0500, Roman Kononov wrote: > On Sun, 23 May 2010 23:12:24 -0500 Stan Hoeppner > wrote: > > "The whole notion of "direct IO" is totally braindamaged. Just say no. > ... > > From: http://lkml.org/lkml/2007/1/10/235 > > I definitely measure dramatic overall performance benefit using > O_DIRECT carefully. > > In that thread, it is doubtful that madvise+mmap+msync allow > asynchronous zero-copy reads and writes to/from already pinned by a > device driver memory of data produced/consumed by that device, without > cache pollution and with intelligent handling of disk errors. Am I > wrong? No, you are not wrong. Remember, just because Linus asserts something it doesn't mean he is right. Yes, he's right an awful lot of the time, but not always. In this case, most people with experience in writing high performance IO engines with tell your that mmap() and advisory interfaces are no substitute for the fine grained control of IO issue that direct IO provides you with. And in the case of XFS, mmap serialiseŃ• write page faults to different areas of the same file, whereas direct IO allows concurrent reads and writes to different regions of the same file. That makes direct IO far more scalable than than any mmap interface will ever be.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfs@tlinx.org Wed May 26 02:32:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4Q7WggB068508 for ; Wed, 26 May 2010 02:32:43 -0500 X-ASG-Debug-ID: 1274859408-166c02e50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from Ishtar.sc.tlinx.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B5657A52DCE for ; Wed, 26 May 2010 00:36:48 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id XAYoTjUtJRB3hUgv for ; Wed, 26 May 2010 00:36:48 -0700 (PDT) Received: from [192.168.3.12] (Athenae [192.168.3.12]) by Ishtar.sc.tlinx.org (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4Q7Yt9f006057; Wed, 26 May 2010 00:34:57 -0700 Message-ID: <4BFCCF1F.7010701@tlinx.org> Date: Wed, 26 May 2010 00:34:55 -0700 From: "Linda A. Walsh" User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss X-ASG-Orig-Subj: Re: xfsdump -- not enough memory to dump attributes? w/>20G free -- how much does it need? Subject: Re: xfsdump -- not enough memory to dump attributes? w/>20G free -- how much does it need? References: <4BF7D787.4020903@tlinx.org> <20100525164244.GB18666@infradead.org> In-Reply-To: <20100525164244.GB18666@infradead.org> X-Stationery: 0.5.1 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1274859409 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30791 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > The error comes directly from the libhandle listing routine, which > is a straight forward wrapper around the kernel syscall in current > xfsprogs. > > What xfsprogs version are you using? I noticed your xfsdump is > rather old, so making sure you have recent XFS userspace and > possibly also the kernel would help debugging this. > > Also can you check using strace if the ENOMEM comes directly from > the attr_list_by_handle ioctl? --- versions: xfsprogs/xfsdump both at 3.0.1-2.1 from suse11.2 which would likely be 3.0.1 with some patchlevel from suse. kernel is 2.6.34 (vanilla). strace would be pretty difficult considering how far it is into a dump before it is triggered. Maybe I should try getting updated tools and see if it "goes away"... looks like I need to build xfsprogs before xfsdump? looks like best way to pull current ver is from .git. will try rebuilding and see if I have any luck... BTW -- how do you tell the version of the xfs progs from the individual progs -- I'm going from the installed rpm name, but if I build from the git, that won't be helpful. I don't see a VERSION command in xfsdump/restore? Is there one with any of the xfs tools? tnx, -linda From michael.monnerie@is.it-management.at Wed May 26 09:51:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4QEpEdK083996 for ; Wed, 26 May 2010 09:51:14 -0500 X-ASG-Debug-ID: 1274885721-46be00b90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3FDE2A4C8C3 for ; Wed, 26 May 2010 07:55:21 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id 6pNhXzy7grrqtBIA for ; Wed, 26 May 2010 07:55:21 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 91ADC800184 for ; Wed, 26 May 2010 16:53:34 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 509DC83C804 for ; Wed, 26 May 2010 16:53:34 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: noatime,nodiratime? Subject: Re: noatime,nodiratime? Date: Wed, 26 May 2010 16:53:33 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-vanilla; KDE/4.3.5; x86_64; ; ) References: <4BF3F212.5030600@hardwarefreak.com> <4BF44105.4040902@sandeen.net> <4BF47859.6020808@hardwarefreak.com> In-Reply-To: <4BF47859.6020808@hardwarefreak.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart4048424.WqApMMQSJU"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005261653.33774@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1274885722 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0030 1.0000 -2.0017 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.00 X-Barracuda-Spam-Status: No, SCORE=-2.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.2, rules version 3.2.2.30818 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart4048424.WqApMMQSJU Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Donnerstag, 20. Mai 2010 Stan Hoeppner wrote: > Yes. It would be nice to see the settings regardless of default or > user defined. =20 I second that. Because you could use barrier in the fstab options, but=20 it's not supported and so nobarrier is used. It would be good to check=20 that by simply "cat /proc/mounts". =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart4048424.WqApMMQSJU Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkv9Ne0ACgkQzhSR9xwSCbRKsgCeNgdBYWAPxzSg8QL/GKFx8UY6 hIkAoKZq1bhFl4LbunRflC5kfI0i3qxN =ORl0 -----END PGP SIGNATURE----- --nextPart4048424.WqApMMQSJU-- From stan@hardwarefreak.com Wed May 26 10:02:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4QF2gWg084327 for ; Wed, 26 May 2010 10:02:43 -0500 X-ASG-Debug-ID: 1274886304-53aa008a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 33C961445562 for ; Wed, 26 May 2010 08:05:04 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id BM3wQDN5DTWfviIy for ; Wed, 26 May 2010 08:05:04 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 380C36C35D for ; Wed, 26 May 2010 10:05:04 -0500 (CDT) Message-ID: <4BFD3926.6040208@hardwarefreak.com> Date: Wed, 26 May 2010 10:07:18 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() Subject: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <4BF9FCA8.8090906@hardwarefreak.com> <20100524143428.6f3a117c@abend.internal.xtremedata.com> <20100526070620.GT2150@dastard> In-Reply-To: <20100526070620.GT2150@dastard> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1274886305 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.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30819 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner put forth on 5/26/2010 2:06 AM: > On Mon, May 24, 2010 at 02:34:28PM -0500, Roman Kononov wrote: >> On Sun, 23 May 2010 23:12:24 -0500 Stan Hoeppner >> wrote: >>> "The whole notion of "direct IO" is totally braindamaged. Just say no. >> ... >>> From: http://lkml.org/lkml/2007/1/10/235 >> >> I definitely measure dramatic overall performance benefit using >> O_DIRECT carefully. >> >> In that thread, it is doubtful that madvise+mmap+msync allow >> asynchronous zero-copy reads and writes to/from already pinned by a >> device driver memory of data produced/consumed by that device, without >> cache pollution and with intelligent handling of disk errors. Am I >> wrong? > > No, you are not wrong. > > Remember, just because Linus asserts something it doesn't mean he is > right. Yes, he's right an awful lot of the time, but not always. In > this case, most people with experience in writing high performance > IO engines with tell your that mmap() and advisory interfaces are no > substitute for the fine grained control of IO issue that direct IO > provides you with. > > And in the case of XFS, mmap serialiseŃ• write page faults to > different areas of the same file, whereas direct IO allows > concurrent reads and writes to different regions of the same file. > That makes direct IO far more scalable than than any mmap interface > will ever be.... > > Cheers, > > Dave. Please educate the ignorant a little bit Dave. I'm not a programmer, or at least, haven't been one for a couple of decades. If o_direct is superior to mmap, why then don't, say, Postfix and Dovecot use it instead of mmap? Email servers are some of the most disk I/O bound applications on the planet. I would think on heavily loaded mail servers (smtp or imap), at $big_isp for example, buffer cache would yield very little performance gain, and may even slow the system down due to buffer cache thrashing. Why do you think Wietse and Timo don't use o_direct instead of mmap? Timo is working on a complex and aggressive totally asynchronous I/O subsystem for a future Dovecot release in an effort to speed up I/O on loaded systems. Could o_direct not be the solution? AFAIK, both Postfix and Dovecot support running on just about every Unix like OS on the planet. Is o_direct not a portable interface, limited to Linux only? Is o_direct a POSIX standard? I'm sure o_direct isn't the best fit for many I/O bound applications. I'm just trying to understand why. What applications are the best candidates for using o_direct? Why would one want to avoid using o_direct in an I/O bound application? My apologies for the newbish questions. If this has all been asked/answered before, please just point me to any papers that explain the pros/cons of o_direct. Thanks. -- Stan From julia@diku.dk Wed May 26 10:55:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4QFt7k8086049 for ; Wed, 26 May 2010 10:55:08 -0500 X-ASG-Debug-ID: 1274889555-4e81018c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mgw1.diku.dk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C3537130AF85; Wed, 26 May 2010 08:59:15 -0700 (PDT) Received: from mgw1.diku.dk (mgw1.diku.dk [130.225.96.91]) by cuda.sgi.com with ESMTP id JdYOGqSuZHFKbcFU; Wed, 26 May 2010 08:59:15 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by mgw1.diku.dk (Postfix) with ESMTP id A821A52C390; Wed, 26 May 2010 17:57:27 +0200 (CEST) Received: from mgw1.diku.dk ([127.0.0.1]) by localhost (mgw1.diku.dk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id oUjY0HnUow5u; Wed, 26 May 2010 17:57:23 +0200 (CEST) Received: from nhugin.diku.dk (nhugin.diku.dk [130.225.96.140]) by mgw1.diku.dk (Postfix) with ESMTP id 4E52152C555; Wed, 26 May 2010 17:57:23 +0200 (CEST) Received: from ask.diku.dk (ask.diku.dk [130.225.96.225]) by nhugin.diku.dk (Postfix) with ESMTP id 9200D6DFD05; Wed, 26 May 2010 17:49:57 +0200 (CEST) Received: by ask.diku.dk (Postfix, from userid 3767) id 2FC5F200BF; Wed, 26 May 2010 17:57:23 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by ask.diku.dk (Postfix) with ESMTP id 28C0F200BC; Wed, 26 May 2010 17:57:23 +0200 (CEST) Date: Wed, 26 May 2010 17:57:23 +0200 (CEST) From: Julia Lawall To: Alex Elder , xfs-masters@oss.sgi.com, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, kernel-janitors@vger.kernel.org X-ASG-Orig-Subj: [PATCH 11/17] fs/xfs/quota: Add missing mutex_unlock Subject: [PATCH 11/17] fs/xfs/quota: Add missing mutex_unlock Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: mgw1.diku.dk[130.225.96.91] X-Barracuda-Start-Time: 1274889556 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.2, rules version 3.2.2.30822 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Julia Lawall Add a mutex_unlock missing on the error path. The use of this lock is balanced elsewhere in the file. The semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // @@ expression E1; @@ * mutex_lock(E1,...); <+... when != E1 if (...) { ... when != E1 * return ...; } ...+> * mutex_unlock(E1,...); // Signed-off-by: Julia Lawall --- The use of ENOMEM rather than -ENOMEM is also a bit odd. fs/xfs/quota/xfs_qm.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 38e7641..2d8b7bc 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -249,8 +249,10 @@ xfs_qm_hold_quotafs_ref( if (!xfs_Gqm) { xfs_Gqm = xfs_Gqm_init(); - if (!xfs_Gqm) + if (!xfs_Gqm) { + mutex_unlock(&xfs_Gqm_lock); return ENOMEM; + } } /* From npiggin@suse.de Wed May 26 11:15:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4QGFEKn086774 for ; Wed, 26 May 2010 11:15:15 -0500 X-ASG-Debug-ID: 1274890763-4e7701ce0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 47D84157A40B for ; Wed, 26 May 2010 09:19:23 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id 9TzHo5CggZc2HnNZ for ; Wed, 26 May 2010 09:19:23 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 787B58E8CC; Wed, 26 May 2010 18:17:36 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id 2131629818; Thu, 27 May 2010 02:17:33 +1000 (EST) Date: Thu, 27 May 2010 02:17:33 +1000 From: Nick Piggin To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Subject: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Message-ID: <20100526161732.GC22536@laptop> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274777588-21494-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274890764 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 06:53:04PM +1000, Dave Chinner wrote: > From: Dave Chinner > > The inode unused list is currently a global LRU. This does not match > the other global filesystem cache - the dentry cache - which uses > per-superblock LRU lists. Hence we have related filesystem object > types using different LRU reclaimatin schemes. Is this an improvement I wonder? The dcache is using per sb lists because it specifically requires sb traversal. What allocation/reclaim really wants (for good scalability and NUMA characteristics) is per-zone lists for these things. It's easy to convert a single list into per-zone lists. It is much harder to convert per-sb lists into per-sb x per-zone lists. From npiggin@suse.de Wed May 26 11:39:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4QGd1ej087469 for ; Wed, 26 May 2010 11:39:01 -0500 X-ASG-Debug-ID: 1274892083-1d6b023a0000-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 43C9C3782A2 for ; Wed, 26 May 2010 09:41:23 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id U4H6xNCHLQHsG922 for ; Wed, 26 May 2010 09:41:23 -0700 (PDT) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 40E0387104; Wed, 26 May 2010 18:41:19 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id 9CBA329818; Thu, 27 May 2010 02:41:16 +1000 (EST) Date: Thu, 27 May 2010 02:41:16 +1000 From: Nick Piggin To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100526164116.GD22536@laptop> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1274777588-21494-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274892084 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.2, rules version 3.2.2.30825 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 06:53:06PM +1000, Dave Chinner wrote: > @@ -456,21 +456,16 @@ static void prune_one_dentry(struct dentry * dentry) > * which flags are set. This means we don't need to maintain multiple > * similar copies of this loop. > */ > -static void __shrink_dcache_sb(struct super_block *sb, int *count, int flags) > +static void __shrink_dcache_sb(struct super_block *sb, int count, int flags) > { > LIST_HEAD(referenced); > LIST_HEAD(tmp); > struct dentry *dentry; > - int cnt = 0; > > BUG_ON(!sb); > - BUG_ON((flags & DCACHE_REFERENCED) && count == NULL); > + BUG_ON((flags & DCACHE_REFERENCED) && count == -1); > spin_lock(&dcache_lock); > - if (count != NULL) > - /* called from prune_dcache() and shrink_dcache_parent() */ > - cnt = *count; > -restart: > - if (count == NULL) > + if (count == -1) > list_splice_init(&sb->s_dentry_lru, &tmp); > else { > while (!list_empty(&sb->s_dentry_lru)) { > @@ -492,13 +487,13 @@ restart: > } else { > list_move_tail(&dentry->d_lru, &tmp); > spin_unlock(&dentry->d_lock); > - cnt--; > - if (!cnt) > + if (--count == 0) > break; > } > cond_resched_lock(&dcache_lock); > } > } > +prune_more: > while (!list_empty(&tmp)) { > dentry = list_entry(tmp.prev, struct dentry, d_lru); > dentry_lru_del_init(dentry); > @@ -516,88 +511,29 @@ restart: > /* dentry->d_lock was dropped in prune_one_dentry() */ > cond_resched_lock(&dcache_lock); > } > - if (count == NULL && !list_empty(&sb->s_dentry_lru)) > - goto restart; > - if (count != NULL) > - *count = cnt; > + if (count == -1 && !list_empty(&sb->s_dentry_lru)) { > + list_splice_init(&sb->s_dentry_lru, &tmp); > + goto prune_more; > + } Nitpick but I prefer just the restart label wher it is previously. This is moving setup for the next iteration into the "error" case. > +static int prune_super(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) > +{ > + struct super_block *sb; > + int count; > + > + sb = container_of(shrink, struct super_block, s_shrink); > + > + /* > + * Deadlock avoidance. We may hold various FS locks, and we don't want > + * to recurse into the FS that called us in clear_inode() and friends.. > + */ > + if (!(gfp_mask & __GFP_FS)) > + return -1; > + > + /* > + * if we can't get the umount lock, then there's no point having the > + * shrinker try again because the sb is being torn down. > + */ > + if (!down_read_trylock(&sb->s_umount)) > + return -1; Would you just elaborate on the lock order problem somewhere? (the comment makes it look like we *could* take the mutex if we wanted to). > + > + if (!sb->s_root) { > + up_read(&sb->s_umount); > + return -1; > + } > + > + if (nr_to_scan) { > + /* proportion the scan between the two cacheŃ• */ > + int total; > + > + total = sb->s_nr_dentry_unused + sb->s_nr_inodes_unused + 1; > + count = (nr_to_scan * sb->s_nr_dentry_unused) / total; > + > + /* prune dcache first as icache is pinned by it */ > + prune_dcache_sb(sb, count); > + prune_icache_sb(sb, nr_to_scan - count); > + } > + > + count = ((sb->s_nr_dentry_unused + sb->s_nr_inodes_unused) / 100) > + * sysctl_vfs_cache_pressure; Do you think truncating in the divisions is at all a problem? It probably doesn't matter much I suppose. > @@ -162,6 +213,7 @@ void deactivate_locked_super(struct super_block *s) > struct file_system_type *fs = s->s_type; > if (atomic_dec_and_test(&s->s_active)) { > vfs_dq_off(s, 0); > + unregister_shrinker(&s->s_shrink); > fs->kill_sb(s); > put_filesystem(fs); > put_super(s); > @@ -335,6 +387,7 @@ retry: > list_add_tail(&s->s_list, &super_blocks); > list_add(&s->s_instances, &type->fs_supers); > spin_unlock(&sb_lock); > + register_shrinker(&s->s_shrink); > get_filesystem(type); > return s; > } > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 7b90c43..5bff2dc 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -382,6 +382,7 @@ struct inodes_stat_t { > #include > #include > #include > +#include > > #include > #include > @@ -1385,8 +1386,14 @@ struct super_block { > * generic_show_options() > */ > char *s_options; > + > + struct shrinker s_shrink; /* per-sb shrinker handle */ > }; From npiggin@suse.de Wed May 26 11:42:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4QGgGxa087573 for ; Wed, 26 May 2010 11:42:17 -0500 X-ASG-Debug-ID: 1274892385-4bd102570000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B09EAA56467 for ; Wed, 26 May 2010 09:46:26 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id 7mGJiqSYmWYiGmb3 for ; Wed, 26 May 2010 09:46:26 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 681FF93717; Wed, 26 May 2010 18:44:39 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id 8E57629818; Thu, 27 May 2010 02:44:37 +1000 (EST) Date: Thu, 27 May 2010 02:44:37 +1000 From: Nick Piggin To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/5] Per superblock shrinkers V2 Subject: Re: [PATCH 0/5] Per superblock shrinkers V2 Message-ID: <20100526164437.GE22536@laptop> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274777588-21494-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274892386 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 06:53:03PM +1000, Dave Chinner wrote: > > This series reworks the filesystem shrinkers. We currently have a > set of issues with the current filesystem shrinkers: > > 1. There is an dependency between dentry and inode cache > shrinking that is only implicitly defined by the order of > shrinker registration. > 2. The shrinkers need to walk the superblock list and pin > the superblock to avoid unmount races with the sb going > away. > 3. The dentry cache uses per-superblock LRUs and proportions > reclaim between all the superblocks which means we are > doing breadth based reclaim. This means we touch every > superblock for every shrinker call, and may only reclaim > a single dentry at a time from a given superblock. > 4. The inode cache has a global LRU, so it has different > reclaim patterns to the dentry cache, despite the fact > that the dentry cache is generally the only thing that > pins inodes in memory. > 5. Filesystems need to register their own shrinkers for > caches and can't co-ordinate them with the dentry and > inode cache shrinkers. Seems like a fairly good approach overall. Thanks. From richard@sauce.co.nz Wed May 26 14:55:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4QJtLsZ092600 for ; Wed, 26 May 2010 14:55:22 -0500 X-ASG-Debug-ID: 1274903862-24ca01600000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp.sauce.co.nz (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9F78A143F9EC for ; Wed, 26 May 2010 12:57:42 -0700 (PDT) Received: from smtp.sauce.co.nz (smtp.sauce.co.nz [210.48.49.72]) by cuda.sgi.com with ESMTP id kDRJYZGvSBxVZc6V for ; Wed, 26 May 2010 12:57:42 -0700 (PDT) Received: (qmail 6364 invoked from network); 26 May 2010 19:57:40 -0000 Received: from unknown (HELO soot.sauce.co.nz) (192.168.4.182) by smtp.sauce.co.nz with SMTP; 26 May 2010 19:57:40 -0000 Message-ID: <4BFD7D34.9060006@sauce.co.nz> Date: Thu, 27 May 2010 07:57:40 +1200 From: Richard Scobie User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.6) Gecko/20091206 Lightning/1.0b1 SeaMonkey/2.0.1 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfsdump -- not enough memory to dump attributes? w/>20G free -- Subject: Re: xfsdump -- not enough memory to dump attributes? w/>20G free -- Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtp.sauce.co.nz[210.48.49.72] X-Barracuda-Start-Time: 1274903863 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0005 1.0000 -2.0181 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30838 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Linda A. Walsh wrote: BTW -- how do you tell the version of the xfs progs from the individual progs -- I'm going from the installed rpm name, but if I build from the git, that won't be helpful. I don't see a VERSION command in xfsdump/restore? Hi Linda, xfsdump with no arguments shows the version: [rs@sam ~]$ xfsdump xfsdump: version 3.0.1 (dump format 3.0) xfsdump: usage: xfsdump [ -a (dump DMF dualstate files as offline) ] [ -b ] .... Regards, Richard From SRS0+wAYz+85+fromorbit.com=david@internode.on.net Wed May 26 17:59:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4QMxAjV097890 for ; Wed, 26 May 2010 17:59:11 -0500 X-ASG-Debug-ID: 1274914891-59ac03df0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1057C3798A0 for ; Wed, 26 May 2010 16:01:32 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id MWWmx7cR3NZt7EGv for ; Wed, 26 May 2010 16:01:32 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25717052-1927428 for multiple; Thu, 27 May 2010 08:31:30 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHPbN-0001cC-3U; Thu, 27 May 2010 09:01:29 +1000 Date: Thu, 27 May 2010 09:01:29 +1000 From: Dave Chinner To: Nick Piggin Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Subject: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Message-ID: <20100526230129.GA1395@dastard> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-2-git-send-email-david@fromorbit.com> <20100526161732.GC22536@laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100526161732.GC22536@laptop> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1274914894 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.2, rules version 3.2.2.30849 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 02:17:33AM +1000, Nick Piggin wrote: > On Tue, May 25, 2010 at 06:53:04PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > The inode unused list is currently a global LRU. This does not match > > the other global filesystem cache - the dentry cache - which uses > > per-superblock LRU lists. Hence we have related filesystem object > > types using different LRU reclaimatin schemes. > > Is this an improvement I wonder? The dcache is using per sb lists > because it specifically requires sb traversal. Right - I originally implemented the per-sb dentry lists for scalability purposes. i.e. to avoid monopolising the dentry_lock during unmount looking for dentries on a specific sb and hanging the system for several minutes. However, the reason for doing this to the inode cache is not for scalability, it's because we have a tight relationship between the dentry and inode cacheŃ•. That is, reclaim from the dentry LRU grows the inode LRU. Like the registration of the shrinkers, this is kind of an implicit, undocumented behavour of the current shrinker implemenation. What this patch series does is take that implicit relationship and make it explicit. It also allows other filesystem caches to tie into the relationship if they need to (e.g. the XFS inode cache). What it _doesn't do_ is change the macro level behaviour of the shrinkers... > What allocation/reclaim really wants (for good scalability and NUMA > characteristics) is per-zone lists for these things. It's easy to > convert a single list into per-zone lists. > > It is much harder to convert per-sb lists into per-sb x per-zone lists. No it's not. Just convert the s_{dentry,inode}_lru lists on each superblock and call the shrinker with a new zone mask field to pick the correct LRU. That's no harder than converting a global LRU. Anyway, you'd still have to do per-sb x per-zone lists for the dentry LRUs, so changing the inode cache to per-sb makes no difference. However, this is a moot point because we don't have per-zone shrinker interfaces. That's an entirely separate discussion because of the macro-level behavioural changes it implies.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+SGWR+85+fromorbit.com=david@internode.on.net Wed May 26 18:10:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4QNAK5K098995 for ; Wed, 26 May 2010 18:10:20 -0500 X-ASG-Debug-ID: 1274915669-5e5d017c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 09761A5C82D for ; Wed, 26 May 2010 16:14:29 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id pA3RtHVDipFUod7i for ; Wed, 26 May 2010 16:14:29 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25577622-1927428 for multiple; Thu, 27 May 2010 08:42:40 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHPlm-0001d7-H2; Thu, 27 May 2010 09:12:14 +1000 Date: Thu, 27 May 2010 09:12:14 +1000 From: Dave Chinner To: Nick Piggin Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100526231214.GB1395@dastard> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> <20100526164116.GD22536@laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100526164116.GD22536@laptop> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1274915671 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.2, rules version 3.2.2.30850 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 02:41:16AM +1000, Nick Piggin wrote: > On Tue, May 25, 2010 at 06:53:06PM +1000, Dave Chinner wrote: > > @@ -456,21 +456,16 @@ static void prune_one_dentry(struct dentry * dentry) > > * which flags are set. This means we don't need to maintain multiple > > * similar copies of this loop. > > */ > > -static void __shrink_dcache_sb(struct super_block *sb, int *count, int flags) > > +static void __shrink_dcache_sb(struct super_block *sb, int count, int flags) > > { > > LIST_HEAD(referenced); > > LIST_HEAD(tmp); > > struct dentry *dentry; > > - int cnt = 0; > > > > BUG_ON(!sb); > > - BUG_ON((flags & DCACHE_REFERENCED) && count == NULL); > > + BUG_ON((flags & DCACHE_REFERENCED) && count == -1); > > spin_lock(&dcache_lock); > > - if (count != NULL) > > - /* called from prune_dcache() and shrink_dcache_parent() */ > > - cnt = *count; > > -restart: > > - if (count == NULL) > > + if (count == -1) > > list_splice_init(&sb->s_dentry_lru, &tmp); > > else { > > while (!list_empty(&sb->s_dentry_lru)) { > > @@ -492,13 +487,13 @@ restart: > > } else { > > list_move_tail(&dentry->d_lru, &tmp); > > spin_unlock(&dentry->d_lock); > > - cnt--; > > - if (!cnt) > > + if (--count == 0) > > break; > > } > > cond_resched_lock(&dcache_lock); > > } > > } > > +prune_more: > > while (!list_empty(&tmp)) { > > dentry = list_entry(tmp.prev, struct dentry, d_lru); > > dentry_lru_del_init(dentry); > > @@ -516,88 +511,29 @@ restart: > > /* dentry->d_lock was dropped in prune_one_dentry() */ > > cond_resched_lock(&dcache_lock); > > } > > - if (count == NULL && !list_empty(&sb->s_dentry_lru)) > > - goto restart; > > - if (count != NULL) > > - *count = cnt; > > + if (count == -1 && !list_empty(&sb->s_dentry_lru)) { > > + list_splice_init(&sb->s_dentry_lru, &tmp); > > + goto prune_more; > > + } > > Nitpick but I prefer just the restart label wher it is previously. This > is moving setup for the next iteration into the "error" case. Ok, will fix. > > +static int prune_super(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) > > +{ > > + struct super_block *sb; > > + int count; > > + > > + sb = container_of(shrink, struct super_block, s_shrink); > > + > > + /* > > + * Deadlock avoidance. We may hold various FS locks, and we don't want > > + * to recurse into the FS that called us in clear_inode() and friends.. > > + */ > > + if (!(gfp_mask & __GFP_FS)) > > + return -1; > > + > > + /* > > + * if we can't get the umount lock, then there's no point having the > > + * shrinker try again because the sb is being torn down. > > + */ > > + if (!down_read_trylock(&sb->s_umount)) > > + return -1; > > Would you just elaborate on the lock order problem somewhere? (the > comment makes it look like we *could* take the mutex if we wanted > to). The shrinker is unregistered in deactivate_locked_super() which is just before ->kill_sb is called. The sb->s_umount lock is held at this point. hence is the shrinker is operating, we will deadlock if we try to lock it like this: unmount: shrinker: down_read(&shrinker_lock); down_write(&sb->s_umount) unregister_shrinker() down_write(&shrinker_lock) prune_super() down_read(&sb->s_umount); (deadlock) hence if we can't get the sb->s_umount lock in prune_super(), then the superblock must be being unmounted and the shrinker should abort as the ->kill_sb method will clean up everything after the shrinker is unregistered. Hence the down_read_trylock(). > > + if (!sb->s_root) { > > + up_read(&sb->s_umount); > > + return -1; > > + } > > + > > + if (nr_to_scan) { > > + /* proportion the scan between the two cacheŃ• */ > > + int total; > > + > > + total = sb->s_nr_dentry_unused + sb->s_nr_inodes_unused + 1; > > + count = (nr_to_scan * sb->s_nr_dentry_unused) / total; > > + > > + /* prune dcache first as icache is pinned by it */ > > + prune_dcache_sb(sb, count); > > + prune_icache_sb(sb, nr_to_scan - count); > > + } > > + > > + count = ((sb->s_nr_dentry_unused + sb->s_nr_inodes_unused) / 100) > > + * sysctl_vfs_cache_pressure; > > Do you think truncating in the divisions is at all a problem? It > probably doesn't matter much I suppose. Same code as currently exists. IIRC, the reasoning is that if we've got less that 100 objects to reclaim, then we're unlikely to be able to free up any memory from the caches, anyway. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+21CU+85+fromorbit.com=david@internode.on.net Wed May 26 18:16:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4QNGNjY099247 for ; Wed, 26 May 2010 18:16:23 -0500 X-ASG-Debug-ID: 1274915924-2a0c015b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 911643799AB for ; Wed, 26 May 2010 16:18:45 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id LeOJMuxpNetZgDwQ for ; Wed, 26 May 2010 16:18:45 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25676359-1927428 for multiple; Thu, 27 May 2010 08:48:44 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHPs2-0001du-RB; Thu, 27 May 2010 09:18:42 +1000 Date: Thu, 27 May 2010 09:18:42 +1000 From: Dave Chinner To: Stan Hoeppner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: noatime,nodiratime? Subject: Re: noatime,nodiratime? Message-ID: <20100526231842.GC1395@dastard> References: <4BF3F212.5030600@hardwarefreak.com> <20100519182336.GA6264@infradead.org> <4BF43B3C.6030403@hardwarefreak.com> <4BF44105.4040902@sandeen.net> <4BF47859.6020808@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4BF47859.6020808@hardwarefreak.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1274915926 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.2, rules version 3.2.2.30849 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, May 19, 2010 at 06:46:33PM -0500, Stan Hoeppner wrote: > Eric Sandeen put forth on 5/19/2010 2:50 PM: > > > xfs_info actually calls xfs_growfs -n, and it's only reporting on-disk > > geometry. I kind of doubt that'll change. If you want to see mount > > options, /proc/mounts is the place ... but then we don't show the > > defaults ;) I wonder if we should change that and be explicit about > > every option in /proc/mounts *shrug* > > IMHO the option values should be listed, whether they are the defaults or > user defined. XFS may be breaking convention by doing so, as it appears > EXT2 (and probably 3/4, and other filesystems) behave the same as XFS > currently does--no display of default settings, except rw. > > > It's so hard to keep google up to date ;) > > Add the information to the FAQ and it'll show up in Google indexes in short > order, assuming you allow robots to crawl xfs.org, which IIRC, you do. > > > /proc/mounts shows all mount options which were set differently from > > defaults. > > Yes. It would be nice to see the settings regardless of default or user > defined. In the absence of, or in addition to this, could we get a > consistent (default) for each setting in XFS man mount? For example, > barrier is listed but we're not told if it's the default. nobarrier isn't > even in the man page, but it's on the wiki FAQ. The wiki FAQ tells us that > barrier is the default. I'm referring to the man page that comes with > Debian 5.0. The current man page may be updated to reflect some of these > things, though I've not read it yet. > > Sorry if I seem nit-picky. I've spent many hours trying to hunt down some > of this information and it's been a frustrating process. XFS rocks. > Currently, from here, the docs don't rock yet. :( Patches to fix up the docs will be gratefully accepted. :) Patches to change the output of /proc/mounts might take a little more discussion.... Note that the man pages for mount are in the util-linux package, not anything XFS... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+oUyZ+86+fromorbit.com=david@internode.on.net Wed May 26 20:51:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R1pR2O103754 for ; Wed, 26 May 2010 20:51:28 -0500 X-ASG-Debug-ID: 1274925336-285300e50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E5387109F52D for ; Wed, 26 May 2010 18:55:37 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id 2E2lrut7KAo1Fgr7 for ; Wed, 26 May 2010 18:55:37 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14123020-1927428 for multiple; Thu, 27 May 2010 11:23:47 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHSHv-0001mo-BZ; Thu, 27 May 2010 11:53:35 +1000 Date: Thu, 27 May 2010 11:53:35 +1000 From: Dave Chinner To: Nick Piggin Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/5 v2] superblock: introduce per-sb cache shrinker infrastructure Subject: [PATCH 3/5 v2] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100527015335.GD1395@dastard> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> <20100526164116.GD22536@laptop> <20100526231214.GB1395@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100526231214.GB1395@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1274925338 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.2, rules version 3.2.2.30859 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 09:12:14AM +1000, Dave Chinner wrote: > On Thu, May 27, 2010 at 02:41:16AM +1000, Nick Piggin wrote: .... > > Nitpick but I prefer just the restart label wher it is previously. This > > is moving setup for the next iteration into the "error" case. > > Ok, will fix. .... > > Would you just elaborate on the lock order problem somewhere? (the > > comment makes it look like we *could* take the mutex if we wanted > > to). > > The shrinker is unregistered in deactivate_locked_super() which is > just before ->kill_sb is called. The sb->s_umount lock is held at > this point. hence is the shrinker is operating, we will deadlock if > we try to lock it like this: > > unmount: shrinker: > down_read(&shrinker_lock); > down_write(&sb->s_umount) > unregister_shrinker() > down_write(&shrinker_lock) > prune_super() > down_read(&sb->s_umount); > (deadlock) > > hence if we can't get the sb->s_umount lock in prune_super(), then > the superblock must be being unmounted and the shrinker should abort > as the ->kill_sb method will clean up everything after the shrinker > is unregistered. Hence the down_read_trylock(). Updated patch below with these issues fixed. Cheers, Dave. -- Dave Chinner david@fromorbit.com superblock: introduce per-sb cache shrinker infrastructure From: Dave Chinner With context based shrinkers, we can implement a per-superblock shrinker that shrinks the caches attached to the superblock. We currently have global shrinkers for the inode and dentry caches that split up into per-superblock operations via a coarse proportioning method that does not batch very well. The global shrinkers also have a dependency - dentries pin inodes - so we have to be very careful about how we register the global shrinkers so that the implicit call order is always correct. With a per-sb shrinker callout, we can encode this dependency directly into the per-sb shrinker, hence avoiding the need for strictly ordering shrinker registrations. We also have no need for any proportioning code for the shrinker subsystem already provides this functionality across all shrinkers. Allowing the shrinker to operate on a single superblock at a time means that we do less superblock list traversals and locking and reclaim should batch more effectively. This should result in less CPU overhead for reclaim and potentially faster reclaim of items from each filesystem. Signed-off-by: Dave Chinner --- Version 2: - change loop restart in __shrink_dcache_sb() to match previous restart semantics - add a better comment in prune_super() to explain the deadlock we are avoiding by using down_read_trylock(&sb->s_umount) before starting any shrinking. fs/dcache.c | 127 +++++++--------------------------------------------- fs/inode.c | 109 +++----------------------------------------- fs/super.c | 58 ++++++++++++++++++++++++ include/linux/fs.h | 7 +++ 4 files changed, 89 insertions(+), 212 deletions(-) diff --git a/fs/dcache.c b/fs/dcache.c index dba6b6d..a7cd335 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -456,21 +456,17 @@ static void prune_one_dentry(struct dentry * dentry) * which flags are set. This means we don't need to maintain multiple * similar copies of this loop. */ -static void __shrink_dcache_sb(struct super_block *sb, int *count, int flags) +static void __shrink_dcache_sb(struct super_block *sb, int count, int flags) { LIST_HEAD(referenced); LIST_HEAD(tmp); struct dentry *dentry; - int cnt = 0; BUG_ON(!sb); - BUG_ON((flags & DCACHE_REFERENCED) && count == NULL); + BUG_ON((flags & DCACHE_REFERENCED) && count == -1); spin_lock(&dcache_lock); - if (count != NULL) - /* called from prune_dcache() and shrink_dcache_parent() */ - cnt = *count; restart: - if (count == NULL) + if (count == -1) list_splice_init(&sb->s_dentry_lru, &tmp); else { while (!list_empty(&sb->s_dentry_lru)) { @@ -492,8 +488,7 @@ restart: } else { list_move_tail(&dentry->d_lru, &tmp); spin_unlock(&dentry->d_lock); - cnt--; - if (!cnt) + if (--count == 0) break; } cond_resched_lock(&dcache_lock); @@ -516,88 +511,27 @@ restart: /* dentry->d_lock was dropped in prune_one_dentry() */ cond_resched_lock(&dcache_lock); } - if (count == NULL && !list_empty(&sb->s_dentry_lru)) + if (count == -1 && !list_empty(&sb->s_dentry_lru)) goto restart; - if (count != NULL) - *count = cnt; if (!list_empty(&referenced)) list_splice(&referenced, &sb->s_dentry_lru); spin_unlock(&dcache_lock); } /** - * prune_dcache - shrink the dcache - * @count: number of entries to try to free + * prune_dcache_sb - shrink the dcache + * @nr_to_scan: number of entries to try to free * - * Shrink the dcache. This is done when we need more memory, or simply when we - * need to unmount something (at which point we need to unuse all dentries). + * Attempt to shrink the superblock dcache LRU by @nr_to_scan entries. This is + * done when we need more memory an called from the superblock shrinker + * function. * - * This function may fail to free any resources if all the dentries are in use. + * This function may fail to free any resources if all the dentries are in + * use. */ -static void prune_dcache(int count) +void prune_dcache_sb(struct super_block *sb, int nr_to_scan) { - struct super_block *sb, *n; - int w_count; - int unused = dentry_stat.nr_unused; - int prune_ratio; - int pruned; - - if (unused == 0 || count == 0) - return; - spin_lock(&dcache_lock); - if (count >= unused) - prune_ratio = 1; - else - prune_ratio = unused / count; - spin_lock(&sb_lock); - list_for_each_entry_safe(sb, n, &super_blocks, s_list) { - if (list_empty(&sb->s_instances)) - continue; - if (sb->s_nr_dentry_unused == 0) - continue; - sb->s_count++; - /* Now, we reclaim unused dentrins with fairness. - * We reclaim them same percentage from each superblock. - * We calculate number of dentries to scan on this sb - * as follows, but the implementation is arranged to avoid - * overflows: - * number of dentries to scan on this sb = - * count * (number of dentries on this sb / - * number of dentries in the machine) - */ - spin_unlock(&sb_lock); - if (prune_ratio != 1) - w_count = (sb->s_nr_dentry_unused / prune_ratio) + 1; - else - w_count = sb->s_nr_dentry_unused; - pruned = w_count; - /* - * We need to be sure this filesystem isn't being unmounted, - * otherwise we could race with generic_shutdown_super(), and - * end up holding a reference to an inode while the filesystem - * is unmounted. So we try to get s_umount, and make sure - * s_root isn't NULL. - */ - if (down_read_trylock(&sb->s_umount)) { - if ((sb->s_root != NULL) && - (!list_empty(&sb->s_dentry_lru))) { - spin_unlock(&dcache_lock); - __shrink_dcache_sb(sb, &w_count, - DCACHE_REFERENCED); - pruned -= w_count; - spin_lock(&dcache_lock); - } - up_read(&sb->s_umount); - } - spin_lock(&sb_lock); - count -= pruned; - __put_super(sb); - /* more work left to do? */ - if (count <= 0) - break; - } - spin_unlock(&sb_lock); - spin_unlock(&dcache_lock); + __shrink_dcache_sb(sb, nr_to_scan, DCACHE_REFERENCED); } /** @@ -610,7 +544,7 @@ static void prune_dcache(int count) */ void shrink_dcache_sb(struct super_block * sb) { - __shrink_dcache_sb(sb, NULL, 0); + __shrink_dcache_sb(sb, -1, 0); } EXPORT_SYMBOL(shrink_dcache_sb); @@ -878,37 +812,10 @@ void shrink_dcache_parent(struct dentry * parent) int found; while ((found = select_parent(parent)) != 0) - __shrink_dcache_sb(sb, &found, 0); + __shrink_dcache_sb(sb, found, 0); } EXPORT_SYMBOL(shrink_dcache_parent); -/* - * Scan `nr' dentries and return the number which remain. - * - * We need to avoid reentering the filesystem if the caller is performing a - * GFP_NOFS allocation attempt. One example deadlock is: - * - * ext2_new_block->getblk->GFP->shrink_dcache_memory->prune_dcache-> - * prune_one_dentry->dput->dentry_iput->iput->inode->i_sb->s_op->put_inode-> - * ext2_discard_prealloc->ext2_free_blocks->lock_super->DEADLOCK. - * - * In this case we return -1 to tell the caller that we baled. - */ -static int shrink_dcache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) -{ - if (nr) { - if (!(gfp_mask & __GFP_FS)) - return -1; - prune_dcache(nr); - } - return (dentry_stat.nr_unused / 100) * sysctl_vfs_cache_pressure; -} - -static struct shrinker dcache_shrinker = { - .shrink = shrink_dcache_memory, - .seeks = DEFAULT_SEEKS, -}; - /** * d_alloc - allocate a dcache entry * @parent: parent of entry to allocate @@ -2316,8 +2223,6 @@ static void __init dcache_init(void) */ dentry_cache = KMEM_CACHE(dentry, SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD); - - register_shrinker(&dcache_shrinker); /* Hash may have been set up in dcache_init_early */ if (!hashdist) diff --git a/fs/inode.c b/fs/inode.c index 1e44ec5..5fb4a39 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -25,7 +25,6 @@ #include #include #include -#include "internal.h" /* * This is needed for the following functions: @@ -441,8 +440,10 @@ static int can_unuse(struct inode *inode) } /* - * Scan `goal' inodes on the unused list for freeable ones. They are moved to - * a temporary list and then are freed outside inode_lock by dispose_list(). + * Walk the superblock inode LRU for freeable inodes and attempt to free them. + * This is called from the superblock shrinker function with a number of inodes + * to trim from the LRU. Inodes to be freed are moved to a temporary list and + * then are freed outside inode_lock by dispose_list(). * * Any inodes which are pinned purely because of attached pagecache have their * pagecache removed. We expect the final iput() on that inode to add it to @@ -450,10 +451,10 @@ static int can_unuse(struct inode *inode) * inode is still freeable, proceed. The right inode is found 99.9% of the * time in testing on a 4-way. * - * If the inode has metadata buffers attached to mapping->private_list then - * try to remove them. + * If the inode has metadata buffers attached to mapping->private_list then try + * to remove them. */ -static void shrink_icache_sb(struct super_block *sb, int *nr_to_scan) +void prune_icache_sb(struct super_block *sb, int nr_to_scan) { LIST_HEAD(freeable); int nr_pruned = 0; @@ -461,7 +462,7 @@ static void shrink_icache_sb(struct super_block *sb, int *nr_to_scan) unsigned long reap = 0; spin_lock(&inode_lock); - for (nr_scanned = *nr_to_scan; nr_scanned >= 0; nr_scanned--) { + for (nr_scanned = nr_to_scan; nr_scanned >= 0; nr_scanned--) { struct inode *inode; if (list_empty(&sb->s_inode_lru)) @@ -500,103 +501,10 @@ static void shrink_icache_sb(struct super_block *sb, int *nr_to_scan) else __count_vm_events(PGINODESTEAL, reap); spin_unlock(&inode_lock); - *nr_to_scan = nr_scanned; dispose_list(&freeable); } -static void prune_icache(int count) -{ - struct super_block *sb, *n; - int w_count; - int unused = inodes_stat.nr_unused; - int prune_ratio; - int pruned; - - if (unused == 0 || count == 0) - return; - down_read(&iprune_sem); - if (count >= unused) - prune_ratio = 1; - else - prune_ratio = unused / count; - spin_lock(&sb_lock); - list_for_each_entry_safe(sb, n, &super_blocks, s_list) { - if (list_empty(&sb->s_instances)) - continue; - if (sb->s_nr_inodes_unused == 0) - continue; - sb->s_count++; - /* Now, we reclaim unused dentrins with fairness. - * We reclaim them same percentage from each superblock. - * We calculate number of dentries to scan on this sb - * as follows, but the implementation is arranged to avoid - * overflows: - * number of dentries to scan on this sb = - * count * (number of dentries on this sb / - * number of dentries in the machine) - */ - spin_unlock(&sb_lock); - if (prune_ratio != 1) - w_count = (sb->s_nr_inodes_unused / prune_ratio) + 1; - else - w_count = sb->s_nr_inodes_unused; - pruned = w_count; - /* - * We need to be sure this filesystem isn't being unmounted, - * otherwise we could race with generic_shutdown_super(), and - * end up holding a reference to an inode while the filesystem - * is unmounted. So we try to get s_umount, and make sure - * s_root isn't NULL. - */ - if (down_read_trylock(&sb->s_umount)) { - if ((sb->s_root != NULL) && - (!list_empty(&sb->s_inode_lru))) { - shrink_icache_sb(sb, &w_count); - pruned -= w_count; - } - up_read(&sb->s_umount); - } - spin_lock(&sb_lock); - count -= pruned; - __put_super(sb); - /* more work left to do? */ - if (count <= 0) - break; - } - spin_unlock(&sb_lock); - up_read(&iprune_sem); -} - -/* - * shrink_icache_memory() will attempt to reclaim some unused inodes. Here, - * "unused" means that no dentries are referring to the inodes: the files are - * not open and the dcache references to those inodes have already been - * reclaimed. - * - * This function is passed the number of inodes to scan, and it returns the - * total number of remaining possibly-reclaimable inodes. - */ -static int shrink_icache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) -{ - if (nr) { - /* - * Nasty deadlock avoidance. We may hold various FS locks, - * and we don't want to recurse into the FS that called us - * in clear_inode() and friends.. - */ - if (!(gfp_mask & __GFP_FS)) - return -1; - prune_icache(nr); - } - return (inodes_stat.nr_unused / 100) * sysctl_vfs_cache_pressure; -} - -static struct shrinker icache_shrinker = { - .shrink = shrink_icache_memory, - .seeks = DEFAULT_SEEKS, -}; - static void __wait_on_freeing_inode(struct inode *inode); /* * Called with the inode lock held. @@ -1634,7 +1542,6 @@ void __init inode_init(void) (SLAB_RECLAIM_ACCOUNT|SLAB_PANIC| SLAB_MEM_SPREAD), init_once); - register_shrinker(&icache_shrinker); /* Hash may have been set up in inode_init_early */ if (!hashdist) diff --git a/fs/super.c b/fs/super.c index c554c53..613339b 100644 --- a/fs/super.c +++ b/fs/super.c @@ -37,6 +37,55 @@ LIST_HEAD(super_blocks); DEFINE_SPINLOCK(sb_lock); +static int prune_super(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) +{ + struct super_block *sb; + int count; + + sb = container_of(shrink, struct super_block, s_shrink); + + /* + * Deadlock avoidance. We may hold various FS locks, and we don't want + * to recurse into the FS that called us in clear_inode() and friends.. + */ + if (!(gfp_mask & __GFP_FS)) + return -1; + + /* + * If we can't get the umount lock, then it's because the sb is being + * unmounted. If we get here, then the unmount is likely stuck trying + * to unregister the shrinker, so we must not block trying to get the + * sb->s_umount otherwise we deadlock. Hence if we fail to get the + * sb_umount lock, abort shrinking the sb by telling the shrinker not + * to call us again and the unmount process will clean up the cache for + * us after it has unregistered the shrinker. + */ + if (!down_read_trylock(&sb->s_umount)) + return -1; + + if (!sb->s_root) { + up_read(&sb->s_umount); + return -1; + } + + if (nr_to_scan) { + /* proportion the scan between the two cacheŃ• */ + int total; + + total = sb->s_nr_dentry_unused + sb->s_nr_inodes_unused + 1; + count = (nr_to_scan * sb->s_nr_dentry_unused) / total; + + /* prune dcache first as icache is pinned by it */ + prune_dcache_sb(sb, count); + prune_icache_sb(sb, nr_to_scan - count); + } + + count = ((sb->s_nr_dentry_unused + sb->s_nr_inodes_unused) / 100) + * sysctl_vfs_cache_pressure; + up_read(&sb->s_umount); + return count; +} + /** * alloc_super - create new superblock * @type: filesystem type superblock should belong to @@ -99,6 +148,13 @@ static struct super_block *alloc_super(struct file_system_type *type) s->s_qcop = sb_quotactl_ops; s->s_op = &default_op; s->s_time_gran = 1000000000; + + /* + * The shrinker is set up here but not registered until after + * the superblock has been filled out successfully. + */ + s->s_shrink.shrink = prune_super; + s->s_shrink.seeks = DEFAULT_SEEKS; } out: return s; @@ -162,6 +218,7 @@ void deactivate_locked_super(struct super_block *s) struct file_system_type *fs = s->s_type; if (atomic_dec_and_test(&s->s_active)) { vfs_dq_off(s, 0); + unregister_shrinker(&s->s_shrink); fs->kill_sb(s); put_filesystem(fs); put_super(s); @@ -335,6 +392,7 @@ retry: list_add_tail(&s->s_list, &super_blocks); list_add(&s->s_instances, &type->fs_supers); spin_unlock(&sb_lock); + register_shrinker(&s->s_shrink); get_filesystem(type); return s; } diff --git a/include/linux/fs.h b/include/linux/fs.h index 7b90c43..5bff2dc 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -382,6 +382,7 @@ struct inodes_stat_t { #include #include #include +#include #include #include @@ -1385,8 +1386,14 @@ struct super_block { * generic_show_options() */ char *s_options; + + struct shrinker s_shrink; /* per-sb shrinker handle */ }; +/* superblock cache pruning functions */ +void prune_icache_sb(struct super_block *sb, int nr_to_scan); +void prune_dcache_sb(struct super_block *sb, int nr_to_scan); + extern struct timespec current_fs_time(struct super_block *sb); /* From SRS0+r754+86+fromorbit.com=dave@internode.on.net Wed May 26 20:56:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R1u27x103844 for ; Wed, 26 May 2010 20:56:03 -0500 X-ASG-Debug-ID: 1274925504-483702a30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 71ABE37A2B5 for ; Wed, 26 May 2010 18:58:25 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id m2thSSzC91D3DwNH for ; Wed, 26 May 2010 18:58:25 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26002374-1927428 for ; Thu, 27 May 2010 11:28:23 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OHSMZ-0001n9-3A for xfs@oss.sgi.com; Thu, 27 May 2010 11:58:23 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OHSMQ-0008Ar-0E for xfs@oss.sgi.com; Thu, 27 May 2010 11:58:14 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: fix might_sleep() warning when initialising per-ag tree Subject: [PATCH] xfs: fix might_sleep() warning when initialising per-ag tree Date: Thu, 27 May 2010 11:58:13 +1000 Message-Id: <1274925493-31401-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1274925506 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.2, rules version 3.2.2.30860 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The use of radix_tree_preload() only works if the radix tree was initialised without the __GFP_WAIT flag. The per-ag tree uses GFP_NOFS, so does not trigger allocation of new tree nodes from the preloaded array. Hence it enters the allocator with a spinlock held and triggers the might_sleep() warnings. Reported-by; Chris Mason Signed-off-by: Dave Chinner --- fs/xfs/xfs_mount.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index ace795f..c901283 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1251,7 +1251,7 @@ xfs_mountfs( * Allocate and initialize the per-ag data. */ spin_lock_init(&mp->m_perag_lock); - INIT_RADIX_TREE(&mp->m_perag_tree, GFP_NOFS); + INIT_RADIX_TREE(&mp->m_perag_tree, GFP_ATOMIC); error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); if (error) { cmn_err(CE_WARN, "XFS: Failed per-ag init: %d", error); -- 1.5.6.5 From SRS0+sKSk+86+fromorbit.com=dave@internode.on.net Wed May 26 20:56:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R1utZG103870 for ; Wed, 26 May 2010 20:56:55 -0500 X-ASG-Debug-ID: 1274925665-2b3f00b00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2A23E109F70C for ; Wed, 26 May 2010 19:01:05 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id o71R4d7EqnJuvtoh for ; Wed, 26 May 2010 19:01:05 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25867136-1927428 for ; Thu, 27 May 2010 11:29:16 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OHSNP-0001nF-HC for xfs@oss.sgi.com; Thu, 27 May 2010 11:59:15 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OHSNG-0008C1-CF for xfs@oss.sgi.com; Thu, 27 May 2010 11:59:06 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: Re-initialise lockdep context for all inodes in reclaim Subject: [PATCH] xfs: Re-initialise lockdep context for all inodes in reclaim Date: Thu, 27 May 2010 11:59:06 +1000 Message-Id: <1274925546-31468-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.5.6.5 X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1274925667 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.2, rules version 3.2.2.30859 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner We re-initialise the lockdep context for inode iolocks when dropping an inode, but not when we delete an inode. Now that we can reclaim inodes from a shrinker, we can get get false lockdep warnings about inode iolock inversions during reclaim of deleted inodes. Hence we need to re-initialise the iolock in the delete path as well. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 8119d1b..ba0e884 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -911,6 +911,20 @@ xfs_fs_destroy_inode( XFS_STATS_INC(vn_reclaim); + /* + * The iolock is used by the file system to coordinate reads, + * writes, and block truncates. Up to this point the lock + * protected concurrent accesses by users of the inode. But + * from here forward we're doing some final processing of the + * inode because we're done with it, and although we reuse the + * iolock for protection it is really a distinct lock class + * (in the lockdep sense) from before. To keep lockdep happy + * (and basically indicate what we are doing), we explicitly + * re-init the iolock here. + */ + ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); + mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); + /* bad inode, get out here ASAP */ if (is_bad_inode(inode)) goto out_reclaim; -- 1.5.6.5 From npiggin@suse.de Wed May 26 21:02:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R22SCW104069 for ; Wed, 26 May 2010 21:02:29 -0500 X-ASG-Debug-ID: 1274925891-54a801ad0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B208F144D710 for ; Wed, 26 May 2010 19:04:52 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id zwPB8OIqXD9QiCEV for ; Wed, 26 May 2010 19:04:52 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id CE6C090975; Thu, 27 May 2010 04:04:50 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id 39D32298D6; Thu, 27 May 2010 12:04:45 +1000 (EST) Date: Thu, 27 May 2010 12:04:45 +1000 From: Nick Piggin To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Subject: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Message-ID: <20100527020445.GF22536@laptop> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-2-git-send-email-david@fromorbit.com> <20100526161732.GC22536@laptop> <20100526230129.GA1395@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100526230129.GA1395@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274925892 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 09:01:29AM +1000, Dave Chinner wrote: > On Thu, May 27, 2010 at 02:17:33AM +1000, Nick Piggin wrote: > > On Tue, May 25, 2010 at 06:53:04PM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > The inode unused list is currently a global LRU. This does not match > > > the other global filesystem cache - the dentry cache - which uses > > > per-superblock LRU lists. Hence we have related filesystem object > > > types using different LRU reclaimatin schemes. > > > > Is this an improvement I wonder? The dcache is using per sb lists > > because it specifically requires sb traversal. > > Right - I originally implemented the per-sb dentry lists for > scalability purposes. i.e. to avoid monopolising the dentry_lock > during unmount looking for dentries on a specific sb and hanging the > system for several minutes. > > However, the reason for doing this to the inode cache is not for > scalability, it's because we have a tight relationship between the > dentry and inode cacheŃ•. That is, reclaim from the dentry LRU grows > the inode LRU. Like the registration of the shrinkers, this is kind > of an implicit, undocumented behavour of the current shrinker > implemenation. Right, that's why I wonder whether it is an improvement. It would be interesting to see some tests (showing at least parity). > What this patch series does is take that implicit relationship and > make it explicit. It also allows other filesystem caches to tie > into the relationship if they need to (e.g. the XFS inode cache). > What it _doesn't do_ is change the macro level behaviour of the > shrinkers... > > > What allocation/reclaim really wants (for good scalability and NUMA > > characteristics) is per-zone lists for these things. It's easy to > > convert a single list into per-zone lists. > > > > It is much harder to convert per-sb lists into per-sb x per-zone lists. > > No it's not. Just convert the s_{dentry,inode}_lru lists on each > superblock and call the shrinker with a new zone mask field to pick > the correct LRU. That's no harder than converting a global LRU. > Anyway, you'd still have to do per-sb x per-zone lists for the dentry LRUs, > so changing the inode cache to per-sb makes no difference. Right, it just makes it harder to do. By much harder, I did mostly mean the extra memory overhead. If there is *no* benefit from doing per-sb icache then I would question whether we should. > However, this is a moot point because we don't have per-zone shrinker > interfaces. That's an entirely separate discussion because of the > macro-level behavioural changes it implies.... Yep. I have some patches for it, but they're currently behind the other fine grained locking stuff. But it's something that really needs to be implemented, IMO. From npiggin@suse.de Wed May 26 21:16:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R2Gt7s104492 for ; Wed, 26 May 2010 21:16:56 -0500 X-ASG-Debug-ID: 1274926758-53fc02680000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A991C144D916 for ; Wed, 26 May 2010 19:19:18 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id mbvZ3gYWNbznAK4Z for ; Wed, 26 May 2010 19:19:18 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 5753B90975; Thu, 27 May 2010 04:19:18 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id 050BA29818; Thu, 27 May 2010 12:19:05 +1000 (EST) Date: Thu, 27 May 2010 12:19:05 +1000 From: Nick Piggin To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100527021905.GG22536@laptop> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> <20100526164116.GD22536@laptop> <20100526231214.GB1395@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100526231214.GB1395@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274926759 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 09:12:14AM +1000, Dave Chinner wrote: > On Thu, May 27, 2010 at 02:41:16AM +1000, Nick Piggin wrote: > > On Tue, May 25, 2010 at 06:53:06PM +1000, Dave Chinner wrote: > > > @@ -456,21 +456,16 @@ static void prune_one_dentry(struct dentry * dentry) > > > + /* > > > + * if we can't get the umount lock, then there's no point having the > > > + * shrinker try again because the sb is being torn down. > > > + */ > > > + if (!down_read_trylock(&sb->s_umount)) > > > + return -1; > > > > Would you just elaborate on the lock order problem somewhere? (the > > comment makes it look like we *could* take the mutex if we wanted > > to). > > The shrinker is unregistered in deactivate_locked_super() which is > just before ->kill_sb is called. The sb->s_umount lock is held at > this point. hence is the shrinker is operating, we will deadlock if > we try to lock it like this: > > unmount: shrinker: > down_read(&shrinker_lock); > down_write(&sb->s_umount) > unregister_shrinker() > down_write(&shrinker_lock) > prune_super() > down_read(&sb->s_umount); > (deadlock) > > hence if we can't get the sb->s_umount lock in prune_super(), then > the superblock must be being unmounted and the shrinker should abort > as the ->kill_sb method will clean up everything after the shrinker > is unregistered. Hence the down_read_trylock(). You added it to the comment in your updated patch, that was the main thing I wanted. Thanks. > > > + if (!sb->s_root) { > > > + up_read(&sb->s_umount); > > > + return -1; > > > + } > > > + > > > + if (nr_to_scan) { > > > + /* proportion the scan between the two cacheŃ• */ > > > + int total; > > > + > > > + total = sb->s_nr_dentry_unused + sb->s_nr_inodes_unused + 1; > > > + count = (nr_to_scan * sb->s_nr_dentry_unused) / total; > > > + > > > + /* prune dcache first as icache is pinned by it */ > > > + prune_dcache_sb(sb, count); > > > + prune_icache_sb(sb, nr_to_scan - count); > > > + } > > > + > > > + count = ((sb->s_nr_dentry_unused + sb->s_nr_inodes_unused) / 100) > > > + * sysctl_vfs_cache_pressure; > > > > Do you think truncating in the divisions is at all a problem? It > > probably doesn't matter much I suppose. > > Same code as currently exists. IIRC, the reasoning is that if we've > got less that 100 objects to reclaim, then we're unlikely to be able > to free up any memory from the caches, anyway. Yeah, which is why I stop short of saying you should change it in this patch. But I think we should ensure things can get reclaimed eventually. 100 objects could be 100 slabs, which could be anything from half a meg to half a dozen. Multiplied by each of the caches. Could be significant in small systems. From viro@ftp.linux.org.uk Wed May 26 22:59:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R3xEiN107644 for ; Wed, 26 May 2010 22:59:14 -0500 X-ASG-Debug-ID: 1274932999-4aad02150000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ZenIV.linux.org.uk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AF8DCA64418 for ; Wed, 26 May 2010 21:03:19 -0700 (PDT) Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id VODZP0LyytwGeMtV for ; Wed, 26 May 2010 21:03:19 -0700 (PDT) Received: from viro by ZenIV.linux.org.uk with local (Exim 4.69 #1 (Red Hat Linux)) id 1OHUHZ-0002vQ-1h; Thu, 27 May 2010 04:01:21 +0000 Date: Thu, 27 May 2010 05:01:20 +0100 From: Al Viro To: Dave Chinner Cc: Nick Piggin , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5 v2] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5 v2] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100527040120.GX31073@ZenIV.linux.org.uk> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> <20100526164116.GD22536@laptop> <20100526231214.GB1395@dastard> <20100527015335.GD1395@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527015335.GD1395@dastard> User-Agent: Mutt/1.5.20 (2009-08-17) Sender: Al Viro X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1274933003 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.2, rules version 3.2.2.30867 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 11:53:35AM +1000, Dave Chinner wrote: > On Thu, May 27, 2010 at 09:12:14AM +1000, Dave Chinner wrote: > > On Thu, May 27, 2010 at 02:41:16AM +1000, Nick Piggin wrote: > .... > > > Nitpick but I prefer just the restart label wher it is previously. This > > > is moving setup for the next iteration into the "error" case. > > > > Ok, will fix. > .... > > > Would you just elaborate on the lock order problem somewhere? (the > > > comment makes it look like we *could* take the mutex if we wanted > > > to). > > > > The shrinker is unregistered in deactivate_locked_super() which is > > just before ->kill_sb is called. The sb->s_umount lock is held at > > this point. hence is the shrinker is operating, we will deadlock if > > we try to lock it like this: > > > > unmount: shrinker: > > down_read(&shrinker_lock); > > down_write(&sb->s_umount) > > unregister_shrinker() > > down_write(&shrinker_lock) > > prune_super() > > down_read(&sb->s_umount); > > (deadlock) > > > > hence if we can't get the sb->s_umount lock in prune_super(), then > > the superblock must be being unmounted and the shrinker should abort > > as the ->kill_sb method will clean up everything after the shrinker > > is unregistered. Hence the down_read_trylock(). Um... Maybe I'm dumb, but what's wrong with doing unregistration from deactivate_locked_super(), right after the call of ->kill_sb()? At that point ->s_umount is already dropped, so we won't deadlock at all. Shrinker rwsem will make sure that all shrinkers-in-progress will run to completion, so we won't get a superblock freed under prune_super(). I don't particulary mind down_try_read() in prune_super(), but why not make life obviously safer? Am I missing something here? From SRS0+BywY+86+fromorbit.com=david@internode.on.net Wed May 26 22:59:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R3xpwO107690 for ; Wed, 26 May 2010 22:59:52 -0500 X-ASG-Debug-ID: 1274932932-09a901890000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A976E37A662 for ; Wed, 26 May 2010 21:02:13 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id fjkAEYvPTyNaV4kN for ; Wed, 26 May 2010 21:02:13 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25885177-1927428 for multiple; Thu, 27 May 2010 13:32:12 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHUIM-0001v3-LG; Thu, 27 May 2010 14:02:10 +1000 Date: Thu, 27 May 2010 14:02:10 +1000 From: Dave Chinner To: Nick Piggin Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Subject: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Message-ID: <20100527040210.GI12087@dastard> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-2-git-send-email-david@fromorbit.com> <20100526161732.GC22536@laptop> <20100526230129.GA1395@dastard> <20100527020445.GF22536@laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100527020445.GF22536@laptop> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1274932934 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.2, rules version 3.2.2.30868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 12:04:45PM +1000, Nick Piggin wrote: > On Thu, May 27, 2010 at 09:01:29AM +1000, Dave Chinner wrote: > > On Thu, May 27, 2010 at 02:17:33AM +1000, Nick Piggin wrote: > > > On Tue, May 25, 2010 at 06:53:04PM +1000, Dave Chinner wrote: > > > > From: Dave Chinner > > > > > > > > The inode unused list is currently a global LRU. This does not match > > > > the other global filesystem cache - the dentry cache - which uses > > > > per-superblock LRU lists. Hence we have related filesystem object > > > > types using different LRU reclaimatin schemes. > > > > > > Is this an improvement I wonder? The dcache is using per sb lists > > > because it specifically requires sb traversal. > > > > Right - I originally implemented the per-sb dentry lists for > > scalability purposes. i.e. to avoid monopolising the dentry_lock > > during unmount looking for dentries on a specific sb and hanging the > > system for several minutes. > > > > However, the reason for doing this to the inode cache is not for > > scalability, it's because we have a tight relationship between the > > dentry and inode cacheŃ•. That is, reclaim from the dentry LRU grows > > the inode LRU. Like the registration of the shrinkers, this is kind > > of an implicit, undocumented behavour of the current shrinker > > implemenation. > > Right, that's why I wonder whether it is an improvement. It would > be interesting to see some tests (showing at least parity). I've done some testing showing parity. They've been along the lines of: - populate cache with 1m dentries + inodes - run 'time echo 2 > /proc/sys/vm/drop_caches' I've used different methods of populating the caches to have them non-sequential in the LRU (i.e. trigger fragmentation), have dirty backing inodes (e.g. the VFS inode clean, the xfs inode dirty because transactions haven't completed), etc. The variation on the test is around +-10%, with the per-sb shrinkers averaging about 5% lower time to reclaim. This is within the error margin of the test, so it's not really a conclusive win, but it is certainly shows that it does not slow anything down. If you've got a better way to test it, then I'm all ears.... > > What this patch series does is take that implicit relationship and > > make it explicit. It also allows other filesystem caches to tie > > into the relationship if they need to (e.g. the XFS inode cache). > > What it _doesn't do_ is change the macro level behaviour of the > > shrinkers... > > > > > What allocation/reclaim really wants (for good scalability and NUMA > > > characteristics) is per-zone lists for these things. It's easy to > > > convert a single list into per-zone lists. > > > > > > It is much harder to convert per-sb lists into per-sb x per-zone lists. > > > > No it's not. Just convert the s_{dentry,inode}_lru lists on each > > superblock and call the shrinker with a new zone mask field to pick > > the correct LRU. That's no harder than converting a global LRU. > > Anyway, you'd still have to do per-sb x per-zone lists for the dentry LRUs, > > so changing the inode cache to per-sb makes no difference. > > Right, it just makes it harder to do. By much harder, I did mostly mean > the extra memory overhead. You've still got to allocate that extra memory on the per-sb dentry LRUs so it's not really a valid argument. IOWs, if it's too much memory for per-sb inode LRUs, then it's too much memory for the per-sb dentry LRUs as well... > If there is *no* benefit from doing per-sb > icache then I would question whether we should. The same vague questions wondering about the benefit of per-sb dentry LRUs were raised when I first proposed them years ago, and look where we are now. Besides, focussing on whether this one patch is a benefit or not is really missing the point because it's the benefits of this patchset as a whole that need to be considered.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+9Bdw+86+fromorbit.com=david@internode.on.net Wed May 26 23:05:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R45A6C107926 for ; Wed, 26 May 2010 23:05:11 -0500 X-ASG-Debug-ID: 1274933252-09c701560000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7300937A698 for ; Wed, 26 May 2010 21:07:33 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id WFS2RKPsb45SmPTD for ; Wed, 26 May 2010 21:07:33 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25588051-1927428 for multiple; Thu, 27 May 2010 13:37:27 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHUN6-0001vX-RW; Thu, 27 May 2010 14:07:04 +1000 Date: Thu, 27 May 2010 14:07:04 +1000 From: Dave Chinner To: Nick Piggin Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100527040704.GJ12087@dastard> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> <20100526164116.GD22536@laptop> <20100526231214.GB1395@dastard> <20100527021905.GG22536@laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527021905.GG22536@laptop> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1274933254 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.2, rules version 3.2.2.30868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 12:19:05PM +1000, Nick Piggin wrote: > On Thu, May 27, 2010 at 09:12:14AM +1000, Dave Chinner wrote: > > On Thu, May 27, 2010 at 02:41:16AM +1000, Nick Piggin wrote: > > > > + count = ((sb->s_nr_dentry_unused + sb->s_nr_inodes_unused) / 100) > > > > + * sysctl_vfs_cache_pressure; > > > > > > Do you think truncating in the divisions is at all a problem? It > > > probably doesn't matter much I suppose. > > > > Same code as currently exists. IIRC, the reasoning is that if we've > > got less that 100 objects to reclaim, then we're unlikely to be able > > to free up any memory from the caches, anyway. > > Yeah, which is why I stop short of saying you should change it in > this patch. > > But I think we should ensure things can get reclaimed eventually. > 100 objects could be 100 slabs, which could be anything from > half a meg to half a dozen. Multiplied by each of the caches. > Could be significant in small systems. True, but usually there are busy objects in the dentry and inode slabs, so it shouldn't be a significant issue. We can probably address such problems if they can be demonstrated to be an issue in a separate patch set.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From npiggin@suse.de Wed May 26 23:21:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R4LGKb108677 for ; Wed, 26 May 2010 23:21:16 -0500 X-ASG-Debug-ID: 1274934217-04f601cc0000-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 C987837A6E1 for ; Wed, 26 May 2010 21:23:37 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id SMykjBYMTbLse2MC for ; Wed, 26 May 2010 21:23:37 -0700 (PDT) Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 5EE578765C; Thu, 27 May 2010 06:23:36 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id 6534329818; Thu, 27 May 2010 14:23:32 +1000 (EST) Date: Thu, 27 May 2010 14:23:32 +1000 From: Nick Piggin To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Subject: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Message-ID: <20100527042332.GH22536@laptop> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-2-git-send-email-david@fromorbit.com> <20100526161732.GC22536@laptop> <20100526230129.GA1395@dastard> <20100527020445.GF22536@laptop> <20100527040210.GI12087@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100527040210.GI12087@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274934219 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.2, rules version 3.2.2.30870 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 02:02:10PM +1000, Dave Chinner wrote: > On Thu, May 27, 2010 at 12:04:45PM +1000, Nick Piggin wrote: > > On Thu, May 27, 2010 at 09:01:29AM +1000, Dave Chinner wrote: > > > On Thu, May 27, 2010 at 02:17:33AM +1000, Nick Piggin wrote: > > > > On Tue, May 25, 2010 at 06:53:04PM +1000, Dave Chinner wrote: > > > > > From: Dave Chinner > > > > > > > > > > The inode unused list is currently a global LRU. This does not match > > > > > the other global filesystem cache - the dentry cache - which uses > > > > > per-superblock LRU lists. Hence we have related filesystem object > > > > > types using different LRU reclaimatin schemes. > > > > > > > > Is this an improvement I wonder? The dcache is using per sb lists > > > > because it specifically requires sb traversal. > > > > > > Right - I originally implemented the per-sb dentry lists for > > > scalability purposes. i.e. to avoid monopolising the dentry_lock > > > during unmount looking for dentries on a specific sb and hanging the > > > system for several minutes. > > > > > > However, the reason for doing this to the inode cache is not for > > > scalability, it's because we have a tight relationship between the > > > dentry and inode cacheŃ•. That is, reclaim from the dentry LRU grows > > > the inode LRU. Like the registration of the shrinkers, this is kind > > > of an implicit, undocumented behavour of the current shrinker > > > implemenation. > > > > Right, that's why I wonder whether it is an improvement. It would > > be interesting to see some tests (showing at least parity). > > I've done some testing showing parity. They've been along the lines > of: > - populate cache with 1m dentries + inodes > - run 'time echo 2 > /proc/sys/vm/drop_caches' > > I've used different methods of populating the caches to have them > non-sequential in the LRU (i.e. trigger fragmentation), have dirty > backing inodes (e.g. the VFS inode clean, the xfs inode dirty > because transactions haven't completed), etc. > > The variation on the test is around +-10%, with the per-sb shrinkers > averaging about 5% lower time to reclaim. This is within the error > margin of the test, so it's not really a conclusive win, but it is > certainly shows that it does not slow anything down. If you've got a > better way to test it, then I'm all ears.... I guess the problem is that inode LRU cache isn't very useful as long as there are dentries in the way (which is most of the time, isn't it?). I think nfsd will exercise them better? Dont know of any other cases. > > Right, it just makes it harder to do. By much harder, I did mostly mean > > the extra memory overhead. > > You've still got to allocate that extra memory on the per-sb dentry > LRUs so it's not really a valid argument. Well it would be per-zone, per-sb list, but I don't think that makes it an ivalid point. > IOWs, if it's too much > memory for per-sb inode LRUs, then it's too much memory for the > per-sb dentry LRUs as well... Not about how much is too much, it's about more cost or memory usage for what benefit? I guess it isn't a lot more memory though. > > If there is *no* benefit from doing per-sb > > icache then I would question whether we should. > > The same vague questions wondering about the benefit of per-sb > dentry LRUs were raised when I first proposed them years ago, and > look where we are now. To be fair that is because there were specific needs to do per-sb pruning. This isn't the case with icache. > Besides, focussing on whether this one patch > is a benefit or not is really missing the point because it's the > benefits of this patchset as a whole that need to be considered.... I would indeed like to focus on the benefits of the patchset as a whole. Leaving aside the xfs changes, it would be interesting to have at least a few numbers for dcache/icache heavy workloads. From npiggin@suse.de Wed May 26 23:22:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R4MYFD108749 for ; Wed, 26 May 2010 23:22:34 -0500 X-ASG-Debug-ID: 1274934404-472802910000-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 94EBDA645A6 for ; Wed, 26 May 2010 21:26:45 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id lFIfJkuSUG7GICdU for ; Wed, 26 May 2010 21:26:45 -0700 (PDT) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 638A58891E; Thu, 27 May 2010 06:24:55 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id 9298B29818; Thu, 27 May 2010 14:24:53 +1000 (EST) Date: Thu, 27 May 2010 14:24:53 +1000 From: Nick Piggin To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100527042453.GI22536@laptop> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> <20100526164116.GD22536@laptop> <20100526231214.GB1395@dastard> <20100527021905.GG22536@laptop> <20100527040704.GJ12087@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527040704.GJ12087@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274934405 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.2, rules version 3.2.2.30869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 02:07:04PM +1000, Dave Chinner wrote: > On Thu, May 27, 2010 at 12:19:05PM +1000, Nick Piggin wrote: > > On Thu, May 27, 2010 at 09:12:14AM +1000, Dave Chinner wrote: > > > On Thu, May 27, 2010 at 02:41:16AM +1000, Nick Piggin wrote: > > > > > + count = ((sb->s_nr_dentry_unused + sb->s_nr_inodes_unused) / 100) > > > > > + * sysctl_vfs_cache_pressure; > > > > > > > > Do you think truncating in the divisions is at all a problem? It > > > > probably doesn't matter much I suppose. > > > > > > Same code as currently exists. IIRC, the reasoning is that if we've > > > got less that 100 objects to reclaim, then we're unlikely to be able > > > to free up any memory from the caches, anyway. > > > > Yeah, which is why I stop short of saying you should change it in > > this patch. > > > > But I think we should ensure things can get reclaimed eventually. > > 100 objects could be 100 slabs, which could be anything from > > half a meg to half a dozen. Multiplied by each of the caches. > > Could be significant in small systems. > > True, but usually there are busy objects in the dentry and inode > slabs, so it shouldn't be a significant issue. We can probably > address such problems if they can be demonstrated to be an issue in > a separate patch set.... I didn't want to say it is a problem with your patchset, I just thought of it when reviewing. From SRS0+9Bdw+86+fromorbit.com=david@internode.on.net Thu May 27 01:15:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R6FXZR115987 for ; Thu, 27 May 2010 01:15:34 -0500 X-ASG-Debug-ID: 1274941074-09ce038b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AEB5237ABE6 for ; Wed, 26 May 2010 23:17:55 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id My6EmPboGFrrAqwt for ; Wed, 26 May 2010 23:17:55 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25606589-1927428 for multiple; Thu, 27 May 2010 15:47:53 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHWPf-00022j-P0; Thu, 27 May 2010 16:17:51 +1000 Date: Thu, 27 May 2010 16:17:51 +1000 From: Dave Chinner To: Al Viro Cc: Nick Piggin , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5 v2] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5 v2] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100527061751.GK12087@dastard> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> <20100526164116.GD22536@laptop> <20100526231214.GB1395@dastard> <20100527015335.GD1395@dastard> <20100527040120.GX31073@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527040120.GX31073@ZenIV.linux.org.uk> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1274941076 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.2, rules version 3.2.2.30875 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 05:01:20AM +0100, Al Viro wrote: > On Thu, May 27, 2010 at 11:53:35AM +1000, Dave Chinner wrote: > > On Thu, May 27, 2010 at 09:12:14AM +1000, Dave Chinner wrote: > > > On Thu, May 27, 2010 at 02:41:16AM +1000, Nick Piggin wrote: > > .... > > > > Nitpick but I prefer just the restart label wher it is previously. This > > > > is moving setup for the next iteration into the "error" case. > > > > > > Ok, will fix. > > .... > > > > Would you just elaborate on the lock order problem somewhere? (the > > > > comment makes it look like we *could* take the mutex if we wanted > > > > to). > > > > > > The shrinker is unregistered in deactivate_locked_super() which is > > > just before ->kill_sb is called. The sb->s_umount lock is held at > > > this point. hence is the shrinker is operating, we will deadlock if > > > we try to lock it like this: > > > > > > unmount: shrinker: > > > down_read(&shrinker_lock); > > > down_write(&sb->s_umount) > > > unregister_shrinker() > > > down_write(&shrinker_lock) > > > prune_super() > > > down_read(&sb->s_umount); > > > (deadlock) > > > > > > hence if we can't get the sb->s_umount lock in prune_super(), then > > > the superblock must be being unmounted and the shrinker should abort > > > as the ->kill_sb method will clean up everything after the shrinker > > > is unregistered. Hence the down_read_trylock(). > > Um... Maybe I'm dumb, but what's wrong with doing unregistration from > deactivate_locked_super(), right after the call of ->kill_sb()? At that > point ->s_umount is already dropped, so we won't deadlock at all. > Shrinker rwsem will make sure that all shrinkers-in-progress will run > to completion, so we won't get a superblock freed under prune_super(). > I don't particulary mind down_try_read() in prune_super(), but why not > make life obviously safer? > > Am I missing something here? I was worried about memory allocation in the ->kill_sb path deadlocking on the s_umount lock if it enters reclaim. e.g. XFS inodes can still be dirty even after the VFS has disposed of them, and writing them back can require page cache allocation for the backing buffers. If allocation recurses back into the shrinker, we can deadlock on the s_umount lock. This doesn't seem like an XFS specific problem, so I used a trylock to avoid that whole class of problems (same way the current shrinkers do). >From there, we can unregister the shrinker before calling ->kill_sb as per above. That, in turn, means that the unmount invalidate_inodes() vs shrinker race goes away and the iprune_sem is not needed in the new prune_icache_sb() function. I'm pretty sure that I can now remove the iprune_sem, but I haven't written the patch to do that yet. Cheers, Dave. -- Dave Chinner david@fromorbit.com From npiggin@suse.de Thu May 27 01:33:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R6X6l0116859 for ; Thu, 27 May 2010 01:33:07 -0500 X-ASG-Debug-ID: 1274942238-53cd014f0000-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 A746212A0246 for ; Wed, 26 May 2010 23:37:18 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id mAAg3qAVUKanVSX6 for ; Wed, 26 May 2010 23:37:18 -0700 (PDT) Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id CCFFF8655F; Thu, 27 May 2010 08:35:27 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id 0C1DF29818; Thu, 27 May 2010 16:35:23 +1000 (EST) Date: Thu, 27 May 2010 16:35:23 +1000 From: Nick Piggin To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100527063523.GJ22536@laptop> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1274777588-21494-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274942239 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.2, rules version 3.2.2.30878 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 06:53:06PM +1000, Dave Chinner wrote: > --- a/fs/super.c > +++ b/fs/super.c > @@ -37,6 +37,50 @@ > LIST_HEAD(super_blocks); > DEFINE_SPINLOCK(sb_lock); > > +static int prune_super(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) > +{ > + struct super_block *sb; > + int count; > + > + sb = container_of(shrink, struct super_block, s_shrink); > + > + /* > + * Deadlock avoidance. We may hold various FS locks, and we don't want > + * to recurse into the FS that called us in clear_inode() and friends.. > + */ > + if (!(gfp_mask & __GFP_FS)) > + return -1; > + > + /* > + * if we can't get the umount lock, then there's no point having the > + * shrinker try again because the sb is being torn down. > + */ > + if (!down_read_trylock(&sb->s_umount)) > + return -1; > + > + if (!sb->s_root) { > + up_read(&sb->s_umount); > + return -1; > + } > + > + if (nr_to_scan) { > + /* proportion the scan between the two cacheŃ• */ > + int total; > + > + total = sb->s_nr_dentry_unused + sb->s_nr_inodes_unused + 1; > + count = (nr_to_scan * sb->s_nr_dentry_unused) / total; > + > + /* prune dcache first as icache is pinned by it */ > + prune_dcache_sb(sb, count); > + prune_icache_sb(sb, nr_to_scan - count); Hmm, an interesting dynamic that you've changed is that previously we'd scan dcache LRU proportionately to pagecache, and then scan inode LRU in proportion to the current number of unused inodes. But we can think of inodes that are only in use by unused (and aged) dentries as effectively unused themselves. So this sequence under estimates how many inodes to scan. This could bias pressure against dcache I'd think, especially considering inodes are far larger than dentries. Maybe require 2 passes to get the inodes unused inthe first pass. Part of the problem is the funny shrinker API. The right way to do it is to change the shrinker API so that it passes down the lru_pages and scanned into the callback. From there, the shrinkers can calculate the appropriate ratio of objects to scan. No need for 2-call scheme, no need for shrinker->seeks, and the ability to calculate an appropriate ratio first for dcache, and *then* for icache. A helper of course can do the calculation (considering that every driver and their dog will do the wrong thing if we let them :)). unsigned long shrinker_scan(unsigned long lru_pages, unsigned long lru_scanned, unsigned long nr_objects, unsigned long scan_ratio) { unsigned long long tmp = nr_objects; tmp *= lru_scanned * 100; do_div(tmp, (lru_pages * scan_ratio) + 1); return (unsigned long)tmp; } Then the shrinker callback will go: sb->s_nr_dentry_scan += shrinker_scan(lru_pages, lru_scanned, sb->s_nr_dentry_unused, vfs_cache_pressure * SEEKS_PER_DENTRY); if (sb->s_nr_dentry_scan > SHRINK_BATCH) prune_dcache() sb->s_nr_inode_scan += shrinker_scan(lru_pages, lru_scanned, sb->s_nr_inodes_unused, vfs_cache_pressure * SEEKS_PER_INODE); ... What do you think of that? Seeing as we're changing the shrinker API anyway, I'd think it is high time to do somthing like this. From npiggin@suse.de Thu May 27 01:44:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R6iCI9117427 for ; Thu, 27 May 2010 01:44:12 -0500 X-ASG-Debug-ID: 1274942795-278402120000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 583A61D5224B for ; Wed, 26 May 2010 23:46:35 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id 5loMaOtEl9Gmq9Ta for ; Wed, 26 May 2010 23:46:35 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 1661F8E8CC; Thu, 27 May 2010 08:46:34 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id F3FA929818; Thu, 27 May 2010 16:46:31 +1000 (EST) Date: Thu, 27 May 2010 16:46:31 +1000 From: Nick Piggin To: Dave Chinner Cc: Al Viro , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5 v2] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5 v2] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100527064631.GK22536@laptop> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> <20100526164116.GD22536@laptop> <20100526231214.GB1395@dastard> <20100527015335.GD1395@dastard> <20100527040120.GX31073@ZenIV.linux.org.uk> <20100527061751.GK12087@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527061751.GK12087@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274942796 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 04:17:51PM +1000, Dave Chinner wrote: > On Thu, May 27, 2010 at 05:01:20AM +0100, Al Viro wrote: > > Um... Maybe I'm dumb, but what's wrong with doing unregistration from > > deactivate_locked_super(), right after the call of ->kill_sb()? At that > > point ->s_umount is already dropped, so we won't deadlock at all. > > Shrinker rwsem will make sure that all shrinkers-in-progress will run > > to completion, so we won't get a superblock freed under prune_super(). > > I don't particulary mind down_try_read() in prune_super(), but why not > > make life obviously safer? > > > > Am I missing something here? > > I was worried about memory allocation in the ->kill_sb path > deadlocking on the s_umount lock if it enters reclaim. e.g. XFS > inodes can still be dirty even after the VFS has disposed of them, > and writing them back can require page cache allocation for the > backing buffers. If allocation recurses back into the shrinker, we > can deadlock on the s_umount lock. This doesn't seem like an XFS > specific problem, so I used a trylock to avoid that whole class of > problems (same way the current shrinkers do). If GFP_FS is set, we wouldn't touch the locks. It is a concern though, if __GFP_FS allocations were previously permitted under the exclusive lock. > >From there, we can unregister the shrinker before calling ->kill_sb > as per above. That, in turn, means that the unmount > invalidate_inodes() vs shrinker race goes away and the iprune_sem is > not needed in the new prune_icache_sb() function. I'm pretty sure > that I can now remove the iprune_sem, but I haven't written the > patch to do that yet. I do really like that aspect of your patch. It's nice to have the shrinker always only operating against active supers. So I would be in favour of your current scheme. From michael.monnerie@is.it-management.at Thu May 27 01:55:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4R6tILm117906 for ; Thu, 27 May 2010 01:55:18 -0500 X-ASG-Debug-ID: 1274943460-138802550000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 943F237AB20 for ; Wed, 26 May 2010 23:57:41 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id o7ltVTYynj1KMiis for ; Wed, 26 May 2010 23:57:41 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id CC239800184 for ; Thu, 27 May 2010 08:57:39 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 7615983C804 for ; Thu, 27 May 2010 08:57:39 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: puzzling error: XenServer, LVM and XFS Subject: puzzling error: XenServer, LVM and XFS Date: Thu, 27 May 2010 08:57:38 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-vanilla; KDE/4.3.5; x86_64; ; ) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1400176.4lrSpho5rt"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005270857.39048@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1274943461 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.2, rules version 3.2.2.30879 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1400176.4lrSpho5rt Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable I have a problem I can recreate, but have no idea where to ask/report=20 it. I have a XenServer 5.5 based Virtual Machine with a running openSUSE=20 11.2. Everything running fine. Now I add another disk (which is an LVM volume on the host), there there=20 I create a partition. In this partition, I create an LVM volume: pvcreate .. vgcreate .. lvcreate .. So far no problem. Now I create an XFS: mkfs.xfs /dev/test/test mount /dev/test/test /1 I can reproduce and get tons of these errors on 2 different XenServers=20 in 2 different VMs: May 27 08:32:11 zdb13 kernel: [ 738.046895] end_request: I/O error, dev=20 xvdc, sector 0 This only happens after XFS is mounted from the LVM volume. On another=20 machine where active I/O is happening, I get tons of these errors every=20 some seconds. =2D-=20 mit freundlichen Gr=C3=BCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=C3=A4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart1400176.4lrSpho5rt Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkv+F+MACgkQzhSR9xwSCbTc3ACgmI2qeDY02o7MdaRxxxVvuatr c+UAoOLokTjKCirI0jR4BPWp+Ie+nLrs =bTBF -----END PGP SIGNATURE----- --nextPart1400176.4lrSpho5rt-- From michael.monnerie@is.it-management.at Thu May 27 06:02:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RB2ov5128681 for ; Thu, 27 May 2010 06:02:50 -0500 X-ASG-Debug-ID: 1274958311-3c09004c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CB30F1DFD2B6 for ; Thu, 27 May 2010 04:05:12 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id bntc98WI167429Jk for ; Thu, 27 May 2010 04:05:12 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 987E4800112 for ; Thu, 27 May 2010 13:05:10 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 5C30383C804 for ; Thu, 27 May 2010 13:05:10 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() Date: Thu, 27 May 2010 13:05:09 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-vanilla; KDE/4.3.5; x86_64; ; ) References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100526070620.GT2150@dastard> <4BFD3926.6040208@hardwarefreak.com> In-Reply-To: <4BFD3926.6040208@hardwarefreak.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1308396.KR7F04zR49"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005271305.09901@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1274958312 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.2, rules version 3.2.2.30895 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1308396.KR7F04zR49 Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable On Mittwoch, 26. Mai 2010 Stan Hoeppner wrote: > My apologies for the newbish questions. If this has all been > asked/answered before, please just point me to any papers that > explain the pros/cons of o_direct. Thanks. =20 I'd recommend the kernel pages on http://lwn.net =46rom time to time you see the discussions about o_direct, always a=20 subject of discussion. I'm not a programmer so I don't care ;-) =2D-=20 mit freundlichen Gr=C3=BCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=C3=A4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart1308396.KR7F04zR49 Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkv+UeUACgkQzhSR9xwSCbRwhgCeOsCTMmukmgCnakPGG8yOzMIt V1YAoJnpXwtXAffXzIElq36eeSCaf7Nb =bKds -----END PGP SIGNATURE----- --nextPart1308396.KR7F04zR49-- From BATV+b75d1beb719476e89480+2468+infradead.org+hch@bombadil.srs.infradead.org Thu May 27 06:45:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RBjFlK130603 for ; Thu, 27 May 2010 06:45:15 -0500 X-ASG-Debug-ID: 1274960969-5a10020c0000-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 99F7F157B50C for ; Thu, 27 May 2010 04:49:29 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id GOPxVlydcJ3PiNtz for ; Thu, 27 May 2010 04:49:29 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OHbYn-0005LE-45; Thu, 27 May 2010 11:47:37 +0000 Date: Thu, 27 May 2010 07:47:37 -0400 From: Christoph Hellwig To: Stan Hoeppner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() Message-ID: <20100527114736.GA13112@infradead.org> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <4BF9FCA8.8090906@hardwarefreak.com> <20100524143428.6f3a117c@abend.internal.xtremedata.com> <20100526070620.GT2150@dastard> <4BFD3926.6040208@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4BFD3926.6040208@hardwarefreak.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274960969 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean O_DIRECT is not a Posix standard and not very portable. It originated on IRIX, and Linux inherited it during the 2.4 kernel series days. These days FreeBSD/NetBSD and AIX support it as well, but for example Solaris, HP-UX and OpenBSD don't, nevermind Windows or Mac OS. I have no idea why the MTAs don't want to use it - it's generally easier to use then memory mapped I/O, and has much more deterministic performance. From BATV+b75d1beb719476e89480+2468+infradead.org+hch@bombadil.srs.infradead.org Thu May 27 06:49:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RBnUCH130843 for ; Thu, 27 May 2010 06:49:30 -0500 X-ASG-Debug-ID: 1274961224-619a019d0000-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 BE99112A0B39 for ; Thu, 27 May 2010 04:53:44 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id dWEeJ0WAtvysAsGA for ; Thu, 27 May 2010 04:53:44 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OHbcv-0006Rf-6a; Thu, 27 May 2010 11:51:53 +0000 Date: Thu, 27 May 2010 07:51:53 -0400 From: Christoph Hellwig To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: puzzling error: XenServer, LVM and XFS Subject: Re: puzzling error: XenServer, LVM and XFS Message-ID: <20100527115153.GB13112@infradead.org> References: <201005270857.39048@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201005270857.39048@zmi.at> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274961224 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 08:57:38AM +0200, Michael Monnerie wrote: > May 27 08:32:11 zdb13 kernel: [ 738.046895] end_request: I/O error, dev > xvdc, sector 0 > > This only happens after XFS is mounted from the LVM volume. On another > machine where active I/O is happening, I get tons of these errors every > some seconds. This looks like the Xen block device code is buggy and doesn't handle the I/O pattern XFS throws at it. A sector 0 error during mount usually is the superblock barrier test write. To verify that assumptions try mounting the XFS filesystems with -o nobarrier and see if it goes away. Note that this is only for testing, and I would _not_ recommend it for production use. If it makes the error go away please file a bug with the Xen guys to fix their barrier support by either implementing it properly or not advertizing it. From BATV+b75d1beb719476e89480+2468+infradead.org+hch@bombadil.srs.infradead.org Thu May 27 07:19:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RCJGAU132330 for ; Thu, 27 May 2010 07:19:17 -0500 X-ASG-Debug-ID: 1274962900-196902ea0000-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 1219D37B448 for ; Thu, 27 May 2010 05:21:40 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id eJEJHiF9tTKU4m6W for ; Thu, 27 May 2010 05:21:40 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OHc5i-0004jy-3a; Thu, 27 May 2010 12:21:38 +0000 Date: Thu, 27 May 2010 08:21:38 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: Re-initialise lockdep context for all inodes in reclaim Subject: Re: [PATCH] xfs: Re-initialise lockdep context for all inodes in reclaim Message-ID: <20100527122138.GA14632@infradead.org> References: <1274925546-31468-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274925546-31468-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274962901 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 11:59:06AM +1000, Dave Chinner wrote: > From: Dave Chinner > > We re-initialise the lockdep context for inode iolocks when dropping an inode, > but not when we delete an inode. Now that we can reclaim inodes from a shrinker, > we can get get false lockdep warnings about inode iolock inversions during > reclaim of deleted inodes. Hence we need to re-initialise the iolock in the > delete path as well. clear_inode also gets called when we delete an inode, so at least the rationale for this isn't quite right. It seems like we re-acquire new lockdep dependecies between clear_inode and destroy_inode that your shrinker doesn't like. What lockdep report do you see? From BATV+b75d1beb719476e89480+2468+infradead.org+hch@bombadil.srs.infradead.org Thu May 27 07:19:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RCJPqE132349 for ; Thu, 27 May 2010 07:19:26 -0500 X-ASG-Debug-ID: 1274963020-031200eb0000-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 A4D0E157BAB4 for ; Thu, 27 May 2010 05:23:40 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id sdNt6dyZ0pv38rbG for ; Thu, 27 May 2010 05:23:40 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OHc5t-0004k7-Gn; Thu, 27 May 2010 12:21:49 +0000 Date: Thu, 27 May 2010 08:21:49 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: fix might_sleep() warning when initialising per-ag tree Subject: Re: [PATCH] xfs: fix might_sleep() warning when initialising per-ag tree Message-ID: <20100527122149.GB14632@infradead.org> References: <1274925493-31401-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274925493-31401-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274963020 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 11:58:13AM +1000, Dave Chinner wrote: > From: Dave Chinner > > The use of radix_tree_preload() only works if the radix tree was initialised > without the __GFP_WAIT flag. The per-ag tree uses GFP_NOFS, so does not trigger > allocation of new tree nodes from the preloaded array. Hence it enters the > allocator with a spinlock held and triggers the might_sleep() warnings. > > Reported-by; Chris Mason > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From stewart@flamingspork.com Thu May 27 08:56:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RDuZ1h137460 for ; Thu, 27 May 2010 08:56:35 -0500 X-ASG-Debug-ID: 1274968737-107700a40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kaylee.flamingspork.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4DB6737BD7D for ; Thu, 27 May 2010 06:58:57 -0700 (PDT) Received: from kaylee.flamingspork.com (kaylee.flamingspork.com [74.207.245.61]) by cuda.sgi.com with ESMTP id uLRpdjx3vhmDSW28 for ; Thu, 27 May 2010 06:58:57 -0700 (PDT) Received: from willster (localhost [127.0.0.1]) by kaylee.flamingspork.com (Postfix) with ESMTPS id 2102B6396; Thu, 27 May 2010 13:52:00 +0000 (UTC) Received: by willster (Postfix, from userid 1000) id 383F7128C8; Thu, 27 May 2010 23:58:55 +1000 (EST) From: Stewart Smith To: Christoph Hellwig , Stan Hoeppner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() In-Reply-To: <20100527114736.GA13112@infradead.org> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <4BF9FCA8.8090906@hardwarefreak.com> <20100524143428.6f3a117c@abend.internal.xtremedata.com> <20100526070620.GT2150@dastard> <4BFD3926.6040208@hardwarefreak.com> <20100527114736.GA13112@infradead.org> User-Agent: Notmuch/0.3.1-17-gc50524e (http://notmuchmail.org) Emacs/23.1.1 (x86_64-pc-linux-gnu) Date: Thu, 27 May 2010 23:58:55 +1000 Message-ID: <87pr0hbg4g.fsf@willster.local.flamingspork.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: kaylee.flamingspork.com[74.207.245.61] X-Barracuda-Start-Time: 1274968739 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.2, rules version 3.2.2.30907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 27 May 2010 07:47:37 -0400, Christoph Hellwig wrote: > O_DIRECT is not a Posix standard and not very portable. It originated > on IRIX, and Linux inherited it during the 2.4 kernel series days. > These days FreeBSD/NetBSD and AIX support it as well, but for example > Solaris, HP-UX and OpenBSD don't, nevermind Windows or Mac OS. There is O_DIRECT type functionality available on Windows, with similar restrictions for aligned IO too. You have to use the Win32 APIs to do it though, the POSIX ones won't get you it (or more than 2048 files open at once). In practice we've only ever found Solaris (other than linux) to be reliable with O_DIRECT (at least on UFS... ZFS is... well... I wouldn't run a database server on it yet). -- Stewart Smith From stewart@flamingspork.com Thu May 27 09:02:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RE2ijM137846 for ; Thu, 27 May 2010 09:02:44 -0500 X-ASG-Debug-ID: 1274969107-0faf014f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kaylee.flamingspork.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EE70437BE01 for ; Thu, 27 May 2010 07:05:07 -0700 (PDT) Received: from kaylee.flamingspork.com (kaylee.flamingspork.com [74.207.245.61]) by cuda.sgi.com with ESMTP id haLaXHFKo2JunpKE for ; Thu, 27 May 2010 07:05:07 -0700 (PDT) Received: from willster (localhost [127.0.0.1]) by kaylee.flamingspork.com (Postfix) with ESMTPS id 2C5056396; Thu, 27 May 2010 13:58:10 +0000 (UTC) Received: by willster (Postfix, from userid 1000) id 572E5128C8; Fri, 28 May 2010 00:05:05 +1000 (EST) From: Stewart Smith To: Stan Hoeppner , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() In-Reply-To: <4BFD3926.6040208@hardwarefreak.com> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <4BF9FCA8.8090906@hardwarefreak.com> <20100524143428.6f3a117c@abend.internal.xtremedata.com> <20100526070620.GT2150@dastard> <4BFD3926.6040208@hardwarefreak.com> User-Agent: Notmuch/0.3.1-17-gc50524e (http://notmuchmail.org) Emacs/23.1.1 (x86_64-pc-linux-gnu) Date: Fri, 28 May 2010 00:05:05 +1000 Message-ID: <87mxvlbfu6.fsf@willster.local.flamingspork.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: kaylee.flamingspork.com[74.207.245.61] X-Barracuda-Start-Time: 1274969107 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.2, rules version 3.2.2.30907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 26 May 2010 10:07:18 -0500, Stan Hoeppner wrote: > Please educate the ignorant a little bit Dave. I'm not a programmer, or at > least, haven't been one for a couple of decades. If o_direct is superior to > mmap, why then don't, say, Postfix and Dovecot use it instead of mmap? Email > servers are some of the most disk I/O bound applications on the planet. I > would think on heavily loaded mail servers (smtp or imap), at $big_isp for > example, buffer cache would yield very little performance gain, and may even > slow the system down due to buffer cache thrashing. email servers are metadata heavy workloads, not data heavy. They do lots of create/rename/delete of small files. O_DIRECT requires you to do IO in multiples of 512bytes aligned to 512byte boundaries. things like email servers... generally don't need/do that. Database servers tend to do that, so they use O_DIRECT. Also, email smtpd delivering a message on a machine, you could quite likely have imapd come along and read that soon after, so using the cache makes sense. > Why do you think Wietse and Timo don't use o_direct instead of mmap? Timo is > working on a complex and aggressive totally asynchronous I/O subsystem for a > future Dovecot release in an effort to speed up I/O on loaded systems. Could > o_direct not be the solution? AFAIK, both Postfix and Dovecot support running > on just about every Unix like OS on the planet. Is o_direct not a portable > interface, limited to Linux only? Is o_direct a POSIX standard? not posix. but you can get the functionality out of linux through opening with O_DIRECT, solaris by doing o_direct(), and who cares about the rest :) -- Stewart Smith From BATV+b75d1beb719476e89480+2468+infradead.org+hch@bombadil.srs.infradead.org Thu May 27 09:54:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.1 required=5.0 tests=BAYES_00,HEADER_ESQ autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4REsq2G140260 for ; Thu, 27 May 2010 09:54:53 -0500 X-ASG-Debug-ID: 1274972236-107d03d90000-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 C404137C1D8 for ; Thu, 27 May 2010 07:57:16 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id mA0mYdCXHlmGVDWf for ; Thu, 27 May 2010 07:57:16 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OHeWI-0007at-Ju; Thu, 27 May 2010 14:57:14 +0000 Date: Thu, 27 May 2010 10:57:14 -0400 From: Christoph Hellwig To: Stewart Smith Cc: Christoph Hellwig , Stan Hoeppner , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() Message-ID: <20100527145714.GA28678@infradead.org> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <4BF9FCA8.8090906@hardwarefreak.com> <20100524143428.6f3a117c@abend.internal.xtremedata.com> <20100526070620.GT2150@dastard> <4BFD3926.6040208@hardwarefreak.com> <20100527114736.GA13112@infradead.org> <87pr0hbg4g.fsf@willster.local.flamingspork.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87pr0hbg4g.fsf@willster.local.flamingspork.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274972236 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 11:58:55PM +1000, Stewart Smith wrote: > There is O_DIRECT type functionality available on Windows, with similar > restrictions for aligned IO too. You have to use the Win32 APIs to do it > though, the POSIX ones won't get you it (or more than 2048 files open at > once). > > In practice we've only ever found Solaris (other than linux) to be > reliable with O_DIRECT (at least on UFS... ZFS is... well... I wouldn't > run a database server on it yet). Solaris doesn't support O_DIRECT either, it instead has a separate directio call - just another pointless difference. From stewart@flamingspork.com Thu May 27 10:42:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RFgrcr142804 for ; Thu, 27 May 2010 10:42:53 -0500 X-ASG-Debug-ID: 1274975116-6c75016e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kaylee.flamingspork.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9D8F8145452F for ; Thu, 27 May 2010 08:45:16 -0700 (PDT) Received: from kaylee.flamingspork.com (kaylee.flamingspork.com [74.207.245.61]) by cuda.sgi.com with ESMTP id vxXpkw7HAFyQYhjg for ; Thu, 27 May 2010 08:45:16 -0700 (PDT) Received: from willster (localhost [127.0.0.1]) by kaylee.flamingspork.com (Postfix) with ESMTPS id 083B26396; Thu, 27 May 2010 15:38:19 +0000 (UTC) Received: by willster (Postfix, from userid 1000) id 6A95D128C8; Fri, 28 May 2010 01:45:14 +1000 (EST) From: Stewart Smith To: Christoph Hellwig Cc: Christoph Hellwig , Stan Hoeppner , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() In-Reply-To: <20100527145714.GA28678@infradead.org> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <4BF9FCA8.8090906@hardwarefreak.com> <20100524143428.6f3a117c@abend.internal.xtremedata.com> <20100526070620.GT2150@dastard> <4BFD3926.6040208@hardwarefreak.com> <20100527114736.GA13112@infradead.org> <87pr0hbg4g.fsf@willster.local.flamingspork.com> <20100527145714.GA28678@infradead.org> User-Agent: Notmuch/0.3.1-17-gc50524e (http://notmuchmail.org) Emacs/23.1.1 (x86_64-pc-linux-gnu) Date: Fri, 28 May 2010 01:45:14 +1000 Message-ID: <877hmpjqlx.fsf@willster.local.flamingspork.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: kaylee.flamingspork.com[74.207.245.61] X-Barracuda-Start-Time: 1274975116 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.2, rules version 3.2.2.30913 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 27 May 2010 10:57:14 -0400, Christoph Hellwig wrote: > On Thu, May 27, 2010 at 11:58:55PM +1000, Stewart Smith wrote: > > There is O_DIRECT type functionality available on Windows, with similar > > restrictions for aligned IO too. You have to use the Win32 APIs to do it > > though, the POSIX ones won't get you it (or more than 2048 files open at > > once). > > > > In practice we've only ever found Solaris (other than linux) to be > > reliable with O_DIRECT (at least on UFS... ZFS is... well... I wouldn't > > run a database server on it yet). > > Solaris doesn't support O_DIRECT either, it instead has a separate > directio call - just another pointless difference. Oh yeah, casually forgot about that. Shows how much I'm writing new code on Solaris that is IO performance critical (on Solaris). -- Stewart Smith From jack@suse.cz Thu May 27 10:51:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=BAYES_00,DATE_IN_PAST_24_48 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RFp5tW143235 for ; Thu, 27 May 2010 10:51:06 -0500 X-ASG-Debug-ID: 1274975719-4e1101f90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6C5DDA68538 for ; Thu, 27 May 2010 08:55:19 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id ncp2veAFT5QO0Azu for ; Thu, 27 May 2010 08:55:19 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 3623F90847; Thu, 27 May 2010 17:53:27 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 5D23E2B1BBF; Tue, 25 May 2010 22:39:15 +0200 (CEST) Date: Tue, 25 May 2010 22:39:15 +0200 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/8] Test basic quota enforcement Subject: Re: [PATCH 3/8] Test basic quota enforcement Message-ID: <20100525203914.GE3783@quack.suse.cz> References: <1274710459-11446-1-git-send-email-jack@suse.cz> <1274710459-11446-4-git-send-email-jack@suse.cz> <20100525100635.GA21252@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100525100635.GA21252@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274975721 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue 25-05-10 06:06:35, Christoph Hellwig wrote: > On Mon, May 24, 2010 at 04:14:14PM +0200, Jan Kara wrote: > > Add a test which checks whether basic quota enforcement works. > > This one fails for me when testing and xfs filesystem on latest Linus' > tree (with Debian -testing userspace): OK, I've committed a fixed version of the test to the repository. Honza > > --- 230.out 2010-05-25 09:49:35.000000000 +0000 > +++ 230.out.bad 2010-05-25 09:52:49.000000000 +0000 > @@ -4,20 +4,22 @@ > > ### create files, setting up ownership (type=u) > ### some buffered IO (type=u) > +pwrite64: Disk quota exceeded > *** Report for user quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa -- 4 4 12 2 2 4 > +fsgqa -- 0 4 12 2 2 4 00:00 > > > +pwrite64: Disk quota exceeded > *** Report for user quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa +- 8 4 12 00:00 2 2 4 > +fsgqa -- 0 4 12 2 2 4 00:00 > > > pwrite64: Disk quota exceeded > @@ -26,7 +28,7 @@ > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa +- 12 4 12 00:00 2 2 4 > +fsgqa -- 0 4 12 2 2 4 00:00 > > > pwrite64: Disk quota exceeded > @@ -35,24 +37,26 @@ > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa +- 8 4 12 none 2 2 4 > +fsgqa -- 0 4 12 2 2 4 none > > > +touch: cannot touch `[SCR_MNT]/file3': Disk quota exceeded > *** Report for user quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa ++ 8 4 12 none 3 2 4 00:00 > +fsgqa -- 0 4 12 2 2 4 none > > > +touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded > touch: cannot touch `[SCR_MNT]/file5': Disk quota exceeded > *** Report for user quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa ++ 8 4 12 none 4 2 4 00:00 > +fsgqa -- 0 4 12 2 2 4 none > > > touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded > @@ -61,7 +65,7 @@ > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa ++ 8 4 12 none 3 2 4 none > +fsgqa -- 0 4 12 2 2 4 none > > > > @@ -69,20 +73,22 @@ > > ### create files, setting up ownership (type=g) > ### some buffered IO (type=g) > +pwrite64: Disk quota exceeded > *** Report for group quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa -- 4 4 12 2 2 4 > +fsgqa -- 0 4 12 2 2 4 00:00 > > > +pwrite64: Disk quota exceeded > *** Report for group quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa +- 8 4 12 00:00 2 2 4 > +fsgqa -- 0 4 12 2 2 4 00:00 > > > pwrite64: Disk quota exceeded > @@ -91,7 +97,7 @@ > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa +- 12 4 12 00:00 2 2 4 > +fsgqa -- 0 4 12 2 2 4 00:00 > > > pwrite64: Disk quota exceeded > @@ -100,24 +106,26 @@ > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa +- 8 4 12 none 2 2 4 > +fsgqa -- 0 4 12 2 2 4 none > > > +touch: cannot touch `[SCR_MNT]/file3': Disk quota exceeded > *** Report for group quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa ++ 8 4 12 none 3 2 4 00:00 > +fsgqa -- 0 4 12 2 2 4 none > > > +touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded > touch: cannot touch `[SCR_MNT]/file5': Disk quota exceeded > *** Report for group quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa ++ 8 4 12 none 4 2 4 00:00 > +fsgqa -- 0 4 12 2 2 4 none > > > touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded > @@ -126,6 +134,6 @@ > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa ++ 8 4 12 none 3 2 4 none > +fsgqa -- 0 4 12 2 2 4 none > > > -- Jan Kara SUSE Labs, CR From jack@suse.cz Thu May 27 10:51:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RFp5fv143233 for ; Thu, 27 May 2010 10:51:06 -0500 X-ASG-Debug-ID: 1274975608-6c7401af0000-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 2ADCF145314F for ; Thu, 27 May 2010 08:53:28 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id egwuNZ3s8Fddfo0C for ; Thu, 27 May 2010 08:53:28 -0700 (PDT) Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id A7B4987D82; Thu, 27 May 2010 17:53:27 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 1CC9D2B1B68; Tue, 25 May 2010 16:41:46 +0200 (CEST) Date: Tue, 25 May 2010 16:41:45 +0200 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/8] Test basic quota enforcement Subject: Re: [PATCH 3/8] Test basic quota enforcement Message-ID: <20100525144145.GD3783@quack.suse.cz> References: <1274710459-11446-1-git-send-email-jack@suse.cz> <1274710459-11446-4-git-send-email-jack@suse.cz> <20100525100635.GA21252@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100525100635.GA21252@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274975609 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.2, rules version 3.2.2.30915 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue 25-05-10 06:06:35, Christoph Hellwig wrote: > On Mon, May 24, 2010 at 04:14:14PM +0200, Jan Kara wrote: > > Add a test which checks whether basic quota enforcement works. > > This one fails for me when testing and xfs filesystem on latest Linus' > tree (with Debian -testing userspace): > > --- 230.out 2010-05-25 09:49:35.000000000 +0000 > +++ 230.out.bad 2010-05-25 09:52:49.000000000 +0000 > @@ -4,20 +4,22 @@ > > ### create files, setting up ownership (type=u) > ### some buffered IO (type=u) > +pwrite64: Disk quota exceeded Hmm, the test fails differently for XFS in my setting but it fails as well. One reason is that XFS starts counting grace time when user reaches softlimit while VFS quotas start counting grace time when user exceeds softlimit. Another reason probably is that limit 12 KB is too tight for XFS to write a 4 KB file probably due to delayed allocation. So I'll try to loosen the limits a bit to make test 230 work also for xfs. Thanks for report. Honza > *** Report for user quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa -- 4 4 12 2 2 4 > +fsgqa -- 0 4 12 2 2 4 00:00 > > > +pwrite64: Disk quota exceeded > *** Report for user quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa +- 8 4 12 00:00 2 2 4 > +fsgqa -- 0 4 12 2 2 4 00:00 > > > pwrite64: Disk quota exceeded > @@ -26,7 +28,7 @@ > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa +- 12 4 12 00:00 2 2 4 > +fsgqa -- 0 4 12 2 2 4 00:00 > > > pwrite64: Disk quota exceeded > @@ -35,24 +37,26 @@ > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa +- 8 4 12 none 2 2 4 > +fsgqa -- 0 4 12 2 2 4 none > > > +touch: cannot touch `[SCR_MNT]/file3': Disk quota exceeded > *** Report for user quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa ++ 8 4 12 none 3 2 4 00:00 > +fsgqa -- 0 4 12 2 2 4 none > > > +touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded > touch: cannot touch `[SCR_MNT]/file5': Disk quota exceeded > *** Report for user quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa ++ 8 4 12 none 4 2 4 00:00 > +fsgqa -- 0 4 12 2 2 4 none > > > touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded > @@ -61,7 +65,7 @@ > Block limits File limits > User used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa ++ 8 4 12 none 3 2 4 none > +fsgqa -- 0 4 12 2 2 4 none > > > > @@ -69,20 +73,22 @@ > > ### create files, setting up ownership (type=g) > ### some buffered IO (type=g) > +pwrite64: Disk quota exceeded > *** Report for group quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa -- 4 4 12 2 2 4 > +fsgqa -- 0 4 12 2 2 4 00:00 > > > +pwrite64: Disk quota exceeded > *** Report for group quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa +- 8 4 12 00:00 2 2 4 > +fsgqa -- 0 4 12 2 2 4 00:00 > > > pwrite64: Disk quota exceeded > @@ -91,7 +97,7 @@ > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa +- 12 4 12 00:00 2 2 4 > +fsgqa -- 0 4 12 2 2 4 00:00 > > > pwrite64: Disk quota exceeded > @@ -100,24 +106,26 @@ > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa +- 8 4 12 none 2 2 4 > +fsgqa -- 0 4 12 2 2 4 none > > > +touch: cannot touch `[SCR_MNT]/file3': Disk quota exceeded > *** Report for group quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa ++ 8 4 12 none 3 2 4 00:00 > +fsgqa -- 0 4 12 2 2 4 none > > > +touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded > touch: cannot touch `[SCR_MNT]/file5': Disk quota exceeded > *** Report for group quotas on device [SCR_DEV] > Block grace time: 00:00; Inode grace time: 00:00 > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa ++ 8 4 12 none 4 2 4 00:00 > +fsgqa -- 0 4 12 2 2 4 none > > > touch: cannot touch `[SCR_MNT]/file4': Disk quota exceeded > @@ -126,6 +134,6 @@ > Block limits File limits > Group used soft hard grace used soft hard grace > ---------------------------------------------------------------------- > -fsgqa ++ 8 4 12 none 3 2 4 none > +fsgqa -- 0 4 12 2 2 4 none > > > -- Jan Kara SUSE Labs, CR From dmonlist@gmail.com Thu May 27 11:23:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=BAYES_00, RCVD_IN_BL_SPAMCOP_NET,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RGN79L145092 for ; Thu, 27 May 2010 11:23:07 -0500 X-ASG-Debug-ID: 1274977641-1302004a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-fx0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9D6A9A68AF1 for ; Thu, 27 May 2010 09:27:21 -0700 (PDT) Received: from mail-fx0-f53.google.com (mail-fx0-f53.google.com [209.85.161.53]) by cuda.sgi.com with ESMTP id IG4auCOMy8uLVv7U for ; Thu, 27 May 2010 09:27:21 -0700 (PDT) Received: by fxm14 with SMTP id 14so143216fxm.26 for ; Thu, 27 May 2010 09:25:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:sender:from:to:cc:subject :date:message-id:x-mailer; bh=1+w5tJVwyxP2uzT4cyy2/C8L+C2lwoIQcu/0ObmxWFA=; b=C9EZMKOWTu3h1dGo/yhrOm+amILVleF6zR0ZuIeR3RJZIzUBEK7H2x7+ftTpDteuPE WGnf0EEpZqCx7IXHM+YMydfx0HwvjmDxDv7RY99OroRVLq+6FA/dIEvqRMYEf6MqoVUF ZdU4sVscl/wrw5JFnNmlwinRSFA8E7Aui+3jE= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:from:to:cc:subject:date:message-id:x-mailer; b=s17mPhoHeciK1pOzx4up3YSIDCwUuTg01+UlYSi5jffRrtrottY4naFxRFrnDVjBUq TXh7YoK8a8Pve5+tnKW/d6O2hwlU1SjKNzJvOsE9XYQtnVW+zyHEBdrHwX+/iX/tuksz /MNVyIvEdGRWHhJTm0Plgqrn2vCcGbqLAeLUA= Received: by 10.204.34.201 with SMTP id m9mr5018706bkd.127.1274977528940; Thu, 27 May 2010 09:25:28 -0700 (PDT) Received: from localhost.localdomain (swsoft-msk-nat.sw.ru [195.214.232.10]) by mx.google.com with ESMTPS id r38sm6087008bkk.9.2010.05.27.09.25.27 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 27 May 2010 09:25:28 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: jack@suse.cz Cc: xfs@oss.sgi.com, sandeen@redhat.com, hch@infradead.org, Dmitry Monakhov X-ASG-Orig-Subj: [PATCH 0/2] xfstests-dev: More stress tests Subject: [PATCH 0/2] xfstests-dev: More stress tests Date: Thu, 27 May 2010 20:25:22 +0400 Message-Id: <1274977524-19741-1-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.6.3.3 X-Barracuda-Connect: mail-fx0-f53.google.com[209.85.161.53] X-Barracuda-Start-Time: 1274977642 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30916 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I've finally port my tests to common platform with respect to previous comments. Pathes agains Jen's xfstest tree *Tests state* I've executed it on ext4 on current ext4.git/next snapshot and with http://patchwork.ozlabs.org/patch/53720/ 0001) Is now succeed finally.(i've found more than 5 bugs with that testcase) 0002) Is failed by now: Sometimes it failed due to quota leak (dont know where yet) Sometimes kernel hungs with following call trace: sys_quotactl ->do_quotactl ->vfs_quota_off ->vfs_quota_disable ->invalidate_dquots() /* Wait here for a dqput */ Seems what we have dquot leakage. Still digging... From dmonlist@gmail.com Thu May 27 11:23:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_45, RCVD_IN_BL_SPAMCOP_NET,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RGN8va145098 for ; Thu, 27 May 2010 11:23:08 -0500 X-ASG-Debug-ID: 1274977531-31c300860000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-bw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 47A6C37C97D for ; Thu, 27 May 2010 09:25:31 -0700 (PDT) Received: from mail-bw0-f53.google.com (mail-bw0-f53.google.com [209.85.214.53]) by cuda.sgi.com with ESMTP id PyyCVphd3Vqv8OPK for ; Thu, 27 May 2010 09:25:31 -0700 (PDT) Received: by bwz20 with SMTP id 20so11040bwz.26 for ; Thu, 27 May 2010 09:25:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:sender:from:to:cc:subject :date:message-id:x-mailer:in-reply-to:references; bh=6h4qvACObi2vXh//HLp+WuhD5C2et+DZfqWnDn/cpkw=; b=lo16sxMiH0otTaWhpRPT87jzr5z+J9ria8FknFS2xAwfmu+muqhpWn2C723iDWey3I TMWhZAhodRNdg6EQHkrazf8Vna25u5oqBQ3kDUcnIITsEYaql28WDzJDePKQyZoBt3tk +NOIxuFP4NI3A1ZBm3SNAGfd2TnkZXWg+BSG8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; b=pyNZeQQTlV5pcxEOkvy08QPD7NuG9n9QlVG8gdNar93wOczVVlyn74l271OiyuXtz8 XgtO50nJdVvoIyIe1eWSVlP1Ojz080C9+8WSV9XNZUxPykabH4msp0p4Y56iMn1+vI9N tmCyJ8U3jIfM60SKKwrNhDp5k3VKsX62g23oc= Received: by 10.204.10.8 with SMTP id n8mr4886834bkn.86.1274977530418; Thu, 27 May 2010 09:25:30 -0700 (PDT) Received: from localhost.localdomain (swsoft-msk-nat.sw.ru [195.214.232.10]) by mx.google.com with ESMTPS id r38sm6087008bkk.9.2010.05.27.09.25.29 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 27 May 2010 09:25:29 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: jack@suse.cz Cc: xfs@oss.sgi.com, sandeen@redhat.com, hch@infradead.org, Dmitry Monakhov X-ASG-Orig-Subj: [PATCH 1/2] xfstests-dev: add one more stress test Subject: [PATCH 1/2] xfstests-dev: add one more stress test Date: Thu, 27 May 2010 20:25:23 +0400 Message-Id: <1274977524-19741-2-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.6.3.3 In-Reply-To: <1274977524-19741-1-git-send-email-dmonakhov@openvz.org> References: <1274977524-19741-1-git-send-email-dmonakhov@openvz.org> X-Barracuda-Connect: mail-bw0-f53.google.com[209.85.214.53] X-Barracuda-Start-Time: 1274977532 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30917 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean During stress testing we want to cover most of code paths. fsstress is very good for this purpose. But it has expandable nature (disk usage almost continually grow). So once we goes it no ENOSPC condition we will be where till the end. But by running 'dd' in parallel we can regularly trigger ENOSPC but only for a limited periods of time. This is my favorite stress test case configuration https://bugzilla.kernel.org/show_bug.cgi?id=15742 https://bugzilla.kernel.org/show_bug.cgi?id=15792 https://bugzilla.kernel.org/show_bug.cgi?id=15827 Signed-off-by: Dmitry Monakhov --- 236 | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 236.out | 5 +++ group | 1 + 3 files changed, 109 insertions(+), 0 deletions(-) create mode 100755 236 create mode 100644 236.out diff --git a/236 b/236 new file mode 100755 index 0000000..9e8e34a --- /dev/null +++ b/236 @@ -0,0 +1,103 @@ +#! /bin/bash +# FS QA Test No. 236 +# +# Perform fsstress test with parallel dd +# This proven to be a good stress test +# * Continuous dd retult in ENOSPC condition but only for a limited periods +# of time. +# * Fsstress test cover many code paths +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Dmitry Monakhov. 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=dmonakhov@openvz.org + +seq=`basename $0` +echo "QA output created by $seq" +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +workout() +{ + #Timing parameters + nr_iterations=5 + kill_tries=10 + echo Running fsstress. | tee -a $seq.full + mkdir -p $SCRATCH_MNT/fsstress + touch $SCRATCH_MNT/BIG_FILE + # It is reasonable to disable sync, otherwise most of tasks will simply + # stuck in that sync() call. + + $FSSTRESS_PROG -d $SCRATCH_MNT/fsstress \ + -p 100 -f sync=0 -n 9999999 >>$seq.full 2>&1 & + pid=$! + echo Running ENOSPC hitters. | tee -a $seq.full + for ((i = 0; i < $nr_iterations; i++)) + do + #Open with O_TRUNC and then write until error + #hit ENOSPC each time. + dd if=/dev/zero of=$SCRATCH_MNT/BIG_FILE bs=1M conv=fsync 2> /dev/null + done + + # Kill parent fsstress task to prevent complain from bash + kill $pid 2>/dev/null + wait $pid 2>/dev/null + + # Kill actual stress workers + for ((i = 0; i < $kill_tries; i++)) + do + killall -r -q -TERM fsstress 2> /dev/null + sleep 1 + done + unlink $SCRATCH_MNT/BIG_FILE +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch + +rm -f $seq.full + +umount $TEST_DEV >/dev/null 2>&1 +umount $SCRATCH_DEV >/dev/null 2>&1 +echo "*** MKFS ***" >>$seq.full +echo "" >>$seq.full +SIZE=`expr 128 \* 1024 \* 1024` +_scratch_mkfs_sized $SIZE > /dev/null 2>&1 || _fail "mkfs failed" +_scratch_mount >> $seq.full 2>&1 || _fail "mount failed" +workout +umount $SCRATCH_MNT +echo +echo Checking filesystem +_check_scratch_fs +status=$? +exit diff --git a/236.out b/236.out new file mode 100644 index 0000000..03ffccd --- /dev/null +++ b/236.out @@ -0,0 +1,5 @@ +QA output created by 236 +Running fsstress. +Running ENOSPC hitters. + +Checking filesystem diff --git a/group b/group index cc76175..6402020 100644 --- a/group +++ b/group @@ -349,3 +349,4 @@ deprecated 233 auto quota 234 auto quota 235 auto quota quick +236 auto \ No newline at end of file -- 1.6.6 From dmonlist@gmail.com Thu May 27 11:23:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=BAYES_00,J_CHICKENPOX_45, J_CHICKENPOX_47,RCVD_IN_BL_SPAMCOP_NET,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RGN9vT145110 for ; Thu, 27 May 2010 11:23:10 -0500 X-ASG-Debug-ID: 1274977532-6c76038d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-bw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6DD4913D6F06 for ; Thu, 27 May 2010 09:25:32 -0700 (PDT) Received: from mail-bw0-f53.google.com (mail-bw0-f53.google.com [209.85.214.53]) by cuda.sgi.com with ESMTP id tJ5uzKD1OX2J7Tll for ; Thu, 27 May 2010 09:25:32 -0700 (PDT) Received: by bwz20 with SMTP id 20so11042bwz.26 for ; Thu, 27 May 2010 09:25:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:sender:from:to:cc:subject :date:message-id:x-mailer:in-reply-to:references; bh=5uVRHL7VNzd0nQCmy8Ay6GiCHKXmKHe3ycg1BLE/HpY=; b=eM4aRRguz8o55Bhvg/y+Ep5P7h0xKn8QbXy0BhhiZkji8aa3tHTVr7SHIJc6yTHajZ O729wAcBjqBJ0+DPvvpMrpwTuoTFAknwhhtjPU13Ek+xcv9Ds48HQx/g+cUvFw30mL8C mEQnUYe3750mnmejQQgoo3wJdNW8IDpxATapU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; b=SFSWzbgl+QJ8BPR3KJ0GdzFhWiYBt8bt0PPpj5hT3E6p4vlxfwX9NVFCMTbuxQMe87 26vv2JlYME3flCy+JcpF6z/emOG08N5Hk12Kmb+aKlnZFHeQsek5GPKZFsnpE20kbQ1k IniBhi5ftRKNQxS9nVb6wKQfRwlzspiCi+W/Q= Received: by 10.204.154.220 with SMTP id p28mr4897305bkw.190.1274977531607; Thu, 27 May 2010 09:25:31 -0700 (PDT) Received: from localhost.localdomain (swsoft-msk-nat.sw.ru [195.214.232.10]) by mx.google.com with ESMTPS id r38sm6087008bkk.9.2010.05.27.09.25.30 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 27 May 2010 09:25:31 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: jack@suse.cz Cc: xfs@oss.sgi.com, sandeen@redhat.com, hch@infradead.org, Dmitry Monakhov X-ASG-Orig-Subj: [PATCH 2/2] xfstests-dev: Add one more quota stress test Subject: [PATCH 2/2] xfstests-dev: Add one more quota stress test Date: Thu, 27 May 2010 20:25:24 +0400 Message-Id: <1274977524-19741-3-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.6.3.3 In-Reply-To: <1274977524-19741-2-git-send-email-dmonakhov@openvz.org> References: <1274977524-19741-1-git-send-email-dmonakhov@openvz.org> <1274977524-19741-2-git-send-email-dmonakhov@openvz.org> X-Barracuda-Connect: mail-bw0-f53.google.com[209.85.214.53] X-Barracuda-Start-Time: 1274977533 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, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30917 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Test is inherent from 236 and runs with quota enabled. Later when we will fixup quota code to pe reliable for errors (ENOSPC/ENOMEM) we may merge the test with 236. Signed-off-by: Dmitry Monakhov --- 237 | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 237.out | 8 ++++ group | 3 +- 3 files changed, 148 insertions(+), 1 deletions(-) create mode 100755 237 create mode 100644 237.out diff --git a/237 b/237 new file mode 100755 index 0000000..053c7ad --- /dev/null +++ b/237 @@ -0,0 +1,138 @@ +#! /bin/bash +# FS QA Test No. 237 +# +# Perform agressive stress testing with quota enabled +# Derived from 236. +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Dmitry Monakhov. 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 +# +#----------------------------------------------------------------------- +# +# creator +owner=dmonakhov@openvz.org + +seq=`basename $0` +echo "QA output created by $seq" +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + + +filter_scratch() +{ + perl -ne " +s,$SCRATCH_MNT,[SCR_MNT],; +s,$SCRATCH_DEV,[SCR_DEV],; + print;" +} +check_usage() +{ + quotaon -f -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.orig + quotacheck -u -g $SCRATCH_MNT 2>/dev/null + repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.checked + quotaon -u -g $SCRATCH_MNT 2>/dev/null + diff $tmp.orig $tmp.checked +} + + +tmp=/tmp/$$ + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.quota + +# real QA test starts here +_supported_fs generic +_supported_os Linux #IRIX +_require_scratch +_require_quota +_need_to_be_root + +workout() +{ + #Timing parameters + nr_iterations=5 + kill_tries=10 + echo Running fsstress. | tee -a $seq.full + mkdir -p $SCRATCH_MNT/fsstress + touch $SCRATCH_MNT/BIG_FILE + # It is reasonable to disable sync, otherwise most of tasks will simply + # stuck in that sync() call. + + $FSSTRESS_PROG -d $SCRATCH_MNT/fsstress \ + -p 100 -f sync=0 -n 9999999 >>$seq.full 2>&1 & + pid=$! + echo Running ENOSPC hitters. | tee -a $seq.full + for ((i = 0; i < $nr_iterations; i++)) + do + #Open with O_TRUNC and then write until error + #hit ENOSPC each time. + dd if=/dev/zero of=$SCRATCH_MNT/BIG_FILE bs=1M conv=fsync 2> /dev/null + done + + # Kill parent fsstress task to prevent complain from bash + kill $pid 2>/dev/null + wait $pid 2>/dev/null + # Kill actual stress workers + for ((i = 0; i < $kill_tries; i++)) + do + killall -r -q -TERM fsstress 2> /dev/null + done + unlink $SCRATCH_MNT/BIG_FILE +} + + +rm -f $seq.full + +umount $TEST_DEV >/dev/null 2>&1 +umount $SCRATCH_DEV >/dev/null 2>&1 +echo "*** MKFS ***" >>$seq.full +echo "" >>$seq.full +SIZE=`expr 128 \* 1024 \* 1024` +_scratch_mkfs_sized $SIZE > /dev/null 2>&1 || _fail "mkfs failed" +_scratch_mount "-o usrquota,grpquota" +quotacheck -u -g $SCRATCH_MNT 2>/dev/null + +# Currently quota is not able to handle errors from quota internals +# so quota goes inconsistent after any error. To workaround this let's +# allocate space for quota files to protect quota from ENOSPC +# TODO: Remove this logic after quota becomes enospc tolerant -dmon@ +mv $SCRATCH_MNT/aquota.user{,.tmp} +mv $SCRATCH_MNT/aquota.group{,.tmp} +dd if=/dev/zero of=$SCRATCH_MNT/aquota.user bs=1M count=10 2>/dev/null +dd if=/dev/zero of=$SCRATCH_MNT/aquota.group bs=1M count=10 2>/dev/null +dd if=$SCRATCH_MNT/aquota.user.tmp of=$SCRATCH_MNT/aquota.user conv=notrunc \ + 2>/dev/null +dd if=$SCRATCH_MNT/aquota.group.tmp of=$SCRATCH_MNT/aquota.group conv=notrunc \ + 2>/dev/null +rm -rf $SCRATCH_MNT/aquota.*.tmp + +quotaon $SCRATCH_MNT 2>/dev/null +workout +if ! check_usage; then + umount $SCRATCH_DEV 2>/dev/null + status=1 + exit +fi +echo Checking filesystem +_check_scratch_fs +status=$? +exit diff --git a/237.out b/237.out new file mode 100644 index 0000000..4cd7f0f --- /dev/null +++ b/237.out @@ -0,0 +1,8 @@ +QA output created by 237 +Running fsstress. +Running ENOSPC hitters. +Setting grace times and other flags to default values. +Assuming number of blocks is 10240. +Setting grace times and other flags to default values. +Assuming number of blocks is 10240. +Checking filesystem diff --git a/group b/group index 6402020..389b3ff 100644 --- a/group +++ b/group @@ -349,4 +349,5 @@ deprecated 233 auto quota 234 auto quota 235 auto quota quick -236 auto \ No newline at end of file +236 auto +237 auto quota \ No newline at end of file -- 1.6.6 From BATV+b75d1beb719476e89480+2468+infradead.org+hch@bombadil.srs.infradead.org Thu May 27 11:28:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RGS0nO145410 for ; Thu, 27 May 2010 11:28:00 -0500 X-ASG-Debug-ID: 1274977824-33a400fe0000-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 C499214542D5 for ; Thu, 27 May 2010 09:30:24 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id l5iIbko8wYHUSGwm for ; Thu, 27 May 2010 09:30:24 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OHfyS-0005lC-5E; Thu, 27 May 2010 16:30:24 +0000 Date: Thu, 27 May 2010 12:30:24 -0400 From: Christoph Hellwig To: Jan Kara Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/8] Test basic quota enforcement Subject: Re: [PATCH 3/8] Test basic quota enforcement Message-ID: <20100527163024.GA18771@infradead.org> References: <1274710459-11446-1-git-send-email-jack@suse.cz> <1274710459-11446-4-git-send-email-jack@suse.cz> <20100525100635.GA21252@infradead.org> <20100525203914.GE3783@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100525203914.GE3783@quack.suse.cz> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274977824 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, May 25, 2010 at 10:39:15PM +0200, Jan Kara wrote: > On Tue 25-05-10 06:06:35, Christoph Hellwig wrote: > > On Mon, May 24, 2010 at 04:14:14PM +0200, Jan Kara wrote: > > > Add a test which checks whether basic quota enforcement works. > > > > This one fails for me when testing and xfs filesystem on latest Linus' > > tree (with Debian -testing userspace): > OK, I've committed a fixed version of the test to the repository. Thanks, I've pulled your updated tree. Btw, your kernel.org xfstests tree is not a bare repo which will increase the load in the kernel.org servers needlessly. From jack@suse.cz Thu May 27 12:06:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RH62nC147529 for ; Thu, 27 May 2010 12:06:02 -0500 X-ASG-Debug-ID: 1274980105-2d8d02e20000-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 4D4B437D45B for ; Thu, 27 May 2010 10:08:25 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id ToxQQBthPeCFFVBJ for ; Thu, 27 May 2010 10:08:25 -0700 (PDT) Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id BAD085FC9F; Thu, 27 May 2010 19:08:24 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 7EACB2B17C4; Thu, 27 May 2010 19:08:11 +0200 (CEST) Date: Thu, 27 May 2010 19:08:11 +0200 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/8] Test basic quota enforcement Subject: Re: [PATCH 3/8] Test basic quota enforcement Message-ID: <20100527170810.GB3576@quack.suse.cz> References: <1274710459-11446-1-git-send-email-jack@suse.cz> <1274710459-11446-4-git-send-email-jack@suse.cz> <20100525100635.GA21252@infradead.org> <20100525203914.GE3783@quack.suse.cz> <20100527163024.GA18771@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527163024.GA18771@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1274980106 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.2, rules version 3.2.2.30919 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu 27-05-10 12:30:24, Christoph Hellwig wrote: > On Tue, May 25, 2010 at 10:39:15PM +0200, Jan Kara wrote: > > On Tue 25-05-10 06:06:35, Christoph Hellwig wrote: > > > On Mon, May 24, 2010 at 04:14:14PM +0200, Jan Kara wrote: > > > > Add a test which checks whether basic quota enforcement works. > > > > > > This one fails for me when testing and xfs filesystem on latest Linus' > > > tree (with Debian -testing userspace): > > OK, I've committed a fixed version of the test to the repository. > > Thanks, I've pulled your updated tree. Btw, your kernel.org xfstests > tree is not a bare repo which will increase the load in the kernel.org > servers needlessly. Thanks! I've now removed the repo and next time when I need it I will create a proper bare repository. Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Thu May 27 12:33:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RHX01l149667 for ; Thu, 27 May 2010 12:33:00 -0500 X-ASG-Debug-ID: 1274981835-5ce900a80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 87982149D589 for ; Thu, 27 May 2010 10:37:15 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id 3APsRGIWP72zRfzs for ; Thu, 27 May 2010 10:37:15 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 87B7093717; Thu, 27 May 2010 19:35:22 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 1B6842B17C4; Thu, 27 May 2010 19:35:09 +0200 (CEST) Date: Thu, 27 May 2010 19:35:09 +0200 From: Jan Kara To: Dmitry Monakhov Cc: jack@suse.cz, xfs@oss.sgi.com, sandeen@redhat.com, hch@infradead.org X-ASG-Orig-Subj: Re: [PATCH 0/2] xfstests-dev: More stress tests Subject: Re: [PATCH 0/2] xfstests-dev: More stress tests Message-ID: <20100527173508.GD3576@quack.suse.cz> References: <1274977524-19741-1-git-send-email-dmonakhov@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1274977524-19741-1-git-send-email-dmonakhov@openvz.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1274981836 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu 27-05-10 20:25:22, Dmitry Monakhov wrote: > I've finally port my tests to common platform with respect to previous > comments. Pathes agains Jen's xfstest tree > > *Tests state* > I've executed it on ext4 on current ext4.git/next snapshot and > with http://patchwork.ozlabs.org/patch/53720/ > > 0001) Is now succeed finally.(i've found more than 5 bugs with that testcase) > > 0002) Is failed by now: > Sometimes it failed due to quota leak (dont know where yet) I sometimes observe that quota accounting is wrong on ext4 in my fsstress test as well... > Sometimes kernel hungs with following call trace: > sys_quotactl > ->do_quotactl > ->vfs_quota_off > ->vfs_quota_disable > ->invalidate_dquots() > /* Wait here for a dqput */ > Seems what we have dquot leakage. > Still digging... Hmm, interesting. I don't have a clue where that could happen. Honza -- Jan Kara SUSE Labs, CR From BATV+b75d1beb719476e89480+2468+infradead.org+hch@bombadil.srs.infradead.org Thu May 27 14:02:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RJ2tN4157185 for ; Thu, 27 May 2010 14:02:55 -0500 X-ASG-Debug-ID: 1274987118-5d82005a0000-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 971721B10885 for ; Thu, 27 May 2010 12:05:18 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id WGVoZIm3jHMvb0wU for ; Thu, 27 May 2010 12:05:18 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OHiOJ-0004lP-Ru for xfs@oss.sgi.com; Thu, 27 May 2010 19:05:15 +0000 Date: Thu, 27 May 2010 15:05:15 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: fix access to upper inodes without inode64 Subject: [PATCH] xfs: fix access to upper inodes without inode64 Message-ID: <20100527190515.GA16102@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274987119 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean If a filesystem is mounted without the inode64 mount option we should still be able to access inodes not fitting into 32 bits, just not created new ones. For this to work we need to make sure the inode cache radix tree is initialized for all allocation groups, not just those we plan to allocate inodes from. This patch makes sure we initialize the inode cache radix tree for all allocation groups, and also cleans xfs_initialize_perag up a bit to separate the inode32 logical from the general perag structure setup. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_mount.c =================================================================== --- xfs.orig/fs/xfs/xfs_mount.c 2010-05-27 20:59:09.191004330 +0200 +++ xfs/fs/xfs/xfs_mount.c 2010-05-27 20:59:43.290004329 +0200 @@ -410,17 +410,6 @@ xfs_mount_validate_sb( return 0; } -STATIC void -xfs_initialize_perag_icache( - xfs_perag_t *pag) -{ - if (!pag->pag_ici_init) { - rwlock_init(&pag->pag_ici_lock); - INIT_RADIX_TREE(&pag->pag_ici_root, GFP_ATOMIC); - pag->pag_ici_init = 1; - } -} - int xfs_initialize_perag( xfs_mount_t *mp, @@ -433,13 +422,8 @@ xfs_initialize_perag( xfs_agino_t agino; xfs_ino_t ino; xfs_sb_t *sbp = &mp->m_sb; - xfs_ino_t max_inum = XFS_MAXINUMBER_32; int error = -ENOMEM; - /* Check to see if the filesystem can overflow 32 bit inodes */ - agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks - 1, 0); - ino = XFS_AGINO_TO_INO(mp, agcount - 1, agino); - /* * Walk the current per-ag tree so we don't try to initialise AGs * that already exist (growfs case). Allocate and insert all the @@ -453,11 +437,18 @@ xfs_initialize_perag( } if (!first_initialised) first_initialised = index; + pag = kmem_zalloc(sizeof(*pag), KM_MAYFAIL); if (!pag) goto out_unwind; + pag->pag_agno = index; + pag->pag_mount = mp; + rwlock_init(&pag->pag_ici_lock); + INIT_RADIX_TREE(&pag->pag_ici_root, GFP_ATOMIC); + if (radix_tree_preload(GFP_NOFS)) goto out_unwind; + spin_lock(&mp->m_perag_lock); if (radix_tree_insert(&mp->m_perag_tree, index, pag)) { BUG(); @@ -466,25 +457,26 @@ xfs_initialize_perag( error = -EEXIST; goto out_unwind; } - pag->pag_agno = index; - pag->pag_mount = mp; spin_unlock(&mp->m_perag_lock); radix_tree_preload_end(); } - /* Clear the mount flag if no inode can overflow 32 bits - * on this filesystem, or if specifically requested.. + /* + * If we mount with the inode64 option, or no inode overflows + * the legacy 32-bit address space clear the inode32 option. */ - if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) && ino > max_inum) { + agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks - 1, 0); + ino = XFS_AGINO_TO_INO(mp, agcount - 1, agino); + + if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) && ino > XFS_MAXINUMBER_32) mp->m_flags |= XFS_MOUNT_32BITINODES; - } else { + else mp->m_flags &= ~XFS_MOUNT_32BITINODES; - } - /* If we can overflow then setup the ag headers accordingly */ if (mp->m_flags & XFS_MOUNT_32BITINODES) { - /* Calculate how much should be reserved for inodes to - * meet the max inode percentage. + /* + * Calculate how much should be reserved for inodes to meet + * the max inode percentage. */ if (mp->m_maxicount) { __uint64_t icount; @@ -497,30 +489,30 @@ xfs_initialize_perag( } else { max_metadata = agcount; } + for (index = 0; index < agcount; index++) { ino = XFS_AGINO_TO_INO(mp, index, agino); - if (ino > max_inum) { + if (ino > XFS_MAXINUMBER_32) { index++; break; } - /* This ag is preferred for inodes */ pag = xfs_perag_get(mp, index); pag->pagi_inodeok = 1; if (index < max_metadata) pag->pagf_metadata = 1; - xfs_initialize_perag_icache(pag); xfs_perag_put(pag); } + + *maxagi = agcount; } else { - /* Setup default behavior for smaller filesystems */ for (index = 0; index < agcount; index++) { pag = xfs_perag_get(mp, index); pag->pagi_inodeok = 1; - xfs_initialize_perag_icache(pag); xfs_perag_put(pag); } } + if (maxagi) *maxagi = index; return 0; Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2010-05-27 20:59:09.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2010-05-27 20:59:43.291003910 +0200 @@ -153,10 +153,6 @@ xfs_inode_ag_iterator( struct xfs_perag *pag; pag = xfs_perag_get(mp, ag); - if (!pag->pag_ici_init) { - xfs_perag_put(pag); - continue; - } error = xfs_inode_ag_walk(mp, pag, execute, flags, tag, exclusive, &nr); xfs_perag_put(pag); @@ -856,12 +852,7 @@ xfs_reclaim_inode_shrink( down_read(&xfs_mount_list_lock); list_for_each_entry(mp, &xfs_mount_list, m_mplist) { for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { - pag = xfs_perag_get(mp, ag); - if (!pag->pag_ici_init) { - xfs_perag_put(pag); - continue; - } reclaimable += pag->pag_ici_reclaimable; xfs_perag_put(pag); } Index: xfs/fs/xfs/xfs_ag.h =================================================================== --- xfs.orig/fs/xfs/xfs_ag.h 2010-05-27 20:59:09.000000000 +0200 +++ xfs/fs/xfs/xfs_ag.h 2010-05-27 20:59:43.299004538 +0200 @@ -227,7 +227,6 @@ typedef struct xfs_perag { atomic_t pagf_fstrms; /* # of filestreams active in this AG */ - int pag_ici_init; /* incore inode cache initialised */ rwlock_t pag_ici_lock; /* incore inode lock */ struct radix_tree_root pag_ici_root; /* incore inode cache root */ int pag_ici_reclaimable; /* reclaimable inodes */ Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-05-27 20:59:38.000000000 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-05-27 21:00:06.084254784 +0200 @@ -378,9 +378,6 @@ xfs_iget( /* get the perag structure and ensure that it's inode capable */ pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ino)); - if (!pag->pagi_inodeok) - return EINVAL; - ASSERT(pag->pag_ici_init); agino = XFS_INO_TO_AGINO(mp, ino); again: Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-05-27 20:59:09.000000000 +0200 +++ xfs/fs/xfs/xfs_inode.c 2010-05-27 20:59:43.315004399 +0200 @@ -2624,7 +2624,6 @@ xfs_iflush_cluster( int i; pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); - ASSERT(pag->pag_ici_init); inodes_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog; ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); From BATV+b75d1beb719476e89480+2468+infradead.org+hch@bombadil.srs.infradead.org Thu May 27 14:03:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RJ3BUr157214 for ; Thu, 27 May 2010 14:03:11 -0500 X-ASG-Debug-ID: 1274987246-2caf00d30000-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 70618A6B114 for ; Thu, 27 May 2010 12:07:26 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id BFggdPHOpLPalhxm for ; Thu, 27 May 2010 12:07:26 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OHiOb-0004nS-P0 for xfs@oss.sgi.com; Thu, 27 May 2010 19:05:33 +0000 Date: Thu, 27 May 2010 15:05:33 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: improve xfs_isilocked Subject: [PATCH] xfs: improve xfs_isilocked Message-ID: <20100527190533.GB16102@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274987247 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Use rwsem_is_locked to make the assertations for shared locks work. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-05-25 11:40:59.216005587 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-05-27 20:59:09.244004330 +0200 @@ -740,30 +738,24 @@ xfs_ilock_demote( } #ifdef DEBUG -/* - * Debug-only routine, without additional rw_semaphore APIs, we can - * now only answer requests regarding whether we hold the lock for write - * (reader state is outside our visibility, we only track writer state). - * - * Note: this means !xfs_isilocked would give false positives, so don't do that. - */ int xfs_isilocked( xfs_inode_t *ip, uint lock_flags) { - if ((lock_flags & (XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)) == - XFS_ILOCK_EXCL) { - if (!ip->i_lock.mr_writer) - return 0; + if (lock_flags & (XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)) { + if (!(lock_flags & XFS_ILOCK_SHARED)) + return !!ip->i_lock.mr_writer; + return rwsem_is_locked(&ip->i_lock.mr_lock); } - if ((lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) == - XFS_IOLOCK_EXCL) { - if (!ip->i_iolock.mr_writer) - return 0; + if (lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) { + if (!(lock_flags & XFS_IOLOCK_SHARED)) + return !!ip->i_iolock.mr_writer; + return rwsem_is_locked(&ip->i_iolock.mr_lock); } - return 1; + ASSERT(0); + return 0; } #endif From BATV+b75d1beb719476e89480+2468+infradead.org+hch@bombadil.srs.infradead.org Thu May 27 14:17:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RJH4UX158032 for ; Thu, 27 May 2010 14:17:05 -0500 X-ASG-Debug-ID: 1274988081-30f800be0000-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 67026A6B9E4 for ; Thu, 27 May 2010 12:21:21 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id V0ht4YihBhcV2b1T for ; Thu, 27 May 2010 12:21:21 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OHibz-0008IS-OZ; Thu, 27 May 2010 19:19:23 +0000 Date: Thu, 27 May 2010 15:19:23 -0400 From: Christoph Hellwig To: Shi Weihua Cc: Christoph Hellwig , "Yan, Zheng" , linux-btrfs@vger.kernel.org, chris.mason@oracle.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] btrfs: should add a permission check for setfacl Subject: Re: [PATCH] btrfs: should add a permission check for setfacl Message-ID: <20100527191923.GA20439@infradead.org> References: <4BF1E458.7060500@cn.fujitsu.com> <20100520083340.GC11920@infradead.org> <4BFA1F03.6030909@cn.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4BFA1F03.6030909@cn.fujitsu.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1274988081 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Thanks! I've commit both patches. From akpm@linux-foundation.org Thu May 27 15:30:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RKUHt3162282 for ; Thu, 27 May 2010 15:30:18 -0500 X-ASG-Debug-ID: 1274992473-30f702800000-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 3DB35149D817 for ; Thu, 27 May 2010 13:34:33 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id 5QZZSY7os4yNQlih for ; Thu, 27 May 2010 13:34:33 -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 o4RKWOIn019033 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 27 May 2010 13:32:25 -0700 Received: from akpm.mtv.corp.google.com (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with SMTP id o4RKWNeI012515; Thu, 27 May 2010 13:32:24 -0700 Date: Thu, 27 May 2010 13:32:23 -0700 From: Andrew Morton To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/5] Per superblock shrinkers V2 Subject: Re: [PATCH 0/5] Per superblock shrinkers V2 Message-Id: <20100527133223.efa4740a.akpm@linux-foundation.org> In-Reply-To: <1274777588-21494-1-git-send-email-david@fromorbit.com> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> X-Mailer: Sylpheed 2.4.8 (GTK+ 2.12.9; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit 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: 1274992474 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.2, rules version 3.2.2.30927 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 25 May 2010 18:53:03 +1000 Dave Chinner wrote: > This series reworks the filesystem shrinkers. We currently have a > set of issues with the current filesystem shrinkers: > > 1. There is an dependency between dentry and inode cache > shrinking that is only implicitly defined by the order of > shrinker registration. > 2. The shrinkers need to walk the superblock list and pin > the superblock to avoid unmount races with the sb going > away. > 3. The dentry cache uses per-superblock LRUs and proportions > reclaim between all the superblocks which means we are > doing breadth based reclaim. This means we touch every > superblock for every shrinker call, and may only reclaim > a single dentry at a time from a given superblock. > 4. The inode cache has a global LRU, so it has different > reclaim patterns to the dentry cache, despite the fact > that the dentry cache is generally the only thing that > pins inodes in memory. > 5. Filesystems need to register their own shrinkers for > caches and can't co-ordinate them with the dentry and > inode cache shrinkers. Nice description, but... it never actually told us what the benefit of the changes are. Presumably some undescribed workload had some undescribed user-visible problem. But what was that workload, and what was the user-visible problem, and how does the patch affect all this? Stuff like that. From akpm@linux-foundation.org Thu May 27 15:30:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RKUIIq162287 for ; Thu, 27 May 2010 15:30:18 -0500 X-ASG-Debug-ID: 1274992361-570103160000-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 686CA37E115 for ; Thu, 27 May 2010 13:32:41 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id aovAkAtEce8ukktD for ; Thu, 27 May 2010 13:32:41 -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 o4RKWUte019061 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 27 May 2010 13:32:31 -0700 Received: from akpm.mtv.corp.google.com (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with SMTP id o4RKWUaP012520; Thu, 27 May 2010 13:32:30 -0700 Date: Thu, 27 May 2010 13:32:30 -0700 From: Andrew Morton To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Subject: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Message-Id: <20100527133230.780be6c7.akpm@linux-foundation.org> In-Reply-To: <1274777588-21494-2-git-send-email-david@fromorbit.com> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-2-git-send-email-david@fromorbit.com> X-Mailer: Sylpheed 2.4.8 (GTK+ 2.12.9; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit 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: 1274992362 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.2, rules version 3.2.2.30928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 25 May 2010 18:53:04 +1000 Dave Chinner wrote: > From: Dave Chinner > > The inode unused list is currently a global LRU. This does not match > the other global filesystem cache - the dentry cache - which uses > per-superblock LRU lists. Hence we have related filesystem object > types using different LRU reclaimatin schemes. > > To enable a per-superblock filesystem cache shrinker, both of these > caches need to have per-sb unused object LRU lists. Hence this patch > converts the global inode LRU to per-sb LRUs. > > The patch only does rudimentary per-sb propotioning in the shrinker > infrastructure, as this gets removed when the per-sb shrinker > callouts are introduced later on. > > ... > > + list_move(&inode->i_list, &inode->i_sb->s_inode_lru); It's a shape that s_inode_lru is still protected by inode_lock. One day we're going to get in trouble over that lock. Migrating to a per-sb lock would be logical and might help. Did you look into this? I expect we'd end up taking both inode_lock and the new sb->lru_lock in several places, which wouldn't be of any help, at least in the interim. Long-term, the locking for fs-writeback.c should move to the per-superblock one also, at which time this problem largely goes away I think. Unfortunately the writeback inode lists got moved into the backing_dev_info, whcih messes things up a bit. > inodes_stat.nr_unused--; > + inode->i_sb->s_nr_inodes_unused--; It's regrettable to be counting the same thing twice. Did you look into removing (or no longer using) inodes_stat.nr_unused? > + /* Now, we reclaim unused dentrins with fairness. May as well fix the typo while we're there. Please review all these comments to ensure that they are still accurate and complete. From akpm@linux-foundation.org Thu May 27 15:30:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RKUIPP162286 for ; Thu, 27 May 2010 15:30:18 -0500 X-ASG-Debug-ID: 1274992361-5d8a01e40000-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 221701D52AD1 for ; Thu, 27 May 2010 13:32:41 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id 1VwGXdb3Q8Rr0jed for ; Thu, 27 May 2010 13:32:41 -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 o4RKWZnf019083 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 27 May 2010 13:32:36 -0700 Received: from akpm.mtv.corp.google.com (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with SMTP id o4RKWYhe012523; Thu, 27 May 2010 13:32:34 -0700 Date: Thu, 27 May 2010 13:32:34 -0700 From: Andrew Morton To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Message-Id: <20100527133234.e0814239.akpm@linux-foundation.org> In-Reply-To: <1274777588-21494-4-git-send-email-david@fromorbit.com> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> X-Mailer: Sylpheed 2.4.8 (GTK+ 2.12.9; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit 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: 1274992362 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.2, rules version 3.2.2.30928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 25 May 2010 18:53:06 +1000 Dave Chinner wrote: > From: Dave Chinner > > With context based shrinkers, we can implement a per-superblock > shrinker that shrinks the caches attached to the superblock. We > currently have global shrinkers for the inode and dentry caches that > split up into per-superblock operations via a coarse proportioning > method that does not batch very well. The global shrinkers also > have a dependency - dentries pin inodes - so we have to be very > careful about how we register the global shrinkers so that the > implicit call order is always correct. > > With a per-sb shrinker callout, we can encode this dependency > directly into the per-sb shrinker, hence avoiding the need for > strictly ordering shrinker registrations. We also have no need for > any proportioning code for the shrinker subsystem already provides > this functionality across all shrinkers. Allowing the shrinker to > operate on a single superblock at a time means that we do less > superblock list traversals and locking and reclaim should batch more > effectively. This should result in less CPU overhead for reclaim and > potentially faster reclaim of items from each filesystem. > I go all tingly when a changelog contains the word "should". OK, it _should_ do X. But _does_ it actually do X? > fs/super.c | 53 +++++++++++++++++++++ > include/linux/fs.h | 7 +++ > 4 files changed, 88 insertions(+), 214 deletions(-) > > diff --git a/fs/dcache.c b/fs/dcache.c > index dba6b6d..d7bd781 100644 > --- a/fs/dcache.c > +++ b/fs/dcache.c > @@ -456,21 +456,16 @@ static void prune_one_dentry(struct dentry * dentry) > * which flags are set. This means we don't need to maintain multiple > * similar copies of this loop. > */ > -static void __shrink_dcache_sb(struct super_block *sb, int *count, int flags) > +static void __shrink_dcache_sb(struct super_block *sb, int count, int flags) Forgot to update the kerneldoc description of `count'. From akpm@linux-foundation.org Thu May 27 15:30:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RKUQum162323 for ; Thu, 27 May 2010 15:30:26 -0500 X-ASG-Debug-ID: 1274992482-234503900000-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 87293149D81C for ; Thu, 27 May 2010 13:34:42 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id gWdITsSTHz2q3bQw for ; Thu, 27 May 2010 13:34:42 -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 o4RKWd4p019090 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 27 May 2010 13:32:40 -0700 Received: from akpm.mtv.corp.google.com (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with SMTP id o4RKWdku012526; Thu, 27 May 2010 13:32:39 -0700 Date: Thu, 27 May 2010 13:32:39 -0700 From: Andrew Morton To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/5] superblock: add filesystem shrinker operations Subject: Re: [PATCH 4/5] superblock: add filesystem shrinker operations Message-Id: <20100527133239.5d038d9c.akpm@linux-foundation.org> In-Reply-To: <1274777588-21494-5-git-send-email-david@fromorbit.com> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-5-git-send-email-david@fromorbit.com> X-Mailer: Sylpheed 2.4.8 (GTK+ 2.12.9; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit 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: 1274992482 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.2, rules version 3.2.2.30927 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 25 May 2010 18:53:07 +1000 Dave Chinner wrote: > From: Dave Chinner > > Now we have a per-superblock shrinker implementation, we can add a > filesystem specific callout to it to allow filesystem internal > caches to be shrunk by the superblock shrinker. > > Rather than perpetuate the multipurpose shrinker callback API (i.e. > nr_to_scan == 0 meaning "tell me how many objects freeable in the > cache), two operations will be added. The first will return the > number of objects that are freeable, the second is the actual > shrinker call. > > > ... > > static int prune_super(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) > { > struct super_block *sb; > - int count; > + int fs_objects = 0; > + int total_objects; > > sb = container_of(shrink, struct super_block, s_shrink); > > @@ -63,22 +64,40 @@ static int prune_super(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) > return -1; > } > > - if (nr_to_scan) { > - /* proportion the scan between the two cache__ */ > - int total; > - > - total = sb->s_nr_dentry_unused + sb->s_nr_inodes_unused + 1; > - count = (nr_to_scan * sb->s_nr_dentry_unused) / total; > + if (sb->s_op && sb->s_op->nr_cached_objects) > + fs_objects = sb->s_op->nr_cached_objects(sb); > > - /* prune dcache first as icache is pinned by it */ > - prune_dcache_sb(sb, count); > - prune_icache_sb(sb, nr_to_scan - count); > + total_objects = sb->s_nr_dentry_unused + > + sb->s_nr_inodes_unused + fs_objects + 1; > + if (nr_to_scan) { > + int dentries; > + int inodes; > + > + /* proportion the scan between the cache__ */ > + dentries = (nr_to_scan * sb->s_nr_dentry_unused) / > + total_objects; > + inodes = (nr_to_scan * sb->s_nr_inodes_unused) / > + total_objects; > + if (fs_objects) > + fs_objects = (nr_to_scan * fs_objects) / > + total_objects; > + /* > + * prune the dcache first as the icache is pinned by it, then > + * prune the icache, followed by the filesystem specific caches > + */ > + prune_dcache_sb(sb, dentries); > + prune_icache_sb(sb, inodes); > + if (sb->s_op && sb->s_op->free_cached_objects) { Under which circumstances is a NULL ->free_cached_objects valid? > + sb->s_op->free_cached_objects(sb, fs_objects); > + fs_objects = sb->s_op->nr_cached_objects(sb); > + } > + total_objects = sb->s_nr_dentry_unused + > + sb->s_nr_inodes_unused + fs_objects; > } The return value from ->free_cached_objects() doesn't actually get used. Instead the code calls ->nr_cached_objects() twice. > - count = ((sb->s_nr_dentry_unused + sb->s_nr_inodes_unused) / 100) > - * sysctl_vfs_cache_pressure; > + total_objects = (total_objects / 100) * sysctl_vfs_cache_pressure; > up_read(&sb->s_umount); > - return count; > + return total_objects; > } > > /** > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 5bff2dc..efcdcc6 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -1590,6 +1590,17 @@ struct super_operations { > ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); > #endif > int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); > + > + /* > + * memory shrinker operations. > + * ->nr_cached_objects() should return the number of freeable cached > + * objects the filesystem holds. > + * ->free_cache_objects() should attempt to free the number of cached > + * objects indicated. It should return how many objects it attempted to > + * free. > + */ I'd have thought that ->free_cache_objects() would always return the number which it was passed. Unless someone asked it to scan more objects than exist, perhaps. > + int (*nr_cached_objects)(struct super_block *); > + int (*free_cached_objects)(struct super_block *, int); > }; From akpm@linux-foundation.org Thu May 27 16:30:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RLUoot165693 for ; Thu, 27 May 2010 16:30:51 -0500 X-ASG-Debug-ID: 1274996105-310303c80000-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 3541C10A3909 for ; Thu, 27 May 2010 14:35:05 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id Nry2Lxay0Oe7HyiH for ; Thu, 27 May 2010 14:35:05 -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 o4RLWYZW027122 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 27 May 2010 14:32:35 -0700 Received: from akpm.mtv.corp.google.com (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with SMTP id o4RLWXsi015321; Thu, 27 May 2010 14:32:34 -0700 Date: Thu, 27 May 2010 14:32:33 -0700 From: Andrew Morton To: Dave Chinner Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 1/6] writeback: initial tracing support Subject: Re: [PATCH 1/6] writeback: initial tracing support Message-Id: <20100527143233.836b2c47.akpm@linux-foundation.org> In-Reply-To: <1274784852-30502-2-git-send-email-david@fromorbit.com> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-2-git-send-email-david@fromorbit.com> X-Mailer: Sylpheed 2.4.8 (GTK+ 2.12.9; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit 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: 1274996106 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.2, rules version 3.2.2.30931 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 25 May 2010 20:54:07 +1000 Dave Chinner wrote: > From: From: Jens Axboe > > Trace queue/sched/exec parts of the writeback loop. It would be most useful if this patchset's description provided sample tracing output, so we can see what the patch is actually providing us. > -#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) > - > -/* > - * We don't actually have pdflush, but this one is exported though /proc... > - */ > -int nr_pdflush_threads; > - > /* > * Passed into wb_writeback(), essentially a subset of writeback_control > */ > @@ -63,6 +57,16 @@ struct bdi_work { > unsigned long state; /* flag bits, see WS_* */ > }; > > +#define CREATE_TRACE_POINTS > +#include > + > +#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) Could/should be implemented in C. > +/* > + * We don't actually have pdflush, but this one is exported though /proc... > + */ > +int nr_pdflush_threads; So this is always zero now? We don't want to keep it forever. Add a printk_once("nr_pdflush_threads is deprecated") when someone reads it, remove it in 2014. > > ... > > --- /dev/null > +++ b/include/trace/events/writeback.h > @@ -0,0 +1,171 @@ > +#undef TRACE_SYSTEM > +#define TRACE_SYSTEM writeback > + > +#if !defined(_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ) Seems wrong. If you define TRACE_HEADER_MULTI_READ then include this header twice, things explode. Which negates the purpose of _TRACE_WRITEBACK_H. > +#define _TRACE_WRITEBACK_H > + > +#include > +#include > + > +TRACE_EVENT(writeback_queue, > + > + TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_args *args), > + > + TP_ARGS(bdi, args), > + > + TP_STRUCT__entry( > + __array(char, name, 16) > + __field(long, nr_pages) > + __field(int, sb) > + __field(int, sync_mode) > + __field(int, for_kupdate) > + __field(int, range_cyclic) > + __field(int, for_background) > + ), > + > + TP_fast_assign( > + strncpy(__entry->name, dev_name(bdi->dev), 16); > + __entry->nr_pages = args->nr_pages; > + __entry->sb = !!args->sb; > + __entry->for_kupdate = args->for_kupdate; > + __entry->range_cyclic = args->range_cyclic; > + __entry->for_background = args->for_background; > + ), > + > + TP_printk("%s: pages=%ld, sb=%d, kupdate=%d, range_cyclic=%d " > + "for_background=%d", __entry->name, __entry->nr_pages, > + __entry->sb, __entry->for_kupdate, > + __entry->range_cyclic, __entry->for_background) > +); > + From akpm@linux-foundation.org Thu May 27 16:31:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_ATTENTION autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RLVI33165731 for ; Thu, 27 May 2010 16:31:18 -0500 X-ASG-Debug-ID: 1274996115-312203ad0000-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 55D7D10A397F for ; Thu, 27 May 2010 14:35:16 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id dVhZsWmu2eWEIw39 for ; Thu, 27 May 2010 14:35:16 -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 o4RLWpkf027149 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 27 May 2010 14:32:52 -0700 Received: from akpm.mtv.corp.google.com (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with SMTP id o4RLWpSt015327; Thu, 27 May 2010 14:32:51 -0700 Date: Thu, 27 May 2010 14:32:51 -0700 From: Andrew Morton To: Dave Chinner Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: Re: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Message-Id: <20100527143251.5193842d.akpm@linux-foundation.org> In-Reply-To: <1274784852-30502-5-git-send-email-david@fromorbit.com> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-5-git-send-email-david@fromorbit.com> X-Mailer: Sylpheed 2.4.8 (GTK+ 2.12.9; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit 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: 1274996116 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.2, rules version 3.2.2.30933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 25 May 2010 20:54:10 +1000 Dave Chinner wrote: > From: Dave Chinner > > If a filesystem writes more than one page in ->writepage, write_cache_pages > fails to notice this and continues to attempt writeback when wbc->nr_to_write > has gone negative - this trace was captured from XFS: > > > wbc_writeback_start: towrt=1024 > wbc_writepage: towrt=1024 > wbc_writepage: towrt=0 > wbc_writepage: towrt=-1 > wbc_writepage: towrt=-5 > wbc_writepage: towrt=-21 > wbc_writepage: towrt=-85 > > This has adverse effects on filesystem writeback behaviour. write_cache_pages() > needs to terminate after a certain number of pages are written, not after a > certain number of calls to ->writepage are made. This is a regression > introduced by 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4, but cannot be reverted It's conventional to identify commits by their title as well as their hash. So 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4 ("vfs: Add no_nrwrite_index_update writeback control flag"). Because that commit might have different hashes in different trees, I think. A Linus idea. I do this ten times a day - It's a PITA. > directly due to subsequent bug fixes that have gone in on top of it. > > This commit adds a ->writepage tracepoint inside write_cache_pages() (how the > above trace was generated) and does the revert manually leaving the subsequent > bug fixes in tact. ext4 is not affected by this as a previous commit in the "intact". > series stops ext4 from using the generic function. > > - if (nr_to_write > 0) { > - nr_to_write--; > - if (nr_to_write == 0 && > + if (wbc->nr_to_write > 0) { > + if (--wbc->nr_to_write == 0 && > wbc->sync_mode == WB_SYNC_NONE) { > /* > * We stop writing back only if we are > @@ -974,11 +973,8 @@ continue_unlock: > end = writeback_index - 1; > goto retry; > } > - if (!wbc->no_nrwrite_index_update) { > - if (wbc->range_cyclic || (range_whole && nr_to_write > 0)) > - mapping->writeback_index = done_index; > - wbc->nr_to_write = nr_to_write; > - } > + if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) > + mapping->writeback_index = done_index; > > return ret; 'bout time we fixed that. I wonder why it took so long to find. From akpm@linux-foundation.org Thu May 27 16:31:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RLVr6T165761 for ; Thu, 27 May 2010 16:31:53 -0500 X-ASG-Debug-ID: 1274996169-30f203d30000-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 EABEB10A3A6D for ; Thu, 27 May 2010 14:36:09 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id 0jhKraQ0Ejmy1Nzh for ; Thu, 27 May 2010 14:36:09 -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 o4RLXg24027265 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 27 May 2010 14:33:43 -0700 Received: from akpm.mtv.corp.google.com (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with SMTP id o4RLXfNo015357; Thu, 27 May 2010 14:33:41 -0700 Date: Thu, 27 May 2010 14:33:41 -0700 From: Andrew Morton To: Dave Chinner Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Subject: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Message-Id: <20100527143341.d4258798.akpm@linux-foundation.org> In-Reply-To: <1274784852-30502-7-git-send-email-david@fromorbit.com> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-7-git-send-email-david@fromorbit.com> X-Mailer: Sylpheed 2.4.8 (GTK+ 2.12.9; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit 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: 1274996169 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.2, rules version 3.2.2.30933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 25 May 2010 20:54:12 +1000 Dave Chinner wrote: > From: Dave Chinner > > sync can currently take a really long time if a concurrent writer is > extending a file. The problem is that the dirty pages on the address > space grow in the same direction as write_cache_pages scans, so if > the writer keeps ahead of writeback, the writeback will not > terminate until the writer stops adding dirty pages. The really was a pretty basic bug. It's writeback 101 to test that case :( > For a data integrity sync, we only need to write the pages dirty at > the time we start the writeback, so we can stop scanning once we get > to the page that was at the end of the file at the time the scan > started. > > This will prevent operations like copying a large file preventing > sync from completing as it will not write back pages that were > dirtied after the sync was started. This does not impact the > existing integrity guarantees, as any dirty page (old or new) > within the EOF range at the start of the scan will still be > captured. > > Signed-off-by: Dave Chinner > --- > mm/page-writeback.c | 15 +++++++++++++++ > 1 files changed, 15 insertions(+), 0 deletions(-) > > diff --git a/mm/page-writeback.c b/mm/page-writeback.c > index 0fe713d..c97e973 100644 > --- a/mm/page-writeback.c > +++ b/mm/page-writeback.c > @@ -855,7 +855,22 @@ int write_cache_pages(struct address_space *mapping, > if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) > range_whole = 1; > cycled = 1; /* ignore range_cyclic tests */ > + > + /* > + * If this is a data integrity sync, cap the writeback to the > + * current end of file. Any extension to the file that occurs > + * after this is a new write and we don't need to write those > + * pages out to fulfil our data integrity requirements. If we > + * try to write them out, we can get stuck in this scan until > + * the concurrent writer stops adding dirty pages and extending > + * EOF. > + */ > + if (wbc->sync_mode == WB_SYNC_ALL && > + wbc->range_end == LLONG_MAX) { > + end = i_size_read(mapping->host) >> PAGE_CACHE_SHIFT; > + } > } > + This is somewhat inefficient. It's really trivial and fast to find the highest-index dirty page by walking straight down the PAGECACHE_TAG_DIRTY-tagged nodes. However pagevec_lookup_tag(..., PAGECACHE_TAG_DIRTY) should do a pretty good job of skipping over the (millions of) pages between the (last dirty page before `end') and (`end'). So it _should_ be OK. Some thought and runtime testing would be good. That being said, I think the patch is insufficient. If I create an enormous (possibly sparse) file with a 16TB hole (or a run of clean pages) in the middle and then start busily writing into that hole (run of clean pages), the problem will still occur. One obvious fix for that (a) would be to add another radix-tree tag and do two passes across the radix-tree. Another fix (b) would be to track the number of dirty pages per adddress_space, and only write that number of pages. Another fix would be to work out how the code handled this situation before we broke it, and restore that in some fashion. I guess fix (b) above kinda does that. From SRS0+oUyZ+86+fromorbit.com=david@internode.on.net Thu May 27 17:38:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RMcFmD169176 for ; Thu, 27 May 2010 17:38:15 -0500 X-ASG-Debug-ID: 1275000037-2a3300c10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 225751D531A3 for ; Thu, 27 May 2010 15:40:38 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id YFHuQwfBC4TLCg3I for ; Thu, 27 May 2010 15:40:38 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14246410-1927428 for multiple; Fri, 28 May 2010 08:10:36 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHlkh-0003Lx-1Y; Fri, 28 May 2010 08:40:35 +1000 Date: Fri, 28 May 2010 08:40:34 +1000 From: Dave Chinner To: Nick Piggin Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100527224034.GO12087@dastard> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> <20100527063523.GJ22536@laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100527063523.GJ22536@laptop> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1275000039 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.2, rules version 3.2.2.30936 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 04:35:23PM +1000, Nick Piggin wrote: > On Tue, May 25, 2010 at 06:53:06PM +1000, Dave Chinner wrote: > > --- a/fs/super.c > > +++ b/fs/super.c > > @@ -37,6 +37,50 @@ > > LIST_HEAD(super_blocks); > > DEFINE_SPINLOCK(sb_lock); > > > > +static int prune_super(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) > > +{ > > + struct super_block *sb; > > + int count; > > + > > + sb = container_of(shrink, struct super_block, s_shrink); > > + > > + /* > > + * Deadlock avoidance. We may hold various FS locks, and we don't want > > + * to recurse into the FS that called us in clear_inode() and friends.. > > + */ > > + if (!(gfp_mask & __GFP_FS)) > > + return -1; > > + > > + /* > > + * if we can't get the umount lock, then there's no point having the > > + * shrinker try again because the sb is being torn down. > > + */ > > + if (!down_read_trylock(&sb->s_umount)) > > + return -1; > > + > > + if (!sb->s_root) { > > + up_read(&sb->s_umount); > > + return -1; > > + } > > + > > + if (nr_to_scan) { > > + /* proportion the scan between the two cacheŃ• */ > > + int total; > > + > > + total = sb->s_nr_dentry_unused + sb->s_nr_inodes_unused + 1; > > + count = (nr_to_scan * sb->s_nr_dentry_unused) / total; > > + > > + /* prune dcache first as icache is pinned by it */ > > + prune_dcache_sb(sb, count); > > + prune_icache_sb(sb, nr_to_scan - count); > > Hmm, an interesting dynamic that you've changed is that previously > we'd scan dcache LRU proportionately to pagecache, and then scan > inode LRU in proportion to the current number of unused inodes. > > But we can think of inodes that are only in use by unused (and aged) > dentries as effectively unused themselves. So this sequence under > estimates how many inodes to scan. This could bias pressure against > dcache I'd think, especially considering inodes are far larger than > dentries. Maybe require 2 passes to get the inodes unused inthe > first pass. It's self-balancing - it trends towards an equal number of unused dentries and inodes in the caches. Yes, it will tear down more dentries at first, but we need to do that to be able to reclaim inodes. â„«s reclaim progresses the propotion of inodes increases, so the amount of inodes reclaimed increases. Basically this is a recognition that the important cache for avoiding IO is the inode cache, not he dentry cache. Once the inode cache is freed that we need to do IO to repopulate it, but rebuilding dentries fromteh inode cache only costs CPU time. Hence under light reclaim, inodes are mostly left in cache but we free up memory that only costs CPU to rebuild. Under heavy, sustained reclaim, we trend towards freeing equal amounts of objects from both caches. This is pretty much what the current code attempts to do - free a lot of dentries, then free a smaller amount of the inodes that were used by the freed dentries. Once again it is a direct encoding of what is currently an implicit design feature - it makes it *obvious* how we are trying to balance the caches. Another reason for this is that the calculation changes again to allow filesystem caches to modiy this proportioning in the next patch.... FWIW, this also makes workloads that generate hundreds of thousands of never-to-be-used again negative dentries free dcache memory really quickly on memory pressure... > Part of the problem is the funny shrinker API. > > The right way to do it is to change the shrinker API so that it passes > down the lru_pages and scanned into the callback. From there, the > shrinkers can calculate the appropriate ratio of objects to scan. > No need for 2-call scheme, no need for shrinker->seeks, and the > ability to calculate an appropriate ratio first for dcache, and *then* > for icache. My only concern about this is that exposes the inner workings of the shrinker and mm subsystem to code that simply doesn't need to know about it. > A helper of course can do the calculation (considering that every > driver and their dog will do the wrong thing if we let them :)). > > unsigned long shrinker_scan(unsigned long lru_pages, > unsigned long lru_scanned, > unsigned long nr_objects, > unsigned long scan_ratio) > { > unsigned long long tmp = nr_objects; > > tmp *= lru_scanned * 100; > do_div(tmp, (lru_pages * scan_ratio) + 1); > > return (unsigned long)tmp; > } > > Then the shrinker callback will go: > sb->s_nr_dentry_scan += shrinker_scan(lru_pages, lru_scanned, > sb->s_nr_dentry_unused, > vfs_cache_pressure * SEEKS_PER_DENTRY); > if (sb->s_nr_dentry_scan > SHRINK_BATCH) > prune_dcache() > > sb->s_nr_inode_scan += shrinker_scan(lru_pages, lru_scanned, > sb->s_nr_inodes_unused, > vfs_cache_pressure * SEEKS_PER_INODE); > ... > > What do you think of that? Seeing as we're changing the shrinker API > anyway, I'd think it is high time to do somthing like this. Ignoring the dcache/icache reclaim ratio issues, I'd prefer a two call API that matches the current behaviour, leaving the caclulation of how much to reclaim in shrink_slab(). Encoding it this way makes it more difficult to change the high level behaviour e.g. if we want to modify the amount of slab reclaim based on reclaim priority, we'd have to cahnge every shrinker instead of just shrink_slab(). Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+oUyZ+86+fromorbit.com=david@internode.on.net Thu May 27 17:51:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RMpw3N170121 for ; Thu, 27 May 2010 17:51:58 -0500 X-ASG-Debug-ID: 1275000860-12a9013c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5AC9037EA9B for ; Thu, 27 May 2010 15:54:20 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id ef22rgIQT9gdi62q for ; Thu, 27 May 2010 15:54:20 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26125978-1927428 for multiple; Fri, 28 May 2010 08:24:19 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHlxy-0003NL-9S; Fri, 28 May 2010 08:54:18 +1000 Date: Fri, 28 May 2010 08:54:18 +1000 From: Dave Chinner To: Andrew Morton Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Subject: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Message-ID: <20100527225418.GP12087@dastard> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-2-git-send-email-david@fromorbit.com> <20100527133230.780be6c7.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527133230.780be6c7.akpm@linux-foundation.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1275000862 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.2, rules version 3.2.2.30938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 01:32:30PM -0700, Andrew Morton wrote: > On Tue, 25 May 2010 18:53:04 +1000 > Dave Chinner wrote: > > > From: Dave Chinner > > > > The inode unused list is currently a global LRU. This does not match > > the other global filesystem cache - the dentry cache - which uses > > per-superblock LRU lists. Hence we have related filesystem object > > types using different LRU reclaimatin schemes. > > > > To enable a per-superblock filesystem cache shrinker, both of these > > caches need to have per-sb unused object LRU lists. Hence this patch > > converts the global inode LRU to per-sb LRUs. > > > > The patch only does rudimentary per-sb propotioning in the shrinker > > infrastructure, as this gets removed when the per-sb shrinker > > callouts are introduced later on. > > > > ... > > > > + list_move(&inode->i_list, &inode->i_sb->s_inode_lru); > > It's a shape that s_inode_lru is still protected by inode_lock. One > day we're going to get in trouble over that lock. Migrating to a > per-sb lock would be logical and might help. > > Did you look into this? Yes, I have. Yes, it's possible. It's solving a different problem, so I figured it can be done in a different patch set. > I expect we'd end up taking both inode_lock > and the new sb->lru_lock in several places, which wouldn't be of any > help, at least in the interim. Long-term, the locking for > fs-writeback.c should move to the per-superblock one also, at which > time this problem largely goes away I think. Unfortunately the > writeback inode lists got moved into the backing_dev_info, whcih messes > things up a bit. *nod* > > > inodes_stat.nr_unused--; > > + inode->i_sb->s_nr_inodes_unused--; > > It's regrettable to be counting the same thing twice. Did you look > into removing (or no longer using) inodes_stat.nr_unused? Sort of. The complexity is the stats are userspace visible, so they can't just be removed. Replacing the current stats means that when they are read from /proc we would need to walk all the superblocks to aggregate them. The bit I haven't looked at yet is whether walking superblocks is allowed in a proc handler. So in the mean time, I just copied what was done for the dentry_stats. If it's ok to do this walk, then we can change both the dentry and inode stats at the same time. > > + /* Now, we reclaim unused dentrins with fairness. > > May as well fix the typo while we're there. > > Please review all these comments to ensure that they are still accurate > and complete. Will do. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+oUyZ+86+fromorbit.com=david@internode.on.net Thu May 27 17:58:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4RMwiea170810 for ; Thu, 27 May 2010 17:58:45 -0500 X-ASG-Debug-ID: 1275001267-208802390000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D16111D52F4E for ; Thu, 27 May 2010 16:01:07 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id E4xT4KfWn5eMltqo for ; Thu, 27 May 2010 16:01:07 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25783292-1927428 for multiple; Fri, 28 May 2010 08:31:05 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHm4W-0003O8-3g; Fri, 28 May 2010 09:01:04 +1000 Date: Fri, 28 May 2010 09:01:04 +1000 From: Dave Chinner To: Andrew Morton Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100527230104.GQ12087@dastard> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> <20100527133234.e0814239.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527133234.e0814239.akpm@linux-foundation.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1275001268 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.2, rules version 3.2.2.30938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 01:32:34PM -0700, Andrew Morton wrote: > On Tue, 25 May 2010 18:53:06 +1000 > Dave Chinner wrote: > > > From: Dave Chinner > > > > With context based shrinkers, we can implement a per-superblock > > shrinker that shrinks the caches attached to the superblock. We > > currently have global shrinkers for the inode and dentry caches that > > split up into per-superblock operations via a coarse proportioning > > method that does not batch very well. The global shrinkers also > > have a dependency - dentries pin inodes - so we have to be very > > careful about how we register the global shrinkers so that the > > implicit call order is always correct. > > > > With a per-sb shrinker callout, we can encode this dependency > > directly into the per-sb shrinker, hence avoiding the need for > > strictly ordering shrinker registrations. We also have no need for > > any proportioning code for the shrinker subsystem already provides > > this functionality across all shrinkers. Allowing the shrinker to > > operate on a single superblock at a time means that we do less > > superblock list traversals and locking and reclaim should batch more > > effectively. This should result in less CPU overhead for reclaim and > > potentially faster reclaim of items from each filesystem. > > > > I go all tingly when a changelog contains the word "should". > > OK, it _should_ do X. But _does_ it actually do X? As i said to Nick - the tests I ran showed an average improvement of 5% but the accuracy of the benchmark was +/-10%. Hence it's hard to draw any conclusive results from that. It appears to be slightly faster on an otherwise idle system, but... As it is, the XFS shrinker that gets integrated into this structure in a later patch peaks at a higher rate - 150k inodes/s vs 90k inodes/s with the current shrinker - but still it's hard to quantify qualitatively. I'm going to run more benchmarks to try to get better numbers. > > fs/super.c | 53 +++++++++++++++++++++ > > include/linux/fs.h | 7 +++ > > 4 files changed, 88 insertions(+), 214 deletions(-) > > > > diff --git a/fs/dcache.c b/fs/dcache.c > > index dba6b6d..d7bd781 100644 > > --- a/fs/dcache.c > > +++ b/fs/dcache.c > > @@ -456,21 +456,16 @@ static void prune_one_dentry(struct dentry * dentry) > > * which flags are set. This means we don't need to maintain multiple > > * similar copies of this loop. > > */ > > -static void __shrink_dcache_sb(struct super_block *sb, int *count, int flags) > > +static void __shrink_dcache_sb(struct super_block *sb, int count, int flags) > > Forgot to update the kerneldoc description of `count'. Will fix. Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Thu May 27 19:22:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4S0MP8l178900 for ; Thu, 27 May 2010 19:22:26 -0500 X-ASG-Debug-ID: 1275006402-2239030d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EA1D8157D3A0 for ; Thu, 27 May 2010 17:26:42 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id 1RlPDLq9U9jTY1hQ for ; Thu, 27 May 2010 17:26:42 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 999B06C2B0 for ; Thu, 27 May 2010 19:24:48 -0500 (CDT) Message-ID: <4BFF0D94.5030903@hardwarefreak.com> Date: Thu, 27 May 2010 19:25:56 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <4BF9FCA8.8090906@hardwarefreak.com> <20100524143428.6f3a117c@abend.internal.xtremedata.com> <20100526070620.GT2150@dastard> <4BFD3926.6040208@hardwarefreak.com> <20100527114736.GA13112@infradead.org> In-Reply-To: <20100527114736.GA13112@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1275006402 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0140 1.0000 -1.9296 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.33 X-Barracuda-Spam-Status: No, SCORE=-1.33 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30943 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig put forth on 5/27/2010 6:47 AM: > O_DIRECT is not a Posix standard and not very portable. It originated > on IRIX, and Linux inherited it during the 2.4 kernel series days. > These days FreeBSD/NetBSD and AIX support it as well, but for example > Solaris, HP-UX and OpenBSD don't, nevermind Windows or Mac OS. > > I have no idea why the MTAs don't want to use it - it's generally easier > to use then memory mapped I/O, and has much more deterministic > performance. Thanks for the background Christoph. I can now see why Postfix and Dovecot in particular don't use O_DIRECT: portability. They both are developed to run on every Unix/like OS you mention above, half of which don't offer O_DIRECT. I'm guessing the same may likely be true for the other SMTP MTAs and IMAP servers. -- Stan From SRS0+ulBy+87+fromorbit.com=david@internode.on.net Thu May 27 19:28:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4S0SLrk179229 for ; Thu, 27 May 2010 19:28:22 -0500 X-ASG-Debug-ID: 1275006757-224203530000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D25CE157D3DB for ; Thu, 27 May 2010 17:32:37 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id UeSis4GWVHan6ieH for ; Thu, 27 May 2010 17:32:37 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26139562-1927428 for multiple; Fri, 28 May 2010 10:00:43 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHnTF-0003Tg-HW; Fri, 28 May 2010 10:30:41 +1000 Date: Fri, 28 May 2010 10:30:41 +1000 From: Dave Chinner To: Andrew Morton Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/5] Per superblock shrinkers V2 Subject: Re: [PATCH 0/5] Per superblock shrinkers V2 Message-ID: <20100528003041.GR12087@dastard> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <20100527133223.efa4740a.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100527133223.efa4740a.akpm@linux-foundation.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1275006758 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.2, rules version 3.2.2.30943 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 01:32:23PM -0700, Andrew Morton wrote: > On Tue, 25 May 2010 18:53:03 +1000 > Dave Chinner wrote: > > > This series reworks the filesystem shrinkers. We currently have a > > set of issues with the current filesystem shrinkers: > > > > 1. There is an dependency between dentry and inode cache > > shrinking that is only implicitly defined by the order of > > shrinker registration. > > 2. The shrinkers need to walk the superblock list and pin > > the superblock to avoid unmount races with the sb going > > away. > > 3. The dentry cache uses per-superblock LRUs and proportions > > reclaim between all the superblocks which means we are > > doing breadth based reclaim. This means we touch every > > superblock for every shrinker call, and may only reclaim > > a single dentry at a time from a given superblock. > > 4. The inode cache has a global LRU, so it has different > > reclaim patterns to the dentry cache, despite the fact > > that the dentry cache is generally the only thing that > > pins inodes in memory. > > 5. Filesystems need to register their own shrinkers for > > caches and can't co-ordinate them with the dentry and > > inode cache shrinkers. > > Nice description, but... it never actually told us what the benefit of > the changes are. The first patch I wrote was a small patch to introduce context to the shrinker callback and a per­XFS filesystem shrinker to solve OOM probelms introduced by background reclaim of XFS inodes. It was simple, it worked but Nick refused to allow it because of #1 listed above. He wanted some guarantee that context based shrinkers would not break the implicit registration dependency between the dentry and inode cache shrinkers. We needed a fix for 2.6.34 for XFS, so I was forced to write a global shrinker which is what introduced all the lockdep problems. XFS does not have global inode caches, and the lock required to manage the list of XFs mounts were what caused all the new lockdep problems. There's also other lockdep false positive problems w/ XFS and shrinkers (e.g. iprune_sem and the unmount path) that need to be fixed. That's what this patchset tries to address. It results in simpler code, less code, removal of implicit, undocumented dependencies, less locking shenanegans, no superblock list traversals, provides filesystems with hooks for cache reclaim without needing shrinker registration and fixes all the all the false positive lockdep problems XFS has with the current shrinker infrastructure. If this is all too much, then I'm quite happy to go back to just the context based shrinker patch and leave everything else alone - the context based shrinkers are the change we *really* need. Everything else in this set of changes is just trying to address objections raised (that I still don't really understand) against that simple change. > Presumably some undescribed workload had some > undescribed user-visible problem. $ find . -inum 11111 on a filesystem with more inodes in it than can be held in memory caused OOM panics. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+rNL0+87+fromorbit.com=david@internode.on.net Thu May 27 19:34:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4S0YoFf179530 for ; Thu, 27 May 2010 19:34:51 -0500 X-ASG-Debug-ID: 1275007146-2256032b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3CF7D149D8A8 for ; Thu, 27 May 2010 17:39:07 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id Qpx07p3WTHstmtO1 for ; Thu, 27 May 2010 17:39:07 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25706829-1927428 for multiple; Fri, 28 May 2010 10:07:12 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHnZX-0003V4-D4; Fri, 28 May 2010 10:37:11 +1000 Date: Fri, 28 May 2010 10:37:11 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: Re-initialise lockdep context for all inodes in reclaim Subject: Re: [PATCH] xfs: Re-initialise lockdep context for all inodes in reclaim Message-ID: <20100528003711.GU12087@dastard> References: <1274925546-31468-1-git-send-email-david@fromorbit.com> <20100527122138.GA14632@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527122138.GA14632@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1275007148 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.2, rules version 3.2.2.30945 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 08:21:38AM -0400, Christoph Hellwig wrote: > On Thu, May 27, 2010 at 11:59:06AM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > We re-initialise the lockdep context for inode iolocks when dropping an inode, > > but not when we delete an inode. Now that we can reclaim inodes from a shrinker, > > we can get get false lockdep warnings about inode iolock inversions during > > reclaim of deleted inodes. Hence we need to re-initialise the iolock in the > > delete path as well. > > clear_inode also gets called when we delete an inode, so at least > the rationale for this isn't quite right. It seems like we re-acquire > new lockdep dependecies between clear_inode and destroy_inode that your > shrinker doesn't like. What lockdep report do you see? I'll have to regenerate it - I saw it a couple of times with the current shrinker, and it went away with this patch. I'll put this on hold for the moment. Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Thu May 27 19:38:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4S0c9Zx179715 for ; Thu, 27 May 2010 19:38:09 -0500 X-ASG-Debug-ID: 1275007346-224b03c70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B16E6149D8CE for ; Thu, 27 May 2010 17:42:26 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id 2VT5ijtKjilsUBfC for ; Thu, 27 May 2010 17:42:26 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 8339F6C24C for ; Thu, 27 May 2010 19:40:32 -0500 (CDT) Message-ID: <4BFF118F.3090508@hardwarefreak.com> Date: Thu, 27 May 2010 19:42:55 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: NOW: o_direct -- WAS: Re: WARNING in xfs_lwr.c, xfs_write() References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <4BF9FCA8.8090906@hardwarefreak.com> <20100524143428.6f3a117c@abend.internal.xtremedata.com> <20100526070620.GT2150@dastard> <4BFD3926.6040208@hardwarefreak.com> <87mxvlbfu6.fsf@willster.local.flamingspork.com> In-Reply-To: <87mxvlbfu6.fsf@willster.local.flamingspork.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1275007346 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4648 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.30945 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Stewart Smith put forth on 5/27/2010 9:05 AM: > Also, email smtpd delivering a message on a machine, you could quite > likely have imapd come along and read that soon after, so using the > cache makes sense. Ah, that's a good point. I've been using Postfix and Dovecot Local Delivery Agent long enough that I'd forgotten about those folks who have their MTA drop mail into /var/mail/%u etc which is then picked up by their imapd. Dovecot LDA receives from Postfix via pipe, so mail doesn't actually hit the disk until Dovecot decides where it goes, via sieve scripts, for example. -- Stan From SRS0+ulBy+87+fromorbit.com=david@internode.on.net Thu May 27 19:42:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4S0gFbK179895 for ; Thu, 27 May 2010 19:42:15 -0500 X-ASG-Debug-ID: 1275007477-31ed03bb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4600837F3C7 for ; Thu, 27 May 2010 17:44:38 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id vXl3DaoSSH9uEuqq for ; Thu, 27 May 2010 17:44:38 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26141810-1927428 for multiple; Fri, 28 May 2010 10:14:18 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHngO-0003Va-Gi; Fri, 28 May 2010 10:44:16 +1000 Date: Fri, 28 May 2010 10:44:16 +1000 From: Dave Chinner To: Andrew Morton Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 1/6] writeback: initial tracing support Subject: Re: [PATCH 1/6] writeback: initial tracing support Message-ID: <20100528004416.GV12087@dastard> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-2-git-send-email-david@fromorbit.com> <20100527143233.836b2c47.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527143233.836b2c47.akpm@linux-foundation.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1275007479 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.2, rules version 3.2.2.30944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 02:32:33PM -0700, Andrew Morton wrote: > On Tue, 25 May 2010 20:54:07 +1000 > Dave Chinner wrote: > > > From: From: Jens Axboe > > > > Trace queue/sched/exec parts of the writeback loop. > > It would be most useful if this patchset's description provided sample > tracing output, so we can see what the patch is actually providing us. This is just a forward port of Jen's patch. I guess I'll have to clean it up some more... > > > -#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) > > - > > -/* > > - * We don't actually have pdflush, but this one is exported though /proc... > > - */ > > -int nr_pdflush_threads; > > - > > /* > > * Passed into wb_writeback(), essentially a subset of writeback_control > > */ > > @@ -63,6 +57,16 @@ struct bdi_work { > > unsigned long state; /* flag bits, see WS_* */ > > }; > > > > +#define CREATE_TRACE_POINTS > > +#include > > + > > +#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) > > Could/should be implemented in C. OK. > > > +/* > > + * We don't actually have pdflush, but this one is exported though /proc... > > + */ > > +int nr_pdflush_threads; > > So this is always zero now? I guess so. I'd forgotten that this was in the original patch.... > We don't want to keep it forever. Add a > printk_once("nr_pdflush_threads is deprecated") when someone reads it, > remove it in 2014. OK. > > --- /dev/null > > +++ b/include/trace/events/writeback.h > > @@ -0,0 +1,171 @@ > > +#undef TRACE_SYSTEM > > +#define TRACE_SYSTEM writeback > > + > > +#if !defined(_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ) > > Seems wrong. If you define TRACE_HEADER_MULTI_READ then include this > header twice, things explode. Which negates the purpose of > _TRACE_WRITEBACK_H. Every other trace event header does this, so if it's wrong then the same mistake is in at least 30 files now. I don't know enough about the tracing code to know why this is done, and I'm not keen to address such a mistake here... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+rNL0+87+fromorbit.com=david@internode.on.net Thu May 27 19:54:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_ATTENTION autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4S0s4nY180664 for ; Thu, 27 May 2010 19:54:04 -0500 X-ASG-Debug-ID: 1275008300-681c009e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A4140157D1AF for ; Thu, 27 May 2010 17:58:20 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id rkcqM61ArgfyxfFh for ; Thu, 27 May 2010 17:58:20 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 25709399-1927428 for multiple; Fri, 28 May 2010 10:26:14 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHnrw-0003Wt-Bi; Fri, 28 May 2010 10:56:12 +1000 Date: Fri, 28 May 2010 10:56:02 +1000 From: Dave Chinner To: Andrew Morton Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: Re: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Message-ID: <20100528005602.GW12087@dastard> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-5-git-send-email-david@fromorbit.com> <20100527143251.5193842d.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527143251.5193842d.akpm@linux-foundation.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1275008301 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.2, rules version 3.2.2.30945 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 02:32:51PM -0700, Andrew Morton wrote: > On Tue, 25 May 2010 20:54:10 +1000 > Dave Chinner wrote: > > > From: Dave Chinner > > > > If a filesystem writes more than one page in ->writepage, write_cache_pages > > fails to notice this and continues to attempt writeback when wbc->nr_to_write > > has gone negative - this trace was captured from XFS: > > > > > > wbc_writeback_start: towrt=1024 > > wbc_writepage: towrt=1024 > > wbc_writepage: towrt=0 > > wbc_writepage: towrt=-1 > > wbc_writepage: towrt=-5 > > wbc_writepage: towrt=-21 > > wbc_writepage: towrt=-85 > > > > This has adverse effects on filesystem writeback behaviour. write_cache_pages() > > needs to terminate after a certain number of pages are written, not after a > > certain number of calls to ->writepage are made. This is a regression > > introduced by 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4, but cannot be reverted > > It's conventional to identify commits by their title as well as their > hash. So 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4 ("vfs: Add > no_nrwrite_index_update writeback control flag"). Because that commit > might have different hashes in different trees, I think. A Linus idea. > > I do this ten times a day - It's a PITA. Will fix. > > > directly due to subsequent bug fixes that have gone in on top of it. > > > > This commit adds a ->writepage tracepoint inside write_cache_pages() (how the > > above trace was generated) and does the revert manually leaving the subsequent > > bug fixes in tact. ext4 is not affected by this as a previous commit in the > > "intact". *nod* > > series stops ext4 from using the generic function. > > > > - if (nr_to_write > 0) { > > - nr_to_write--; > > - if (nr_to_write == 0 && > > + if (wbc->nr_to_write > 0) { > > + if (--wbc->nr_to_write == 0 && > > wbc->sync_mode == WB_SYNC_NONE) { > > /* > > * We stop writing back only if we are > > @@ -974,11 +973,8 @@ continue_unlock: > > end = writeback_index - 1; > > goto retry; > > } > > - if (!wbc->no_nrwrite_index_update) { > > - if (wbc->range_cyclic || (range_whole && nr_to_write > 0)) > > - mapping->writeback_index = done_index; > > - wbc->nr_to_write = nr_to_write; > > - } > > + if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) > > + mapping->writeback_index = done_index; > > > > return ret; > > 'bout time we fixed that. I wonder why it took so long to find. IMO, because without tracing it's almost impossible to see what is happening inside this code easily. I wasn't looking for this bug when I added the tracing - I was trying to discover why sync was locking up for minutes on end. Also a significant problem is that writeback changes often come in through a tree that no filesystem developer is actually testing (e.g. the block git tree) or a single FS tree (e.g. the ext4 tree), so problems in the generic code that manifest in only one or two filesystems slip under the radar all too easily. Hence they are often only discovered when some other, unrelated, obvious problem is investigated... Cheers, Dave. -- Dave Chinner david@fromorbit.com From rostedt@goodmis.org Thu May 27 20:16:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4S1G22w181864 for ; Thu, 27 May 2010 20:16:03 -0500 X-ASG-Debug-ID: 1275009619-681701a20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from hrndva-omtalb.mail.rr.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A9C91157D2BC for ; Thu, 27 May 2010 18:20:19 -0700 (PDT) Received: from hrndva-omtalb.mail.rr.com (hrndva-omtalb.mail.rr.com [71.74.56.124]) by cuda.sgi.com with ESMTP id MD89LjlviA0mMSP3 for ; Thu, 27 May 2010 18:20:19 -0700 (PDT) X-Authority-Analysis: v=1.1 cv=Pm0qIGCwx3bIEOZlSg1a56K3RSwKBTW9sPEb+DFvEKk= c=1 sm=0 a=GQ3jqF8VmdQA:10 a=GQCbJdZ--msA:10 a=7U3hwN5JcxgA:10 a=Q9fys5e9bTEA:10 a=gMqfjgEr1zLu/65IO0LwxA==:17 a=07d9gI8wAAAA:8 a=kn3Cvx327aoEqgSqA6UA:9 a=x5WTrr7B1x4H0gtJolmlzR9KZTgA:4 a=PUjeQqilurYA:10 a=gMqfjgEr1zLu/65IO0LwxA==:117 X-Cloudmark-Score: 0 X-Originating-IP: 74.67.89.75 Received: from [74.67.89.75] ([74.67.89.75:48204] helo=[192.168.23.10]) by hrndva-oedge03.mail.rr.com (envelope-from ) (ecelerity 2.2.2.39 r()) with ESMTP id 14/5C-23859-ED91FFB4; Fri, 28 May 2010 01:18:24 +0000 X-ASG-Orig-Subj: Re: [PATCH 1/6] writeback: initial tracing support Subject: Re: [PATCH 1/6] writeback: initial tracing support From: Steven Rostedt Reply-To: rostedt@goodmis.org To: Andrew Morton Cc: Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com In-Reply-To: <20100527143233.836b2c47.akpm@linux-foundation.org> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-2-git-send-email-david@fromorbit.com> <20100527143233.836b2c47.akpm@linux-foundation.org> Content-Type: text/plain; charset="ISO-8859-15" Organization: Kihon Technologies Inc. Date: Thu, 27 May 2010 21:18:21 -0400 Message-ID: <1275009502.22648.582.camel@gandalf.stny.rr.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: hrndva-omtalb.mail.rr.com[71.74.56.124] X-Barracuda-Start-Time: 1275009619 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.2, rules version 3.2.2.30947 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2010-05-27 at 14:32 -0700, Andrew Morton wrote: > > --- /dev/null > > +++ b/include/trace/events/writeback.h > > @@ -0,0 +1,171 @@ > > +#undef TRACE_SYSTEM > > +#define TRACE_SYSTEM writeback > > + > > +#if !defined(_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ) > > Seems wrong. If you define TRACE_HEADER_MULTI_READ then include this > header twice, things explode. Which negates the purpose of > _TRACE_WRITEBACK_H. That's intended. It is documented in samples/trace_events/trace-events-samples.h The purpose of the TRACE_HEADER_MULTI_READ is to read the trace header multi times. ;-) You can also read about it here: http://lwn.net/Articles/379903/ here: http://lwn.net/Articles/381064/ and here: http://lwn.net/Articles/383362/ -- Steve > > > +#define _TRACE_WRITEBACK_H > > + > > +#include > > +#include > > + From rostedt@goodmis.org Thu May 27 20:18:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4S1IaqB181993 for ; Thu, 27 May 2010 20:18:37 -0500 X-ASG-Debug-ID: 1275009773-681c01dd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from hrndva-omtalb.mail.rr.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0CECC157D2E3 for ; Thu, 27 May 2010 18:22:53 -0700 (PDT) Received: from hrndva-omtalb.mail.rr.com (hrndva-omtalb.mail.rr.com [71.74.56.125]) by cuda.sgi.com with ESMTP id xBT9FnwTvakHyjwG for ; Thu, 27 May 2010 18:22:53 -0700 (PDT) X-Authority-Analysis: v=1.1 cv=WC2cwRI/KXdLNEmE8ivg2cmI8vFt6dWmaZdvaJ93QHU= c=1 sm=0 a=GQ3jqF8VmdQA:10 a=GQCbJdZ--msA:10 a=7U3hwN5JcxgA:10 a=Q9fys5e9bTEA:10 a=gMqfjgEr1zLu/65IO0LwxA==:17 a=NiKR6py9vGVug06BySkA:9 a=71ACFb9r2zmr3cuCf6PJN0XbQAcA:4 a=PUjeQqilurYA:10 a=gMqfjgEr1zLu/65IO0LwxA==:117 X-Cloudmark-Score: 0 X-Originating-IP: 74.67.89.75 Received: from [74.67.89.75] ([74.67.89.75:48224] helo=[192.168.23.10]) by hrndva-oedge02.mail.rr.com (envelope-from ) (ecelerity 2.2.2.39 r()) with ESMTP id 1F/90-21155-A7A1FFB4; Fri, 28 May 2010 01:20:59 +0000 X-ASG-Orig-Subj: Re: [PATCH 1/6] writeback: initial tracing support Subject: Re: [PATCH 1/6] writeback: initial tracing support From: Steven Rostedt Reply-To: rostedt@goodmis.org To: Dave Chinner Cc: Andrew Morton , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com In-Reply-To: <20100528004416.GV12087@dastard> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-2-git-send-email-david@fromorbit.com> <20100527143233.836b2c47.akpm@linux-foundation.org> <20100528004416.GV12087@dastard> Content-Type: text/plain; charset="ISO-8859-15" Organization: Kihon Technologies Inc. Date: Thu, 27 May 2010 21:20:57 -0400 Message-ID: <1275009657.22648.584.camel@gandalf.stny.rr.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: hrndva-omtalb.mail.rr.com[71.74.56.125] X-Barracuda-Start-Time: 1275009774 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.2, rules version 3.2.2.30947 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 2010-05-28 at 10:44 +1000, Dave Chinner wrote: > On Thu, May 27, 2010 at 02:32:33PM -0700, Andrew Morton wrote: > > > > > --- /dev/null > > > +++ b/include/trace/events/writeback.h > > > @@ -0,0 +1,171 @@ > > > +#undef TRACE_SYSTEM > > > +#define TRACE_SYSTEM writeback > > > + > > > +#if !defined(_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ) > > > > Seems wrong. If you define TRACE_HEADER_MULTI_READ then include this > > header twice, things explode. Which negates the purpose of > > _TRACE_WRITEBACK_H. > > Every other trace event header does this, so if it's wrong then the > same mistake is in at least 30 files now. I don't know enough about > the tracing code to know why this is done, and I'm not keen to > address such a mistake here... It's all part of the CPP voodoo ritual. You don't want to know why, just do it, otherwise you may find dancing CPP skulls running around your bathtub. If you want to be a CPP Voodoo Witch doctor too, read up on LWN, I describe some of the magic there. -- Steve From SRS0+ulBy+87+fromorbit.com=david@internode.on.net Thu May 27 20:21:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4S1LXqo182124 for ; Thu, 27 May 2010 20:21:34 -0500 X-ASG-Debug-ID: 1275009836-52ef034e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1296537EF5C for ; Thu, 27 May 2010 18:23:56 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id lk5AGnmTHFN4Gbrs for ; Thu, 27 May 2010 18:23:56 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26147219-1927428 for multiple; Fri, 28 May 2010 10:53:40 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OHoIU-0003ZP-O9; Fri, 28 May 2010 11:23:38 +1000 Date: Fri, 28 May 2010 11:23:38 +1000 From: Dave Chinner To: Andrew Morton Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Subject: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Message-ID: <20100528012338.GX12087@dastard> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-7-git-send-email-david@fromorbit.com> <20100527143341.d4258798.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527143341.d4258798.akpm@linux-foundation.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1275009838 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.2, rules version 3.2.2.30948 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 02:33:41PM -0700, Andrew Morton wrote: > On Tue, 25 May 2010 20:54:12 +1000 > Dave Chinner wrote: > > > From: Dave Chinner > > > > sync can currently take a really long time if a concurrent writer is > > extending a file. The problem is that the dirty pages on the address > > space grow in the same direction as write_cache_pages scans, so if > > the writer keeps ahead of writeback, the writeback will not > > terminate until the writer stops adding dirty pages. > > > > The really was a pretty basic bug. It's writeback 101 to test that case :( > > > For a data integrity sync, we only need to write the pages dirty at > > the time we start the writeback, so we can stop scanning once we get > > to the page that was at the end of the file at the time the scan > > started. > > > > This will prevent operations like copying a large file preventing > > sync from completing as it will not write back pages that were > > dirtied after the sync was started. This does not impact the > > existing integrity guarantees, as any dirty page (old or new) > > within the EOF range at the start of the scan will still be > > captured. > > > > Signed-off-by: Dave Chinner > > --- > > mm/page-writeback.c | 15 +++++++++++++++ > > 1 files changed, 15 insertions(+), 0 deletions(-) > > > > diff --git a/mm/page-writeback.c b/mm/page-writeback.c > > index 0fe713d..c97e973 100644 > > --- a/mm/page-writeback.c > > +++ b/mm/page-writeback.c > > @@ -855,7 +855,22 @@ int write_cache_pages(struct address_space *mapping, > > if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) > > range_whole = 1; > > cycled = 1; /* ignore range_cyclic tests */ > > + > > + /* > > + * If this is a data integrity sync, cap the writeback to the > > + * current end of file. Any extension to the file that occurs > > + * after this is a new write and we don't need to write those > > + * pages out to fulfil our data integrity requirements. If we > > + * try to write them out, we can get stuck in this scan until > > + * the concurrent writer stops adding dirty pages and extending > > + * EOF. > > + */ > > + if (wbc->sync_mode == WB_SYNC_ALL && > > + wbc->range_end == LLONG_MAX) { > > + end = i_size_read(mapping->host) >> PAGE_CACHE_SHIFT; > > + } > > } > > + > > This is somewhat inefficient. It's really trivial and fast to find the > highest-index dirty page by walking straight down the > PAGECACHE_TAG_DIRTY-tagged nodes. > > However pagevec_lookup_tag(..., PAGECACHE_TAG_DIRTY) should do a pretty > good job of skipping over the (millions of) pages between the (last > dirty page before `end') and (`end'). So it _should_ be OK. Some thought > and runtime testing would be good. I've done plenty of testing here - the patch is part of my usual QA stack so it's probably run through XFSQA a few hundred times now. The behaviour w.r.t. writes into holes appears to be identical to the current behaviour (i.e. sync hangs until the write stops). I can't _see_ any difference in behaviour of increase in overhead, but we all know that this doesn't mean there isn't one. The test I ran to determine it's effectiveness against extending writes was running sync during an 8GB sequential write. It would hang every time until the write completes - typically around 50-60s - without this patch. With this patch sync returns within 3-4s every time. > That being said, I think the patch is insufficient. If I create an > enormous (possibly sparse) file with a 16TB hole (or a run of clean > pages) in the middle and then start busily writing into that hole (run > of clean pages), the problem will still occur. Yes, that's already been pointed out. This doesn't attempt to address that problem because.... > One obvious fix for that (a) would be to add another radix-tree tag and > do two passes across the radix-tree. .... we're still waiting for Jan's mark and sweep patch that does this to make progress. This patch is just a simple fix for the most common cause of the problem and might get into the tree sooner. Personally I see no problems with using a mark+sweep algorithm for this - IMO ensuring that data integrity requirements are met is more important than ultimate performance. > Another fix (b) would be to track the number of dirty pages per > adddress_space, and only write that number of pages. > > Another fix would be to work out how the code handled this situation > before we broke it, and restore that in some fashion. I guess fix (b) > above kinda does that. Yes, b) is similar to the old code, but like the old code it doesn't work for the data integrity case because it doesn't guarantee the correct pages are written out. This patch does for the append case, and a) guarantees it in all cases.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From npiggin@suse.de Fri May 28 00:04:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4S54qWi195539 for ; Fri, 28 May 2010 00:04:52 -0500 X-ASG-Debug-ID: 1275023235-5a7001bc0000-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 32FD11D5273D for ; Thu, 27 May 2010 22:07:15 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id IeouDxVj1ZNMULjC for ; Thu, 27 May 2010 22:07:15 -0700 (PDT) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 1618E8655F; Fri, 28 May 2010 07:07:13 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id 3B6A429818; Fri, 28 May 2010 15:06:55 +1000 (EST) Date: Fri, 28 May 2010 15:06:55 +1000 From: Nick Piggin To: Andrew Morton Cc: Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Subject: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Message-ID: <20100528050655.GY22536@laptop> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-7-git-send-email-david@fromorbit.com> <20100527143341.d4258798.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527143341.d4258798.akpm@linux-foundation.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1275023236 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.2, rules version 3.2.2.30960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 02:33:41PM -0700, Andrew Morton wrote: > On Tue, 25 May 2010 20:54:12 +1000 > Dave Chinner wrote: > > > From: Dave Chinner > > > > sync can currently take a really long time if a concurrent writer is > > extending a file. The problem is that the dirty pages on the address > > space grow in the same direction as write_cache_pages scans, so if > > the writer keeps ahead of writeback, the writeback will not > > terminate until the writer stops adding dirty pages. ... > That being said, I think the patch is insufficient. If I create an > enormous (possibly sparse) file with a 16TB hole (or a run of clean > pages) in the middle and then start busily writing into that hole (run > of clean pages), the problem will still occur. Yep. > One obvious fix for that (a) would be to add another radix-tree tag and > do two passes across the radix-tree. Yes this is the method I tried. Jan has taken it further and should have the latest patches around. A good test case for the starvation would be helpful. > Another fix (b) would be to track the number of dirty pages per > adddress_space, and only write that number of pages. > > Another fix would be to work out how the code handled this situation > before we broke it, and restore that in some fashion. I guess fix (b) > above kinda does that. I took that out (and offered fix a in replacement but it was turned down at the time). Because b stands for broken. IIRC we were writing out no more than 2x the dirty pages of the file during sync. The problem with that is more pages can be dirtied after we calculate the number, and then we might write out those newly dirty pages and miss old dirty pages. From npiggin@suse.de Fri May 28 00:17:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4S5H7Oj196346 for ; Fri, 28 May 2010 00:17:07 -0500 X-ASG-Debug-ID: 1275024082-23b000510000-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 84098130C1A0 for ; Thu, 27 May 2010 22:21:22 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 8IlAKx3OwH4b0pAq for ; Thu, 27 May 2010 22:21:22 -0700 (PDT) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 513E987104; Fri, 28 May 2010 07:19:27 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id A4CDE29818; Fri, 28 May 2010 15:19:24 +1000 (EST) Date: Fri, 28 May 2010 15:19:24 +1000 From: Nick Piggin To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100528051924.GZ22536@laptop> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> <20100527063523.GJ22536@laptop> <20100527224034.GO12087@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100527224034.GO12087@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1275024085 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.2, rules version 3.2.2.30960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 28, 2010 at 08:40:34AM +1000, Dave Chinner wrote: > On Thu, May 27, 2010 at 04:35:23PM +1000, Nick Piggin wrote: > > But we can think of inodes that are only in use by unused (and aged) > > dentries as effectively unused themselves. So this sequence under > > estimates how many inodes to scan. This could bias pressure against > > dcache I'd think, especially considering inodes are far larger than > > dentries. Maybe require 2 passes to get the inodes unused inthe > > first pass. > > It's self-balancing - it trends towards an equal number of unused > dentries and inodes in the caches. Yes, it will tear down more > dentries at first, but we need to do that to be able to reclaim > inodes. But then it doesn't scan enough inodes on the inode pass. > â„«s reclaim progresses the propotion of inodes increases, so > the amount of inodes reclaimed increases. > > Basically this is a recognition that the important cache for > avoiding IO is the inode cache, not he dentry cache. Once the inode You can bias against the dcache using multipliers. > cache is freed that we need to do IO to repopulate it, but > rebuilding dentries fromteh inode cache only costs CPU time. Hence > under light reclaim, inodes are mostly left in cache but we free up > memory that only costs CPU to rebuild. Under heavy, sustained > reclaim, we trend towards freeing equal amounts of objects from both > caches. I don't know if you've got numbers or patterns to justify that. My point is that things should stay as close to the old code as possible without good reason. > This is pretty much what the current code attempts to do - free a > lot of dentries, then free a smaller amount of the inodes that were > used by the freed dentries. Once again it is a direct encoding of > what is currently an implicit design feature - it makes it *obvious* > how we are trying to balance the caches. With your patches, if there are no inodes free you would need to take 2 passes at freeing the dentry cache. My suggestion is closer to the current code. > Another reason for this is that the calculation changes again to > allow filesystem caches to modiy this proportioning in the next > patch.... > > FWIW, this also makes workloads that generate hundreds of thousands > of never-to-be-used again negative dentries free dcache memory really > quickly on memory pressure... That would still be the case because used inodes aren't getting their dentries freed so little inode scanning will occur. > > > Part of the problem is the funny shrinker API. > > > > The right way to do it is to change the shrinker API so that it passes > > down the lru_pages and scanned into the callback. From there, the > > shrinkers can calculate the appropriate ratio of objects to scan. > > No need for 2-call scheme, no need for shrinker->seeks, and the > > ability to calculate an appropriate ratio first for dcache, and *then* > > for icache. > > My only concern about this is that exposes the inner workings of the > shrinker and mm subsystem to code that simply doesn't need to know > about it. It's just providing a ratio. The shrinkers allready know they are scanning based on a ratio of pagecache scanned. > > A helper of course can do the calculation (considering that every > > driver and their dog will do the wrong thing if we let them :)). > > > > unsigned long shrinker_scan(unsigned long lru_pages, > > unsigned long lru_scanned, > > unsigned long nr_objects, > > unsigned long scan_ratio) > > { > > unsigned long long tmp = nr_objects; > > > > tmp *= lru_scanned * 100; > > do_div(tmp, (lru_pages * scan_ratio) + 1); > > > > return (unsigned long)tmp; > > } > > > > Then the shrinker callback will go: > > sb->s_nr_dentry_scan += shrinker_scan(lru_pages, lru_scanned, > > sb->s_nr_dentry_unused, > > vfs_cache_pressure * SEEKS_PER_DENTRY); > > if (sb->s_nr_dentry_scan > SHRINK_BATCH) > > prune_dcache() > > > > sb->s_nr_inode_scan += shrinker_scan(lru_pages, lru_scanned, > > sb->s_nr_inodes_unused, > > vfs_cache_pressure * SEEKS_PER_INODE); > > ... > > > > What do you think of that? Seeing as we're changing the shrinker API > > anyway, I'd think it is high time to do somthing like this. > > Ignoring the dcache/icache reclaim ratio issues, I'd prefer a two Well if it is an issue, it should be changed in a different patch I think (with numbers). > call API that matches the current behaviour, leaving the caclulation > of how much to reclaim in shrink_slab(). Encoding it this way makes > it more difficult to change the high level behaviour e.g. if we want > to modify the amount of slab reclaim based on reclaim priority, we'd > have to cahnge every shrinker instead of just shrink_slab(). We can modifiy the ratios before calling if needed, or have a default ratio define to multiply with as well. But shrinkers are very subsystem specific. From dedekind1@gmail.com Fri May 28 02:42:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4S7gMYa203579 for ; Fri, 28 May 2010 02:42:23 -0500 X-ASG-Debug-ID: 1275032798-2216002f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mgw-mx06.nokia.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AB678130BDBA for ; Fri, 28 May 2010 00:46:39 -0700 (PDT) Received: from mgw-mx06.nokia.com (smtp.nokia.com [192.100.122.233]) by cuda.sgi.com with ESMTP id cPl3IybG6zDk0J7r for ; Fri, 28 May 2010 00:46:39 -0700 (PDT) Received: from vaebh106.NOE.Nokia.com (vaebh106.europe.nokia.com [10.160.244.32]) by mgw-mx06.nokia.com (Switch-3.3.3/Switch-3.3.3) with ESMTP id o4S7i9kT023623; Fri, 28 May 2010 10:44:11 +0300 Received: from esebh102.NOE.Nokia.com ([172.21.138.183]) by vaebh106.NOE.Nokia.com with Microsoft SMTPSVC(6.0.3790.4675); Fri, 28 May 2010 10:43:50 +0300 Received: from mgw-da02.ext.nokia.com ([147.243.128.26]) by esebh102.NOE.Nokia.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.4675); Fri, 28 May 2010 10:43:50 +0300 Received: from [172.21.40.75] (esdhcp04075.research.nokia.com [172.21.40.75]) by mgw-da02.ext.nokia.com (Switch-3.3.3/Switch-3.3.3) with ESMTP id o4S7hjXg027976; Fri, 28 May 2010 10:43:46 +0300 X-ASG-Orig-Subj: Re: [PATCH 0/5] Per superblock shrinkers V2 Subject: Re: [PATCH 0/5] Per superblock shrinkers V2 From: Artem Bityutskiy Reply-To: dedekind1@gmail.com To: Andrew Morton Cc: Dave Chinner , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com In-Reply-To: <20100527133223.efa4740a.akpm@linux-foundation.org> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <20100527133223.efa4740a.akpm@linux-foundation.org> Content-Type: text/plain; charset="UTF-8" Date: Fri, 28 May 2010 10:42:06 +0300 Message-ID: <1275032526.15516.83.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-1.fc12) Content-Transfer-Encoding: 8bit X-OriginalArrivalTime: 28 May 2010 07:43:50.0812 (UTC) FILETIME=[839C25C0:01CAFE39] X-Nokia-AV: Clean X-Barracuda-Connect: smtp.nokia.com[192.100.122.233] X-Barracuda-Start-Time: 1275032801 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.2, rules version 3.2.2.30963 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2010-05-27 at 13:32 -0700, Andrew Morton wrote: > On Tue, 25 May 2010 18:53:03 +1000 > Dave Chinner wrote: > > > This series reworks the filesystem shrinkers. We currently have a > > set of issues with the current filesystem shrinkers: > > > > 1. There is an dependency between dentry and inode cache > > shrinking that is only implicitly defined by the order of > > shrinker registration. > > 2. The shrinkers need to walk the superblock list and pin > > the superblock to avoid unmount races with the sb going > > away. > > 3. The dentry cache uses per-superblock LRUs and proportions > > reclaim between all the superblocks which means we are > > doing breadth based reclaim. This means we touch every > > superblock for every shrinker call, and may only reclaim > > a single dentry at a time from a given superblock. > > 4. The inode cache has a global LRU, so it has different > > reclaim patterns to the dentry cache, despite the fact > > that the dentry cache is generally the only thing that > > pins inodes in memory. > > 5. Filesystems need to register their own shrinkers for > > caches and can't co-ordinate them with the dentry and > > inode cache shrinkers. > > Nice description, but... it never actually told us what the benefit of > the changes are. Presumably some undescribed workload had some > undescribed user-visible problem. But what was that workload, and what > was the user-visible problem, and how does the patch affect all this? For UBIFS it wwill give a benefit in terms of simpler UBIFS code - we now have to keep our own list of UBIFS superblocks, provide locking for it, and maintain. This is just extra burden. So the item 2 above will be useful for UBIFS. -- Best Regards, Artem Bityutskiy (Đртём Битюцкий) From BATV+b1135330df1ac21a70df+2469+infradead.org+hch@bombadil.srs.infradead.org Fri May 28 02:42:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4S7ghSo203616 for ; Fri, 28 May 2010 02:42:45 -0500 X-ASG-Debug-ID: 1275032707-184501b30000-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 5F6AF37F960 for ; Fri, 28 May 2010 00:45:07 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id AfG1BmItgyeSUEsm for ; Fri, 28 May 2010 00:45:07 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OHuFZ-0005Aa-0A; Fri, 28 May 2010 07:45:01 +0000 Date: Fri, 28 May 2010 03:45:00 -0400 From: Christoph Hellwig To: Andrew Morton Cc: Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 1/6] writeback: initial tracing support Subject: Re: [PATCH 1/6] writeback: initial tracing support Message-ID: <20100528074500.GA14151@infradead.org> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-2-git-send-email-david@fromorbit.com> <20100527143233.836b2c47.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527143233.836b2c47.akpm@linux-foundation.org> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1275032708 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 27, 2010 at 02:32:33PM -0700, Andrew Morton wrote: > > +#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) > > Could/should be implemented in C. > > > +/* > > + * We don't actually have pdflush, but this one is exported though /proc... > > + */ > > +int nr_pdflush_threads; > > So this is always zero now? > > We don't want to keep it forever. Add a > printk_once("nr_pdflush_threads is deprecated") when someone reads it, > remove it in 2014. These two lines are just moved down a bit by the patch, I think any cleanups should be left to separate patches. From npiggin@suse.de Fri May 28 05:05:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4SA54nq211820 for ; Fri, 28 May 2010 05:05:04 -0500 X-ASG-Debug-ID: 1275041362-78e3018b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1B9F9A77200 for ; Fri, 28 May 2010 03:09:22 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id XpNjNAxF9DZIPdkC for ; Fri, 28 May 2010 03:09:22 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id E9B288E8CC; Fri, 28 May 2010 12:07:23 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id C09BD29818; Fri, 28 May 2010 20:07:19 +1000 (EST) Date: Fri, 28 May 2010 20:07:19 +1000 From: Nick Piggin To: Dave Chinner Cc: Andrew Morton , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Subject: Re: [PATCH 1/5] inode: Make unused inode LRU per superblock Message-ID: <20100528100719.GC22536@laptop> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-2-git-send-email-david@fromorbit.com> <20100527133230.780be6c7.akpm@linux-foundation.org> <20100527225418.GP12087@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527225418.GP12087@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1275041364 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 28, 2010 at 08:54:18AM +1000, Dave Chinner wrote: > On Thu, May 27, 2010 at 01:32:30PM -0700, Andrew Morton wrote: > > On Tue, 25 May 2010 18:53:04 +1000 > > Dave Chinner wrote: > > > > > From: Dave Chinner > > > > > > The inode unused list is currently a global LRU. This does not match > > > the other global filesystem cache - the dentry cache - which uses > > > per-superblock LRU lists. Hence we have related filesystem object > > > types using different LRU reclaimatin schemes. > > > > > > To enable a per-superblock filesystem cache shrinker, both of these > > > caches need to have per-sb unused object LRU lists. Hence this patch > > > converts the global inode LRU to per-sb LRUs. > > > > > > The patch only does rudimentary per-sb propotioning in the shrinker > > > infrastructure, as this gets removed when the per-sb shrinker > > > callouts are introduced later on. > > > > > > ... > > > > > > + list_move(&inode->i_list, &inode->i_sb->s_inode_lru); > > > > It's a shape that s_inode_lru is still protected by inode_lock. One > > day we're going to get in trouble over that lock. Migrating to a > > per-sb lock would be logical and might help. > > > > Did you look into this? > > Yes, I have. Yes, it's possible. It's solving a different problem, > so I figured it can be done in a different patch set. It almost all goes away in my inode lock splitup patches. Inode lru and dirty lists were the last things protected by the global lock there. I am actually going to do per-zone lrus for these guys and per-zone locks (which is actually better than per-sb because it gives NUMA scalability within a single sb). The dirty/writeback lists should probably be per-bdi locked. From BATV+b1135330df1ac21a70df+2469+infradead.org+hch@bombadil.srs.infradead.org Fri May 28 12:48:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=BAYES_00,HEADER_ESQ, J_CHICKENPOX_64,J_CHICKENPOX_65,LOCAL_GNU_PATCH autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4SHmmKX234279 for ; Fri, 28 May 2010 12:48:51 -0500 X-ASG-Debug-ID: 1275069187-70f2038f0000-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 12A66A7CD80 for ; Fri, 28 May 2010 10:53:08 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id HBuQe2carESQXhlB for ; Fri, 28 May 2010 10:53:08 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OI3i8-0002U1-LR for xfs@oss.sgi.com; Fri, 28 May 2010 17:51:08 +0000 Date: Fri, 28 May 2010 13:51:08 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: remove lazy per-AG initialization Subject: [PATCH] xfs: remove lazy per-AG initialization Message-ID: <20100528175108.GA9421@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1275069190 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Historically XFS initializes the allocator / inode allocator per-AG lazily, that is the first time this information is required. For filesystems that use lazy superblock counters (which is the default now) we already have to walk all AGs to initialize the superblock counters on an unclean shutdown. This patch generalizes that code so that we always initialize the per-AG data on mount, and also during growfs so that we can remove all the special case code in the fastpath which couldn't assume that the per-AG data is already initialized. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_ag.h =================================================================== --- xfs.orig/fs/xfs/xfs_ag.h 2010-05-27 20:59:43.299004538 +0200 +++ xfs/fs/xfs/xfs_ag.h 2010-05-27 21:20:35.514254155 +0200 @@ -200,8 +200,6 @@ typedef struct xfs_perag { struct xfs_mount *pag_mount; /* owner filesystem */ xfs_agnumber_t pag_agno; /* AG this structure belongs to */ atomic_t pag_ref; /* perag reference count */ - char pagf_init; /* this agf's entry is initialized */ - char pagi_init; /* this agi's entry is initialized */ char pagf_metadata; /* the agf is preferred to be metadata */ char pagi_inodeok; /* The agi is ok for inodes */ __uint8_t pagf_levels[XFS_BTNUM_AGF]; Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2010-05-27 20:59:08.806004469 +0200 +++ xfs/fs/xfs/xfs_alloc.c 2010-05-27 21:32:04.893005726 +0200 @@ -1777,18 +1777,6 @@ xfs_alloc_fix_freelist( pag = args->pag; tp = args->tp; - if (!pag->pagf_init) { - if ((error = xfs_alloc_read_agf(mp, tp, args->agno, flags, - &agbp))) - return error; - if (!pag->pagf_init) { - ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK); - ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); - args->agbp = NULL; - return 0; - } - } else - agbp = NULL; /* * If this is a metadata preferred pag and we are user data @@ -1813,8 +1801,6 @@ xfs_alloc_fix_freelist( longest || ((int)(pag->pagf_freeblks + pag->pagf_flcount - need - args->total) < (int)args->minleft)) { - if (agbp) - xfs_trans_brelse(tp, agbp); args->agbp = NULL; return 0; } @@ -1824,17 +1810,16 @@ xfs_alloc_fix_freelist( * Get the a.g. freespace buffer. * Can fail if we're not blocking on locks, and it's held. */ + error = xfs_alloc_read_agf(mp, tp, args->agno, flags, &agbp); + if (error) + return error; if (agbp == NULL) { - if ((error = xfs_alloc_read_agf(mp, tp, args->agno, flags, - &agbp))) - return error; - if (agbp == NULL) { - ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK); - ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); - args->agbp = NULL; - return 0; - } + ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK); + ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); + args->agbp = NULL; + return 0; } + /* * Figure out how many blocks we should have in the freelist. */ @@ -2040,22 +2025,32 @@ xfs_alloc_log_agf( } /* - * Interface for inode allocation to force the pag data to be initialized. + * Read in the AGF to initialise the per-AG data in the mount structure */ -int /* error */ +int xfs_alloc_pagf_init( - xfs_mount_t *mp, /* file system mount structure */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_agnumber_t agno, /* allocation group number */ - int flags) /* XFS_ALLOC_FLAGS_... */ + struct xfs_mount *mp, + struct xfs_perag *pag) { - xfs_buf_t *bp; + struct xfs_buf *bp; + struct xfs_agf *agf; int error; - if ((error = xfs_alloc_read_agf(mp, tp, agno, flags, &bp))) + error = xfs_read_agf(mp, NULL, pag->pag_agno, 0, &bp); + if (error) return error; - if (bp) - xfs_trans_brelse(tp, bp); + + agf = XFS_BUF_TO_AGF(bp); + pag->pagf_freeblks = be32_to_cpu(agf->agf_freeblks); + pag->pagf_btreeblks = be32_to_cpu(agf->agf_btreeblks); + pag->pagf_flcount = be32_to_cpu(agf->agf_flcount); + pag->pagf_longest = be32_to_cpu(agf->agf_longest); + pag->pagf_levels[XFS_BTNUM_BNOi] = + be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNOi]); + pag->pagf_levels[XFS_BTNUM_CNTi] = + be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]); + + xfs_buf_relse(bp); return 0; } @@ -2179,8 +2174,6 @@ xfs_alloc_read_agf( int flags, /* XFS_ALLOC_FLAG_... */ struct xfs_buf **bpp) /* buffer for the ag freelist header */ { - struct xfs_agf *agf; /* ag freelist header */ - struct xfs_perag *pag; /* per allocation group data */ int error; ASSERT(agno != NULLAGNUMBER); @@ -2194,24 +2187,12 @@ xfs_alloc_read_agf( return 0; ASSERT(!XFS_BUF_GETERROR(*bpp)); - agf = XFS_BUF_TO_AGF(*bpp); - pag = xfs_perag_get(mp, agno); - if (!pag->pagf_init) { - pag->pagf_freeblks = be32_to_cpu(agf->agf_freeblks); - pag->pagf_btreeblks = be32_to_cpu(agf->agf_btreeblks); - pag->pagf_flcount = be32_to_cpu(agf->agf_flcount); - pag->pagf_longest = be32_to_cpu(agf->agf_longest); - pag->pagf_levels[XFS_BTNUM_BNOi] = - be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNOi]); - pag->pagf_levels[XFS_BTNUM_CNTi] = - be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]); - spin_lock_init(&pag->pagb_lock); - pag->pagb_count = 0; - pag->pagb_tree = RB_ROOT; - pag->pagf_init = 1; - } #ifdef DEBUG - else if (!XFS_FORCED_SHUTDOWN(mp)) { + if (!XFS_FORCED_SHUTDOWN(mp)) { + struct xfs_agf *agf = XFS_BUF_TO_AGF(*bpp); + struct xfs_perag *pag; + + pag = xfs_perag_get(mp, agno); ASSERT(pag->pagf_freeblks == be32_to_cpu(agf->agf_freeblks)); ASSERT(pag->pagf_btreeblks == be32_to_cpu(agf->agf_btreeblks)); ASSERT(pag->pagf_flcount == be32_to_cpu(agf->agf_flcount)); @@ -2220,9 +2201,10 @@ xfs_alloc_read_agf( be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNOi])); ASSERT(pag->pagf_levels[XFS_BTNUM_CNTi] == be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi])); + xfs_perag_put(pag); } #endif - xfs_perag_put(pag); + return 0; } Index: xfs/fs/xfs/xfs_alloc.h =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.h 2010-05-27 20:59:08.830004749 +0200 +++ xfs/fs/xfs/xfs_alloc.h 2010-05-27 21:20:35.517293965 +0200 @@ -158,14 +158,9 @@ xfs_alloc_log_agf( int fields);/* mask of fields to be logged (XFS_AGF_...) */ /* - * Interface for inode allocation to force the pag data to be initialized. + * Read in the AGF to initialise the per-AG data in the mount structure */ -int /* error */ -xfs_alloc_pagf_init( - struct xfs_mount *mp, /* file system mount structure */ - struct xfs_trans *tp, /* transaction pointer */ - xfs_agnumber_t agno, /* allocation group number */ - int flags); /* XFS_ALLOC_FLAGS_... */ +int xfs_alloc_pagf_init(struct xfs_mount *mp, struct xfs_perag *pag); /* * Put the block on the freelist for the allocation group. Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-05-27 20:59:39.199003911 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2010-05-27 21:20:35.522254016 +0200 @@ -2552,7 +2552,6 @@ xfs_bmap_btalloc_nullfb( struct xfs_mount *mp = ap->ip->i_mount; struct xfs_perag *pag; xfs_agnumber_t ag, startag; - int notinit = 0; int error; if (ap->userdata && xfs_inode_is_filestream(ap->ip)) @@ -2572,25 +2571,14 @@ xfs_bmap_btalloc_nullfb( pag = xfs_perag_get(mp, ag); while (*blen < ap->alen) { - if (!pag->pagf_init) { - error = xfs_alloc_pagf_init(mp, args->tp, ag, - XFS_ALLOC_FLAG_TRYLOCK); - if (error) { - xfs_perag_put(pag); - return error; - } - } + xfs_extlen_t longest; /* * See xfs_alloc_fix_freelist... */ - if (pag->pagf_init) { - xfs_extlen_t longest; - longest = xfs_alloc_longest_free_extent(mp, pag); - if (*blen < longest) - *blen = longest; - } else - notinit = 1; + longest = xfs_alloc_longest_free_extent(mp, pag); + if (*blen < longest) + *blen = longest; if (xfs_inode_is_filestream(ap->ip)) { if (*blen >= ap->alen) @@ -2633,7 +2621,7 @@ xfs_bmap_btalloc_nullfb( * Since the above loop did a BUF_TRYLOCK, it is * possible that there is space for this request. */ - if (notinit || *blen < ap->minlen) + if (*blen < ap->minlen) args->minlen = ap->minlen; /* * If the best seen length is less than the request Index: xfs/fs/xfs/xfs_filestream.c =================================================================== --- xfs.orig/fs/xfs/xfs_filestream.c 2010-05-27 20:59:08.838004330 +0200 +++ xfs/fs/xfs/xfs_filestream.c 2010-05-27 21:20:35.529005308 +0200 @@ -137,7 +137,7 @@ _xfs_filestream_pick_ag( xfs_extlen_t minlen) { int streams, max_streams; - int err, trylock, nscan; + int nscan; xfs_extlen_t longest, free, minfree, maxfree = 0; xfs_agnumber_t ag, max_ag = NULLAGNUMBER; struct xfs_perag *pag; @@ -148,25 +148,10 @@ _xfs_filestream_pick_ag( ag = startag; *agp = NULLAGNUMBER; - /* For the first pass, don't sleep trying to init the per-AG. */ - trylock = XFS_ALLOC_FLAG_TRYLOCK; - for (nscan = 0; 1; nscan++) { pag = xfs_perag_get(mp, ag); TRACE_AG_SCAN(mp, ag, atomic_read(&pag->pagf_fstrms)); - if (!pag->pagf_init) { - err = xfs_alloc_pagf_init(mp, NULL, ag, trylock); - if (err && !trylock) { - xfs_perag_put(pag); - return err; - } - } - - /* Might fail sometimes during the 1st pass with trylock set. */ - if (!pag->pagf_init) - goto next_ag; - /* Keep track of the AG with the most free blocks. */ if (pag->pagf_freeblks > maxfree) { maxfree = pag->pagf_freeblks; @@ -211,12 +196,6 @@ next_ag: if (ag != startag) continue; - /* Allow sleeping in xfs_alloc_pagf_init() on the 2nd pass. */ - if (trylock != 0) { - trylock = 0; - continue; - } - /* Finally, if lowspace wasn't set, set it for the 3rd pass. */ if (!(flags & XFS_PICK_LOWSPACE)) { flags |= XFS_PICK_LOWSPACE; Index: xfs/fs/xfs/xfs_ialloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc.c 2010-05-27 20:59:08.855005028 +0200 +++ xfs/fs/xfs/xfs_ialloc.c 2010-05-27 21:32:03.104255552 +0200 @@ -448,16 +448,14 @@ xfs_ialloc_ag_select( mode_t mode, /* bits set to indicate file type */ int okalloc) /* ok to allocate more space */ { - xfs_buf_t *agbp; /* allocation group header buffer */ xfs_agnumber_t agcount; /* number of ag's in the filesystem */ xfs_agnumber_t agno; /* current ag number */ int flags; /* alloc buffer locking flags */ - xfs_extlen_t ineed; /* blocks needed for inode allocation */ - xfs_extlen_t longest = 0; /* longest extent available */ xfs_mount_t *mp; /* mount point structure */ int needspace; /* file mode implies space allocated */ xfs_perag_t *pag; /* per allocation group data */ xfs_agnumber_t pagno; /* parent (starting) ag number */ + xfs_buf_t *agbp; /* * Files of these types need at least one block if length > 0 @@ -485,51 +483,37 @@ xfs_ialloc_ag_select( flags = XFS_ALLOC_FLAG_TRYLOCK; for (;;) { pag = xfs_perag_get(mp, agno); - if (!pag->pagi_init) { - if (xfs_ialloc_read_agi(mp, tp, agno, &agbp)) { - agbp = NULL; - goto nextag; - } - } else - agbp = NULL; if (!pag->pagi_inodeok) { xfs_ialloc_next_ag(mp); - goto unlock_nextag; + goto nextag; } /* * Is there enough free space for the file plus a block * of inodes (if we need to allocate some)? */ - ineed = pag->pagi_freecount ? 0 : XFS_IALLOC_BLOCKS(mp); - if (ineed && !pag->pagf_init) { - if (agbp == NULL && - xfs_ialloc_read_agi(mp, tp, agno, &agbp)) { - agbp = NULL; + if (!pag->pagi_freecount) { + xfs_extlen_t ineed = XFS_IALLOC_BLOCKS(mp); + xfs_extlen_t longest; /* longest extent available */ + + longest = pag->pagf_longest; + if (!longest) + longest = pag->pagf_flcount > 0; + + if (pag->pagf_freeblks < needspace + ineed) + goto nextag; + if (longest < ineed) + goto nextag; + if (!okalloc) goto nextag; - } - (void)xfs_alloc_pagf_init(mp, tp, agno, flags); } - if (!ineed || pag->pagf_init) { - if (ineed && !(longest = pag->pagf_longest)) - longest = pag->pagf_flcount > 0; - if (!ineed || - (pag->pagf_freeblks >= needspace + ineed && - longest >= ineed && - okalloc)) { - if (agbp == NULL && - xfs_ialloc_read_agi(mp, tp, agno, &agbp)) { - agbp = NULL; - goto nextag; - } - xfs_perag_put(pag); - return agbp; - } + + if (xfs_ialloc_read_agi(mp, tp, agno, &agbp) == 0) { + xfs_perag_put(pag); + return agbp; } -unlock_nextag: - if (agbp) - xfs_trans_brelse(tp, agbp); + nextag: xfs_perag_put(pag); /* @@ -1504,48 +1488,44 @@ xfs_ialloc_read_agi( xfs_agnumber_t agno, /* allocation group number */ struct xfs_buf **bpp) /* allocation group hdr buf */ { - struct xfs_agi *agi; /* allocation group header */ - struct xfs_perag *pag; /* per allocation group data */ int error; error = xfs_read_agi(mp, tp, agno, bpp); - if (error) - return error; - - agi = XFS_BUF_TO_AGI(*bpp); - pag = xfs_perag_get(mp, agno); - if (!pag->pagi_init) { - pag->pagi_freecount = be32_to_cpu(agi->agi_freecount); - pag->pagi_count = be32_to_cpu(agi->agi_count); - pag->pagi_init = 1; - } - +#ifdef DEBUG /* - * It's possible for these to be out of sync if - * we are in the middle of a forced shutdown. + * It's possible for these to be out of sync if we are in the + * middle of a forced shutdown. */ - ASSERT(pag->pagi_freecount == be32_to_cpu(agi->agi_freecount) || - XFS_FORCED_SHUTDOWN(mp)); - xfs_perag_put(pag); - return 0; + if (!error && !XFS_FORCED_SHUTDOWN(mp)) { + struct xfs_perag *pag = xfs_perag_get(mp, agno); + ASSERT(pag->pagi_freecount == + be32_to_cpu(XFS_BUF_TO_AGI(*bpp)->agi_freecount)); + xfs_perag_put(pag); + } +#endif + return error; } /* - * Read in the agi to initialise the per-ag data in the mount structure + * Read in the AGI to initialise the per-AG data in the mount structure */ int xfs_ialloc_pagi_init( - xfs_mount_t *mp, /* file system mount structure */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_agnumber_t agno) /* allocation group number */ + struct xfs_mount *mp, + struct xfs_perag *pag) { - xfs_buf_t *bp = NULL; - int error; + struct xfs_buf *bp = NULL; + struct xfs_agi *agi; + int error; - error = xfs_ialloc_read_agi(mp, tp, agno, &bp); + error = xfs_read_agi(mp, NULL, pag->pag_agno, &bp); if (error) return error; - if (bp) - xfs_trans_brelse(tp, bp); + + agi = XFS_BUF_TO_AGI(bp); + pag->pagi_freecount = be32_to_cpu(agi->agi_freecount); + pag->pagi_count = be32_to_cpu(agi->agi_count); + + xfs_buf_relse(bp); return 0; } Index: xfs/fs/xfs/xfs_ialloc.h =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc.h 2010-05-27 20:59:08.872004190 +0200 +++ xfs/fs/xfs/xfs_ialloc.h 2010-05-27 21:20:35.540024375 +0200 @@ -140,14 +140,9 @@ xfs_ialloc_read_agi( struct xfs_buf **bpp); /* allocation group hdr buf */ /* - * Read in the allocation group header to initialise the per-ag data - * in the mount structure + * Read in the AGI to initialise the per-AG data in the mount structure */ -int -xfs_ialloc_pagi_init( - struct xfs_mount *mp, /* file system mount structure */ - struct xfs_trans *tp, /* transaction pointer */ - xfs_agnumber_t agno); /* allocation group number */ +int xfs_ialloc_pagi_init(struct xfs_mount *, struct xfs_perag *); /* * Lookup a record by ino in the btree given by cur. Index: xfs/fs/xfs/xfs_mount.c =================================================================== --- xfs.orig/fs/xfs/xfs_mount.c 2010-05-27 20:59:43.290004329 +0200 +++ xfs/fs/xfs/xfs_mount.c 2010-05-27 21:20:35.548256111 +0200 @@ -445,6 +445,7 @@ xfs_initialize_perag( pag->pag_mount = mp; rwlock_init(&pag->pag_ici_lock); INIT_RADIX_TREE(&pag->pag_ici_root, GFP_ATOMIC); + spin_lock_init(&pag->pagb_lock); if (radix_tree_preload(GFP_NOFS)) goto out_unwind; @@ -777,50 +778,78 @@ xfs_mount_common(xfs_mount_t *mp, xfs_sb * this information, write it into the in-core superblock structure. */ STATIC int -xfs_initialize_perag_data(xfs_mount_t *mp, xfs_agnumber_t agcount) +xfs_initialize_perag_data( + struct xfs_mount *mp, + xfs_agnumber_t agcount) { - xfs_agnumber_t index; - xfs_perag_t *pag; - xfs_sb_t *sbp = &mp->m_sb; - uint64_t ifree = 0; - uint64_t ialloc = 0; - uint64_t bfree = 0; - uint64_t bfreelst = 0; - uint64_t btree = 0; - int error; + xfs_agnumber_t index; + int error; for (index = 0; index < agcount; index++) { - /* - * read the agf, then the agi. This gets us - * all the information we need and populates the - * per-ag structures for us. - */ - error = xfs_alloc_pagf_init(mp, NULL, index, 0); - if (error) - return error; + struct xfs_perag *pag; - error = xfs_ialloc_pagi_init(mp, NULL, index); - if (error) - return error; pag = xfs_perag_get(mp, index); - ifree += pag->pagi_freecount; - ialloc += pag->pagi_count; - bfree += pag->pagf_freeblks; - bfreelst += pag->pagf_flcount; - btree += pag->pagf_btreeblks; + error = xfs_alloc_pagf_init(mp, pag); + if (!error) + error = xfs_ialloc_pagi_init(mp, pag); xfs_perag_put(pag); + + if (error) + return error; } + /* - * Overwrite incore superblock counters with just-read data + * Now the log is mounted, we know if it was an unclean shutdown or + * not. If it was, with the first phase of recovery has completed, we + * have consistent AG blocks on disk. We have not recovered EFIs yet, + * but they are recovered transactionally in the second recovery phase + * later. + * + * Hence we can safely re-initialise incore superblock counters from + * the per-ag data. These may not be correct if the filesystem was not + * cleanly unmounted, so we need to wait for recovery to finish before + * doing this. + * + * If the filesystem was cleanly unmounted, then we can trust the + * values in the superblock to be correct and we don't need to do + * anything here. + * + * If we are currently making the filesystem, the initialisation will + * fail as the perag data is in an undefined state. */ - spin_lock(&mp->m_sb_lock); - sbp->sb_ifree = ifree; - sbp->sb_icount = ialloc; - sbp->sb_fdblocks = bfree + bfreelst + btree; - spin_unlock(&mp->m_sb_lock); + if (xfs_sb_version_haslazysbcount(&mp->m_sb) && + !XFS_LAST_UNMOUNT_WAS_CLEAN(mp) && !mp->m_sb.sb_inprogress) { + struct xfs_sb *sbp = &mp->m_sb; + uint64_t ifree = 0; + uint64_t ialloc = 0; + uint64_t bfree = 0; + uint64_t bfreelst = 0; + uint64_t btree = 0; - /* Fixup the per-cpu counters as well. */ - xfs_icsb_reinit_counters(mp); + for (index = 0; index < agcount; index++) { + struct xfs_perag *pag; + + pag = xfs_perag_get(mp, index); + ifree += pag->pagi_freecount; + ialloc += pag->pagi_count; + bfree += pag->pagf_freeblks; + bfreelst += pag->pagf_flcount; + btree += pag->pagf_btreeblks; + xfs_perag_put(pag); + } + + /* + * Overwrite incore superblock counters with just-read data + */ + spin_lock(&mp->m_sb_lock); + sbp->sb_ifree = ifree; + sbp->sb_icount = ialloc; + sbp->sb_fdblocks = bfree + bfreelst + btree; + spin_unlock(&mp->m_sb_lock); + + /* Fixup the per-cpu counters as well. */ + xfs_icsb_reinit_counters(mp); + } return 0; } @@ -1268,32 +1297,9 @@ xfs_mountfs( goto out_free_perag; } - /* - * Now the log is mounted, we know if it was an unclean shutdown or - * not. If it was, with the first phase of recovery has completed, we - * have consistent AG blocks on disk. We have not recovered EFIs yet, - * but they are recovered transactionally in the second recovery phase - * later. - * - * Hence we can safely re-initialise incore superblock counters from - * the per-ag data. These may not be correct if the filesystem was not - * cleanly unmounted, so we need to wait for recovery to finish before - * doing this. - * - * If the filesystem was cleanly unmounted, then we can trust the - * values in the superblock to be correct and we don't need to do - * anything here. - * - * If we are currently making the filesystem, the initialisation will - * fail as the perag data is in an undefined state. - */ - if (xfs_sb_version_haslazysbcount(&mp->m_sb) && - !XFS_LAST_UNMOUNT_WAS_CLEAN(mp) && - !mp->m_sb.sb_inprogress) { - error = xfs_initialize_perag_data(mp, sbp->sb_agcount); - if (error) - goto out_free_perag; - } + error = xfs_initialize_perag_data(mp, sbp->sb_agcount); + if (error) + goto out_free_perag; /* * Get and sanity-check the root inode. Index: xfs/fs/xfs/xfs_fsops.c =================================================================== --- xfs.orig/fs/xfs/xfs_fsops.c 2010-05-27 21:25:26.804004050 +0200 +++ xfs/fs/xfs/xfs_fsops.c 2010-05-27 21:30:51.144009429 +0200 @@ -186,6 +186,8 @@ xfs_growfs_data_private( */ nfree = 0; for (agno = nagcount - 1; agno >= oagcount; agno--, new -= agsize) { + struct xfs_perag *pag; + /* * AG freelist header block */ @@ -305,6 +307,15 @@ xfs_growfs_data_private( if (error) { goto error0; } + + pag = xfs_perag_get(mp, agno); + error = xfs_alloc_pagf_init(mp, pag); + if (!error) + error = xfs_ialloc_pagi_init(mp, pag); + xfs_perag_put(pag); + + if (error) + goto error0; } xfs_trans_agblocks_delta(tp, nfree); /* From aelder@sgi.com Fri May 28 12:55:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4SHtMb5234526; Fri, 28 May 2010 12:55:22 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4595430419E; Fri, 28 May 2010 10:57:41 -0700 (PDT) Received: from [128.162.232.197] ([128.162.232.197]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 28 May 2010 12:57:32 -0500 Subject: Re: [PATCH 11/17] fs/xfs/quota: Add missing mutex_unlock From: Alex Elder Reply-To: aelder@sgi.com To: Julia Lawall Cc: xfs-masters@oss.sgi.com, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, kernel-janitors@vger.kernel.org In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Date: Fri, 28 May 2010 12:57:32 -0500 Message-ID: <1275069452.2302.5.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 28 May 2010 17:57:32.0677 (UTC) FILETIME=[3F26DB50:01CAFE8F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2010-05-26 at 17:57 +0200, Julia Lawall wrote: > From: Julia Lawall > > Add a mutex_unlock missing on the error path. The use of this lock is > balanced elsewhere in the file. Looks good. I'll pull this one into the XFS tree. Reviewed-by: Alex Elder > The semantic match that finds this problem is as follows: > (http://coccinelle.lip6.fr/) > > // > @@ > expression E1; > @@ > > * mutex_lock(E1,...); > <+... when != E1 > if (...) { > ... when != E1 > * return ...; > } > ...+> > * mutex_unlock(E1,...); > // > > Signed-off-by: Julia Lawall > > --- > The use of ENOMEM rather than -ENOMEM is also a bit odd. > > fs/xfs/quota/xfs_qm.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c > index 38e7641..2d8b7bc 100644 > --- a/fs/xfs/quota/xfs_qm.c > +++ b/fs/xfs/quota/xfs_qm.c > @@ -249,8 +249,10 @@ xfs_qm_hold_quotafs_ref( > > if (!xfs_Gqm) { > xfs_Gqm = xfs_Gqm_init(); > - if (!xfs_Gqm) > + if (!xfs_Gqm) { > + mutex_unlock(&xfs_Gqm_lock); > return ENOMEM; > + } > } > > /* From aelder@sgi.com Fri May 28 13:24:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4SIOO2P235711 for ; Fri, 28 May 2010 13:24:24 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2C71F3041D6; Fri, 28 May 2010 11:26:40 -0700 (PDT) Received: from [128.162.232.197] ([128.162.232.197]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 28 May 2010 13:19:20 -0500 Subject: Re: [PATCH] xfs: fix access to upper inodes without inode64 From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20100527190515.GA16102@infradead.org> References: <20100527190515.GA16102@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Fri, 28 May 2010 13:19:19 -0500 Message-ID: <1275070759.2302.14.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 28 May 2010 18:19:20.0279 (UTC) FILETIME=[4A8B1670:01CAFE92] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2010-05-27 at 15:05 -0400, Christoph Hellwig wrote: > If a filesystem is mounted without the inode64 mount option we should still > be able to access inodes not fitting into 32 bits, just not created new > ones. For this to work we need to make sure the inode cache radix tree > is initialized for all allocation groups, not just those we plan to allocate > inodes from. This patch makes sure we initialize the inode cache radix > tree for all allocation groups, and also cleans xfs_initialize_perag up > a bit to separate the inode32 logical from the general perag structure > setup. This looks generally good, but I have a comment below that is not a bug now but could become one. > Signed-off-by: Christoph Hellwig > > Index: xfs/fs/xfs/xfs_mount.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_mount.c 2010-05-27 20:59:09.191004330 +0200 > +++ xfs/fs/xfs/xfs_mount.c 2010-05-27 20:59:43.290004329 +0200 . . . > @@ -497,30 +489,30 @@ xfs_initialize_perag( > } else { > max_metadata = agcount; > } > + > for (index = 0; index < agcount; index++) { > ino = XFS_AGINO_TO_INO(mp, index, agino); > - if (ino > max_inum) { > + if (ino > XFS_MAXINUMBER_32) { > index++; > break; > } > > - /* This ag is preferred for inodes */ > pag = xfs_perag_get(mp, index); > pag->pagi_inodeok = 1; > if (index < max_metadata) > pag->pagf_metadata = 1; > - xfs_initialize_perag_icache(pag); > xfs_perag_put(pag); > } > + > + *maxagi = agcount; Here you unconditionally assign to *maxagi... > } else { > - /* Setup default behavior for smaller filesystems */ > for (index = 0; index < agcount; index++) { > pag = xfs_perag_get(mp, index); > pag->pagi_inodeok = 1; > - xfs_initialize_perag_icache(pag); > xfs_perag_put(pag); > } > } > + > if (maxagi) > *maxagi = index; ...while here it checks to be sure it's non-null before assigning. Right now, the two places that call this function always pass the address of something. I don't care which way it goes, but the two assignments should be done consistently (either both or neither should check for null before assignment). Other than that, this change looks really good. Unless I hear from you otherwise, I'll make the change before commit. I will make both (all) spots assume a valid pointer is passed in. -Alex From aelder@sgi.com Fri May 28 13:47:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4SIl8eK236729 for ; Fri, 28 May 2010 13:47:09 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id B3BBDAC077; Fri, 28 May 2010 11:49:27 -0700 (PDT) Received: from [128.162.232.197] ([128.162.232.197]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 28 May 2010 13:49:01 -0500 Subject: Re: [PATCH] xfs: fix access to upper inodes without inode64 From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20100527190515.GA16102@infradead.org> References: <20100527190515.GA16102@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Fri, 28 May 2010 13:49:00 -0500 Message-ID: <1275072540.2302.21.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 28 May 2010 18:49:01.0181 (UTC) FILETIME=[700B2AD0:01CAFE96] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2010-05-27 at 15:05 -0400, Christoph Hellwig wrote: > If a filesystem is mounted without the inode64 mount option we should still > be able to access inodes not fitting into 32 bits, just not created new > ones. For this to work we need to make sure the inode cache radix tree > is initialized for all allocation groups, not just those we plan to allocate > inodes from. This patch makes sure we initialize the inode cache radix > tree for all allocation groups, and also cleans xfs_initialize_perag up > a bit to separate the inode32 logical from the general perag structure > setup. > > Signed-off-by: Christoph Hellwig One other thing: > Index: xfs/fs/xfs/xfs_inode.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_inode.c 2010-05-27 20:59:09.000000000 +0200 > +++ xfs/fs/xfs/xfs_inode.c 2010-05-27 20:59:43.315004399 +0200 > @@ -2624,7 +2624,6 @@ xfs_iflush_cluster( > int i; > > pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); > - ASSERT(pag->pag_ici_init); This doesn't apply in my tree, because it's missing this: ASSERT(pag->pagi_inodeok); I believe that this missing assertion should be deleted also, to go along with the purpose of this patch. Again, I'll make this change myself before I commit; let me know if you would like me not to. -Alex > > inodes_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog; > ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); > From BATV+b1135330df1ac21a70df+2469+infradead.org+hch@bombadil.srs.infradead.org Fri May 28 14:00:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4SJ0lFt237257 for ; Fri, 28 May 2010 14:00:49 -0500 X-ASG-Debug-ID: 1275073392-322a03210000-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 8F0F7348995; Fri, 28 May 2010 12:03:12 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id PEBAmGxOJqjQ4Hrd; Fri, 28 May 2010 12:03:12 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OI4pq-0005kx-Ds; Fri, 28 May 2010 19:03:10 +0000 Date: Fri, 28 May 2010 15:03:10 -0400 From: Christoph Hellwig To: Alex Elder Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: fix access to upper inodes without inode64 Subject: Re: [PATCH] xfs: fix access to upper inodes without inode64 Message-ID: <20100528190310.GA21403@infradead.org> References: <20100527190515.GA16102@infradead.org> <1275070759.2302.14.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1275070759.2302.14.camel@doink> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1275073392 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 28, 2010 at 01:19:19PM -0500, Alex Elder wrote: > > } > > + > > + *maxagi = agcount; > > Here you unconditionally assign to *maxagi... Actually that hunk shouldn't be there, I think I sent you a previous version of the patch before I did the final quilt refresh. Below it the final version, which also fixes your other nit: --- From: Christoph Hellwig Subject: [PATCH] xfs: fix access to upper inodes without inode64 If a filesystem is mounted without the inode64 mount option we should still be able to access inodes not fitting into 32 bits, just not created new ones. For this to work we need to make sure the inode cache radix tree is initialized for all allocation groups, not just those we plan to allocate inodes from. This patch makes sure we initialize the inode cache radix tree for all allocation groups, and also cleans xfs_initialize_perag up a bit to separate the inode32 logical from the general perag structure setup. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_mount.c =================================================================== --- xfs.orig/fs/xfs/xfs_mount.c 2010-05-28 20:57:59.014025018 +0200 +++ xfs/fs/xfs/xfs_mount.c 2010-05-28 20:58:53.579005781 +0200 @@ -413,17 +413,6 @@ xfs_mount_validate_sb( return 0; } -STATIC void -xfs_initialize_perag_icache( - xfs_perag_t *pag) -{ - if (!pag->pag_ici_init) { - rwlock_init(&pag->pag_ici_lock); - INIT_RADIX_TREE(&pag->pag_ici_root, GFP_ATOMIC); - pag->pag_ici_init = 1; - } -} - int xfs_initialize_perag( xfs_mount_t *mp, @@ -436,13 +425,8 @@ xfs_initialize_perag( xfs_agino_t agino; xfs_ino_t ino; xfs_sb_t *sbp = &mp->m_sb; - xfs_ino_t max_inum = XFS_MAXINUMBER_32; int error = -ENOMEM; - /* Check to see if the filesystem can overflow 32 bit inodes */ - agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks - 1, 0); - ino = XFS_AGINO_TO_INO(mp, agcount - 1, agino); - /* * Walk the current per-ag tree so we don't try to initialise AGs * that already exist (growfs case). Allocate and insert all the @@ -456,11 +440,18 @@ xfs_initialize_perag( } if (!first_initialised) first_initialised = index; + pag = kmem_zalloc(sizeof(*pag), KM_MAYFAIL); if (!pag) goto out_unwind; + pag->pag_agno = index; + pag->pag_mount = mp; + rwlock_init(&pag->pag_ici_lock); + INIT_RADIX_TREE(&pag->pag_ici_root, GFP_ATOMIC); + if (radix_tree_preload(GFP_NOFS)) goto out_unwind; + spin_lock(&mp->m_perag_lock); if (radix_tree_insert(&mp->m_perag_tree, index, pag)) { BUG(); @@ -469,25 +460,26 @@ xfs_initialize_perag( error = -EEXIST; goto out_unwind; } - pag->pag_agno = index; - pag->pag_mount = mp; spin_unlock(&mp->m_perag_lock); radix_tree_preload_end(); } - /* Clear the mount flag if no inode can overflow 32 bits - * on this filesystem, or if specifically requested.. + /* + * If we mount with the inode64 option, or no inode overflows + * the legacy 32-bit address space clear the inode32 option. */ - if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) && ino > max_inum) { + agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks - 1, 0); + ino = XFS_AGINO_TO_INO(mp, agcount - 1, agino); + + if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) && ino > XFS_MAXINUMBER_32) mp->m_flags |= XFS_MOUNT_32BITINODES; - } else { + else mp->m_flags &= ~XFS_MOUNT_32BITINODES; - } - /* If we can overflow then setup the ag headers accordingly */ if (mp->m_flags & XFS_MOUNT_32BITINODES) { - /* Calculate how much should be reserved for inodes to - * meet the max inode percentage. + /* + * Calculate how much should be reserved for inodes to meet + * the max inode percentage. */ if (mp->m_maxicount) { __uint64_t icount; @@ -500,30 +492,28 @@ xfs_initialize_perag( } else { max_metadata = agcount; } + for (index = 0; index < agcount; index++) { ino = XFS_AGINO_TO_INO(mp, index, agino); - if (ino > max_inum) { + if (ino > XFS_MAXINUMBER_32) { index++; break; } - /* This ag is preferred for inodes */ pag = xfs_perag_get(mp, index); pag->pagi_inodeok = 1; if (index < max_metadata) pag->pagf_metadata = 1; - xfs_initialize_perag_icache(pag); xfs_perag_put(pag); } } else { - /* Setup default behavior for smaller filesystems */ for (index = 0; index < agcount; index++) { pag = xfs_perag_get(mp, index); pag->pagi_inodeok = 1; - xfs_initialize_perag_icache(pag); xfs_perag_put(pag); } } + if (maxagi) *maxagi = index; return 0; Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2010-05-28 20:57:58.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2010-05-28 20:58:09.538261854 +0200 @@ -164,10 +164,6 @@ xfs_inode_ag_iterator( struct xfs_perag *pag; pag = xfs_perag_get(mp, ag); - if (!pag->pag_ici_init) { - xfs_perag_put(pag); - continue; - } error = xfs_inode_ag_walk(mp, pag, execute, flags, tag, exclusive, &nr); xfs_perag_put(pag); @@ -867,12 +863,7 @@ xfs_reclaim_inode_shrink( down_read(&xfs_mount_list_lock); list_for_each_entry(mp, &xfs_mount_list, m_mplist) { for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { - pag = xfs_perag_get(mp, ag); - if (!pag->pag_ici_init) { - xfs_perag_put(pag); - continue; - } reclaimable += pag->pag_ici_reclaimable; xfs_perag_put(pag); } Index: xfs/fs/xfs/xfs_ag.h =================================================================== --- xfs.orig/fs/xfs/xfs_ag.h 2010-05-28 20:57:49.000000000 +0200 +++ xfs/fs/xfs/xfs_ag.h 2010-05-28 20:58:09.542081591 +0200 @@ -227,7 +227,6 @@ typedef struct xfs_perag { atomic_t pagf_fstrms; /* # of filestreams active in this AG */ - int pag_ici_init; /* incore inode cache initialised */ rwlock_t pag_ici_lock; /* incore inode lock */ struct radix_tree_root pag_ici_root; /* incore inode cache root */ int pag_ici_reclaimable; /* reclaimable inodes */ Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-05-28 20:57:58.000000000 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-05-28 20:58:09.549120633 +0200 @@ -382,9 +382,6 @@ xfs_iget( /* get the perag structure and ensure that it's inode capable */ pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ino)); - if (!pag->pagi_inodeok) - return EINVAL; - ASSERT(pag->pag_ici_init); agino = XFS_INO_TO_AGINO(mp, ino); again: Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-05-28 20:57:58.000000000 +0200 +++ xfs/fs/xfs/xfs_inode.c 2010-05-28 20:58:26.993255425 +0200 @@ -2649,8 +2649,6 @@ xfs_iflush_cluster( int i; pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); - ASSERT(pag->pagi_inodeok); - ASSERT(pag->pag_ici_init); inodes_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog; ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); From aelder@sgi.com Fri May 28 14:39:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4SJdJNm239130 for ; Fri, 28 May 2010 14:39:19 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id C1E1C8F8050; Fri, 28 May 2010 12:41:41 -0700 (PDT) Received: from [128.162.232.197] ([128.162.232.197]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 28 May 2010 14:40:53 -0500 Subject: Re: [PATCH] xfs: improve xfs_isilocked From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20100527190533.GB16102@infradead.org> References: <20100527190533.GB16102@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Fri, 28 May 2010 14:40:53 -0500 Message-ID: <1275075653.2302.38.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 28 May 2010 19:40:53.0498 (UTC) FILETIME=[AF210DA0:01CAFE9D] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2010-05-27 at 15:05 -0400, Christoph Hellwig wrote: > Use rwsem_is_locked to make the assertations for shared locks work. So you're changing it so it answers "yes it's locked" even it it's only a read lock now, right? Previously it was basically (once each for ilock and iolock): "If the exclusive flag is set, but there is no writer, then it is not locked; otherwise it is." Now it's "If the exclusive flag is set, but no writer, it's not locked. Otherwise if the shared flag is set it's locked if rwsem_is_locked() says we are. Otherwise (ASSERT(0) and) it is not locked." That last part is wrong I think. It should be OK to call xfs_isilocked() with neither flag set, in which case the result should be 0. And if the exclusive flag is set, and there *is* a writer, it *is* locked, so it should return 1. -Alex > Signed-off-by: Christoph Hellwig > > Index: xfs/fs/xfs/xfs_iget.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_iget.c 2010-05-25 11:40:59.216005587 +0200 > +++ xfs/fs/xfs/xfs_iget.c 2010-05-27 20:59:09.244004330 +0200 > @@ -740,30 +738,24 @@ xfs_ilock_demote( > } > > #ifdef DEBUG > -/* > - * Debug-only routine, without additional rw_semaphore APIs, we can > - * now only answer requests regarding whether we hold the lock for write > - * (reader state is outside our visibility, we only track writer state). > - * > - * Note: this means !xfs_isilocked would give false positives, so don't do that. > - */ > int > xfs_isilocked( > xfs_inode_t *ip, > uint lock_flags) > { > - if ((lock_flags & (XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)) == > - XFS_ILOCK_EXCL) { > - if (!ip->i_lock.mr_writer) > - return 0; > + if (lock_flags & (XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)) { > + if (!(lock_flags & XFS_ILOCK_SHARED)) > + return !!ip->i_lock.mr_writer; > + return rwsem_is_locked(&ip->i_lock.mr_lock); > } > > - if ((lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) == > - XFS_IOLOCK_EXCL) { > - if (!ip->i_iolock.mr_writer) > - return 0; > + if (lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) { > + if (!(lock_flags & XFS_IOLOCK_SHARED)) > + return !!ip->i_iolock.mr_writer; > + return rwsem_is_locked(&ip->i_iolock.mr_lock); > } > > - return 1; > + ASSERT(0); > + return 0; > } > #endif > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From aelder@oss.sgi.com Fri May 28 17:38:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4SMc7D4247821 for ; Fri, 28 May 2010 17:38:07 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o4SMc7Dl247743; Fri, 28 May 2010 17:38:07 -0500 Date: Fri, 28 May 2010 17:38:07 -0500 Message-Id: <201005282238.o4SMc7Dl247743@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v2.6.34-77-gfb3b504 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: ccf7c23fc129e75ef60e6f59f60a485b7a056598 X-Git-Newrev: fb3b504adeee942e55393396fea8fdf406acf037 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated fb3b504 xfs: fix access to upper inodes without inode64 9b98b6f xfs: fix might_sleep() warning when initialising per-ag tree 38e712a fs/xfs/quota: Add missing mutex_unlock 3bd0946 xfs: remove duplicated #include f8adb4d xfs: convert more trace events to DEFINE_EVENT 292ec4c xfs: xfs_trace.c: remove duplicated #include 07f1a4f xfs: Check new inode size is OK before preallocating fdc07f4 xfs: clean up xlog_align 025101d xfs: cleanup log reservation calculactions 32891b2 xfs: be more explicit if RT mount fails due to config 657a4cf xfs: replace E2BIG with EFBIG where appropriate from ccf7c23fc129e75ef60e6f59f60a485b7a056598 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit fb3b504adeee942e55393396fea8fdf406acf037 Author: Christoph Hellwig Date: Fri May 28 19:03:10 2010 +0000 xfs: fix access to upper inodes without inode64 If a filesystem is mounted without the inode64 mount option we should still be able to access inodes not fitting into 32 bits, just not created new ones. For this to work we need to make sure the inode cache radix tree is initialized for all allocation groups, not just those we plan to allocate inodes from. This patch makes sure we initialize the inode cache radix tree for all allocation groups, and also cleans xfs_initialize_perag up a bit to separate the inode32 logical from the general perag structure setup. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit 9b98b6f3e1534bba2efcd5b16318945cf2218d99 Author: Dave Chinner Date: Thu May 27 01:58:13 2010 +0000 xfs: fix might_sleep() warning when initialising per-ag tree The use of radix_tree_preload() only works if the radix tree was initialised without the __GFP_WAIT flag. The per-ag tree uses GFP_NOFS, so does not trigger allocation of new tree nodes from the preloaded array. Hence it enters the allocator with a spinlock held and triggers the might_sleep() warnings. Reported-by; Chris Mason Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 38e712ab3d28d79725eaade02fe8aba51abac196 Author: Julia Lawall Date: Wed May 26 15:57:23 2010 +0000 fs/xfs/quota: Add missing mutex_unlock Add a mutex_unlock missing on the error path. The use of this lock is balanced elsewhere in the file. The semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // @@ expression E1; @@ * mutex_lock(E1,...); <+... when != E1 if (...) { ... when != E1 * return ...; } ...+> * mutex_unlock(E1,...); // Signed-off-by: Julia Lawall Signed-off-by: Alex Elder commit 3bd0946eb157e26240ca858d1a42738b095dc6f3 Author: Huang Weiyi Date: Tue May 25 22:15:26 2010 +0000 xfs: remove duplicated #include Remove duplicated #include('s) in fs/xfs/linux-2.6/xfs_quotaops.c Signed-off-by: Huang Weiyi Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit f8adb4d574cf8c67f8391367136edc5469258fdc Author: Li Zefan Date: Mon May 24 08:25:57 2010 +0000 xfs: convert more trace events to DEFINE_EVENT Use DECLARE_EVENT_CLASS, and save ~15K: text data bss dec hex filename 171949 43028 48 215025 347f1 fs/xfs/linux-2.6/xfs_trace.o.orig 156521 43028 36 199585 30ba1 fs/xfs/linux-2.6/xfs_trace.o No change in functionality. Signed-off-by: Li Zefan Acked-by: Steven Rostedt Signed-off-by: Alex Elder commit 292ec4cf3536a5ed8809e8823341b203e497bbaf Author: Huang Weiyi Date: Sat May 22 17:13:20 2010 +0000 xfs: xfs_trace.c: remove duplicated #include Remove duplicated #include('s) in fs/xfs/linux-2.6/xfs_trace.c Signed-off-by: Huang Weiyi Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 07f1a4f5e89cd4e6c79d67d41e8a18c451214ae2 Author: Dave Chinner Date: Fri May 21 05:47:59 2010 +0000 xfs: Check new inode size is OK before preallocating The new xfsqa test 228 tries to preallocate more space than the filesystem contains. it should fail, but instead triggers an assert about lock flags. The failure is due to the size extension failing in vmtruncate() due to rlimit being set. Check this before we start the preallocation to avoid allocating space that will never be used. Also the path through xfs_vn_allocate already holds the IO lock, so it should not be present in the lock flags when the setattr fails. Hence the assert needs to take this into account. This will prevent other such callers from hitting this incorrect ASSERT. (Fixed a reference to "newsize" to read "new_size". -Alex) Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit fdc07f44c891d3fdee7722a03e3881614a293b3c Author: Christoph Hellwig Date: Mon May 10 17:28:14 2010 +0000 xfs: clean up xlog_align Add suggested cleanups to commit 29db3370a1369541d58d692fbfb168b8a0bd7f41 from review that didn't end up being commited. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit 025101dca4480eff9da948405e872d5115030850 Author: Christoph Hellwig Date: Tue May 4 13:53:48 2010 +0000 xfs: cleanup log reservation calculactions Instead of having small helper functions calling big macros do the calculations for the log reservations directly in the functions. These are mostly 1:1 from the macros execept that the macros kept the quota calculations in their callers. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit 32891b292d6262d1db8e553cf3f4b38a91247b5a Author: Eric Sandeen Date: Fri Apr 30 16:43:48 2010 +0000 xfs: be more explicit if RT mount fails due to config Recent testers were slightly confused that a realtime mount failed due to missing CONFIG_XFS_RT; we can make that a little more obvious. V2: drop the else as suggested by Christoph Signed-off-by: Eric Sandeen Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 657a4cffde065beca7d919e867f61e7d322708b6 Author: Eric Sandeen Date: Fri Apr 30 03:42:49 2010 +0000 xfs: replace E2BIG with EFBIG where appropriate Many places in the xfs code return E2BIG when they really mean EFBIG; trying to grow past 16T on a 32 bit machine, for example, says "Argument list too long" rather than "File too large" which is not particularly helpful. Some of these don't make perfect sense as EFBIG either, but still better than E2BIG IMHO. Signed-off-by: Eric Sandeen Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_iops.c | 16 ++- fs/xfs/linux-2.6/xfs_quotaops.c | 1 - fs/xfs/linux-2.6/xfs_sync.c | 9 - fs/xfs/linux-2.6/xfs_trace.c | 1 - fs/xfs/linux-2.6/xfs_trace.h | 356 ++++++++++++++++--------------- fs/xfs/quota/xfs_qm.c | 4 +- fs/xfs/xfs_ag.h | 1 - fs/xfs/xfs_iget.c | 3 - fs/xfs/xfs_inode.c | 2 - fs/xfs/xfs_log_recover.c | 11 +- fs/xfs/xfs_mount.c | 68 +++---- fs/xfs/xfs_rtalloc.c | 4 +- fs/xfs/xfs_rtalloc.h | 11 +- fs/xfs/xfs_trans.c | 446 +++++++++++++++++++++++++++++++++++---- fs/xfs/xfs_trans.h | 411 ------------------------------------ fs/xfs/xfs_vnodeops.c | 2 +- 16 files changed, 649 insertions(+), 697 deletions(-) hooks/post-receive -- XFS development tree From MAILER-DAEMON@oss.sgi.com Sat May 29 00:31:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4T5VOq2008249 for ; Sat, 29 May 2010 00:31:24 -0500 X-ASG-Debug-ID: 1275111343-4b8403890000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from hcmut.edu.vn (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CCE1CA8BC4D for ; Fri, 28 May 2010 22:35:43 -0700 (PDT) Received: from hcmut.edu.vn (mailserv.hcmut.edu.vn [203.162.44.74]) by cuda.sgi.com with ESMTP id 2SK5v1HZXxHT2N7A for ; Fri, 28 May 2010 22:35:43 -0700 (PDT) Received: (qmail 28843 invoked for bounce); 29 May 2010 05:22:26 -0000 Date: 29 May 2010 05:22:26 -0000 From: MAILER-DAEMON@hcmut.edu.vn To: xfs@oss.sgi.com X-ASG-Orig-Subj: failure notice Subject: failure notice X-BK-MailScanner-OpenProtect-Information: Please contact the ISP for more information X-BK-MailScanner-OpenProtect: Found to be clean X-BK-MailScanner-OpenProtect-MCPCheck: X-BK-MailScanner-OpenProtect-SpamCheck: not spam, SpamAssassin (score=0.549, required 5, NO_REAL_NAME 0.55, NO_RELAYS -0.00) X-BK-MailScanner-OpenProtect-From: X-Barracuda-Connect: mailserv.hcmut.edu.vn[203.162.44.74] X-Barracuda-Start-Time: 1275111344 Message-Id: <20100529053543.CCE1CA8BC4D@cuda.sgi.com> X-Barracuda-Bayes: INNOCENT GLOBAL 0.4810 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=ANY_BOUNCE_MESSAGE, BOUNCE_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31042 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 BOUNCE_MESSAGE MTA bounce message 0.00 ANY_BOUNCE_MESSAGE Message is some kind of bounce message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi. This is the qmail-send program at hcmut.edu.vn. I'm afraid I wasn't able to deliver your message to the following addresses. This is a permanent error; I've given up. Sorry it didn't work out. Contact to luu@hcmut.edu.vn : 172.28.120.2 does not like recipient. Remote host said: 550 , Recipient unknown Giving up on 172.28.120.2. --- Below this line is a copy of the message. Return-Path: Received: (qmail 28823 invoked from network); 29 May 2010 05:22:23 -0000 Received: from unknown (HELO vnuserv.vnuhcm.edu.vn) ([172.16.1.2]) (envelope-sender ) by hcmut.edu.vn (qmail-ldap-1.03) with SMTP for ; 29 May 2010 05:22:23 -0000 Received: from oss.sgi.com (localhost [113.167.65.22] (may be forged)) by vnuserv.vnuhcm.edu.vn (8.14.3/8.13.8) with ESMTP id o4T6pHYq009871 for ; Sat, 29 May 2010 13:51:18 +0700 Date: Sat, 29 May 2010 13:51:17 +0700 Message-Id: <201005290651.o4T6pHYq009871@vnuserv.vnuhcm.edu.vn> From: xfs@oss.sgi.com To: ntphu@sim.hcmut.edu.vn Subject: Delivery reports about your e-mail Content-Type: text/plain X-BK-MailScanner-OpenProtect-Information: Please contact the ISP for more information X-BK-MailScanner-OpenProtect: Found to be clean X-BK-MailScanner-OpenProtect-MCPCheck: X-BK-MailScanner-OpenProtect-SpamCheck: not spam, SpamAssassin (score=0.346, required 5, ALL_TRUSTED -1.44, BLANK_LINES_70_80 1.24, NO_REAL_NAME 0.55) X-BK-MailScanner-OpenProtect-From: xfs@oss.sgi.com Your mail 113.167.65.22:14912->172.16.1.2:25 contains contaminated file _Fromxfs_oss.sgi.com__Datexfs_oss.sgi.com__SubjDelivery_reports_about_your_e_mail_/_message.zip_/message.pif with virus Email-Worm.Win32.Mydoom.m, so it is dropped. -- This message has been scanned for viruses and dangerous content by OpenProtect(http://www.openprotect.com), and is believed to be clean. -- This message has been scanned for viruses and dangerous content by OpenProtect(http://www.openprotect.com), and is believed to be clean. From BATV+88ed5562ccd8816fb789+2470+infradead.org+hch@bombadil.srs.infradead.org Sat May 29 04:47:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4T9ltmQ021026 for ; Sat, 29 May 2010 04:47:56 -0500 X-ASG-Debug-ID: 1275126620-2efb01f20000-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 6552138362F; Sat, 29 May 2010 02:50:20 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id V8yAkejvuBSjgFgf; Sat, 29 May 2010 02:50:20 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OIIgN-0006Hd-6h; Sat, 29 May 2010 09:50:19 +0000 Date: Sat, 29 May 2010 05:50:19 -0400 From: Christoph Hellwig To: Alex Elder Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: improve xfs_isilocked Subject: Re: [PATCH] xfs: improve xfs_isilocked Message-ID: <20100529095019.GA18859@infradead.org> References: <20100527190533.GB16102@infradead.org> <1275075653.2302.38.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1275075653.2302.38.camel@doink> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1275126620 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 28, 2010 at 02:40:53PM -0500, Alex Elder wrote: > On Thu, 2010-05-27 at 15:05 -0400, Christoph Hellwig wrote: > > Use rwsem_is_locked to make the assertations for shared locks work. > > So you're changing it so it answers "yes it's locked" > even it it's only a read lock now, right? If XFS_ILOCK_SHARED/XFS_IOLOCK_SHARED are in the flags we'll answer yes it's locked for a read lock now, indeed. > Previously it was basically (once each for ilock and > iolock): "If the exclusive flag is set, but there is no > writer, then it is not locked; otherwise it is." Yes. > Now it's "If the exclusive flag is set, but no writer, > it's not locked. Otherwise if the shared flag is > set it's locked if rwsem_is_locked() says we are. > Otherwise (ASSERT(0) and) it is not locked." Not exactly. Now it's: - if excl is set but shared isn't return true if mr_writer is set, else false - if shared is set either alone or together with excl return if it is locked in any way (rwsem_is_locked). Note that xfs_isilocked can be called like: ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); which means that either excl or shared is fine. - if either one or both of excl and shared are set and it's > That last part is wrong I think. It should be OK to > call xfs_isilocked() with neither flag set, in which > case the result should be 0. We can argue about removing the assert, but we currently don't and should't call xfs_isilocked wit ha 0 argument - it's rather pointless to do so. > And if the exclusive > flag is set, and there *is* a writer, it *is* locked, > so it should return 1. We do that right now. From mail@traffictractor.com Sat May 29 08:43:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=BAYES_50, RCVD_IN_BL_SPAMCOP_NET,URIBL_BLACK autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4TDhhm9032843 for ; Sat, 29 May 2010 08:43:44 -0500 X-ASG-Debug-ID: 1275140765-55ca02a10000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from moutng.kundenserver.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F00DD383E0F for ; Sat, 29 May 2010 06:46:06 -0700 (PDT) Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.187]) by cuda.sgi.com with ESMTP id nEnRamEhNM9T1Avq for ; Sat, 29 May 2010 06:46:06 -0700 (PDT) Received: from regina (host86-133-49-52.range86-133.btcentralplus.com [86.133.49.52]) by mrelayeu.kundenserver.de (node=mrbap0) with ESMTP (Nemesis) id 0LwXJH-1PQ9Ex410R-018MvO; Sat, 29 May 2010 15:46:05 +0200 Message-ID: <00ec390d$40327$1c7d6153135764@regina> Reply-To: "Sam L. Carl" From: "Sam L. Carl" To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: RE: Hey, Opt In Email Lists Give Away! Subject: RE: Hey, Opt In Email Lists Give Away! Date: Sat, 29 May 2010 14:46:03 +0100 MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: My e-mail client v1.0 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3028 X-Provags-ID: V01U2FsdGVkX193LNhR8o4GXZJGTZS5TsvKnsDZgevDoVlV1T/ yWcJedfsHepuK/q82Mif4cxCO7/9UgXT3xXM68ag24uUiZuYCo MvnDwPd9KgWNuxKDiIgXOQiJlpmR4IM X-Barracuda-Connect: moutng.kundenserver.de[212.227.126.187] X-Barracuda-Start-Time: 1275140766 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0483 1.0000 -1.7107 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.71 X-Barracuda-Spam-Status: No, SCORE=-1.71 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31064 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hey, You have to check this out if your a webmaster. http://www.traffictractor.com is giving away thousands of opt in emails. This is huge! Everyone is talking about it now. With these opt in email addresses you can do so much. It takes years and a lot of money to build a list from scratch but now you have the chance to grab a massive list. Use it for ezine, email, autoresponders, they will bring your website a huge amount of power, traffic and sales. You have to check it out at http://www.traffictractor.com All the best, Sam L. Carl From info@jambo.co.ke Sat May 29 09:26:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.9 required=5.0 tests=BAYES_50, FREEMAIL_FORGED_REPLYTO autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4TEQr94034693 for ; Sat, 29 May 2010 09:26:54 -0500 X-ASG-Debug-ID: 1275143354-793901fe0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.jambo.co.ke (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3BDCD383DA4 for ; Sat, 29 May 2010 07:29:15 -0700 (PDT) Received: from mail.jambo.co.ke (pop.jambo.co.ke [212.49.70.11]) by cuda.sgi.com with ESMTP id h1Y7udcTbjdTAeLA for ; Sat, 29 May 2010 07:29:15 -0700 (PDT) Received: from mail.jambo.co.ke (mail.jambo.co.ke [127.0.0.1]) by mail.jambo.co.ke (mail) with ESMTP id AB6E2972EB8; Sat, 29 May 2010 17:34:48 +0300 (EAT) Received: from 109.169.41.23 (SquirrelMail authenticated user matuto) by mail.jambo.co.ke with HTTP; Sat, 29 May 2010 17:34:48 +0300 (EAT) Message-ID: <4e520050256feb1959fba6c017af0b06.squirrel@mail.jambo.co.ke> Date: Sat, 29 May 2010 17:34:48 +0300 (EAT) X-ASG-Orig-Subj: Technical Support Subject: Technical Support From: "Technical Support" Reply-To: TechnicalSupport@live.com User-Agent: SquirrelMail/1.4.16 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-jambo-MailScanner-Information: Please contact Jambo Telkom Tech(support@jambo.co.ke) for more information X-MailScanner-ID: AB6E2972EB8.7F195 X-jambo-MailScanner: Found to Have No Virus Infection X-jambo-MailScanner-SpamCheck: not spam, SpamAssassin (cached, score=-1.3, required 5, ALL_TRUSTED -1.80, BAYES_00 0.50) X-jambo-MailScanner-From: info@jambo.co.ke X-jambo-MailScanner-To: 9@nursing.ufl.edu, afloresc711@peds.ufl.edu, alcdist@pacbell.net, amlan@phys.ufl.edu, andresen@phhp.ufl.edu, angeljg@ortho.ufl.edu, bdavidson@pdn.net, bhart@phhp.ufl.edu, bova@neurosurgery.ufl.edu, brentca@phhp.ufl.edu, capencl@peds.ufl.edu, cms528@phhp.ufl.edu, colleeng@phhp.ufl.edu, corissac@phhp.ufl.edu, crawford@pathology.ufl.edu, crichmond@phhp.ufl.edu, ddede@phhp.ufl.edu, dellpc@ortho.ufl.edu, djanicke@phhp.ufl.edu, dlanford@phhp.ufl.edu, drumond@peds.ufl.edu, elizdavi@peds.ufl.edu, gearepf@ortho.ufl.edu, info@perc.ufl.edu, jacobmj@ortho.ufl.edu, jcc5005n@peoplepc.com, jean.cibula@neurology.ufl.edu, jhj@phhp.ufl.edu, lindsayc@peds.ufl.edu, linux-xfs@oss.sgi.com, lisa.aenlle@neurology.ufl.edu, misc@openbsd.org, mlb27@phhp.ufl.edu, mpalazuelos@perc.ufl.edu, msammy@phhp.ufl.edu, nalusemb@phhp.ufl.edu, nblevins@phhp.ufl.edu, nettiepa@phhp.ufl.edu, nick@panjewelers.com, ot-info@phhp.ufl.edu, pablo.rios@neurology.ufl.edu, pegneil@phhp.ufl.edu, pye@okstate.edu, rachelle.stephen@neurology.ufl.edu, rbauer@phhp.ufl.edu, rdonnelly@phhp.ufl.edu, redacted@oryx.com, rsimmons@pky.ufl.edu, scipio@phhp.ufl.edu, sdschaf@nursing.ufl.edu, sheaton@phhp.ufl.edu, slande@phhp.ufl.edu, smccoy@pky.ufl.edu, stevean@ortho.ufl.edu, stewaml@ortho.ufl.edu, strukam@ortho.ufl.edu, webmaster@phys.ufl.edu, weissmd@peds.ufl.edu, windsong@phonewave.net, xyzsmith@phil.ufl.edu X-Barracuda-Connect: pop.jambo.co.ke[212.49.70.11] X-Barracuda-Start-Time: 1275143356 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5057 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 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.2, rules version 3.2.2.31068 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean You have exceeded your email account storage limit of 20mb. Click the below link to upgrade your email quota. http://www.webmail-techsupport.us.ms/ Technical Support 192.168.0.1 ---------------------------------------------- This message has been scanned for viruses and dangerous content by Jambo MailScanner, and is believed to be clean. --------------------------------------------- "easy access to the world" From michael.monnerie@is.it-management.at Sun May 30 03:53:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4U8rM6g089221 for ; Sun, 30 May 2010 03:53:22 -0500 X-ASG-Debug-ID: 1275209745-5ec401440000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 88F67384C23 for ; Sun, 30 May 2010 01:55:45 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id RmMA4DeVARUT5EJE for ; Sun, 30 May 2010 01:55:45 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 43CA4800184 for ; Sun, 30 May 2010 10:55:44 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id F3DC883C825 for ; Sun, 30 May 2010 10:55:43 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: puzzling error: XenServer, LVM and XFS Subject: Re: puzzling error: XenServer, LVM and XFS Date: Sun, 30 May 2010 10:55:43 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-vanilla; KDE/4.3.5; x86_64; ; ) References: <201005270857.39048@zmi.at> <20100527115153.GB13112@infradead.org> In-Reply-To: <20100527115153.GB13112@infradead.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1719874.pVEGPVWJrK"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005301055.43430@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1275209746 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.2, rules version 3.2.2.31138 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1719874.pVEGPVWJrK Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Donnerstag, 27. Mai 2010 Christoph Hellwig wrote: > This looks like the Xen block device code is buggy and doesn't handle > the I/O pattern XFS throws at it. A sector 0 error during mount > usually is the superblock barrier test write. To verify that > assumptions try mounting the XFS filesystems with -o nobarrier and > see if it goes away. Note that this is only for testing, and I > would not recommend it for production use. If it makes the error go > away please file a bug with the Xen guys to fix their barrier > support by either implementing it properly or not advertizing it. =20 You're right! As this does not happen with normal partitions but only=20 LVM volumes, there must be some problem in the combination of XenServer,=20 LVM and XFS. There is nothing I can do to report this to Citrix, at least I didn't=20 find a bug report facility for that, so it won't be fixed but now we=20 know it. This was XenServer 5.5 =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart1719874.pVEGPVWJrK Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkwCKA8ACgkQzhSR9xwSCbTt6ACgopcSvsRgHRiG4ojF3tU4TvlY P3sAn00WqWwuNyQuyjwDKVBxBDSBsFTM =KyR2 -----END PGP SIGNATURE----- --nextPart1719874.pVEGPVWJrK-- From michael.monnerie@is.it-management.at Sun May 30 03:58:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4U8w0VH089455 for ; Sun, 30 May 2010 03:58:00 -0500 X-ASG-Debug-ID: 1275210024-5ec8013c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8BC81384CA8 for ; Sun, 30 May 2010 02:00:24 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id Vb51QWzVjQkQLlVC for ; Sun, 30 May 2010 02:00:24 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id AF3CF800184 for ; Sun, 30 May 2010 11:00:23 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 6416483C825 for ; Sun, 30 May 2010 11:00:23 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: puzzling error: XenServer, LVM and XFS Subject: Re: puzzling error: XenServer, LVM and XFS Date: Sun, 30 May 2010 11:00:22 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-vanilla; KDE/4.3.5; x86_64; ; ) References: <201005270857.39048@zmi.at> <20100527115153.GB13112@infradead.org> In-Reply-To: <20100527115153.GB13112@infradead.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1648402.nkTk5fVA1n"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201005301100.22827@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1275210025 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0004 1.0000 -2.0187 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.2, rules version 3.2.2.31138 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1648402.nkTk5fVA1n Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Donnerstag, 27. Mai 2010 Christoph Hellwig wrote: > This looks like the Xen block device code is buggy and doesn't handle > the I/O pattern XFS throws at it. A sector 0 error during mount > usually is the superblock barrier test write. One strange thing I want to mention: This doesn't only happen during=20 mount, but also during runtime: [272445.900691] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272445.900959] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272445.900966] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272445.901149] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272445.906411] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272445.906693] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272445.906700] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272445.906885] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272445.924679] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272445.924948] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272445.924956] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272445.925111] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272447.543881] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272447.544198] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272447.544205] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272447.544354] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272447.548822] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272447.549069] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272447.549077] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272447.549226] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272449.264465] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272449.264808] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272449.264816] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272449.265007] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272449.270708] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272449.270950] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272449.270958] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272449.271107] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.481089] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.481360] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.481368] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.481646] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.484787] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.485069] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.485077] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.485220] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.504376] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.504633] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.504642] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.504790] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.505045] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.505274] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.505281] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.505425] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.512789] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.513154] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.513162] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.513309] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.530959] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.531352] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.531361] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272450.531543] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.173596] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.173887] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.173896] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.174055] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.175007] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.175268] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.175275] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.175443] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.175815] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.176056] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.176063] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.176221] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.176793] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.177010] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.177016] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.177198] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.559967] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.560240] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.560247] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.560420] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.565146] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.565408] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.565415] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272452.565581] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272454.296089] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272454.296357] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272454.296365] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272454.296523] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272454.301814] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272454.302083] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272454.302091] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272454.302277] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272457.575577] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272457.575824] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272457.575832] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272457.575974] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272457.576165] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272457.576403] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272457.576410] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272457.576552] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272457.580690] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272457.580981] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272457.580989] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272457.581186] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272459.343053] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272459.343330] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272459.343338] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272459.343521] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272459.343750] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272459.344086] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272459.344093] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272459.344236] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272459.348876] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272459.349152] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272459.349159] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272459.349357] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.217232] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.217530] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.217539] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.217719] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.218443] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.218712] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.218720] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.218887] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.219677] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.219943] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.219982] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.220138] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.592004] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.592285] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.592293] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.592486] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.597265] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.597531] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.597539] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272462.597706] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272464.375703] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272464.375992] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272464.376000] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272464.376157] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272464.381090] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272464.381385] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272464.381392] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272464.381585] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272467.608382] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272467.608671] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272467.608678] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272467.608862] end_request: I/O error, dev xvdb, sector 0 = = = =20 [272467.613789] end_request: I/O error, dev xvdb, sector 0 = = = =20 Does XFS always recheck for barriers? Or is it because I specified=20 "barrier" as a mount option, but it doesn't work and XFS didn't detect=20 it doesn't work? =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart1648402.nkTk5fVA1n Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkwCKSYACgkQzhSR9xwSCbSZpACg4Tlr6fgzItE0EjhEE3dG4PAD qFMAoMsaVnpMwey9DU93HB7Bm2SAKf7S =jLFA -----END PGP SIGNATURE----- --nextPart1648402.nkTk5fVA1n-- From SRS0+jKn/+89+fromorbit.com=david@internode.on.net Sun May 30 18:06:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4UN6sS7131537 for ; Sun, 30 May 2010 18:06:54 -0500 X-ASG-Debug-ID: 1275261086-0b8c028a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 36F1DA9311E for ; Sun, 30 May 2010 16:11:27 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id NIYSfB5CH8a67MNo for ; Sun, 30 May 2010 16:11:27 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26063959-1927428 for multiple; Mon, 31 May 2010 08:39:16 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OIrd5-00074c-Bo; Mon, 31 May 2010 09:09:15 +1000 Date: Mon, 31 May 2010 09:09:15 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: remove lazy per-AG initialization Subject: Re: [PATCH] xfs: remove lazy per-AG initialization Message-ID: <20100530230915.GA13732@dastard> References: <20100528175108.GA9421@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100528175108.GA9421@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1275261089 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.2, rules version 3.2.2.31186 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 28, 2010 at 01:51:08PM -0400, Christoph Hellwig wrote: > Historically XFS initializes the allocator / inode allocator per-AG > lazily, that is the first time this information is required. For > filesystems that use lazy superblock counters (which is the default now) > we already have to walk all AGs to initialize the superblock counters > on an unclean shutdown. Which is not common, so isn't frequently triggered in the normal mount process. The reason for the lazy initialisation is to speed the mount process up when there are thousands of AGs. That is, we avoid thousands of serialised IOs in the mount path. Have you checked to see what the impact is on the clean mount execution time is on such a filesystem? FWIW, in the case of an unclean shutdown, we are already on the slow path due to log recovery so adding IO to read all the headers it not such a big deal as they have probably been read in during replay, anyway. > This patch generalizes that code so that we > always initialize the per-AG data on mount, and also during growfs so > that we can remove all the special case code in the fastpath which > couldn't assume that the per-AG data is already initialized. I like the cleanup, but I'm not sure that potentially adding tens of seconds to the time to mount a really large filesystem is a good tradeoff... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+92Bm+0+fromorbit.com=david@internode.on.net Mon May 31 01:37:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4V6bH8D152366 for ; Mon, 31 May 2010 01:37:17 -0500 X-ASG-Debug-ID: 1275287980-333302790000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DF5031B6479D for ; Sun, 30 May 2010 23:39:41 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id tloDHODMcI9yLv82 for ; Sun, 30 May 2010 23:39:41 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26201922-1927428 for multiple; Mon, 31 May 2010 16:09:40 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OIyew-0007Rg-Bx; Mon, 31 May 2010 16:39:38 +1000 Date: Mon, 31 May 2010 16:39:38 +1000 From: Dave Chinner To: Nick Piggin Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100531063938.GE1395@dastard> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> <20100527063523.GJ22536@laptop> <20100527224034.GO12087@dastard> <20100528051924.GZ22536@laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100528051924.GZ22536@laptop> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1275287982 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.2, rules version 3.2.2.31215 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, May 28, 2010 at 03:19:24PM +1000, Nick Piggin wrote: > On Fri, May 28, 2010 at 08:40:34AM +1000, Dave Chinner wrote: > > On Thu, May 27, 2010 at 04:35:23PM +1000, Nick Piggin wrote: > > > But we can think of inodes that are only in use by unused (and aged) > > > dentries as effectively unused themselves. So this sequence under > > > estimates how many inodes to scan. This could bias pressure against > > > dcache I'd think, especially considering inodes are far larger than > > > dentries. Maybe require 2 passes to get the inodes unused inthe > > > first pass. > > > > It's self-balancing - it trends towards an equal number of unused > > dentries and inodes in the caches. Yes, it will tear down more > > dentries at first, but we need to do that to be able to reclaim > > inodes. > > But then it doesn't scan enough inodes on the inode pass. We don't get a single shrinker call - we get batches of them fo each shrinker. The shrinker determines how many objects to scan in the cache, and that only changes for each shrinker to call based on the the shrinker->seeks and the number of objects in the cache. Once the number is decided, then the shrinker gets batches of reclaim to operate on. Fundamentally, the current shrinker will ask for the same percentage of each cache to be scanned - if it decides to scan 20% of the dentry cache, it will also decide to scan 20% of the inode cache Hence what the inode shrinker is doing is scanning 20% of the inodes freed by the dcache shrinker. In rough numbers, say we have 100k dentries, and the shrinker calculates it needs to scan 20% of the caches to reclaim them, the current code will end up with: unused dentries unused inodes before 100k 0 after dentry 80k 20k after inode 80k 16k So we get 20k dentries freed and 4k inodes freed on that shrink_slab pass. To contrast this against the code I proposed, I'll make a couple of simplicfications to avoid hurting my brain. That is, I'll assume SHRINK_BATCH=100 (rather than 128) and forgetting about rounding errors. With this, the algorithm I encoded gives roughly the following for a 20% object reclaim: number of batches = 20k / 100 = 200 Unused dentries+inodes dentries inodes before 100k 100k 0 batch 1 100k 99900 100 batch 2 100k 99800 200 .... batch 10 100k 99000 1000 batch 20 99990 98010 1990 batch 30 99980 97030 2950 batch 50 99910 95100 4810 batch 60 99860 94150 5710 ..... batch 200 98100 81900 16200 And so (roughly) we see that the number of inodes being reclaim per set of 10 batches roughly equals the (batch number - 10). Hence over 200 batches, we can expect to see roughly 190 + 180 + ... + 10 inodes reclaimed. That is 1900 inodes. Similarly for dentries, we get roughly 1000 + 990 + 980 + ... 810 dentries reclaimed - 18,100 in total. In other words, we have roughly 18k dentries and 1.9k inodes reclaimed for the code I wrote new algorithm. That does mean it initially attempts to reclaim dentries faster than the current code, but as the number of unused inodes increases, this comes back to parity with the current code and we end up with a 1:1 reclaim ratio. This is good behaviour - dentries are cheap to reconstruct from the inode cache, and we should hold onto the inode cache as much as possible. i.e. we should reclaim them more aggressively only if there is sustained pressure on the superblock and that is what the above algorithm does. > > â„«s reclaim progresses the propotion of inodes increases, so > > the amount of inodes reclaimed increases. > > > > Basically this is a recognition that the important cache for > > avoiding IO is the inode cache, not he dentry cache. Once the inode > > You can bias against the dcache using multipliers. Multipliers are not self-balancing, and generally just amplify any imbalance an algorithm tends towards. The vfs_cache_pressure multiplier is a shining example of this kind of utterly useless knob... > > > Part of the problem is the funny shrinker API. > > > > > > The right way to do it is to change the shrinker API so that it passes > > > down the lru_pages and scanned into the callback. From there, the > > > shrinkers can calculate the appropriate ratio of objects to scan. > > > No need for 2-call scheme, no need for shrinker->seeks, and the > > > ability to calculate an appropriate ratio first for dcache, and *then* > > > for icache. > > > > My only concern about this is that exposes the inner workings of the > > shrinker and mm subsystem to code that simply doesn't need to know > > about it. > > It's just providing a ratio. The shrinkers allready know they are > scanning based on a ratio of pagecache scanned. Sure, but the shrinkers are just a simple mechanism for implementing VM policy decisions. IMO reclaim policy decisions should not be pushed down and replicated in every one of these reclaim mechanisms. > But shrinkers are very subsystem specific. And as such should concentrate on getting their subsystem reclaim correct, not have to worry about implementing VM policy calculations... Cheers, Dave. -- Dave Chinner david@fromorbit.com From npiggin@suse.de Mon May 31 02:26:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4V7QWYo154232 for ; Mon, 31 May 2010 02:26:32 -0500 X-ASG-Debug-ID: 1275291068-187303cf0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.suse.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EAEA012A569B for ; Mon, 31 May 2010 00:31:08 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id jSmhZnxcAf3LjX5R for ; Mon, 31 May 2010 00:31:08 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 51FD3457F0; Mon, 31 May 2010 09:28:53 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id 26DC229818; Mon, 31 May 2010 17:28:50 +1000 (EST) Date: Mon, 31 May 2010 17:28:50 +1000 From: Nick Piggin To: Dave Chinner Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Subject: Re: [PATCH 3/5] superblock: introduce per-sb cache shrinker infrastructure Message-ID: <20100531072850.GB9453@laptop> References: <1274777588-21494-1-git-send-email-david@fromorbit.com> <1274777588-21494-4-git-send-email-david@fromorbit.com> <20100527063523.GJ22536@laptop> <20100527224034.GO12087@dastard> <20100528051924.GZ22536@laptop> <20100531063938.GE1395@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100531063938.GE1395@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1275291069 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 04:39:38PM +1000, Dave Chinner wrote: > On Fri, May 28, 2010 at 03:19:24PM +1000, Nick Piggin wrote: > > On Fri, May 28, 2010 at 08:40:34AM +1000, Dave Chinner wrote: > > > On Thu, May 27, 2010 at 04:35:23PM +1000, Nick Piggin wrote: > > > > But we can think of inodes that are only in use by unused (and aged) > > > > dentries as effectively unused themselves. So this sequence under > > > > estimates how many inodes to scan. This could bias pressure against > > > > dcache I'd think, especially considering inodes are far larger than > > > > dentries. Maybe require 2 passes to get the inodes unused inthe > > > > first pass. > > > > > > It's self-balancing - it trends towards an equal number of unused > > > dentries and inodes in the caches. Yes, it will tear down more > > > dentries at first, but we need to do that to be able to reclaim > > > inodes. > > > > But then it doesn't scan enough inodes on the inode pass. > > We don't get a single shrinker call - we get batches of them fo each > shrinker. OK fair point. However [...] > In other words, we have roughly 18k dentries and 1.9k inodes > reclaimed for the code I wrote new algorithm. That does mean it > initially attempts to reclaim dentries faster than the current code, but > as the number of unused inodes increases, this comes back to parity > with the current code and we end up with a 1:1 reclaim ratio. > > This is good behaviour - dentries are cheap to reconstruct from the > inode cache, and we should hold onto the inode cache as much as > possible. i.e. we should reclaim them more aggressively only if > there is sustained pressure on the superblock and that is what the > above algorithm does. I prefer just to keep changes to a minimum and split into seperate patches (each with at least basic test or two showing no regression). As-is you're already changing global inode/dentry passes into per sb inode and dentry passes. I think it can only be a good thing for that changeset if other changes are minimised. Then if it is so obviously good behaviour to reduce dcache pressure, it should be easy to justify that too. > > > â„«s reclaim progresses the propotion of inodes increases, so > > > the amount of inodes reclaimed increases. > > > > > > Basically this is a recognition that the important cache for > > > avoiding IO is the inode cache, not he dentry cache. Once the inode > > > > You can bias against the dcache using multipliers. > > Multipliers are not self-balancing, and generally just amplify any > imbalance an algorithm tends towards. The vfs_cache_pressure > multiplier is a shining example of this kind of utterly useless > knob... Well you can also bias against the dcache with any other means, including the change you've made here. My main point I guess is that it should not be in the same as this patchset (or at least an individual patch). > > > > Part of the problem is the funny shrinker API. > > > > > > > > The right way to do it is to change the shrinker API so that it passes > > > > down the lru_pages and scanned into the callback. From there, the > > > > shrinkers can calculate the appropriate ratio of objects to scan. > > > > No need for 2-call scheme, no need for shrinker->seeks, and the > > > > ability to calculate an appropriate ratio first for dcache, and *then* > > > > for icache. > > > > > > My only concern about this is that exposes the inner workings of the > > > shrinker and mm subsystem to code that simply doesn't need to know > > > about it. > > > > It's just providing a ratio. The shrinkers allready know they are > > scanning based on a ratio of pagecache scanned. > > Sure, but the shrinkers are just a simple mechanism for implementing > VM policy decisions. IMO reclaim policy decisions should not be > pushed down and replicated in every one of these reclaim mechanisms. Not really. The VM doesn't know about any of those. They are just told to provide a ratio and some scanning based on some abstract cost. The VM doesn't know anything about usage patterns, inuse vs unused objects, exactly how their LRU algorithms are supposed to work, etc. There is very little policy decision by the VM in the shrinkers. > > But shrinkers are very subsystem specific. > > And as such should concentrate on getting their subsystem reclaim > correct, not have to worry about implementing VM policy > calculations... Clearly they wouldn't with what I was proposing. And the result would be much more flexible and also gives the shrinkers more information. From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6WZw178884 for ; Mon, 31 May 2010 11:06:33 -0500 X-ASG-Debug-ID: 1275322139-26ee03140000-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 4F53B14678D9 for ; Mon, 31 May 2010 09:08:59 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id oY0X0wXaZgsjHUf8 for ; Mon, 31 May 2010 09:08:59 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xu-0000ng-TU for xfs@oss.sgi.com; Mon, 31 May 2010 16:08:58 +0000 Message-Id: <20100531160727.842750532@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:27 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 00/17] pending patches Subject: [PATCH 00/17] pending patches 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: 1275322139 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Here's my list of pending patches. Ordering them is getting a bit difficult as various patches that have been out of a while haven't been commited yet. Note that some patches require Dave's [PATCH] xfs: fix race in inode cluster freeing failing to stale inodes applies first. That patch is a clear candidate for something that should go to Linus ASAP IHMO. From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6XSe178891 for ; Mon, 31 May 2010 11:06:33 -0500 X-ASG-Debug-ID: 1275322272-38a3009a0000-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 049EE157FB5A for ; Mon, 31 May 2010 09:11:12 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id v9X6iDnOrsDSNtyi for ; Mon, 31 May 2010 09:11:12 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xv-0000qR-9M for xfs@oss.sgi.com; Mon, 31 May 2010 16:08:59 +0000 Message-Id: <20100531160859.184576507@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:29 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 02/17] xfs: skip writeback from reclaim context Subject: [PATCH 02/17] xfs: skip writeback from reclaim context References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-disable-allocations-from-reclaim 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: 1275322273 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Allowing writeback from reclaim context causes massive problems with stack overflows as we can call into the writeback code which tends to be a heavy stack user both in the generic code and XFS from random contexts that perform memory allocations. Follow the example of btrfs (and in slightly different form ext4) and refuse to write out data from reclaim context. This issue should really be handled by the VM so that we can tune better for this case, but until we get it sorted out there we have to hack around this in each filesystem with a complex writeback path. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-05-29 18:09:01.713253891 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-05-29 18:11:46.847261713 +0200 @@ -1333,6 +1333,21 @@ xfs_vm_writepage( trace_xfs_writepage(inode, page, 0); /* + * Refuse to write the page out if we are called from reclaim context. + * + * This is primarily to avoid stack overflows when called from deep + * used stacks in random callers for direct reclaim, but disabling + * reclaim for kswap is a nice side-effect as kswapd causes rather + * suboptimal I/O patters, too. + * + * This should really be done by the core VM, but until that happens + * filesystems like XFS, btrfs and ext4 have to take care of this + * by themselves. + */ + if (current->flags & PF_MEMALLOC) + goto out_fail; + + /* * We need a transaction if: * 1. There are delalloc buffers on the page * 2. The page is uptodate and we have unmapped buffers From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6W85178889 for ; Mon, 31 May 2010 11:06:33 -0500 X-ASG-Debug-ID: 1275322139-16f401d40000-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 D5B89387867 for ; Mon, 31 May 2010 09:08:59 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id b8cNd248ubsXuNNw for ; Mon, 31 May 2010 09:08:59 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xv-0000rd-HU for xfs@oss.sgi.com; Mon, 31 May 2010 16:08:59 +0000 Message-Id: <20100531160859.397431345@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:30 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 03/17] xfs: improve xfs_isilocked Subject: [PATCH 03/17] xfs: improve xfs_isilocked References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-improve-mrlock-debug 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: 1275322139 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Use rwsem_is_locked to make the assertations for shared locks work. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-05-29 18:09:02.083254031 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-05-29 18:11:58.194003577 +0200 @@ -741,30 +741,24 @@ xfs_ilock_demote( } #ifdef DEBUG -/* - * Debug-only routine, without additional rw_semaphore APIs, we can - * now only answer requests regarding whether we hold the lock for write - * (reader state is outside our visibility, we only track writer state). - * - * Note: this means !xfs_isilocked would give false positives, so don't do that. - */ int xfs_isilocked( xfs_inode_t *ip, uint lock_flags) { - if ((lock_flags & (XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)) == - XFS_ILOCK_EXCL) { - if (!ip->i_lock.mr_writer) - return 0; + if (lock_flags & (XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)) { + if (!(lock_flags & XFS_ILOCK_SHARED)) + return !!ip->i_lock.mr_writer; + return rwsem_is_locked(&ip->i_lock.mr_lock); } - if ((lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) == - XFS_IOLOCK_EXCL) { - if (!ip->i_iolock.mr_writer) - return 0; + if (lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) { + if (!(lock_flags & XFS_IOLOCK_SHARED)) + return !!ip->i_iolock.mr_writer; + return rwsem_is_locked(&ip->i_iolock.mr_lock); } - return 1; + ASSERT(0); + return 0; } #endif From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6Y3X178928 for ; Mon, 31 May 2010 11:06:34 -0500 X-ASG-Debug-ID: 1275322141-16f401d50000-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 77A1C387869 for ; Mon, 31 May 2010 09:09:01 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 8YIi0Pa2iE8KoNdk for ; Mon, 31 May 2010 09:09:01 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xx-00011J-3j for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:01 +0000 Message-Id: <20100531160901.036824012@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:36 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 09/17] xfs: give li_cb callbacks the correct prototype Subject: [PATCH 09/17] xfs: give li_cb callbacks the correct prototype References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-fix-li_cb-types 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: 1275322141 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Stop the function pointer casting madness and give all the li_cb instances correct prototype. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/quota/xfs_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot.c 2010-05-29 18:12:09.768255567 +0200 +++ xfs/fs/xfs/quota/xfs_dquot.c 2010-05-29 18:16:52.004003788 +0200 @@ -54,8 +54,6 @@ flush lock - ditto. */ -STATIC void xfs_qm_dqflush_done(xfs_buf_t *, xfs_dq_logitem_t *); - #ifdef DEBUG xfs_buftarg_t *xfs_dqerror_target; int xfs_do_dqerror; @@ -1131,6 +1129,46 @@ xfs_qm_dqrele( xfs_qm_dqput(dqp); } +/* + * This is the dquot flushing I/O completion routine. It is called + * from interrupt level when the buffer containing the dquot is + * flushed to disk. It is responsible for removing the dquot logitem + * from the AIL if it has not been re-logged, and unlocking the dquot's + * flush lock. This behavior is very similar to that of inodes.. + */ +STATIC void +xfs_qm_dqflush_done( + struct xfs_buf *bp, + struct xfs_log_item *lip) +{ + xfs_dq_logitem_t *qip = (struct xfs_dq_logitem *)lip; + xfs_dquot_t *dqp = qip->qli_dquot; + struct xfs_ail *ailp = lip->li_ailp; + + /* + * We only want to pull the item from the AIL if its + * location in the log has not changed since we started the flush. + * Thus, we only bother if the dquot's lsn has + * not changed. First we check the lsn outside the lock + * since it's cheaper, and then we recheck while + * holding the lock before removing the dquot from the AIL. + */ + if ((lip->li_flags & XFS_LI_IN_AIL) && + lip->li_lsn == qip->qli_flush_lsn) { + + /* xfs_trans_ail_delete() drops the AIL lock. */ + spin_lock(&ailp->xa_lock); + if (lip->li_lsn == qip->qli_flush_lsn) + xfs_trans_ail_delete(ailp, lip); + else + spin_unlock(&ailp->xa_lock); + } + + /* + * Release the dq's flush lock since we're done with it. + */ + xfs_dqfunlock(dqp); +} /* * Write a modified dquot to disk. @@ -1212,8 +1250,9 @@ xfs_qm_dqflush( * Attach an iodone routine so that we can remove this dquot from the * AIL and release the flush lock once the dquot is synced to disk. */ - xfs_buf_attach_iodone(bp, (void(*)(xfs_buf_t *, xfs_log_item_t *)) - xfs_qm_dqflush_done, &(dqp->q_logitem.qli_item)); + xfs_buf_attach_iodone(bp, xfs_qm_dqflush_done, + &dqp->q_logitem.qli_item); + /* * If the buffer is pinned then push on the log so we won't * get stuck waiting in the write for too long. @@ -1237,50 +1276,6 @@ xfs_qm_dqflush( } -/* - * This is the dquot flushing I/O completion routine. It is called - * from interrupt level when the buffer containing the dquot is - * flushed to disk. It is responsible for removing the dquot logitem - * from the AIL if it has not been re-logged, and unlocking the dquot's - * flush lock. This behavior is very similar to that of inodes.. - */ -/*ARGSUSED*/ -STATIC void -xfs_qm_dqflush_done( - xfs_buf_t *bp, - xfs_dq_logitem_t *qip) -{ - xfs_dquot_t *dqp; - struct xfs_ail *ailp; - - dqp = qip->qli_dquot; - ailp = qip->qli_item.li_ailp; - - /* - * We only want to pull the item from the AIL if its - * location in the log has not changed since we started the flush. - * Thus, we only bother if the dquot's lsn has - * not changed. First we check the lsn outside the lock - * since it's cheaper, and then we recheck while - * holding the lock before removing the dquot from the AIL. - */ - if ((qip->qli_item.li_flags & XFS_LI_IN_AIL) && - qip->qli_item.li_lsn == qip->qli_flush_lsn) { - - /* xfs_trans_ail_delete() drops the AIL lock. */ - spin_lock(&ailp->xa_lock); - if (qip->qli_item.li_lsn == qip->qli_flush_lsn) - xfs_trans_ail_delete(ailp, (xfs_log_item_t*)qip); - else - spin_unlock(&ailp->xa_lock); - } - - /* - * Release the dq's flush lock since we're done with it. - */ - xfs_dqfunlock(dqp); -} - int xfs_qm_dqlock_nowait( xfs_dquot_t *dqp) Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2010-05-29 18:14:21.317046949 +0200 +++ xfs/fs/xfs/xfs_buf_item.c 2010-05-29 18:17:16.277004555 +0200 @@ -1079,15 +1079,14 @@ xfs_buf_error_relse( * It is called by xfs_buf_iodone_callbacks() above which will take * care of cleaning up the buffer itself. */ -/* ARGSUSED */ void xfs_buf_iodone( - xfs_buf_t *bp, - xfs_buf_log_item_t *bip) + struct xfs_buf *bp, + struct xfs_log_item *lip) { - struct xfs_ail *ailp = bip->bli_item.li_ailp; + struct xfs_ail *ailp = lip->li_ailp; - ASSERT(bip->bli_buf == bp); + ASSERT(BUF_ITEM(lip)->bli_buf == bp); xfs_buf_rele(bp); @@ -1101,6 +1100,6 @@ xfs_buf_iodone( * Either way, AIL is useless if we're forcing a shutdown. */ spin_lock(&ailp->xa_lock); - xfs_trans_ail_delete(ailp, (xfs_log_item_t *)bip); - xfs_buf_item_free(bip); + xfs_trans_ail_delete(ailp, lip); + xfs_buf_item_free(BUF_ITEM(lip)); } Index: xfs/fs/xfs/xfs_buf_item.h =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.h 2010-05-25 13:01:10.104254015 +0200 +++ xfs/fs/xfs/xfs_buf_item.h 2010-05-29 18:17:16.279048625 +0200 @@ -124,7 +124,7 @@ void xfs_buf_attach_iodone(struct xfs_bu void(*)(struct xfs_buf *, xfs_log_item_t *), xfs_log_item_t *); void xfs_buf_iodone_callbacks(struct xfs_buf *); -void xfs_buf_iodone(struct xfs_buf *, xfs_buf_log_item_t *); +void xfs_buf_iodone(struct xfs_buf *, struct xfs_log_item *); #ifdef XFS_TRANS_DEBUG void Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-05-29 18:17:08.230003507 +0200 +++ xfs/fs/xfs/xfs_inode.c 2010-05-29 18:17:15.205004416 +0200 @@ -1984,7 +1984,7 @@ xfs_ifree_cluster( if (lip->li_type == XFS_LI_INODE) { iip = (xfs_inode_log_item_t *)lip; ASSERT(iip->ili_logged == 1); - lip->li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) xfs_istale_done; + lip->li_cb = xfs_istale_done; xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn, &iip->ili_item.li_lsn); @@ -2051,9 +2051,8 @@ xfs_ifree_cluster( xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn, &iip->ili_item.li_lsn); - xfs_buf_attach_iodone(bp, - (void(*)(xfs_buf_t*,xfs_log_item_t*)) - xfs_istale_done, (xfs_log_item_t *)iip); + xfs_buf_attach_iodone(bp, xfs_istale_done, + &iip->ili_item); if (ip != free_ip) xfs_iunlock(ip, XFS_ILOCK_EXCL); @@ -3065,8 +3064,7 @@ xfs_iflush_int( * and unlock the inode's flush lock when the inode is * completely written to disk. */ - xfs_buf_attach_iodone(bp, (void(*)(xfs_buf_t*,xfs_log_item_t*)) - xfs_iflush_done, (xfs_log_item_t *)iip); + xfs_buf_attach_iodone(bp, xfs_iflush_done, &iip->ili_item); ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); ASSERT(XFS_BUF_IODONE_FUNC(bp) != NULL); Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-05-29 18:17:08.236004764 +0200 +++ xfs/fs/xfs/xfs_inode_item.c 2010-05-29 18:17:15.206003508 +0200 @@ -867,14 +867,14 @@ xfs_inode_item_destroy( * from the AIL if it has not been re-logged, and unlocking the inode's * flush lock. */ -/*ARGSUSED*/ void xfs_iflush_done( - xfs_buf_t *bp, - xfs_inode_log_item_t *iip) + struct xfs_buf *bp, + struct xfs_log_item *lip) { + struct xfs_inode_log_item *iip = INODE_ITEM(lip); xfs_inode_t *ip = iip->ili_inode; - struct xfs_ail *ailp = iip->ili_item.li_ailp; + struct xfs_ail *ailp = lip->li_ailp; /* * We only want to pull the item from the AIL if it is @@ -885,12 +885,11 @@ xfs_iflush_done( * the lock since it's cheaper, and then we recheck while * holding the lock before removing the inode from the AIL. */ - if (iip->ili_logged && - (iip->ili_item.li_lsn == iip->ili_flush_lsn)) { + if (iip->ili_logged && lip->li_lsn == iip->ili_flush_lsn) { spin_lock(&ailp->xa_lock); - if (iip->ili_item.li_lsn == iip->ili_flush_lsn) { + if (lip->li_lsn == iip->ili_flush_lsn) { /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, (xfs_log_item_t*)iip); + xfs_trans_ail_delete(ailp, lip); } else { spin_unlock(&ailp->xa_lock); } @@ -908,8 +907,6 @@ xfs_iflush_done( * Release the inode's flush lock since we're done with it. */ xfs_ifunlock(ip); - - return; } /* @@ -959,10 +956,10 @@ xfs_iflush_abort( void xfs_istale_done( - xfs_buf_t *bp, - xfs_inode_log_item_t *iip) + struct xfs_buf *bp, + struct xfs_log_item *lip) { - xfs_iflush_abort(iip->ili_inode); + xfs_iflush_abort(INODE_ITEM(lip)->ili_inode); } /* Index: xfs/fs/xfs/xfs_inode_item.h =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.h 2010-05-29 18:17:08.256254380 +0200 +++ xfs/fs/xfs/xfs_inode_item.h 2010-05-29 18:17:15.211004626 +0200 @@ -161,8 +161,8 @@ static inline int xfs_inode_clean(xfs_in extern void xfs_inode_item_init(struct xfs_inode *, struct xfs_mount *); extern void xfs_inode_item_destroy(struct xfs_inode *); -extern void xfs_iflush_done(struct xfs_buf *, xfs_inode_log_item_t *); -extern void xfs_istale_done(struct xfs_buf *, xfs_inode_log_item_t *); +extern void xfs_iflush_done(struct xfs_buf *, struct xfs_log_item *); +extern void xfs_istale_done(struct xfs_buf *, struct xfs_log_item *); extern void xfs_iflush_abort(struct xfs_inode *); extern int xfs_inode_item_format_convert(xfs_log_iovec_t *, xfs_inode_log_format_t *); Index: xfs/fs/xfs/xfs_trans_buf.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_buf.c 2010-05-29 18:12:27.256254730 +0200 +++ xfs/fs/xfs/xfs_trans_buf.c 2010-05-29 18:17:16.285032981 +0200 @@ -658,7 +658,7 @@ xfs_trans_log_buf(xfs_trans_t *tp, bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(atomic_read(&bip->bli_refcount) > 0); XFS_BUF_SET_IODONE_FUNC(bp, xfs_buf_iodone_callbacks); - bip->bli_item.li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*))xfs_buf_iodone; + bip->bli_item.li_cb = xfs_buf_iodone; trace_xfs_trans_log_buf(bip); @@ -815,12 +815,9 @@ xfs_trans_stale_inode_buf( ASSERT(atomic_read(&bip->bli_refcount) > 0); bip->bli_flags |= XFS_BLI_STALE_INODE; - bip->bli_item.li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) - xfs_buf_iodone; + bip->bli_item.li_cb = xfs_buf_iodone; } - - /* * Mark the buffer as being one which contains newly allocated * inodes. We need to make sure that even if this buffer is From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6WI5178886 for ; Mon, 31 May 2010 11:06:33 -0500 X-ASG-Debug-ID: 1275322139-1d2a01730000-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 AAFD1387865 for ; Mon, 31 May 2010 09:08:59 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Lq5GHzqCswge8UVC for ; Mon, 31 May 2010 09:08:59 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xv-0000ov-3s for xfs@oss.sgi.com; Mon, 31 May 2010 16:08:59 +0000 Message-Id: <20100531160858.981686872@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:28 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 01/17] xfs: remove done roadmap item from xfs-delayed-logging-design.txt Subject: [PATCH 01/17] xfs: remove done roadmap item from xfs-delayed-logging-design.txt References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-remove-roadmap-item 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: 1275322139 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Christoph Hellwig Index: xfs/Documentation/filesystems/xfs-delayed-logging-design.txt =================================================================== --- xfs.orig/Documentation/filesystems/xfs-delayed-logging-design.txt 2010-05-30 12:23:13.223254240 +0200 +++ xfs/Documentation/filesystems/xfs-delayed-logging-design.txt 2010-05-30 12:23:57.363005673 +0200 @@ -794,11 +794,6 @@ designed. Roadmap: -2.6.35 Inclusion in mainline as an experimental mount option - => approximately 2-3 months to merge window - => needs to be in xfs-dev tree in 4-6 weeks - => code is nearing readiness for review - 2.6.37 Remove experimental tag from mount option => should be roughly 6 months after initial merge => enough time to: From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6YdU178922 for ; Mon, 31 May 2010 11:06:34 -0500 X-ASG-Debug-ID: 1275322140-26f503050000-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 1B8D514678DD for ; Mon, 31 May 2010 09:09:00 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id MaX0K9vJDRI3TBsI for ; Mon, 31 May 2010 09:09:00 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xw-0000z3-NL for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:00 +0000 Message-Id: <20100531160900.602159529@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:34 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 07/17] xfs: merge iop_unpin_remove into iop_unpin Subject: [PATCH 07/17] xfs: merge iop_unpin_remove into iop_unpin References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-merge-IOP-remove 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: 1275322141 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The unpin_remove item operation instances always share most of the implementation with the respective unpin implementation. So instead of keeping two different entry points add a remove flag to the unpin operation and share the code more easily. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/quota/xfs_dquot_item.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot_item.c 2010-05-25 11:40:59.115285445 +0200 +++ xfs/fs/xfs/quota/xfs_dquot_item.c 2010-05-25 12:45:02.895004400 +0200 @@ -97,7 +97,8 @@ xfs_qm_dquot_logitem_pin( /* ARGSUSED */ STATIC void xfs_qm_dquot_logitem_unpin( - xfs_dq_logitem_t *logitem) + xfs_dq_logitem_t *logitem, + int remove) { xfs_dquot_t *dqp = logitem->qli_dquot; @@ -106,15 +107,6 @@ xfs_qm_dquot_logitem_unpin( wake_up(&dqp->q_pinwait); } -/* ARGSUSED */ -STATIC void -xfs_qm_dquot_logitem_unpin_remove( - xfs_dq_logitem_t *logitem, - xfs_trans_t *tp) -{ - xfs_qm_dquot_logitem_unpin(logitem); -} - /* * Given the logitem, this writes the corresponding dquot entry to disk * asynchronously. This is called with the dquot entry securely locked; @@ -318,9 +310,7 @@ static struct xfs_item_ops xfs_dquot_ite .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) xfs_qm_dquot_logitem_format, .iop_pin = (void(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_pin, - .iop_unpin = (void(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_unpin, - .iop_unpin_remove = (void(*)(xfs_log_item_t*, xfs_trans_t*)) - xfs_qm_dquot_logitem_unpin_remove, + .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_qm_dquot_logitem_unpin, .iop_trylock = (uint(*)(xfs_log_item_t*)) xfs_qm_dquot_logitem_trylock, .iop_unlock = (void(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_unlock, @@ -413,14 +403,7 @@ xfs_qm_qoff_logitem_pin(xfs_qoff_logitem */ /*ARGSUSED*/ STATIC void -xfs_qm_qoff_logitem_unpin(xfs_qoff_logitem_t *qf) -{ - return; -} - -/*ARGSUSED*/ -STATIC void -xfs_qm_qoff_logitem_unpin_remove(xfs_qoff_logitem_t *qf, xfs_trans_t *tp) +xfs_qm_qoff_logitem_unpin(xfs_qoff_logitem_t *qf, int remove) { return; } @@ -524,9 +507,7 @@ static struct xfs_item_ops xfs_qm_qoffen .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) xfs_qm_qoff_logitem_format, .iop_pin = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_pin, - .iop_unpin = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_unpin, - .iop_unpin_remove = (void(*)(xfs_log_item_t*,xfs_trans_t*)) - xfs_qm_qoff_logitem_unpin_remove, + .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_qm_qoff_logitem_unpin, .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_trylock, .iop_unlock = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_unlock, .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) @@ -545,9 +526,7 @@ static struct xfs_item_ops xfs_qm_qoff_l .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) xfs_qm_qoff_logitem_format, .iop_pin = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_pin, - .iop_unpin = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_unpin, - .iop_unpin_remove = (void(*)(xfs_log_item_t*,xfs_trans_t*)) - xfs_qm_qoff_logitem_unpin_remove, + .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_qm_qoff_logitem_unpin, .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_trylock, .iop_unlock = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_unlock, .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2010-05-25 12:43:47.926004470 +0200 +++ xfs/fs/xfs/xfs_buf_item.c 2010-05-25 12:45:02.901022489 +0200 @@ -388,20 +388,25 @@ xfs_buf_item_pin( * Also drop the reference to the buf item for the current transaction. * If the XFS_BLI_STALE flag is set and we are the last reference, * then free up the buf log item and unlock the buffer. + * + * If the remove flag is set we are called from uncommit in the + * forced-shutdown path. If that is true and the reference count on + * the log item is going to drop to zero we need to free the item's + * descriptor in the transaction. */ STATIC void xfs_buf_item_unpin( - xfs_buf_log_item_t *bip) + xfs_buf_log_item_t *bip, + int remove) { struct xfs_ail *ailp; - xfs_buf_t *bp; + xfs_buf_t *bp = bip->bli_buf; int freed; int stale = bip->bli_flags & XFS_BLI_STALE; - bp = bip->bli_buf; - ASSERT(bp != NULL); ASSERT(XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *) == bip); ASSERT(atomic_read(&bip->bli_refcount) > 0); + trace_xfs_buf_item_unpin(bip); freed = atomic_dec_and_test(&bip->bli_refcount); @@ -413,8 +418,26 @@ xfs_buf_item_unpin( ASSERT(!(XFS_BUF_ISDELAYWRITE(bp))); ASSERT(XFS_BUF_ISSTALE(bp)); ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); + trace_xfs_buf_item_unpin_stale(bip); + if (remove) { + /* + * We have to remove the log item from the transaction + * as we are about to release our reference to the + * buffer. If we don't, the unlock that occurs later + * in xfs_trans_uncommit() will ry to reference the + * buffer which we no longer have a hold on. + */ + xfs_trans_del_item(&bip->bli_item); + + /* + * Since the transaction no longer refers to the buffer, + * the buffer should no longer refer to the transaction. + */ + XFS_BUF_SET_FSPRIVATE2(bp, NULL); + } + /* * If we get called here because of an IO error, we may * or may not have the item on the AIL. xfs_trans_ail_delete() @@ -436,45 +459,6 @@ xfs_buf_item_unpin( } /* - * this is called from uncommit in the forced-shutdown path. - * we need to check to see if the reference count on the log item - * is going to drop to zero. If so, unpin will free the log item - * so we need to free the item's descriptor (that points to the item) - * in the transaction. - */ -STATIC void -xfs_buf_item_unpin_remove( - xfs_buf_log_item_t *bip, - xfs_trans_t *tp) -{ - /* will xfs_buf_item_unpin() call xfs_buf_item_relse()? */ - if ((atomic_read(&bip->bli_refcount) == 1) && - (bip->bli_flags & XFS_BLI_STALE)) { - /* - * yes -- We can safely do some work here and then call - * buf_item_unpin to do the rest because we are - * are holding the buffer locked so no one else will be - * able to bump up the refcount. We have to remove the - * log item from the transaction as we are about to release - * our reference to the buffer. If we don't, the unlock that - * occurs later in the xfs_trans_uncommit() will try to - * reference the buffer which we no longer have a hold on. - */ - ASSERT(XFS_BUF_VALUSEMA(bip->bli_buf) <= 0); - trace_xfs_buf_item_unpin_stale(bip); - - xfs_trans_del_item(&bip->bli_item); - - /* - * Since the transaction no longer refers to the buffer, the - * buffer should no longer refer to the transaction. - */ - XFS_BUF_SET_FSPRIVATE2(bip->bli_buf, NULL); - } - xfs_buf_item_unpin(bip); -} - -/* * This is called to attempt to lock the buffer associated with this * buf log item. Don't sleep on the buffer lock. If we can't get * the lock right away, return 0. If we can get the lock, take a @@ -669,9 +653,7 @@ static struct xfs_item_ops xfs_buf_item_ .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) xfs_buf_item_format, .iop_pin = (void(*)(xfs_log_item_t*))xfs_buf_item_pin, - .iop_unpin = (void(*)(xfs_log_item_t*))xfs_buf_item_unpin, - .iop_unpin_remove = (void(*)(xfs_log_item_t*, xfs_trans_t *)) - xfs_buf_item_unpin_remove, + .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_buf_item_unpin, .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_buf_item_trylock, .iop_unlock = (void(*)(xfs_log_item_t*))xfs_buf_item_unlock, .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) Index: xfs/fs/xfs/xfs_extfree_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_extfree_item.c 2010-05-25 12:43:47.938004470 +0200 +++ xfs/fs/xfs/xfs_extfree_item.c 2010-05-25 12:45:02.903023258 +0200 @@ -103,32 +103,8 @@ xfs_efi_item_pin(xfs_efi_log_item_t *efi * Here we coordinate with xfs_efi_cancel() to determine who gets to * free the EFI. */ -/*ARGSUSED*/ -STATIC void -xfs_efi_item_unpin(xfs_efi_log_item_t *efip) -{ - struct xfs_ail *ailp = efip->efi_item.li_ailp; - - spin_lock(&ailp->xa_lock); - if (efip->efi_flags & XFS_EFI_CANCELED) { - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); - xfs_efi_item_free(efip); - } else { - efip->efi_flags |= XFS_EFI_COMMITTED; - spin_unlock(&ailp->xa_lock); - } -} - -/* - * like unpin only we have to also clear the xaction descriptor - * pointing the log item if we free the item. This routine duplicates - * unpin because efi_flags is protected by the AIL lock. Freeing - * the descriptor and then calling unpin would force us to drop the AIL - * lock which would open up a race condition. - */ STATIC void -xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) +xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int remove) { struct xfs_ail *ailp = efip->efi_item.li_ailp; @@ -136,10 +112,8 @@ xfs_efi_item_unpin_remove(xfs_efi_log_it if (efip->efi_flags & XFS_EFI_CANCELED) { struct xfs_log_item *lip = &efip->efi_item; - /* - * free the xaction descriptor pointing to this item - */ - xfs_trans_del_item(lip); + if (remove) + xfs_trans_del_item(lip); /* xfs_trans_ail_delete() drops the AIL lock. */ xfs_trans_ail_delete(ailp, lip); @@ -223,9 +197,7 @@ static struct xfs_item_ops xfs_efi_item_ .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) xfs_efi_item_format, .iop_pin = (void(*)(xfs_log_item_t*))xfs_efi_item_pin, - .iop_unpin = (void(*)(xfs_log_item_t*))xfs_efi_item_unpin, - .iop_unpin_remove = (void(*)(xfs_log_item_t*, xfs_trans_t *)) - xfs_efi_item_unpin_remove, + .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_efi_item_unpin, .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_efi_item_trylock, .iop_unlock = (void(*)(xfs_log_item_t*))xfs_efi_item_unlock, .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) @@ -424,14 +396,7 @@ xfs_efd_item_pin(xfs_efd_log_item_t *efd */ /*ARGSUSED*/ STATIC void -xfs_efd_item_unpin(xfs_efd_log_item_t *efdp) -{ - return; -} - -/*ARGSUSED*/ -STATIC void -xfs_efd_item_unpin_remove(xfs_efd_log_item_t *efdp, xfs_trans_t *tp) +xfs_efd_item_unpin(xfs_efd_log_item_t *efdp, int remove) { return; } @@ -514,9 +479,7 @@ static struct xfs_item_ops xfs_efd_item_ .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) xfs_efd_item_format, .iop_pin = (void(*)(xfs_log_item_t*))xfs_efd_item_pin, - .iop_unpin = (void(*)(xfs_log_item_t*))xfs_efd_item_unpin, - .iop_unpin_remove = (void(*)(xfs_log_item_t*, xfs_trans_t*)) - xfs_efd_item_unpin_remove, + .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_efd_item_unpin, .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_efd_item_trylock, .iop_unlock = (void(*)(xfs_log_item_t*))xfs_efd_item_unlock, .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-05-25 11:40:59.225034362 +0200 +++ xfs/fs/xfs/xfs_inode_item.c 2010-05-25 12:45:02.915017599 +0200 @@ -544,10 +544,10 @@ xfs_inode_item_pin( * * Also wake up anyone in xfs_iunpin_wait() if the count goes to 0. */ -/* ARGSUSED */ STATIC void xfs_inode_item_unpin( - xfs_inode_log_item_t *iip) + xfs_inode_log_item_t *iip, + int remove) { struct xfs_inode *ip = iip->ili_inode; @@ -557,15 +557,6 @@ xfs_inode_item_unpin( wake_up(&ip->i_ipin_wait); } -/* ARGSUSED */ -STATIC void -xfs_inode_item_unpin_remove( - xfs_inode_log_item_t *iip, - xfs_trans_t *tp) -{ - xfs_inode_item_unpin(iip); -} - /* * This is called to attempt to lock the inode associated with this * inode log item, in preparation for the push routine which does the actual @@ -829,9 +820,7 @@ static struct xfs_item_ops xfs_inode_ite .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) xfs_inode_item_format, .iop_pin = (void(*)(xfs_log_item_t*))xfs_inode_item_pin, - .iop_unpin = (void(*)(xfs_log_item_t*))xfs_inode_item_unpin, - .iop_unpin_remove = (void(*)(xfs_log_item_t*, xfs_trans_t*)) - xfs_inode_item_unpin_remove, + .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_inode_item_unpin, .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_inode_item_trylock, .iop_unlock = (void(*)(xfs_log_item_t*))xfs_inode_item_unlock, .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-25 12:43:47.977004330 +0200 +++ xfs/fs/xfs/xfs_trans.c 2010-05-25 12:45:02.918006215 +0200 @@ -1375,7 +1375,7 @@ xfs_trans_item_committed( * log item flags, if anyone else stales the buffer we do not want to * pay any attention to it. */ - IOP_UNPIN(lip); + IOP_UNPIN(lip, 0); } /* @@ -1422,7 +1422,7 @@ xfs_trans_uncommit( * Unpin all but those that aren't dirty. */ if (lidp->lid_flags & XFS_LID_DIRTY) - IOP_UNPIN_REMOVE(lidp->lid_item, tp); + IOP_UNPIN(lidp->lid_item, 1); } xfs_trans_unreserve_and_mod_sb(tp); Index: xfs/fs/xfs/xfs_trans.h =================================================================== --- xfs.orig/fs/xfs/xfs_trans.h 2010-05-25 12:43:47.986004051 +0200 +++ xfs/fs/xfs/xfs_trans.h 2010-05-25 12:45:02.942046166 +0200 @@ -347,8 +347,7 @@ typedef struct xfs_item_ops { uint (*iop_size)(xfs_log_item_t *); void (*iop_format)(xfs_log_item_t *, struct xfs_log_iovec *); void (*iop_pin)(xfs_log_item_t *); - void (*iop_unpin)(xfs_log_item_t *); - void (*iop_unpin_remove)(xfs_log_item_t *, struct xfs_trans *); + void (*iop_unpin)(xfs_log_item_t *, int remove); uint (*iop_trylock)(xfs_log_item_t *); void (*iop_unlock)(xfs_log_item_t *); xfs_lsn_t (*iop_committed)(xfs_log_item_t *, xfs_lsn_t); @@ -360,8 +359,7 @@ typedef struct xfs_item_ops { #define IOP_SIZE(ip) (*(ip)->li_ops->iop_size)(ip) #define IOP_FORMAT(ip,vp) (*(ip)->li_ops->iop_format)(ip, vp) #define IOP_PIN(ip) (*(ip)->li_ops->iop_pin)(ip) -#define IOP_UNPIN(ip) (*(ip)->li_ops->iop_unpin)(ip) -#define IOP_UNPIN_REMOVE(ip,tp) (*(ip)->li_ops->iop_unpin_remove)(ip, tp) +#define IOP_UNPIN(ip, remove) (*(ip)->li_ops->iop_unpin)(ip, remove) #define IOP_TRYLOCK(ip) (*(ip)->li_ops->iop_trylock)(ip) #define IOP_UNLOCK(ip) (*(ip)->li_ops->iop_unlock)(ip) #define IOP_COMMITTED(ip, lsn) (*(ip)->li_ops->iop_committed)(ip, lsn) From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6ZiI178953 for ; Mon, 31 May 2010 11:06:35 -0500 X-ASG-Debug-ID: 1275322142-270d02e90000-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 37AD114678DF for ; Mon, 31 May 2010 09:09:02 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id vtG23vq5DoxDxHGG for ; Mon, 31 May 2010 09:09:02 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xx-000169-TJ for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:01 +0000 Message-Id: <20100531160901.792538953@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:40 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 13/17] xfs: kill the unused xlog_debug variable Subject: [PATCH 13/17] xfs: kill the unused xlog_debug variable References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-kill-xlog_debug 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: 1275322142 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_log.h =================================================================== --- xfs.orig/fs/xfs/xfs_log.h 2010-05-29 18:44:56.012049463 +0200 +++ xfs/fs/xfs/xfs_log.h 2010-05-29 18:44:57.709003926 +0200 @@ -201,9 +201,4 @@ int xfs_log_commit_cil(struct xfs_mount bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); #endif - - -extern int xlog_debug; /* set to 1 to enable real log */ - - #endif /* __XFS_LOG_H__ */ From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6Z4A178940 for ; Mon, 31 May 2010 11:06:35 -0500 X-ASG-Debug-ID: 1275322274-37ef00d50000-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 E5B67157FD1E for ; Mon, 31 May 2010 09:11:14 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 7yuremLwPWItfnnB for ; Mon, 31 May 2010 09:11:14 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xx-00011x-99 for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:01 +0000 Message-Id: <20100531160901.186403532@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:37 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 10/17] xfs: simplify buffer pinning Subject: [PATCH 10/17] xfs: simplify buffer pinning References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-simplify-buffer-pinning 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: 1275322274 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Get rid of the xfs_buf_pin/xfs_buf_unpin/xfs_buf_ispin helpers and opencode them in their only callers, just like we did for the inode pinning a while ago. Also remove duplicate trace points - the bufitem tracepoints cover all the information that is present in a buffer tracepoint. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.c 2010-05-29 18:12:07.996183820 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_buf.c 2010-05-29 18:19:18.653023552 +0200 @@ -896,36 +896,6 @@ xfs_buf_unlock( trace_xfs_buf_unlock(bp, _RET_IP_); } - -/* - * Pinning Buffer Storage in Memory - * Ensure that no attempt to force a buffer to disk will succeed. - */ -void -xfs_buf_pin( - xfs_buf_t *bp) -{ - trace_xfs_buf_pin(bp, _RET_IP_); - atomic_inc(&bp->b_pin_count); -} - -void -xfs_buf_unpin( - xfs_buf_t *bp) -{ - trace_xfs_buf_unpin(bp, _RET_IP_); - - if (atomic_dec_and_test(&bp->b_pin_count)) - wake_up_all(&bp->b_waiters); -} - -int -xfs_buf_ispin( - xfs_buf_t *bp) -{ - return atomic_read(&bp->b_pin_count); -} - STATIC void xfs_buf_wait_unpin( xfs_buf_t *bp) @@ -1802,7 +1772,7 @@ xfs_buf_delwri_split( trace_xfs_buf_delwri_split(bp, _RET_IP_); ASSERT(bp->b_flags & XBF_DELWRI); - if (!xfs_buf_ispin(bp) && !xfs_buf_cond_lock(bp)) { + if (!XFS_BUF_ISPINNED(bp) && !xfs_buf_cond_lock(bp)) { if (!force && time_before(jiffies, bp->b_queuetime + age)) { xfs_buf_unlock(bp); Index: xfs/fs/xfs/linux-2.6/xfs_buf.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.h 2010-05-22 00:40:37.889004315 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_buf.h 2010-05-29 18:19:18.654010422 +0200 @@ -258,11 +258,6 @@ static inline int xfs_buf_geterror(xfs_b /* Buffer Utility Routines */ extern xfs_caddr_t xfs_buf_offset(xfs_buf_t *, size_t); -/* Pinning Buffer Storage in Memory */ -extern void xfs_buf_pin(xfs_buf_t *); -extern void xfs_buf_unpin(xfs_buf_t *); -extern int xfs_buf_ispin(xfs_buf_t *); - /* Delayed Write Buffer Routines */ extern void xfs_buf_delwri_dequeue(xfs_buf_t *); extern void xfs_buf_delwri_promote(xfs_buf_t *); @@ -351,7 +346,7 @@ extern void xfs_buf_terminate(void); #define XFS_BUF_SET_VTYPE(bp, type) do { } while (0) #define XFS_BUF_SET_REF(bp, ref) do { } while (0) -#define XFS_BUF_ISPINNED(bp) xfs_buf_ispin(bp) +#define XFS_BUF_ISPINNED(bp) atomic_read(&((bp)->b_pin_count)) #define XFS_BUF_VALUSEMA(bp) xfs_buf_lock_value(bp) #define XFS_BUF_CPSEMA(bp) (xfs_buf_cond_lock(bp) == 0) @@ -370,8 +365,6 @@ static inline void xfs_buf_relse(xfs_buf xfs_buf_rele(bp); } -#define xfs_bpin(bp) xfs_buf_pin(bp) -#define xfs_bunpin(bp) xfs_buf_unpin(bp) #define xfs_biodone(bp) xfs_buf_ioend(bp, 0) #define xfs_biomove(bp, off, len, data, rw) \ Index: xfs/fs/xfs/linux-2.6/xfs_trace.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.h 2010-05-29 12:30:33.890033540 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_trace.h 2010-05-29 18:19:18.660003717 +0200 @@ -314,8 +314,6 @@ DEFINE_BUF_EVENT(xfs_buf_init); DEFINE_BUF_EVENT(xfs_buf_free); DEFINE_BUF_EVENT(xfs_buf_hold); DEFINE_BUF_EVENT(xfs_buf_rele); -DEFINE_BUF_EVENT(xfs_buf_pin); -DEFINE_BUF_EVENT(xfs_buf_unpin); DEFINE_BUF_EVENT(xfs_buf_iodone); DEFINE_BUF_EVENT(xfs_buf_iorequest); DEFINE_BUF_EVENT(xfs_buf_bawrite); Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2010-05-29 18:17:16.277004555 +0200 +++ xfs/fs/xfs/xfs_buf_item.c 2010-05-29 18:19:18.662028022 +0200 @@ -359,14 +359,13 @@ xfs_buf_item_format( /* * This is called to pin the buffer associated with the buf log item in memory - * so it cannot be written out. Simply call bpin() on the buffer to do this. + * so it cannot be written out. * * We also always take a reference to the buffer log item here so that the bli * is held while the item is pinned in memory. This means that we can * unconditionally drop the reference count a transaction holds when the * transaction is completed. */ - STATIC void xfs_buf_item_pin( struct xfs_log_item *lip) @@ -378,15 +377,15 @@ xfs_buf_item_pin( ASSERT((bip->bli_flags & XFS_BLI_LOGGED) || (bip->bli_flags & XFS_BLI_STALE)); - atomic_inc(&bip->bli_refcount); trace_xfs_buf_item_pin(bip); - xfs_bpin(bip->bli_buf); + + atomic_inc(&bip->bli_refcount); + atomic_inc(&bip->bli_buf->b_pin_count); } /* * This is called to unpin the buffer associated with the buf log * item which was previously pinned with a call to xfs_buf_item_pin(). - * Just call bunpin() on the buffer to do this. * * Also drop the reference to the buf item for the current transaction. * If the XFS_BLI_STALE flag is set and we are the last reference, @@ -414,7 +413,9 @@ xfs_buf_item_unpin( trace_xfs_buf_item_unpin(bip); freed = atomic_dec_and_test(&bip->bli_refcount); - xfs_bunpin(bp); + + if (atomic_dec_and_test(&bp->b_pin_count)) + wake_up_all(&bp->b_waiters); if (freed && stale) { ASSERT(bip->bli_flags & XFS_BLI_STALE); From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_64,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6ZuJ178939 for ; Mon, 31 May 2010 11:06:35 -0500 X-ASG-Debug-ID: 1275322141-1d2a01740000-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 E8CF8387869 for ; Mon, 31 May 2010 09:09:01 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id K1GwiAwNJDwVNc7q for ; Mon, 31 May 2010 09:09:01 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xx-00013c-GI for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:01 +0000 Message-Id: <20100531160901.401855518@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:38 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 11/17] xfs: simplify inode to transaction joining Subject: [PATCH 11/17] xfs: simplify inode to transaction joining References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-simplify-xfs_trans_ijoin 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: 1275322141 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Currently we need to either call IHOLD or xfs_trans_ihold on an inode when joining it to a transaction via xfs_trans_ijoin. This patches instead makes xfs_trans_ijoin usable on it's own by doing an implicity xfs_trans_ihold, which also allows us to drop the third argument. For the case where we want to hold a reference on the inode a xfs_trans_ijoin_ref wrapper is added which does the IHOLD and marks the inode for needing an xfs_iput. In addition to the cleaner interface to the caller this also simplifies the implementation. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/quota/xfs_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot.c 2010-05-29 18:44:47.554255638 +0200 +++ xfs/fs/xfs/quota/xfs_dquot.c 2010-05-29 18:49:10.749003438 +0200 @@ -378,14 +378,7 @@ xfs_qm_dqalloc( return (ESRCH); } - /* - * xfs_trans_commit normally decrements the vnode ref count - * when it unlocks the inode. Since we want to keep the quota - * inode around, we bump the vnode ref count now. - */ - IHOLD(quotip); - - xfs_trans_ijoin(tp, quotip, XFS_ILOCK_EXCL); + xfs_trans_ijoin_ref(tp, quotip, XFS_ILOCK_EXCL); nmaps = 1; if ((error = xfs_bmapi(tp, quotip, offset_fsb, XFS_DQUOT_CLUSTER_SIZE_FSB, Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-05-29 18:44:44.719005883 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2010-05-29 18:49:11.611005462 +0200 @@ -3739,9 +3739,10 @@ xfs_bmap_add_attrfork( ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; } ASSERT(ip->i_d.di_anextents == 0); - IHOLD(ip); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + + xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + switch (ip->i_d.di_format) { case XFS_DINODE_FMT_DEV: ip->i_d.di_forkoff = roundup(sizeof(xfs_dev_t), 8) >> 3; Index: xfs/fs/xfs/xfs_rename.c =================================================================== --- xfs.orig/fs/xfs/xfs_rename.c 2010-05-29 18:44:44.198005742 +0200 +++ xfs/fs/xfs/xfs_rename.c 2010-05-29 18:44:47.678039336 +0200 @@ -169,26 +169,14 @@ xfs_rename( /* * Join all the inodes to the transaction. From this point on, * we can rely on either trans_commit or trans_cancel to unlock - * them. Note that we need to add a vnode reference to the - * directories since trans_commit & trans_cancel will decrement - * them when they unlock the inodes. Also, we need to be careful - * not to add an inode to the transaction more than once. + * them. */ - IHOLD(src_dp); - xfs_trans_ijoin(tp, src_dp, XFS_ILOCK_EXCL); - - if (new_parent) { - IHOLD(target_dp); - xfs_trans_ijoin(tp, target_dp, XFS_ILOCK_EXCL); - } - - IHOLD(src_ip); - xfs_trans_ijoin(tp, src_ip, XFS_ILOCK_EXCL); - - if (target_ip) { - IHOLD(target_ip); - xfs_trans_ijoin(tp, target_ip, XFS_ILOCK_EXCL); - } + xfs_trans_ijoin_ref(tp, src_dp, XFS_ILOCK_EXCL); + if (new_parent) + xfs_trans_ijoin_ref(tp, target_dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin_ref(tp, src_ip, XFS_ILOCK_EXCL); + if (target_ip) + xfs_trans_ijoin_ref(tp, target_ip, XFS_ILOCK_EXCL); /* * If we are using project inheritance, we only allow renames Index: xfs/fs/xfs/xfs_trans.h =================================================================== --- xfs.orig/fs/xfs/xfs_trans.h 2010-05-29 18:44:44.783005813 +0200 +++ xfs/fs/xfs/xfs_trans.h 2010-05-29 18:49:12.008004765 +0200 @@ -475,8 +475,8 @@ void xfs_trans_dquot_buf(xfs_trans_t *, void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); int xfs_trans_iget(struct xfs_mount *, xfs_trans_t *, xfs_ino_t , uint, uint, struct xfs_inode **); -void xfs_trans_ijoin(xfs_trans_t *, struct xfs_inode *, uint); -void xfs_trans_ihold(xfs_trans_t *, struct xfs_inode *); +void xfs_trans_ijoin_ref(struct xfs_trans *, struct xfs_inode *, uint); +void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); struct xfs_efi_log_item *xfs_trans_get_efi(xfs_trans_t *, uint); Index: xfs/fs/xfs/xfs_trans_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_inode.c 2010-05-29 18:44:44.695207098 +0200 +++ xfs/fs/xfs/xfs_trans_inode.c 2010-05-29 18:44:47.682003507 +0200 @@ -33,6 +33,7 @@ #include "xfs_btree.h" #include "xfs_trans_priv.h" #include "xfs_inode_item.h" +#include "xfs_trace.h" #ifdef XFS_TRANS_DEBUG STATIC void @@ -42,7 +43,6 @@ xfs_trans_inode_broot_debug( #define xfs_trans_inode_broot_debug(ip) #endif - /* * Get an inode and join it to the transaction. */ @@ -58,32 +58,31 @@ xfs_trans_iget( int error; error = xfs_iget(mp, tp, ino, flags, lock_flags, ipp, 0); - if (!error && tp) - xfs_trans_ijoin(tp, *ipp, lock_flags); + if (!error && tp) { + xfs_trans_ijoin(tp, *ipp); + (*ipp)->i_itemp->ili_lock_flags = lock_flags; + } return error; } /* - * Add the locked inode to the transaction. - * The inode must be locked, and it cannot be associated with any - * transaction. The caller must specify the locks already held - * on the inode. + * Add a locked inode to the transaction. + * + * The inode must be locked, and it cannot be associated with any transaction. */ void xfs_trans_ijoin( - xfs_trans_t *tp, - xfs_inode_t *ip, - uint lock_flags) + struct xfs_trans *tp, + struct xfs_inode *ip) { xfs_inode_log_item_t *iip; ASSERT(ip->i_transp == NULL); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - ASSERT(lock_flags & XFS_ILOCK_EXCL); if (ip->i_itemp == NULL) xfs_inode_item_init(ip, ip->i_mount); iip = ip->i_itemp; - ASSERT(iip->ili_flags == 0); + ASSERT(iip->ili_lock_flags == 0); /* * Get a log_item_desc to point at the new item. @@ -93,42 +92,31 @@ xfs_trans_ijoin( xfs_trans_inode_broot_debug(ip); /* - * If the IO lock is already held, mark that in the inode log item. - */ - if (lock_flags & XFS_IOLOCK_EXCL) { - iip->ili_flags |= XFS_ILI_IOLOCKED_EXCL; - } else if (lock_flags & XFS_IOLOCK_SHARED) { - iip->ili_flags |= XFS_ILI_IOLOCKED_SHARED; - } - - /* * Initialize i_transp so we can find it with xfs_inode_incore() * in xfs_trans_iget() above. */ ip->i_transp = tp; } - - /* - * Mark the inode as not needing to be unlocked when the inode item's - * IOP_UNLOCK() routine is called. The inode must already be locked - * and associated with the given transaction. + * Add a locked inode to the transaction. + * + * + * Grabs a reference to the inode which will be dropped when the transaction + * is commited. The inode will also be unlocked at that point. The inode + * must be locked, and it cannot be associated with any transaction. */ -/*ARGSUSED*/ void -xfs_trans_ihold( - xfs_trans_t *tp, - xfs_inode_t *ip) +xfs_trans_ijoin_ref( + struct xfs_trans *tp, + struct xfs_inode *ip, + uint lock_flags) { - ASSERT(ip->i_transp == tp); - ASSERT(ip->i_itemp != NULL); - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - - ip->i_itemp->ili_flags |= XFS_ILI_HOLD; + xfs_trans_ijoin(tp, ip); + IHOLD(ip); + ip->i_itemp->ili_lock_flags = lock_flags; } - /* * This is called to mark the fields indicated in fieldmask as needing * to be logged when the transaction is committed. The inode must Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c 2010-05-29 18:44:44.233005323 +0200 +++ xfs/fs/xfs/xfs_vnodeops.c 2010-05-29 18:49:10.853004415 +0200 @@ -268,8 +268,7 @@ xfs_setattr( commit_flags = XFS_TRANS_RELEASE_LOG_RES; xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, lock_flags); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); /* * Only change the c/mtime if we are changing the size @@ -319,8 +318,7 @@ xfs_setattr( xfs_iflags_set(ip, XFS_ITRUNCATED); } } else if (tp) { - xfs_trans_ijoin(tp, ip, lock_flags); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); } /* @@ -653,10 +651,7 @@ xfs_free_eofblocks( } xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, - XFS_IOLOCK_EXCL | - XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); error = xfs_itruncate_finish(&tp, ip, ip->i_size, @@ -728,8 +723,7 @@ xfs_inactive_symlink_rmt( xfs_ilock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); size = (int)ip->i_d.di_size; ip->i_d.di_size = 0; - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); /* * Find the block(s) so we can inval and unmap them. @@ -773,8 +767,7 @@ xfs_inactive_symlink_rmt( * Mark it dirty so it will be logged and moved forward in the log as * part of every commit. */ - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); /* * Get a new, empty transaction to return to our caller. @@ -907,8 +900,7 @@ xfs_inactive_attrs( goto error_cancel; xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); xfs_idestroy_fork(ip, XFS_ATTR_FORK); ASSERT(ip->i_d.di_anextents == 0); @@ -1095,8 +1087,7 @@ xfs_inactive( } xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); /* * normally, we have to run xfs_itruncate_finish sync. @@ -1129,8 +1120,7 @@ xfs_inactive( return VN_INACTIVE_CACHE; } - xfs_trans_ijoin(tp, ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); } else { error = xfs_trans_reserve(tp, 0, XFS_IFREE_LOG_RES(mp), @@ -1143,8 +1133,7 @@ xfs_inactive( } xfs_ilock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); } /* @@ -1392,8 +1381,7 @@ xfs_create( * the transaction cancel unlocking dp so don't do it explicitly in the * error path. */ - IHOLD(dp); - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin_ref(tp, dp, XFS_ILOCK_EXCL); unlock_dp_on_error = B_FALSE; error = xfs_dir_createname(tp, dp, name, ip->i_ino, @@ -1730,15 +1718,8 @@ xfs_remove( xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); - /* - * At this point, we've gotten both the directory and the entry - * inodes locked. - */ - IHOLD(ip); - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); - - IHOLD(dp); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin_ref(tp, dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL); /* * If we're removing a directory perform some additional validation. @@ -1884,15 +1865,8 @@ xfs_link( xfs_lock_two_inodes(sip, tdp, XFS_ILOCK_EXCL); - /* - * Increment vnode ref counts since xfs_trans_commit & - * xfs_trans_cancel will both unlock the inodes and - * decrement the associated ref counts. - */ - IHOLD(sip); - IHOLD(tdp); - xfs_trans_ijoin(tp, sip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, tdp, XFS_ILOCK_EXCL); + xfs_trans_ijoin_ref(tp, sip, XFS_ILOCK_EXCL); + xfs_trans_ijoin_ref(tp, tdp, XFS_ILOCK_EXCL); /* * If the source has too many links, we can't make any more to it. @@ -2087,8 +2061,7 @@ xfs_symlink( * transaction cancel unlocking dp so don't do it explicitly in the * error path. */ - IHOLD(dp); - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin_ref(tp, dp, XFS_ILOCK_EXCL); unlock_dp_on_error = B_FALSE; /* @@ -2227,13 +2200,12 @@ xfs_set_dmattrs( return error; } xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL); ip->i_d.di_dmevmask = evmask; ip->i_d.di_dmstate = state; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - IHOLD(ip); error = xfs_trans_commit(tp, 0); return error; @@ -2366,8 +2338,7 @@ xfs_alloc_file_space( if (error) goto error1; - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); /* * Issue the xfs_bmapi() call to allocate the blocks @@ -2668,8 +2639,7 @@ xfs_free_file_space( if (error) goto error1; - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); /* * issue the bunmapi() call to free the blocks @@ -2839,8 +2809,7 @@ xfs_change_file_space( xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); if ((attr_flags & XFS_ATTR_DMI) == 0) { ip->i_d.di_mode &= ~S_ISUID; Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-29 18:44:44.024034028 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-29 18:44:47.689026206 +0200 @@ -1035,8 +1035,7 @@ xfs_ioctl_setattr( } } - xfs_trans_ijoin(tp, ip, lock_flags); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); /* * Change file ownership. Must be the owner or privileged. Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2010-05-29 18:44:44.048005742 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2010-05-29 18:44:47.695005533 +0200 @@ -328,8 +328,7 @@ xfs_commit_dummy_trans( xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); error = xfs_trans_commit(tp, 0); xfs_iunlock(ip, XFS_ILOCK_EXCL); Index: xfs/fs/xfs/xfs_attr.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr.c 2010-05-29 18:44:44.103255638 +0200 +++ xfs/fs/xfs/xfs_attr.c 2010-05-29 18:49:10.764003787 +0200 @@ -319,8 +319,7 @@ xfs_attr_set_int( return (error); } - xfs_trans_ijoin(args.trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args.trans, dp); + xfs_trans_ijoin(args.trans, dp); /* * If the attribute list is non-existent or a shortform list, @@ -390,10 +389,8 @@ xfs_attr_set_int( * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args.trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args.trans, dp); - } + if (committed) + xfs_trans_ijoin(args.trans, dp); /* * Commit the leaf transformation. We'll need another (linked) @@ -538,8 +535,7 @@ xfs_attr_remove_int(xfs_inode_t *dp, str * No need to make quota reservations here. We expect to release some * blocks not allocate in the common case. */ - xfs_trans_ijoin(args.trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args.trans, dp); + xfs_trans_ijoin(args.trans, dp); /* * Decide on what work routines to call based on the inode size. @@ -815,8 +811,7 @@ xfs_attr_inactive(xfs_inode_t *dp) * No need to make quota reservations here. We expect to release some * blocks, not allocate, in the common case. */ - xfs_trans_ijoin(trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(trans, dp); + xfs_trans_ijoin(trans, dp); /* * Decide on what work routines to call based on the inode size. @@ -975,10 +970,8 @@ xfs_attr_leaf_addname(xfs_da_args_t *arg * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp); /* * Commit the current trans (including the inode) and start @@ -1079,10 +1072,8 @@ xfs_attr_leaf_addname(xfs_da_args_t *arg * and started a new one. We need the inode to be * in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp); } else xfs_da_buf_done(bp); @@ -1155,10 +1146,8 @@ xfs_attr_leaf_removename(xfs_da_args_t * * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp); } else xfs_da_buf_done(bp); return(0); @@ -1311,10 +1300,8 @@ restart: * and started a new one. We need the inode to be * in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp); /* * Commit the node conversion and start the next @@ -1350,10 +1337,8 @@ restart: * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp); } else { /* * Addition succeeded, update Btree hashvals. @@ -1464,10 +1449,8 @@ restart: * and started a new one. We need the inode to be * in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp); } /* @@ -1598,10 +1581,8 @@ xfs_attr_node_removename(xfs_da_args_t * * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp); /* * Commit the Btree join operation and start a new trans. @@ -1652,10 +1633,8 @@ xfs_attr_node_removename(xfs_da_args_t * * and started a new one. We need the inode to be * in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp); } else xfs_da_brelse(args->trans, bp); } @@ -2093,10 +2072,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp); ASSERT(nmap == 1); ASSERT((map.br_startblock != DELAYSTARTBLOCK) && @@ -2249,10 +2226,8 @@ xfs_attr_rmtval_remove(xfs_da_args_t *ar * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, args->dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, args->dp); - } + if (committed) + xfs_trans_ijoin(args->trans, args->dp); /* * Close out trans and start the next one in the chain. Index: xfs/fs/xfs/xfs_dfrag.c =================================================================== --- xfs.orig/fs/xfs/xfs_dfrag.c 2010-05-29 18:44:44.127260247 +0200 +++ xfs/fs/xfs/xfs_dfrag.c 2010-05-29 18:44:47.708005952 +0200 @@ -413,11 +413,8 @@ xfs_swap_extents( } - IHOLD(ip); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); - - IHOLD(tip); - xfs_trans_ijoin(tp, tip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); + xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); + xfs_trans_ijoin_ref(tp, tip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); xfs_trans_log_inode(tp, ip, ilf_fields); xfs_trans_log_inode(tp, tip, tilf_fields); Index: xfs/fs/xfs/xfs_fsops.c =================================================================== --- xfs.orig/fs/xfs/xfs_fsops.c 2010-05-29 18:44:44.139031165 +0200 +++ xfs/fs/xfs/xfs_fsops.c 2010-05-29 18:44:47.713005812 +0200 @@ -633,8 +633,7 @@ xfs_fs_log_dummy( ip = mp->m_rootip; xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); xfs_trans_set_sync(tp); error = xfs_trans_commit(tp, 0); Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-05-29 18:44:47.572011120 +0200 +++ xfs/fs/xfs/xfs_inode.c 2010-05-29 18:49:11.627003926 +0200 @@ -1459,7 +1459,7 @@ xfs_itruncate_finish( ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); ASSERT(ip->i_transp == *tp); ASSERT(ip->i_itemp != NULL); - ASSERT(ip->i_itemp->ili_flags & XFS_ILI_HOLD); + ASSERT(ip->i_itemp->ili_lock_flags == 0); ntp = *tp; @@ -1611,12 +1611,8 @@ xfs_itruncate_finish( */ error = xfs_bmap_finish(tp, &free_list, &committed); ntp = *tp; - if (committed) { - /* link the inode into the next xact in the chain */ - xfs_trans_ijoin(ntp, ip, - XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); - xfs_trans_ihold(ntp, ip); - } + if (committed) + xfs_trans_ijoin(ntp, ip); if (error) { /* @@ -1645,9 +1641,7 @@ xfs_itruncate_finish( error = xfs_trans_commit(*tp, 0); *tp = ntp; - /* link the inode into the next transaction in the chain */ - xfs_trans_ijoin(ntp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); - xfs_trans_ihold(ntp, ip); + xfs_trans_ijoin(ntp, ip); if (error) return error; Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c 2010-05-29 18:44:44.173005812 +0200 +++ xfs/fs/xfs/xfs_iomap.c 2010-05-29 18:49:10.832274285 +0200 @@ -329,8 +329,7 @@ xfs_iomap_write_direct( if (error) goto error1; - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); bmapi_flag = XFS_BMAPI_WRITE; if ((flags & BMAPI_DIRECT) && (offset < ip->i_size || extsz)) @@ -597,8 +596,7 @@ xfs_iomap_write_allocate( return XFS_ERROR(error); } xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); xfs_bmap_init(&free_list, &first_block); @@ -761,8 +759,7 @@ xfs_iomap_write_unwritten( } xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); /* * Modify the unwritten extent state of the buffer. Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-29 18:44:44.776255080 +0200 +++ xfs/fs/xfs/xfs_trans.c 2010-05-29 18:44:47.726070626 +0200 @@ -1892,7 +1892,6 @@ xfs_trans_roll( if (error) return error; - xfs_trans_ijoin(trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(trans, dp); + xfs_trans_ijoin(trans, dp); return 0; } Index: xfs/fs/xfs/xfs_utils.c =================================================================== --- xfs.orig/fs/xfs/xfs_utils.c 2010-05-29 18:44:44.226005812 +0200 +++ xfs/fs/xfs/xfs_utils.c 2010-05-29 18:44:47.732005603 +0200 @@ -374,8 +374,8 @@ xfs_truncate_file( * of references will stay constant. */ xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); - xfs_trans_ihold(tp, ip); + xfs_trans_ijoin(tp, ip); + /* * Signal a sync xaction. The only case where that isn't * the case is if we're truncating an already unlinked file Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-05-29 18:44:47.580032003 +0200 +++ xfs/fs/xfs/xfs_inode_item.c 2010-05-29 18:49:14.203004136 +0200 @@ -628,19 +628,10 @@ xfs_inode_item_unlock( { struct xfs_inode_log_item *iip = INODE_ITEM(lip); struct xfs_inode *ip = iip->ili_inode; - uint hold; - uint iolocked; - uint lock_flags; + unsigned short lock_flags; - ASSERT(iip != NULL); ASSERT(iip->ili_inode->i_itemp != NULL); ASSERT(xfs_isilocked(iip->ili_inode, XFS_ILOCK_EXCL)); - ASSERT((!(iip->ili_inode->i_itemp->ili_flags & - XFS_ILI_IOLOCKED_EXCL)) || - xfs_isilocked(iip->ili_inode, XFS_IOLOCK_EXCL)); - ASSERT((!(iip->ili_inode->i_itemp->ili_flags & - XFS_ILI_IOLOCKED_SHARED)) || - xfs_isilocked(iip->ili_inode, XFS_IOLOCK_SHARED)); /* * Clear the transaction pointer in the inode. @@ -668,35 +659,10 @@ xfs_inode_item_unlock( iip->ili_aextents_buf = NULL; } - /* - * Figure out if we should unlock the inode or not. - */ - hold = iip->ili_flags & XFS_ILI_HOLD; - - /* - * Before clearing out the flags, remember whether we - * are holding the inode's IO lock. - */ - iolocked = iip->ili_flags & XFS_ILI_IOLOCKED_ANY; - - /* - * Clear out the fields of the inode log item particular - * to the current transaction. - */ - iip->ili_flags = 0; - - /* - * Unlock the inode if XFS_ILI_HOLD was not set. - */ - if (!hold) { - lock_flags = XFS_ILOCK_EXCL; - if (iolocked & XFS_ILI_IOLOCKED_EXCL) { - lock_flags |= XFS_IOLOCK_EXCL; - } else if (iolocked & XFS_ILI_IOLOCKED_SHARED) { - lock_flags |= XFS_IOLOCK_SHARED; - } + lock_flags = iip->ili_lock_flags; + iip->ili_lock_flags = 0; + if (lock_flags) xfs_iput(iip->ili_inode, lock_flags); - } } /* Index: xfs/fs/xfs/xfs_inode_item.h =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.h 2010-05-29 18:44:47.582032213 +0200 +++ xfs/fs/xfs/xfs_inode_item.h 2010-05-29 18:49:35.192005952 +0200 @@ -103,12 +103,6 @@ typedef struct xfs_inode_log_format_64 { XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ XFS_ILOG_ABROOT) -#define XFS_ILI_HOLD 0x1 -#define XFS_ILI_IOLOCKED_EXCL 0x2 -#define XFS_ILI_IOLOCKED_SHARED 0x4 - -#define XFS_ILI_IOLOCKED_ANY (XFS_ILI_IOLOCKED_EXCL | XFS_ILI_IOLOCKED_SHARED) - static inline int xfs_ilog_fbroot(int w) { return (w == XFS_DATA_FORK ? XFS_ILOG_DBROOT : XFS_ILOG_ABROOT); @@ -137,7 +131,7 @@ typedef struct xfs_inode_log_item { struct xfs_inode *ili_inode; /* inode ptr */ xfs_lsn_t ili_flush_lsn; /* lsn at last flush */ xfs_lsn_t ili_last_lsn; /* lsn at last transaction */ - unsigned short ili_flags; /* misc flags */ + unsigned short ili_lock_flags; /* lock flags */ unsigned short ili_logged; /* flushed logged data */ unsigned int ili_last_fields; /* fields when flushed */ struct xfs_bmbt_rec *ili_extents_buf; /* array of logged Index: xfs/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_file.c 2010-05-29 18:44:44.020005812 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-05-29 18:49:10.742004625 +0200 @@ -158,8 +158,7 @@ xfs_file_fsync( * 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_ijoin(tp, ip); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); xfs_trans_set_sync(tp); error = _xfs_trans_commit(tp, 0, &log_flushed); Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2010-05-29 18:44:44.709255988 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-05-29 18:44:47.751005673 +0200 @@ -1023,8 +1023,7 @@ xfs_log_inode( * 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_ijoin(tp, ip); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); xfs_trans_set_sync(tp); error = xfs_trans_commit(tp, 0); From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, J_CHICKENPOX_63,J_CHICKENPOX_64,J_CHICKENPOX_65,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6YsW178925 for ; Mon, 31 May 2010 11:06:34 -0500 X-ASG-Debug-ID: 1275322141-26ea02e70000-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 5A26314678DF for ; Mon, 31 May 2010 09:09:01 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Oa2oaO228A8JzcNb for ; Mon, 31 May 2010 09:09:01 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xw-00010c-Tl for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:00 +0000 Message-Id: <20100531160900.816713118@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:35 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 08/17] xfs: give xfs_item_ops methods the correct prototypes Subject: [PATCH 08/17] xfs: give xfs_item_ops methods the correct prototypes References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-iop-prototype-cleanup 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: 1275322141 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Stop the function pointer casting madness and give all the xfs_item_ops the correct prototypes. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/quota/xfs_dquot_item.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot_item.c 2010-05-29 18:12:37.757004346 +0200 +++ xfs/fs/xfs/quota/xfs_dquot_item.c 2010-05-29 18:14:21.307004136 +0200 @@ -37,18 +37,22 @@ #include "xfs_trans_priv.h" #include "xfs_qm.h" +static inline struct xfs_dq_logitem *DQUOT_ITEM(struct xfs_log_item *lip) +{ + return container_of(lip, struct xfs_dq_logitem, qli_item); +} + /* * returns the number of iovecs needed to log the given dquot item. */ -/* ARGSUSED */ STATIC uint xfs_qm_dquot_logitem_size( - xfs_dq_logitem_t *logitem) + struct xfs_log_item *lip) { /* * we need only two iovecs, one for the format, one for the real thing */ - return (2); + return 2; } /* @@ -56,22 +60,21 @@ xfs_qm_dquot_logitem_size( */ STATIC void xfs_qm_dquot_logitem_format( - xfs_dq_logitem_t *logitem, - xfs_log_iovec_t *logvec) + struct xfs_log_item *lip, + struct xfs_log_iovec *logvec) { - ASSERT(logitem); - ASSERT(logitem->qli_dquot); + struct xfs_dq_logitem *qlip = DQUOT_ITEM(lip); - logvec->i_addr = (xfs_caddr_t)&logitem->qli_format; + logvec->i_addr = (xfs_caddr_t)&qlip->qli_format; logvec->i_len = sizeof(xfs_dq_logformat_t); logvec->i_type = XLOG_REG_TYPE_QFORMAT; logvec++; - logvec->i_addr = (xfs_caddr_t)&logitem->qli_dquot->q_core; + logvec->i_addr = (xfs_caddr_t)&qlip->qli_dquot->q_core; logvec->i_len = sizeof(xfs_disk_dquot_t); logvec->i_type = XLOG_REG_TYPE_DQUOT; - ASSERT(2 == logitem->qli_item.li_desc->lid_size); - logitem->qli_format.qlf_size = 2; + ASSERT(2 == lip->li_desc->lid_size); + qlip->qli_format.qlf_size = 2; } @@ -80,9 +83,9 @@ xfs_qm_dquot_logitem_format( */ STATIC void xfs_qm_dquot_logitem_pin( - xfs_dq_logitem_t *logitem) + struct xfs_log_item *lip) { - xfs_dquot_t *dqp = logitem->qli_dquot; + struct xfs_dquot *dqp = DQUOT_ITEM(lip)->qli_dquot; ASSERT(XFS_DQ_IS_LOCKED(dqp)); atomic_inc(&dqp->q_pincount); @@ -94,13 +97,12 @@ xfs_qm_dquot_logitem_pin( * dquot must have been previously pinned with a call to * xfs_qm_dquot_logitem_pin(). */ -/* ARGSUSED */ STATIC void xfs_qm_dquot_logitem_unpin( - xfs_dq_logitem_t *logitem, + struct xfs_log_item *lip, int remove) { - xfs_dquot_t *dqp = logitem->qli_dquot; + struct xfs_dquot *dqp = DQUOT_ITEM(lip)->qli_dquot; ASSERT(atomic_read(&dqp->q_pincount) > 0); if (atomic_dec_and_test(&dqp->q_pincount)) @@ -115,12 +117,10 @@ xfs_qm_dquot_logitem_unpin( */ STATIC void xfs_qm_dquot_logitem_push( - xfs_dq_logitem_t *logitem) + struct xfs_log_item *lip) { - xfs_dquot_t *dqp; - int error; - - dqp = logitem->qli_dquot; + struct xfs_dquot *dqp = DQUOT_ITEM(lip)->qli_dquot; + int error; ASSERT(XFS_DQ_IS_LOCKED(dqp)); ASSERT(!completion_done(&dqp->q_flush)); @@ -142,27 +142,25 @@ xfs_qm_dquot_logitem_push( xfs_dqunlock(dqp); } -/*ARGSUSED*/ STATIC xfs_lsn_t xfs_qm_dquot_logitem_committed( - xfs_dq_logitem_t *l, + struct xfs_log_item *lip, xfs_lsn_t lsn) { /* * We always re-log the entire dquot when it becomes dirty, * so, the latest copy _is_ the only one that matters. */ - return (lsn); + return lsn; } - /* * This is called to wait for the given dquot to be unpinned. * Most of these pin/unpin routines are plagiarized from inode code. */ void xfs_qm_dqunpin_wait( - xfs_dquot_t *dqp) + struct xfs_dquot *dqp) { ASSERT(XFS_DQ_IS_LOCKED(dqp)); if (atomic_read(&dqp->q_pincount) == 0) @@ -188,13 +186,12 @@ xfs_qm_dqunpin_wait( */ STATIC void xfs_qm_dquot_logitem_pushbuf( - xfs_dq_logitem_t *qip) + struct xfs_log_item *lip) { - xfs_dquot_t *dqp; - xfs_mount_t *mp; - xfs_buf_t *bp; + struct xfs_dq_logitem *qlip = DQUOT_ITEM(lip); + struct xfs_dquot *dqp = qlip->qli_dquot; + struct xfs_buf *bp; - dqp = qip->qli_dquot; ASSERT(XFS_DQ_IS_LOCKED(dqp)); /* @@ -202,22 +199,20 @@ xfs_qm_dquot_logitem_pushbuf( * inode flush completed and the inode was taken off the AIL. * So, just get out. */ - if (completion_done(&dqp->q_flush) || - ((qip->qli_item.li_flags & XFS_LI_IN_AIL) == 0)) { + if (completion_done(&dqp->q_flush) || + !(lip->li_flags & XFS_LI_IN_AIL)) { xfs_dqunlock(dqp); return; } - mp = dqp->q_mount; - bp = xfs_incore(mp->m_ddev_targp, qip->qli_format.qlf_blkno, - mp->m_quotainfo->qi_dqchunklen, XBF_TRYLOCK); + + bp = xfs_incore(dqp->q_mount->m_ddev_targp, qlip->qli_format.qlf_blkno, + dqp->q_mount->m_quotainfo->qi_dqchunklen, XBF_TRYLOCK); xfs_dqunlock(dqp); if (!bp) return; if (XFS_BUF_ISDELAYWRITE(bp)) xfs_buf_delwri_promote(bp); xfs_buf_relse(bp); - return; - } /* @@ -232,15 +227,14 @@ xfs_qm_dquot_logitem_pushbuf( */ STATIC uint xfs_qm_dquot_logitem_trylock( - xfs_dq_logitem_t *qip) + struct xfs_log_item *lip) { - xfs_dquot_t *dqp; + struct xfs_dquot *dqp = DQUOT_ITEM(lip)->qli_dquot; - dqp = qip->qli_dquot; if (atomic_read(&dqp->q_pincount) > 0) return XFS_ITEM_PINNED; - if (! xfs_qm_dqlock_nowait(dqp)) + if (!xfs_qm_dqlock_nowait(dqp)) return XFS_ITEM_LOCKED; if (!xfs_dqflock_nowait(dqp)) { @@ -251,11 +245,10 @@ xfs_qm_dquot_logitem_trylock( return XFS_ITEM_PUSHBUF; } - ASSERT(qip->qli_item.li_flags & XFS_LI_IN_AIL); + ASSERT(lip->li_flags & XFS_LI_IN_AIL); return XFS_ITEM_SUCCESS; } - /* * Unlock the dquot associated with the log item. * Clear the fields of the dquot and dquot log item that @@ -264,12 +257,10 @@ xfs_qm_dquot_logitem_trylock( */ STATIC void xfs_qm_dquot_logitem_unlock( - xfs_dq_logitem_t *ql) + struct xfs_log_item *lip) { - xfs_dquot_t *dqp; + struct xfs_dquot *dqp = DQUOT_ITEM(lip)->qli_dquot; - ASSERT(ql != NULL); - dqp = ql->qli_dquot; ASSERT(XFS_DQ_IS_LOCKED(dqp)); /* @@ -286,41 +277,32 @@ xfs_qm_dquot_logitem_unlock( xfs_dqunlock(dqp); } - /* * this needs to stamp an lsn into the dquot, I think. * rpc's that look at user dquot's would then have to * push on the dependency recorded in the dquot */ -/* ARGSUSED */ STATIC void xfs_qm_dquot_logitem_committing( - xfs_dq_logitem_t *l, + struct xfs_log_item *lip, xfs_lsn_t lsn) { - return; } - /* * This is the ops vector for dquots */ static struct xfs_item_ops xfs_dquot_item_ops = { - .iop_size = (uint(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_size, - .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) - xfs_qm_dquot_logitem_format, - .iop_pin = (void(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_pin, - .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_qm_dquot_logitem_unpin, - .iop_trylock = (uint(*)(xfs_log_item_t*)) - xfs_qm_dquot_logitem_trylock, - .iop_unlock = (void(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_unlock, - .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_qm_dquot_logitem_committed, - .iop_push = (void(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_push, - .iop_pushbuf = (void(*)(xfs_log_item_t*)) - xfs_qm_dquot_logitem_pushbuf, - .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_qm_dquot_logitem_committing + .iop_size = xfs_qm_dquot_logitem_size, + .iop_format = xfs_qm_dquot_logitem_format, + .iop_pin = xfs_qm_dquot_logitem_pin, + .iop_unpin = xfs_qm_dquot_logitem_unpin, + .iop_trylock = xfs_qm_dquot_logitem_trylock, + .iop_unlock = xfs_qm_dquot_logitem_unlock, + .iop_committed = xfs_qm_dquot_logitem_committed, + .iop_push = xfs_qm_dquot_logitem_push, + .iop_pushbuf = xfs_qm_dquot_logitem_pushbuf, + .iop_committing = xfs_qm_dquot_logitem_committing }; /* @@ -330,10 +312,9 @@ static struct xfs_item_ops xfs_dquot_ite */ void xfs_qm_dquot_logitem_init( - struct xfs_dquot *dqp) + struct xfs_dquot *dqp) { - xfs_dq_logitem_t *lp; - lp = &dqp->q_logitem; + struct xfs_dq_logitem *lp = &dqp->q_logitem; xfs_log_item_init(dqp->q_mount, &lp->qli_item, XFS_LI_DQUOT, &xfs_dquot_item_ops); @@ -354,16 +335,22 @@ xfs_qm_dquot_logitem_init( /*------------------ QUOTAOFF LOG ITEMS -------------------*/ +static inline struct xfs_qoff_logitem *QOFF_ITEM(struct xfs_log_item *lip) +{ + return container_of(lip, struct xfs_qoff_logitem, qql_item); +} + + /* * This returns the number of iovecs needed to log the given quotaoff item. * We only need 1 iovec for an quotaoff item. It just logs the * quotaoff_log_format structure. */ -/*ARGSUSED*/ STATIC uint -xfs_qm_qoff_logitem_size(xfs_qoff_logitem_t *qf) +xfs_qm_qoff_logitem_size( + struct xfs_log_item *lip) { - return (1); + return 1; } /* @@ -374,46 +361,46 @@ xfs_qm_qoff_logitem_size(xfs_qoff_logite * slots in the quotaoff item have been filled. */ STATIC void -xfs_qm_qoff_logitem_format(xfs_qoff_logitem_t *qf, - xfs_log_iovec_t *log_vector) +xfs_qm_qoff_logitem_format( + struct xfs_log_item *lip, + struct xfs_log_iovec *log_vector) { - ASSERT(qf->qql_format.qf_type == XFS_LI_QUOTAOFF); + struct xfs_qoff_logitem *qflip = QOFF_ITEM(lip); - log_vector->i_addr = (xfs_caddr_t)&(qf->qql_format); + ASSERT(qflip->qql_format.qf_type == XFS_LI_QUOTAOFF); + + log_vector->i_addr = (xfs_caddr_t)&(qflip->qql_format); log_vector->i_len = sizeof(xfs_qoff_logitem_t); log_vector->i_type = XLOG_REG_TYPE_QUOTAOFF; - qf->qql_format.qf_size = 1; + qflip->qql_format.qf_size = 1; } - /* * Pinning has no meaning for an quotaoff item, so just return. */ -/*ARGSUSED*/ STATIC void -xfs_qm_qoff_logitem_pin(xfs_qoff_logitem_t *qf) +xfs_qm_qoff_logitem_pin( + struct xfs_log_item *lip) { - return; } - /* * Since pinning has no meaning for an quotaoff item, unpinning does * not either. */ -/*ARGSUSED*/ STATIC void -xfs_qm_qoff_logitem_unpin(xfs_qoff_logitem_t *qf, int remove) +xfs_qm_qoff_logitem_unpin( + struct xfs_log_item *lip, + int remove) { - return; } /* * Quotaoff items have no locking, so just return success. */ -/*ARGSUSED*/ STATIC uint -xfs_qm_qoff_logitem_trylock(xfs_qoff_logitem_t *qf) +xfs_qm_qoff_logitem_trylock( + struct xfs_log_item *lip) { return XFS_ITEM_LOCKED; } @@ -422,53 +409,51 @@ xfs_qm_qoff_logitem_trylock(xfs_qoff_log * Quotaoff items have no locking or pushing, so return failure * so that the caller doesn't bother with us. */ -/*ARGSUSED*/ STATIC void -xfs_qm_qoff_logitem_unlock(xfs_qoff_logitem_t *qf) +xfs_qm_qoff_logitem_unlock( + struct xfs_log_item *lip) { - return; } /* * The quotaoff-start-item is logged only once and cannot be moved in the log, * so simply return the lsn at which it's been logged. */ -/*ARGSUSED*/ STATIC xfs_lsn_t -xfs_qm_qoff_logitem_committed(xfs_qoff_logitem_t *qf, xfs_lsn_t lsn) +xfs_qm_qoff_logitem_committed( + struct xfs_log_item *lip, + xfs_lsn_t lsn) { - return (lsn); + return lsn; } /* * There isn't much you can do to push on an quotaoff item. It is simply * stuck waiting for the log to be flushed to disk. */ -/*ARGSUSED*/ STATIC void -xfs_qm_qoff_logitem_push(xfs_qoff_logitem_t *qf) +xfs_qm_qoff_logitem_push( + struct xfs_log_item *lip) { - return; } -/*ARGSUSED*/ STATIC xfs_lsn_t xfs_qm_qoffend_logitem_committed( - xfs_qoff_logitem_t *qfe, - xfs_lsn_t lsn) + struct xfs_log_item *lip, + xfs_lsn_t lsn) { - xfs_qoff_logitem_t *qfs; - struct xfs_ail *ailp; + struct xfs_qoff_logitem *qfe = QOFF_ITEM(lip); + struct xfs_qoff_logitem *qfs = qfe->qql_start_lip; + struct xfs_ail *ailp = qfs->qql_item.li_ailp; - qfs = qfe->qql_start_lip; - ailp = qfs->qql_item.li_ailp; - spin_lock(&ailp->xa_lock); /* * Delete the qoff-start logitem from the AIL. * xfs_trans_ail_delete() drops the AIL lock. */ + spin_lock(&ailp->xa_lock); xfs_trans_ail_delete(ailp, (xfs_log_item_t *)qfs); + kmem_free(qfs); kmem_free(qfe); return (xfs_lsn_t)-1; @@ -488,67 +473,52 @@ xfs_qm_qoffend_logitem_committed( * (truly makes the quotaoff irrevocable). If we do something else, * then maybe we don't need two. */ -/* ARGSUSED */ -STATIC void -xfs_qm_qoff_logitem_committing(xfs_qoff_logitem_t *qip, xfs_lsn_t commit_lsn) -{ - return; -} - -/* ARGSUSED */ STATIC void -xfs_qm_qoffend_logitem_committing(xfs_qoff_logitem_t *qip, xfs_lsn_t commit_lsn) +xfs_qm_qoff_logitem_committing( + struct xfs_log_item *lip, + xfs_lsn_t commit_lsn) { - return; } static struct xfs_item_ops xfs_qm_qoffend_logitem_ops = { - .iop_size = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_size, - .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) - xfs_qm_qoff_logitem_format, - .iop_pin = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_pin, - .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_qm_qoff_logitem_unpin, - .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_trylock, - .iop_unlock = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_unlock, - .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_qm_qoffend_logitem_committed, - .iop_push = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_push, - .iop_pushbuf = NULL, - .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_qm_qoffend_logitem_committing + .iop_size = xfs_qm_qoff_logitem_size, + .iop_format = xfs_qm_qoff_logitem_format, + .iop_pin = xfs_qm_qoff_logitem_pin, + .iop_unpin = xfs_qm_qoff_logitem_unpin, + .iop_trylock = xfs_qm_qoff_logitem_trylock, + .iop_unlock = xfs_qm_qoff_logitem_unlock, + .iop_committed = xfs_qm_qoffend_logitem_committed, + .iop_push = xfs_qm_qoff_logitem_push, + .iop_committing = xfs_qm_qoff_logitem_committing }; /* * This is the ops vector shared by all quotaoff-start log items. */ static struct xfs_item_ops xfs_qm_qoff_logitem_ops = { - .iop_size = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_size, - .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) - xfs_qm_qoff_logitem_format, - .iop_pin = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_pin, - .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_qm_qoff_logitem_unpin, - .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_trylock, - .iop_unlock = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_unlock, - .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_qm_qoff_logitem_committed, - .iop_push = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_push, - .iop_pushbuf = NULL, - .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_qm_qoff_logitem_committing + .iop_size = xfs_qm_qoff_logitem_size, + .iop_format = xfs_qm_qoff_logitem_format, + .iop_pin = xfs_qm_qoff_logitem_pin, + .iop_unpin = xfs_qm_qoff_logitem_unpin, + .iop_trylock = xfs_qm_qoff_logitem_trylock, + .iop_unlock = xfs_qm_qoff_logitem_unlock, + .iop_committed = xfs_qm_qoff_logitem_committed, + .iop_push = xfs_qm_qoff_logitem_push, + .iop_committing = xfs_qm_qoff_logitem_committing }; /* * Allocate and initialize an quotaoff item of the correct quota type(s). */ -xfs_qoff_logitem_t * +struct xfs_qoff_logitem * xfs_qm_qoff_logitem_init( - struct xfs_mount *mp, - xfs_qoff_logitem_t *start, - uint flags) + struct xfs_mount *mp, + struct xfs_qoff_logitem *start, + uint flags) { - xfs_qoff_logitem_t *qf; + struct xfs_qoff_logitem *qf; - qf = (xfs_qoff_logitem_t*) kmem_zalloc(sizeof(xfs_qoff_logitem_t), KM_SLEEP); + qf = kmem_zalloc(sizeof(struct xfs_qoff_logitem), KM_SLEEP); xfs_log_item_init(mp, &qf->qql_item, XFS_LI_QUOTAOFF, start ? &xfs_qm_qoffend_logitem_ops : &xfs_qm_qoff_logitem_ops); @@ -556,5 +526,5 @@ xfs_qm_qoff_logitem_init( qf->qql_format.qf_type = XFS_LI_QUOTAOFF; qf->qql_format.qf_flags = flags; qf->qql_start_lip = start; - return (qf); + return qf; } Index: xfs/fs/xfs/xfs_extfree_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_extfree_item.c 2010-05-29 18:12:37.767005742 +0200 +++ xfs/fs/xfs/xfs_extfree_item.c 2010-05-29 18:14:21.308004066 +0200 @@ -32,18 +32,19 @@ kmem_zone_t *xfs_efi_zone; kmem_zone_t *xfs_efd_zone; -STATIC void xfs_efi_item_unlock(xfs_efi_log_item_t *); +static inline struct xfs_efi_log_item *EFI_ITEM(struct xfs_log_item *lip) +{ + return container_of(lip, struct xfs_efi_log_item, efi_item); +} void -xfs_efi_item_free(xfs_efi_log_item_t *efip) +xfs_efi_item_free( + struct xfs_efi_log_item *efip) { - int nexts = efip->efi_format.efi_nextents; - - if (nexts > XFS_EFI_MAX_FAST_EXTENTS) { + if (efip->efi_format.efi_nextents > XFS_EFI_MAX_FAST_EXTENTS) kmem_free(efip); - } else { + else kmem_zone_free(xfs_efi_zone, efip); - } } /* @@ -51,9 +52,9 @@ xfs_efi_item_free(xfs_efi_log_item_t *ef * We only need 1 iovec for an efi item. It just logs the efi_log_format * structure. */ -/*ARGSUSED*/ STATIC uint -xfs_efi_item_size(xfs_efi_log_item_t *efip) +xfs_efi_item_size( + struct xfs_log_item *lip) { return 1; } @@ -66,10 +67,12 @@ xfs_efi_item_size(xfs_efi_log_item_t *ef * slots in the efi item have been filled. */ STATIC void -xfs_efi_item_format(xfs_efi_log_item_t *efip, - xfs_log_iovec_t *log_vector) +xfs_efi_item_format( + struct xfs_log_item *lip, + struct xfs_log_iovec *log_vector) { - uint size; + struct xfs_efi_log_item *efip = EFI_ITEM(lip); + uint size; ASSERT(efip->efi_next_extent == efip->efi_format.efi_nextents); @@ -79,7 +82,7 @@ xfs_efi_item_format(xfs_efi_log_item_t * size += (efip->efi_format.efi_nextents - 1) * sizeof(xfs_extent_t); efip->efi_format.efi_size = 1; - log_vector->i_addr = (xfs_caddr_t)&(efip->efi_format); + log_vector->i_addr = (xfs_caddr_t)&efip->efi_format; log_vector->i_len = size; log_vector->i_type = XLOG_REG_TYPE_EFI_FORMAT; ASSERT(size >= sizeof(xfs_efi_log_format_t)); @@ -89,14 +92,12 @@ xfs_efi_item_format(xfs_efi_log_item_t * /* * Pinning has no meaning for an efi item, so just return. */ -/*ARGSUSED*/ STATIC void -xfs_efi_item_pin(xfs_efi_log_item_t *efip) +xfs_efi_item_pin( + struct xfs_log_item *lip) { - return; } - /* * While EFIs cannot really be pinned, the unpin operation is the * last place at which the EFI is manipulated during a transaction. @@ -104,14 +105,15 @@ xfs_efi_item_pin(xfs_efi_log_item_t *efi * free the EFI. */ STATIC void -xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int remove) +xfs_efi_item_unpin( + struct xfs_log_item *lip, + int remove) { - struct xfs_ail *ailp = efip->efi_item.li_ailp; + struct xfs_efi_log_item *efip = EFI_ITEM(lip); + struct xfs_ail *ailp = lip->li_ailp; spin_lock(&ailp->xa_lock); if (efip->efi_flags & XFS_EFI_CANCELED) { - struct xfs_log_item *lip = &efip->efi_item; - if (remove) xfs_trans_del_item(lip); @@ -131,9 +133,9 @@ xfs_efi_item_unpin(xfs_efi_log_item_t *e * XFS_ITEM_PINNED so that the caller will eventually flush the log. * This should help in getting the EFI out of the AIL. */ -/*ARGSUSED*/ STATIC uint -xfs_efi_item_trylock(xfs_efi_log_item_t *efip) +xfs_efi_item_trylock( + struct xfs_log_item *lip) { return XFS_ITEM_PINNED; } @@ -141,13 +143,12 @@ xfs_efi_item_trylock(xfs_efi_log_item_t /* * Efi items have no locking, so just return. */ -/*ARGSUSED*/ STATIC void -xfs_efi_item_unlock(xfs_efi_log_item_t *efip) +xfs_efi_item_unlock( + struct xfs_log_item *lip) { - if (efip->efi_item.li_flags & XFS_LI_ABORTED) - xfs_efi_item_free(efip); - return; + if (lip->li_flags & XFS_LI_ABORTED) + xfs_efi_item_free(EFI_ITEM(lip)); } /* @@ -156,9 +157,10 @@ xfs_efi_item_unlock(xfs_efi_log_item_t * * flag is not paid any attention here. Checking for that is delayed * until the EFI is unpinned. */ -/*ARGSUSED*/ STATIC xfs_lsn_t -xfs_efi_item_committed(xfs_efi_log_item_t *efip, xfs_lsn_t lsn) +xfs_efi_item_committed( + struct xfs_log_item *lip, + xfs_lsn_t lsn) { return lsn; } @@ -168,11 +170,10 @@ xfs_efi_item_committed(xfs_efi_log_item_ * stuck waiting for all of its corresponding efd items to be * committed to disk. */ -/*ARGSUSED*/ STATIC void -xfs_efi_item_push(xfs_efi_log_item_t *efip) +xfs_efi_item_push( + struct xfs_log_item *lip) { - return; } /* @@ -182,59 +183,55 @@ xfs_efi_item_push(xfs_efi_log_item_t *ef * example, for inodes, the inode is locked throughout the extent freeing * so the dependency should be recorded there. */ -/*ARGSUSED*/ STATIC void -xfs_efi_item_committing(xfs_efi_log_item_t *efip, xfs_lsn_t lsn) +xfs_efi_item_committing( + struct xfs_log_item *lip, + xfs_lsn_t lsn) { - return; } /* * This is the ops vector shared by all efi log items. */ static struct xfs_item_ops xfs_efi_item_ops = { - .iop_size = (uint(*)(xfs_log_item_t*))xfs_efi_item_size, - .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) - xfs_efi_item_format, - .iop_pin = (void(*)(xfs_log_item_t*))xfs_efi_item_pin, - .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_efi_item_unpin, - .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_efi_item_trylock, - .iop_unlock = (void(*)(xfs_log_item_t*))xfs_efi_item_unlock, - .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_efi_item_committed, - .iop_push = (void(*)(xfs_log_item_t*))xfs_efi_item_push, - .iop_pushbuf = NULL, - .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_efi_item_committing + .iop_size = xfs_efi_item_size, + .iop_format = xfs_efi_item_format, + .iop_pin = xfs_efi_item_pin, + .iop_unpin = xfs_efi_item_unpin, + .iop_trylock = xfs_efi_item_trylock, + .iop_unlock = xfs_efi_item_unlock, + .iop_committed = xfs_efi_item_committed, + .iop_push = xfs_efi_item_push, + .iop_committing = xfs_efi_item_committing }; /* * Allocate and initialize an efi item with the given number of extents. */ -xfs_efi_log_item_t * -xfs_efi_init(xfs_mount_t *mp, - uint nextents) +struct xfs_efi_log_item * +xfs_efi_init( + struct xfs_mount *mp, + uint nextents) { - xfs_efi_log_item_t *efip; + struct xfs_efi_log_item *efip; uint size; ASSERT(nextents > 0); if (nextents > XFS_EFI_MAX_FAST_EXTENTS) { size = (uint)(sizeof(xfs_efi_log_item_t) + ((nextents - 1) * sizeof(xfs_extent_t))); - efip = (xfs_efi_log_item_t*)kmem_zalloc(size, KM_SLEEP); + efip = kmem_zalloc(size, KM_SLEEP); } else { - efip = (xfs_efi_log_item_t*)kmem_zone_zalloc(xfs_efi_zone, - KM_SLEEP); + efip = kmem_zone_zalloc(xfs_efi_zone, KM_SLEEP); } xfs_log_item_init(mp, &efip->efi_item, XFS_LI_EFI, &xfs_efi_item_ops); efip->efi_format.efi_nextents = nextents; efip->efi_format.efi_id = (__psint_t)(void*)efip; - return (efip); + return efip; } /* @@ -327,16 +324,18 @@ xfs_efi_release(xfs_efi_log_item_t *efip } } -STATIC void -xfs_efd_item_free(xfs_efd_log_item_t *efdp) +static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) { - int nexts = efdp->efd_format.efd_nextents; + return container_of(lip, struct xfs_efd_log_item, efd_item); +} - if (nexts > XFS_EFD_MAX_FAST_EXTENTS) { +STATIC void +xfs_efd_item_free(struct xfs_efd_log_item *efdp) +{ + if (efdp->efd_format.efd_nextents > XFS_EFD_MAX_FAST_EXTENTS) kmem_free(efdp); - } else { + else kmem_zone_free(xfs_efd_zone, efdp); - } } /* @@ -344,9 +343,9 @@ xfs_efd_item_free(xfs_efd_log_item_t *ef * We only need 1 iovec for an efd item. It just logs the efd_log_format * structure. */ -/*ARGSUSED*/ STATIC uint -xfs_efd_item_size(xfs_efd_log_item_t *efdp) +xfs_efd_item_size( + struct xfs_log_item *lip) { return 1; } @@ -359,10 +358,12 @@ xfs_efd_item_size(xfs_efd_log_item_t *ef * slots in the efd item have been filled. */ STATIC void -xfs_efd_item_format(xfs_efd_log_item_t *efdp, - xfs_log_iovec_t *log_vector) +xfs_efd_item_format( + struct xfs_log_item *lip, + struct xfs_log_iovec *log_vector) { - uint size; + struct xfs_efd_log_item *efdp = EFD_ITEM(lip); + uint size; ASSERT(efdp->efd_next_extent == efdp->efd_format.efd_nextents); @@ -372,41 +373,38 @@ xfs_efd_item_format(xfs_efd_log_item_t * size += (efdp->efd_format.efd_nextents - 1) * sizeof(xfs_extent_t); efdp->efd_format.efd_size = 1; - log_vector->i_addr = (xfs_caddr_t)&(efdp->efd_format); + log_vector->i_addr = (xfs_caddr_t)&efdp->efd_format; log_vector->i_len = size; log_vector->i_type = XLOG_REG_TYPE_EFD_FORMAT; ASSERT(size >= sizeof(xfs_efd_log_format_t)); } - /* * Pinning has no meaning for an efd item, so just return. */ -/*ARGSUSED*/ STATIC void -xfs_efd_item_pin(xfs_efd_log_item_t *efdp) +xfs_efd_item_pin( + struct xfs_log_item *lip) { - return; } - /* * Since pinning has no meaning for an efd item, unpinning does * not either. */ -/*ARGSUSED*/ STATIC void -xfs_efd_item_unpin(xfs_efd_log_item_t *efdp, int remove) +xfs_efd_item_unpin( + struct xfs_log_item *lip, + int remove) { - return; } /* * Efd items have no locking, so just return success. */ -/*ARGSUSED*/ STATIC uint -xfs_efd_item_trylock(xfs_efd_log_item_t *efdp) +xfs_efd_item_trylock( + struct xfs_log_item *lip) { return XFS_ITEM_LOCKED; } @@ -415,13 +413,12 @@ xfs_efd_item_trylock(xfs_efd_log_item_t * Efd items have no locking or pushing, so return failure * so that the caller doesn't bother with us. */ -/*ARGSUSED*/ STATIC void -xfs_efd_item_unlock(xfs_efd_log_item_t *efdp) +xfs_efd_item_unlock( + struct xfs_log_item *lip) { - if (efdp->efd_item.li_flags & XFS_LI_ABORTED) - xfs_efd_item_free(efdp); - return; + if (lip->li_flags & XFS_LI_ABORTED) + xfs_efd_item_free(EFD_ITEM(lip)); } /* @@ -431,15 +428,18 @@ xfs_efd_item_unlock(xfs_efd_log_item_t * * return -1 to keep the transaction code from further referencing * this item. */ -/*ARGSUSED*/ STATIC xfs_lsn_t -xfs_efd_item_committed(xfs_efd_log_item_t *efdp, xfs_lsn_t lsn) +xfs_efd_item_committed( + struct xfs_log_item *lip, + xfs_lsn_t lsn) { + struct xfs_efd_log_item *efdp = EFD_ITEM(lip); + /* * If we got a log I/O error, it's always the case that the LR with the * EFI got unpinned and freed before the EFD got aborted. */ - if ((efdp->efd_item.li_flags & XFS_LI_ABORTED) == 0) + if (!(lip->li_flags & XFS_LI_ABORTED)) xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); xfs_efd_item_free(efdp); @@ -450,11 +450,10 @@ xfs_efd_item_committed(xfs_efd_log_item_ * There isn't much you can do to push on an efd item. It is simply * stuck waiting for the log to be flushed to disk. */ -/*ARGSUSED*/ STATIC void -xfs_efd_item_push(xfs_efd_log_item_t *efdp) +xfs_efd_item_push( + struct xfs_log_item *lip) { - return; } /* @@ -464,53 +463,48 @@ xfs_efd_item_push(xfs_efd_log_item_t *ef * example, for inodes, the inode is locked throughout the extent freeing * so the dependency should be recorded there. */ -/*ARGSUSED*/ STATIC void -xfs_efd_item_committing(xfs_efd_log_item_t *efip, xfs_lsn_t lsn) +xfs_efd_item_committing( + struct xfs_log_item *lip, + xfs_lsn_t lsn) { - return; } /* * This is the ops vector shared by all efd log items. */ static struct xfs_item_ops xfs_efd_item_ops = { - .iop_size = (uint(*)(xfs_log_item_t*))xfs_efd_item_size, - .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) - xfs_efd_item_format, - .iop_pin = (void(*)(xfs_log_item_t*))xfs_efd_item_pin, - .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_efd_item_unpin, - .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_efd_item_trylock, - .iop_unlock = (void(*)(xfs_log_item_t*))xfs_efd_item_unlock, - .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_efd_item_committed, - .iop_push = (void(*)(xfs_log_item_t*))xfs_efd_item_push, - .iop_pushbuf = NULL, - .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_efd_item_committing + .iop_size = xfs_efd_item_size, + .iop_format = xfs_efd_item_format, + .iop_pin = xfs_efd_item_pin, + .iop_unpin = xfs_efd_item_unpin, + .iop_trylock = xfs_efd_item_trylock, + .iop_unlock = xfs_efd_item_unlock, + .iop_committed = xfs_efd_item_committed, + .iop_push = xfs_efd_item_push, + .iop_committing = xfs_efd_item_committing }; - /* * Allocate and initialize an efd item with the given number of extents. */ -xfs_efd_log_item_t * -xfs_efd_init(xfs_mount_t *mp, - xfs_efi_log_item_t *efip, - uint nextents) +struct xfs_efd_log_item * +xfs_efd_init( + struct xfs_mount *mp, + struct xfs_efi_log_item *efip, + uint nextents) { - xfs_efd_log_item_t *efdp; + struct xfs_efd_log_item *efdp; uint size; ASSERT(nextents > 0); if (nextents > XFS_EFD_MAX_FAST_EXTENTS) { size = (uint)(sizeof(xfs_efd_log_item_t) + ((nextents - 1) * sizeof(xfs_extent_t))); - efdp = (xfs_efd_log_item_t*)kmem_zalloc(size, KM_SLEEP); + efdp = kmem_zalloc(size, KM_SLEEP); } else { - efdp = (xfs_efd_log_item_t*)kmem_zone_zalloc(xfs_efd_zone, - KM_SLEEP); + efdp = kmem_zone_zalloc(xfs_efd_zone, KM_SLEEP); } xfs_log_item_init(mp, &efdp->efd_item, XFS_LI_EFD, &xfs_efd_item_ops); @@ -518,5 +512,5 @@ xfs_efd_init(xfs_mount_t *mp, efdp->efd_format.efd_nextents = nextents; efdp->efd_format.efd_efi_id = efip->efi_format.efi_id; - return (efdp); + return efdp; } Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-05-29 18:12:37.772005254 +0200 +++ xfs/fs/xfs/xfs_inode_item.c 2010-05-29 18:14:21.313003857 +0200 @@ -36,6 +36,12 @@ kmem_zone_t *xfs_ili_zone; /* inode log item zone */ +static inline struct xfs_inode_log_item *INODE_ITEM(struct xfs_log_item *lip) +{ + return container_of(lip, struct xfs_inode_log_item, ili_item); +} + + /* * This returns the number of iovecs needed to log the given inode item. * @@ -45,13 +51,11 @@ kmem_zone_t *xfs_ili_zone; /* inode log */ STATIC uint xfs_inode_item_size( - xfs_inode_log_item_t *iip) + struct xfs_log_item *lip) { - uint nvecs; - xfs_inode_t *ip; - - ip = iip->ili_inode; - nvecs = 2; + struct xfs_inode_log_item *iip = INODE_ITEM(lip); + struct xfs_inode *ip = iip->ili_inode; + uint nvecs = 2; /* * Only log the data/extents/b-tree root if there is something @@ -202,20 +206,17 @@ xfs_inode_item_size( */ STATIC void xfs_inode_item_format( - xfs_inode_log_item_t *iip, - xfs_log_iovec_t *log_vector) + struct xfs_log_item *lip, + struct xfs_log_iovec *vecp) { + struct xfs_inode_log_item *iip = INODE_ITEM(lip); + struct xfs_inode *ip = iip->ili_inode; uint nvecs; - xfs_log_iovec_t *vecp; - xfs_inode_t *ip; size_t data_bytes; xfs_bmbt_rec_t *ext_buffer; int nrecs; xfs_mount_t *mp; - ip = iip->ili_inode; - vecp = log_vector; - vecp->i_addr = (xfs_caddr_t)&iip->ili_format; vecp->i_len = sizeof(xfs_inode_log_format_t); vecp->i_type = XLOG_REG_TYPE_IFORMAT; @@ -427,7 +428,7 @@ xfs_inode_item_format( * Assert that no attribute-related log flags are set. */ if (!XFS_IFORK_Q(ip)) { - ASSERT(nvecs == iip->ili_item.li_desc->lid_size); + ASSERT(nvecs == lip->li_desc->lid_size); iip->ili_format.ilf_size = nvecs; ASSERT(!(iip->ili_format.ilf_fields & (XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT))); @@ -518,7 +519,7 @@ xfs_inode_item_format( break; } - ASSERT(nvecs == iip->ili_item.li_desc->lid_size); + ASSERT(nvecs == lip->li_desc->lid_size); iip->ili_format.ilf_size = nvecs; } @@ -529,12 +530,14 @@ xfs_inode_item_format( */ STATIC void xfs_inode_item_pin( - xfs_inode_log_item_t *iip) + struct xfs_log_item *lip) { - ASSERT(xfs_isilocked(iip->ili_inode, XFS_ILOCK_EXCL)); + struct xfs_inode *ip = INODE_ITEM(lip)->ili_inode; - trace_xfs_inode_pin(iip->ili_inode, _RET_IP_); - atomic_inc(&iip->ili_inode->i_pincount); + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); + + trace_xfs_inode_pin(ip, _RET_IP_); + atomic_inc(&ip->i_pincount); } @@ -546,10 +549,10 @@ xfs_inode_item_pin( */ STATIC void xfs_inode_item_unpin( - xfs_inode_log_item_t *iip, + struct xfs_log_item *lip, int remove) { - struct xfs_inode *ip = iip->ili_inode; + struct xfs_inode *ip = INODE_ITEM(lip)->ili_inode; trace_xfs_inode_unpin(ip, _RET_IP_); ASSERT(atomic_read(&ip->i_pincount) > 0); @@ -572,19 +575,16 @@ xfs_inode_item_unpin( */ STATIC uint xfs_inode_item_trylock( - xfs_inode_log_item_t *iip) + struct xfs_log_item *lip) { - register xfs_inode_t *ip; - - ip = iip->ili_inode; + struct xfs_inode_log_item *iip = INODE_ITEM(lip); + struct xfs_inode *ip = iip->ili_inode; - if (xfs_ipincount(ip) > 0) { + if (xfs_ipincount(ip) > 0) return XFS_ITEM_PINNED; - } - if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) { + if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) return XFS_ITEM_LOCKED; - } if (!xfs_iflock_nowait(ip)) { /* @@ -610,7 +610,7 @@ xfs_inode_item_trylock( if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { ASSERT(iip->ili_format.ilf_fields != 0); ASSERT(iip->ili_logged == 0); - ASSERT(iip->ili_item.li_flags & XFS_LI_IN_AIL); + ASSERT(lip->li_flags & XFS_LI_IN_AIL); } #endif return XFS_ITEM_SUCCESS; @@ -624,12 +624,13 @@ xfs_inode_item_trylock( */ STATIC void xfs_inode_item_unlock( - xfs_inode_log_item_t *iip) + struct xfs_log_item *lip) { - uint hold; - uint iolocked; - uint lock_flags; - xfs_inode_t *ip; + struct xfs_inode_log_item *iip = INODE_ITEM(lip); + struct xfs_inode *ip = iip->ili_inode; + uint hold; + uint iolocked; + uint lock_flags; ASSERT(iip != NULL); ASSERT(iip->ili_inode->i_itemp != NULL); @@ -640,10 +641,10 @@ xfs_inode_item_unlock( ASSERT((!(iip->ili_inode->i_itemp->ili_flags & XFS_ILI_IOLOCKED_SHARED)) || xfs_isilocked(iip->ili_inode, XFS_IOLOCK_SHARED)); + /* * Clear the transaction pointer in the inode. */ - ip = iip->ili_inode; ip->i_transp = NULL; /* @@ -706,13 +707,12 @@ xfs_inode_item_unlock( * is the only one that matters. Therefore, simply return the * given lsn. */ -/*ARGSUSED*/ STATIC xfs_lsn_t xfs_inode_item_committed( - xfs_inode_log_item_t *iip, + struct xfs_log_item *lip, xfs_lsn_t lsn) { - return (lsn); + return lsn; } /* @@ -724,13 +724,12 @@ xfs_inode_item_committed( */ STATIC void xfs_inode_item_pushbuf( - xfs_inode_log_item_t *iip) + struct xfs_log_item *lip) { - xfs_inode_t *ip; - xfs_mount_t *mp; - xfs_buf_t *bp; + struct xfs_inode_log_item *iip = INODE_ITEM(lip); + struct xfs_inode *ip = iip->ili_inode; + struct xfs_buf *bp; - ip = iip->ili_inode; ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED)); /* @@ -738,14 +737,13 @@ xfs_inode_item_pushbuf( * inode was taken off the AIL. So, just get out. */ if (completion_done(&ip->i_flush) || - ((iip->ili_item.li_flags & XFS_LI_IN_AIL) == 0)) { + !(lip->li_flags & XFS_LI_IN_AIL)) { xfs_iunlock(ip, XFS_ILOCK_SHARED); return; } - mp = ip->i_mount; - bp = xfs_incore(mp->m_ddev_targp, iip->ili_format.ilf_blkno, - iip->ili_format.ilf_len, XBF_TRYLOCK); + bp = xfs_incore(ip->i_mount->m_ddev_targp, iip->ili_format.ilf_blkno, + iip->ili_format.ilf_len, XBF_TRYLOCK); xfs_iunlock(ip, XFS_ILOCK_SHARED); if (!bp) @@ -753,10 +751,8 @@ xfs_inode_item_pushbuf( if (XFS_BUF_ISDELAYWRITE(bp)) xfs_buf_delwri_promote(bp); xfs_buf_relse(bp); - return; } - /* * This is called to asynchronously write the inode associated with this * inode log item out to disk. The inode will already have been locked by @@ -764,14 +760,14 @@ xfs_inode_item_pushbuf( */ STATIC void xfs_inode_item_push( - xfs_inode_log_item_t *iip) + struct xfs_log_item *lip) { - xfs_inode_t *ip; - - ip = iip->ili_inode; + struct xfs_inode_log_item *iip = INODE_ITEM(lip); + struct xfs_inode *ip = iip->ili_inode; ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED)); ASSERT(!completion_done(&ip->i_flush)); + /* * Since we were able to lock the inode's flush lock and * we found it on the AIL, the inode must be dirty. This @@ -794,41 +790,34 @@ xfs_inode_item_push( */ (void) xfs_iflush(ip, 0); xfs_iunlock(ip, XFS_ILOCK_SHARED); - - return; } /* * XXX rcc - this one really has to do something. Probably needs * to stamp in a new field in the incore inode. */ -/* ARGSUSED */ STATIC void xfs_inode_item_committing( - xfs_inode_log_item_t *iip, + struct xfs_log_item *lip, xfs_lsn_t lsn) { - iip->ili_last_lsn = lsn; - return; + INODE_ITEM(lip)->ili_last_lsn = lsn; } /* * This is the ops vector shared by all buf log items. */ static struct xfs_item_ops xfs_inode_item_ops = { - .iop_size = (uint(*)(xfs_log_item_t*))xfs_inode_item_size, - .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) - xfs_inode_item_format, - .iop_pin = (void(*)(xfs_log_item_t*))xfs_inode_item_pin, - .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_inode_item_unpin, - .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_inode_item_trylock, - .iop_unlock = (void(*)(xfs_log_item_t*))xfs_inode_item_unlock, - .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_inode_item_committed, - .iop_push = (void(*)(xfs_log_item_t*))xfs_inode_item_push, - .iop_pushbuf = (void(*)(xfs_log_item_t*))xfs_inode_item_pushbuf, - .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_inode_item_committing + .iop_size = xfs_inode_item_size, + .iop_format = xfs_inode_item_format, + .iop_pin = xfs_inode_item_pin, + .iop_unpin = xfs_inode_item_unpin, + .iop_trylock = xfs_inode_item_trylock, + .iop_unlock = xfs_inode_item_unlock, + .iop_committed = xfs_inode_item_committed, + .iop_push = xfs_inode_item_push, + .iop_pushbuf = xfs_inode_item_pushbuf, + .iop_committing = xfs_inode_item_committing }; @@ -837,10 +826,10 @@ static struct xfs_item_ops xfs_inode_ite */ void xfs_inode_item_init( - xfs_inode_t *ip, - xfs_mount_t *mp) + struct xfs_inode *ip, + struct xfs_mount *mp) { - xfs_inode_log_item_t *iip; + struct xfs_inode_log_item *iip; ASSERT(ip->i_itemp == NULL); iip = ip->i_itemp = kmem_zone_zalloc(xfs_ili_zone, KM_SLEEP); Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2010-05-29 18:12:37.760004276 +0200 +++ xfs/fs/xfs/xfs_buf_item.c 2010-05-29 18:14:21.317046949 +0200 @@ -33,6 +33,12 @@ kmem_zone_t *xfs_buf_item_zone; +static inline struct xfs_buf_log_item *BUF_ITEM(struct xfs_log_item *lip) +{ + return container_of(lip, struct xfs_buf_log_item, bli_item); +} + + #ifdef XFS_TRANS_DEBUG /* * This function uses an alternate strategy for tracking the bytes @@ -150,12 +156,13 @@ STATIC void xfs_buf_do_callbacks(xfs_buf */ STATIC uint xfs_buf_item_size( - xfs_buf_log_item_t *bip) + struct xfs_log_item *lip) { - uint nvecs; - int next_bit; - int last_bit; - xfs_buf_t *bp; + struct xfs_buf_log_item *bip = BUF_ITEM(lip); + struct xfs_buf *bp = bip->bli_buf; + uint nvecs; + int next_bit; + int last_bit; ASSERT(atomic_read(&bip->bli_refcount) > 0); if (bip->bli_flags & XFS_BLI_STALE) { @@ -169,7 +176,6 @@ xfs_buf_item_size( return 1; } - bp = bip->bli_buf; ASSERT(bip->bli_flags & XFS_BLI_LOGGED); nvecs = 1; last_bit = xfs_next_bit(bip->bli_format.blf_data_map, @@ -218,13 +224,13 @@ xfs_buf_item_size( */ STATIC void xfs_buf_item_format( - xfs_buf_log_item_t *bip, - xfs_log_iovec_t *log_vector) + struct xfs_log_item *lip, + struct xfs_log_iovec *vecp) { + struct xfs_buf_log_item *bip = BUF_ITEM(lip); + struct xfs_buf *bp = bip->bli_buf; uint base_size; uint nvecs; - xfs_log_iovec_t *vecp; - xfs_buf_t *bp; int first_bit; int last_bit; int next_bit; @@ -234,8 +240,6 @@ xfs_buf_item_format( ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT((bip->bli_flags & XFS_BLI_LOGGED) || (bip->bli_flags & XFS_BLI_STALE)); - bp = bip->bli_buf; - vecp = log_vector; /* * The size of the base structure is the size of the @@ -262,7 +266,7 @@ xfs_buf_item_format( */ if (bip->bli_flags & XFS_BLI_INODE_BUF) { if (!((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) && - xfs_log_item_in_current_chkpt(&bip->bli_item))) + xfs_log_item_in_current_chkpt(lip))) bip->bli_format.blf_flags |= XFS_BLF_INODE_BUF; bip->bli_flags &= ~XFS_BLI_INODE_BUF; } @@ -365,21 +369,20 @@ xfs_buf_item_format( STATIC void xfs_buf_item_pin( - xfs_buf_log_item_t *bip) + struct xfs_log_item *lip) { - xfs_buf_t *bp; + struct xfs_buf_log_item *bip = BUF_ITEM(lip); - bp = bip->bli_buf; - ASSERT(XFS_BUF_ISBUSY(bp)); + ASSERT(XFS_BUF_ISBUSY(bip->bli_buf)); ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT((bip->bli_flags & XFS_BLI_LOGGED) || (bip->bli_flags & XFS_BLI_STALE)); + atomic_inc(&bip->bli_refcount); trace_xfs_buf_item_pin(bip); - xfs_bpin(bp); + xfs_bpin(bip->bli_buf); } - /* * This is called to unpin the buffer associated with the buf log * item which was previously pinned with a call to xfs_buf_item_pin(). @@ -396,13 +399,14 @@ xfs_buf_item_pin( */ STATIC void xfs_buf_item_unpin( - xfs_buf_log_item_t *bip, + struct xfs_log_item *lip, int remove) { - struct xfs_ail *ailp; + struct xfs_buf_log_item *bip = BUF_ITEM(lip); xfs_buf_t *bp = bip->bli_buf; - int freed; + struct xfs_ail *ailp = lip->li_ailp; int stale = bip->bli_flags & XFS_BLI_STALE; + int freed; ASSERT(XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *) == bip); ASSERT(atomic_read(&bip->bli_refcount) > 0); @@ -410,8 +414,8 @@ xfs_buf_item_unpin( trace_xfs_buf_item_unpin(bip); freed = atomic_dec_and_test(&bip->bli_refcount); - ailp = bip->bli_item.li_ailp; xfs_bunpin(bp); + if (freed && stale) { ASSERT(bip->bli_flags & XFS_BLI_STALE); ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); @@ -429,7 +433,7 @@ xfs_buf_item_unpin( * in xfs_trans_uncommit() will ry to reference the * buffer which we no longer have a hold on. */ - xfs_trans_del_item(&bip->bli_item); + xfs_trans_del_item(lip); /* * Since the transaction no longer refers to the buffer, @@ -468,11 +472,11 @@ xfs_buf_item_unpin( */ STATIC uint xfs_buf_item_trylock( - xfs_buf_log_item_t *bip) + struct xfs_log_item *lip) { - xfs_buf_t *bp; + struct xfs_buf_log_item *bip = BUF_ITEM(lip); + struct xfs_buf *bp = bip->bli_buf; - bp = bip->bli_buf; if (XFS_BUF_ISPINNED(bp)) return XFS_ITEM_PINNED; if (!XFS_BUF_CPSEMA(bp)) @@ -509,13 +513,12 @@ xfs_buf_item_trylock( */ STATIC void xfs_buf_item_unlock( - xfs_buf_log_item_t *bip) + struct xfs_log_item *lip) { - int aborted; - xfs_buf_t *bp; - uint hold; - - bp = bip->bli_buf; + struct xfs_buf_log_item *bip = BUF_ITEM(lip); + struct xfs_buf *bp = bip->bli_buf; + int aborted; + uint hold; /* Clear the buffer's association with this transaction. */ XFS_BUF_SET_FSPRIVATE2(bp, NULL); @@ -526,7 +529,7 @@ xfs_buf_item_unlock( * (cancelled) buffers at unpin time, but we'll never go through the * pin/unpin cycle if we abort inside commit. */ - aborted = (bip->bli_item.li_flags & XFS_LI_ABORTED) != 0; + aborted = (lip->li_flags & XFS_LI_ABORTED) != 0; /* * Before possibly freeing the buf item, determine if we should @@ -587,16 +590,16 @@ xfs_buf_item_unlock( */ STATIC xfs_lsn_t xfs_buf_item_committed( - xfs_buf_log_item_t *bip, + struct xfs_log_item *lip, xfs_lsn_t lsn) { + struct xfs_buf_log_item *bip = BUF_ITEM(lip); + trace_xfs_buf_item_committed(bip); - if ((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) && - (bip->bli_item.li_lsn != 0)) { - return bip->bli_item.li_lsn; - } - return (lsn); + if ((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) && lip->li_lsn != 0) + return lip->li_lsn; + return lsn; } /* @@ -606,15 +609,16 @@ xfs_buf_item_committed( */ STATIC void xfs_buf_item_push( - xfs_buf_log_item_t *bip) + struct xfs_log_item *lip) { - xfs_buf_t *bp; + struct xfs_buf_log_item *bip = BUF_ITEM(lip); + struct xfs_buf *bp = bip->bli_buf; ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); + ASSERT(!XFS_BUF_ISDELAYWRITE(bp)); + trace_xfs_buf_item_push(bip); - bp = bip->bli_buf; - ASSERT(!XFS_BUF_ISDELAYWRITE(bp)); xfs_buf_relse(bp); } @@ -626,22 +630,24 @@ xfs_buf_item_push( */ STATIC void xfs_buf_item_pushbuf( - xfs_buf_log_item_t *bip) + struct xfs_log_item *lip) { - xfs_buf_t *bp; + struct xfs_buf_log_item *bip = BUF_ITEM(lip); + struct xfs_buf *bp = bip->bli_buf; ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); + ASSERT(XFS_BUF_ISDELAYWRITE(bp)); + trace_xfs_buf_item_pushbuf(bip); - bp = bip->bli_buf; - ASSERT(XFS_BUF_ISDELAYWRITE(bp)); xfs_buf_delwri_promote(bp); xfs_buf_relse(bp); } -/* ARGSUSED */ STATIC void -xfs_buf_item_committing(xfs_buf_log_item_t *bip, xfs_lsn_t commit_lsn) +xfs_buf_item_committing( + struct xfs_log_item *lip, + xfs_lsn_t commit_lsn) { } @@ -649,19 +655,16 @@ xfs_buf_item_committing(xfs_buf_log_item * This is the ops vector shared by all buf log items. */ static struct xfs_item_ops xfs_buf_item_ops = { - .iop_size = (uint(*)(xfs_log_item_t*))xfs_buf_item_size, - .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) - xfs_buf_item_format, - .iop_pin = (void(*)(xfs_log_item_t*))xfs_buf_item_pin, - .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_buf_item_unpin, - .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_buf_item_trylock, - .iop_unlock = (void(*)(xfs_log_item_t*))xfs_buf_item_unlock, - .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_buf_item_committed, - .iop_push = (void(*)(xfs_log_item_t*))xfs_buf_item_push, - .iop_pushbuf = (void(*)(xfs_log_item_t*))xfs_buf_item_pushbuf, - .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t)) - xfs_buf_item_committing + .iop_size = xfs_buf_item_size, + .iop_format = xfs_buf_item_format, + .iop_pin = xfs_buf_item_pin, + .iop_unpin = xfs_buf_item_unpin, + .iop_trylock = xfs_buf_item_trylock, + .iop_unlock = xfs_buf_item_unlock, + .iop_committed = xfs_buf_item_committed, + .iop_push = xfs_buf_item_push, + .iop_pushbuf = xfs_buf_item_pushbuf, + .iop_committing = xfs_buf_item_committing }; From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6ZP0178980 for ; Mon, 31 May 2010 11:06:35 -0500 X-ASG-Debug-ID: 1275322142-1cd101710000-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 9AE13387869 for ; Mon, 31 May 2010 09:09:02 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 0pNhtVY5i5Rz6YSA for ; Mon, 31 May 2010 09:09:02 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xy-00018V-9X for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:02 +0000 Message-Id: <20100531160902.179351623@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:42 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 15/17] xfs: remove the unused XFS_TRANS_NOSLEEP/XFS_TRANS_WAIT flags Subject: [PATCH 15/17] xfs: remove the unused XFS_TRANS_NOSLEEP/XFS_TRANS_WAIT flags References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-kill-dead-trans-flags 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: 1275322142 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_trans.h =================================================================== --- xfs.orig/fs/xfs/xfs_trans.h 2010-05-29 18:12:37.780017895 +0200 +++ xfs/fs/xfs/xfs_trans.h 2010-05-29 18:23:22.618003507 +0200 @@ -184,8 +184,6 @@ struct xfs_log_item_desc { /* * Values for call flags parameter. */ -#define XFS_TRANS_NOSLEEP 0x1 -#define XFS_TRANS_WAIT 0x2 #define XFS_TRANS_RELEASE_LOG_RES 0x4 #define XFS_TRANS_ABORT 0x8 From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6ZDU178990 for ; Mon, 31 May 2010 11:06:36 -0500 X-ASG-Debug-ID: 1275322142-1d26015f0000-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 C970B387872 for ; Mon, 31 May 2010 09:09:02 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id e8T3Iu5LNUoxcGpO for ; Mon, 31 May 2010 09:09:02 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xy-00019p-FJ for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:02 +0000 Message-Id: <20100531160902.372281460@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:43 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 16/17] xfs: remove unused XFS_BMAPI_ flags Subject: [PATCH 16/17] xfs: remove unused XFS_BMAPI_ flags References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-bmapi-cleanup-flags 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: 1275322142 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-05-29 18:31:14.248017615 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2010-05-29 18:31:15.146003157 +0200 @@ -4605,19 +4605,13 @@ xfs_bmapi( * allocate the stuff asked for in this bmap call * but that wouldn't be as good. */ - if (wasdelay && !(flags & XFS_BMAPI_EXACT)) { + if (wasdelay) { alen = (xfs_extlen_t)got.br_blockcount; aoff = got.br_startoff; if (lastx != NULLEXTNUM && lastx) { ep = xfs_iext_get_ext(ifp, lastx - 1); xfs_bmbt_get_all(ep, &prev); } - } else if (wasdelay) { - alen = (xfs_extlen_t) - XFS_FILBLKS_MIN(len, - (got.br_startoff + - got.br_blockcount) - bno); - aoff = bno; } else { alen = (xfs_extlen_t) XFS_FILBLKS_MIN(len, MAXEXTLEN); Index: xfs/fs/xfs/xfs_bmap.h =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.h 2010-05-29 18:09:00.436004974 +0200 +++ xfs/fs/xfs/xfs_bmap.h 2010-05-29 18:31:15.149023970 +0200 @@ -82,16 +82,13 @@ typedef struct xfs_bmap_free #define XFS_BMAPI_DELAY 0x002 /* delayed write operation */ #define XFS_BMAPI_ENTIRE 0x004 /* return entire extent, not trimmed */ #define XFS_BMAPI_METADATA 0x008 /* mapping metadata not user data */ -#define XFS_BMAPI_EXACT 0x010 /* allocate only to spec'd bounds */ -#define XFS_BMAPI_ATTRFORK 0x020 /* use attribute fork not data */ -#define XFS_BMAPI_ASYNC 0x040 /* bunmapi xactions can be async */ -#define XFS_BMAPI_RSVBLOCKS 0x080 /* OK to alloc. reserved data blocks */ -#define XFS_BMAPI_PREALLOC 0x100 /* preallocation op: unwritten space */ -#define XFS_BMAPI_IGSTATE 0x200 /* Ignore state - */ +#define XFS_BMAPI_ATTRFORK 0x010 /* use attribute fork not data */ +#define XFS_BMAPI_RSVBLOCKS 0x020 /* OK to alloc. reserved data blocks */ +#define XFS_BMAPI_PREALLOC 0x040 /* preallocation op: unwritten space */ +#define XFS_BMAPI_IGSTATE 0x080 /* Ignore state - */ /* combine contig. space */ -#define XFS_BMAPI_CONTIG 0x400 /* must allocate only one extent */ -/* XFS_BMAPI_DIRECT_IO 0x800 */ -#define XFS_BMAPI_CONVERT 0x1000 /* unwritten extent conversion - */ +#define XFS_BMAPI_CONTIG 0x100 /* must allocate only one extent */ +#define XFS_BMAPI_CONVERT 0x200 /* unwritten extent conversion - */ /* need write cache flushing and no */ /* additional allocation alignments */ @@ -100,9 +97,7 @@ typedef struct xfs_bmap_free { XFS_BMAPI_DELAY, "DELAY" }, \ { XFS_BMAPI_ENTIRE, "ENTIRE" }, \ { XFS_BMAPI_METADATA, "METADATA" }, \ - { XFS_BMAPI_EXACT, "EXACT" }, \ { XFS_BMAPI_ATTRFORK, "ATTRFORK" }, \ - { XFS_BMAPI_ASYNC, "ASYNC" }, \ { XFS_BMAPI_RSVBLOCKS, "RSVBLOCKS" }, \ { XFS_BMAPI_PREALLOC, "PREALLOC" }, \ { XFS_BMAPI_IGSTATE, "IGSTATE" }, \ Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-05-29 18:17:15.205004416 +0200 +++ xfs/fs/xfs/xfs_inode.c 2010-05-29 18:31:15.156026205 +0200 @@ -1588,8 +1588,7 @@ xfs_itruncate_finish( xfs_bmap_init(&free_list, &first_block); error = xfs_bunmapi(ntp, ip, first_unmap_block, unmap_len, - xfs_bmapi_aflag(fork) | - (sync ? 0 : XFS_BMAPI_ASYNC), + xfs_bmapi_aflag(fork), XFS_ITRUNC_MAX_EXTENTS, &first_block, &free_list, NULL, &done); From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6ZqC178969 for ; Mon, 31 May 2010 11:06:35 -0500 X-ASG-Debug-ID: 1275322142-26f302e20000-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 685E914678E3 for ; Mon, 31 May 2010 09:09:02 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id RHlQBIFPGhCPEXgG for ; Mon, 31 May 2010 09:09:02 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xy-00017V-3s for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:02 +0000 Message-Id: <20100531160901.981749888@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:41 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 14/17] xfs: remove the unused XFS_LOG_SLEEP and XFS_LOG_NOSLEEP flags Subject: [PATCH 14/17] xfs: remove the unused XFS_LOG_SLEEP and XFS_LOG_NOSLEEP flags References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-kill-dead-log-flags 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: 1275322142 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_log.c =================================================================== --- xfs.orig/fs/xfs/xfs_log.c 2010-05-29 18:21:05.762255846 +0200 +++ xfs/fs/xfs/xfs_log.c 2010-05-29 18:22:52.309004835 +0200 @@ -333,7 +333,6 @@ xfs_log_reserve( int retval = 0; ASSERT(client == XFS_TRANSACTION || client == XFS_LOG); - ASSERT((flags & XFS_LOG_NOSLEEP) == 0); if (XLOG_FORCED_SHUTDOWN(log)) return XFS_ERROR(EIO); Index: xfs/fs/xfs/xfs_log.h =================================================================== --- xfs.orig/fs/xfs/xfs_log.h 2010-05-29 18:22:26.023003369 +0200 +++ xfs/fs/xfs/xfs_log.h 2010-05-29 18:22:52.309004835 +0200 @@ -55,14 +55,10 @@ static inline xfs_lsn_t _lsn_cmp(xfs_lsn /* * Flags to xfs_log_reserve() * - * XFS_LOG_SLEEP: If space is not available, sleep (default) - * XFS_LOG_NOSLEEP: If space is not available, return error * XFS_LOG_PERM_RESERV: Permanent reservation. When writes are * performed against this type of reservation, the reservation * is not decreased. Long running transactions should use this. */ -#define XFS_LOG_SLEEP 0x0 -#define XFS_LOG_NOSLEEP 0x1 #define XFS_LOG_PERM_RESERV 0x2 /* From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_64, J_CHICKENPOX_66,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6ZLe178971 for ; Mon, 31 May 2010 11:06:35 -0500 X-ASG-Debug-ID: 1275322274-37ed00ad0000-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 7BD6B157FD1E for ; Mon, 31 May 2010 09:11:15 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 1vu1Zh8DaNiepJig for ; Mon, 31 May 2010 09:11:15 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xx-00014w-O0 for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:01 +0000 Message-Id: <20100531160901.608320202@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:39 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 12/17] xfs: fix the xfs_log_iovec i_addr type Subject: [PATCH 12/17] xfs: fix the xfs_log_iovec i_addr type References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-fix-i_addr-type 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: 1275322275 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean By making this member a void pointer we can get rid of a lot of pointless casts. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/quota/xfs_dquot_item.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot_item.c 2010-05-29 18:44:47.514010352 +0200 +++ xfs/fs/xfs/quota/xfs_dquot_item.c 2010-05-29 18:44:55.990253681 +0200 @@ -65,11 +65,11 @@ xfs_qm_dquot_logitem_format( { struct xfs_dq_logitem *qlip = DQUOT_ITEM(lip); - logvec->i_addr = (xfs_caddr_t)&qlip->qli_format; + logvec->i_addr = &qlip->qli_format; logvec->i_len = sizeof(xfs_dq_logformat_t); logvec->i_type = XLOG_REG_TYPE_QFORMAT; logvec++; - logvec->i_addr = (xfs_caddr_t)&qlip->qli_dquot->q_core; + logvec->i_addr = &qlip->qli_dquot->q_core; logvec->i_len = sizeof(xfs_disk_dquot_t); logvec->i_type = XLOG_REG_TYPE_DQUOT; @@ -369,7 +369,7 @@ xfs_qm_qoff_logitem_format( ASSERT(qflip->qql_format.qf_type == XFS_LI_QUOTAOFF); - log_vector->i_addr = (xfs_caddr_t)&(qflip->qql_format); + log_vector->i_addr = &qflip->qql_format; log_vector->i_len = sizeof(xfs_qoff_logitem_t); log_vector->i_type = XLOG_REG_TYPE_QUOTAOFF; qflip->qql_format.qf_size = 1; Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2010-05-29 18:44:47.641007209 +0200 +++ xfs/fs/xfs/xfs_buf_item.c 2010-05-29 18:44:55.991253611 +0200 @@ -251,7 +251,7 @@ xfs_buf_item_format( base_size = (uint)(sizeof(xfs_buf_log_format_t) + ((bip->bli_format.blf_map_size - 1) * sizeof(uint))); - vecp->i_addr = (xfs_caddr_t)&bip->bli_format; + vecp->i_addr = &bip->bli_format; vecp->i_len = base_size; vecp->i_type = XLOG_REG_TYPE_BFORMAT; vecp++; Index: xfs/fs/xfs/xfs_extfree_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_extfree_item.c 2010-05-29 18:44:47.519254590 +0200 +++ xfs/fs/xfs/xfs_extfree_item.c 2010-05-29 18:44:55.996299498 +0200 @@ -82,7 +82,7 @@ xfs_efi_item_format( size += (efip->efi_format.efi_nextents - 1) * sizeof(xfs_extent_t); efip->efi_format.efi_size = 1; - log_vector->i_addr = (xfs_caddr_t)&efip->efi_format; + log_vector->i_addr = &efip->efi_format; log_vector->i_len = size; log_vector->i_type = XLOG_REG_TYPE_EFI_FORMAT; ASSERT(size >= sizeof(xfs_efi_log_format_t)); @@ -244,7 +244,7 @@ xfs_efi_init( int xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt) { - xfs_efi_log_format_t *src_efi_fmt = (xfs_efi_log_format_t *)buf->i_addr; + xfs_efi_log_format_t *src_efi_fmt = buf->i_addr; uint i; uint len = sizeof(xfs_efi_log_format_t) + (src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_t); @@ -257,8 +257,7 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf memcpy((char *)dst_efi_fmt, (char*)src_efi_fmt, len); return 0; } else if (buf->i_len == len32) { - xfs_efi_log_format_32_t *src_efi_fmt_32 = - (xfs_efi_log_format_32_t *)buf->i_addr; + xfs_efi_log_format_32_t *src_efi_fmt_32 = buf->i_addr; dst_efi_fmt->efi_type = src_efi_fmt_32->efi_type; dst_efi_fmt->efi_size = src_efi_fmt_32->efi_size; @@ -272,8 +271,7 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf } return 0; } else if (buf->i_len == len64) { - xfs_efi_log_format_64_t *src_efi_fmt_64 = - (xfs_efi_log_format_64_t *)buf->i_addr; + xfs_efi_log_format_64_t *src_efi_fmt_64 = buf->i_addr; dst_efi_fmt->efi_type = src_efi_fmt_64->efi_type; dst_efi_fmt->efi_size = src_efi_fmt_64->efi_size; @@ -373,7 +371,7 @@ xfs_efd_item_format( size += (efdp->efd_format.efd_nextents - 1) * sizeof(xfs_extent_t); efdp->efd_format.efd_size = 1; - log_vector->i_addr = (xfs_caddr_t)&efdp->efd_format; + log_vector->i_addr = &efdp->efd_format; log_vector->i_len = size; log_vector->i_type = XLOG_REG_TYPE_EFD_FORMAT; ASSERT(size >= sizeof(xfs_efd_log_format_t)); Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-05-29 18:44:47.737033819 +0200 +++ xfs/fs/xfs/xfs_inode_item.c 2010-05-29 18:44:55.999022224 +0200 @@ -217,7 +217,7 @@ xfs_inode_item_format( int nrecs; xfs_mount_t *mp; - vecp->i_addr = (xfs_caddr_t)&iip->ili_format; + vecp->i_addr = &iip->ili_format; vecp->i_len = sizeof(xfs_inode_log_format_t); vecp->i_type = XLOG_REG_TYPE_IFORMAT; vecp++; @@ -268,7 +268,7 @@ xfs_inode_item_format( */ xfs_synchronize_times(ip); - vecp->i_addr = (xfs_caddr_t)&ip->i_d; + vecp->i_addr = &ip->i_d; vecp->i_len = sizeof(struct xfs_icdinode); vecp->i_type = XLOG_REG_TYPE_ICORE; vecp++; @@ -324,8 +324,7 @@ xfs_inode_item_format( * extents, so just point to the * real extents array. */ - vecp->i_addr = - (char *)(ip->i_df.if_u1.if_extents); + vecp->i_addr = ip->i_df.if_u1.if_extents; vecp->i_len = ip->i_df.if_bytes; vecp->i_type = XLOG_REG_TYPE_IEXT; } else @@ -343,7 +342,7 @@ xfs_inode_item_format( ext_buffer = kmem_alloc(ip->i_df.if_bytes, KM_SLEEP); iip->ili_extents_buf = ext_buffer; - vecp->i_addr = (xfs_caddr_t)ext_buffer; + vecp->i_addr = ext_buffer; vecp->i_len = xfs_iextents_copy(ip, ext_buffer, XFS_DATA_FORK); vecp->i_type = XLOG_REG_TYPE_IEXT; @@ -362,7 +361,7 @@ xfs_inode_item_format( if (iip->ili_format.ilf_fields & XFS_ILOG_DBROOT) { ASSERT(ip->i_df.if_broot_bytes > 0); ASSERT(ip->i_df.if_broot != NULL); - vecp->i_addr = (xfs_caddr_t)ip->i_df.if_broot; + vecp->i_addr = ip->i_df.if_broot; vecp->i_len = ip->i_df.if_broot_bytes; vecp->i_type = XLOG_REG_TYPE_IBROOT; vecp++; @@ -380,7 +379,7 @@ xfs_inode_item_format( ASSERT(ip->i_df.if_u1.if_data != NULL); ASSERT(ip->i_d.di_size > 0); - vecp->i_addr = (xfs_caddr_t)ip->i_df.if_u1.if_data; + vecp->i_addr = ip->i_df.if_u1.if_data; /* * Round i_bytes up to a word boundary. * The underlying memory is guaranteed to @@ -454,7 +453,7 @@ xfs_inode_item_format( * There are not delayed allocation extents * for attributes, so just point at the array. */ - vecp->i_addr = (char *)(ip->i_afp->if_u1.if_extents); + vecp->i_addr = ip->i_afp->if_u1.if_extents; vecp->i_len = ip->i_afp->if_bytes; #else ASSERT(iip->ili_aextents_buf == NULL); @@ -464,7 +463,7 @@ xfs_inode_item_format( ext_buffer = kmem_alloc(ip->i_afp->if_bytes, KM_SLEEP); iip->ili_aextents_buf = ext_buffer; - vecp->i_addr = (xfs_caddr_t)ext_buffer; + vecp->i_addr = ext_buffer; vecp->i_len = xfs_iextents_copy(ip, ext_buffer, XFS_ATTR_FORK); #endif @@ -481,7 +480,7 @@ xfs_inode_item_format( if (iip->ili_format.ilf_fields & XFS_ILOG_ABROOT) { ASSERT(ip->i_afp->if_broot_bytes > 0); ASSERT(ip->i_afp->if_broot != NULL); - vecp->i_addr = (xfs_caddr_t)ip->i_afp->if_broot; + vecp->i_addr = ip->i_afp->if_broot; vecp->i_len = ip->i_afp->if_broot_bytes; vecp->i_type = XLOG_REG_TYPE_IATTR_BROOT; vecp++; @@ -497,7 +496,7 @@ xfs_inode_item_format( ASSERT(ip->i_afp->if_bytes > 0); ASSERT(ip->i_afp->if_u1.if_data != NULL); - vecp->i_addr = (xfs_caddr_t)ip->i_afp->if_u1.if_data; + vecp->i_addr = ip->i_afp->if_u1.if_data; /* * Round i_bytes up to a word boundary. * The underlying memory is guaranteed to @@ -938,9 +937,8 @@ xfs_inode_item_format_convert( xfs_inode_log_format_t *in_f) { if (buf->i_len == sizeof(xfs_inode_log_format_32_t)) { - xfs_inode_log_format_32_t *in_f32; + xfs_inode_log_format_32_t *in_f32 = buf->i_addr; - in_f32 = (xfs_inode_log_format_32_t *)buf->i_addr; in_f->ilf_type = in_f32->ilf_type; in_f->ilf_size = in_f32->ilf_size; in_f->ilf_fields = in_f32->ilf_fields; @@ -956,9 +954,8 @@ xfs_inode_item_format_convert( in_f->ilf_boffset = in_f32->ilf_boffset; return 0; } else if (buf->i_len == sizeof(xfs_inode_log_format_64_t)){ - xfs_inode_log_format_64_t *in_f64; + xfs_inode_log_format_64_t *in_f64 = buf->i_addr; - in_f64 = (xfs_inode_log_format_64_t *)buf->i_addr; in_f->ilf_type = in_f64->ilf_type; in_f->ilf_size = in_f64->ilf_size; in_f->ilf_fields = in_f64->ilf_fields; Index: xfs/fs/xfs/xfs_log.c =================================================================== --- xfs.orig/fs/xfs/xfs_log.c 2010-05-29 18:44:44.180005323 +0200 +++ xfs/fs/xfs/xfs_log.c 2010-05-29 18:44:56.006006719 +0200 @@ -548,7 +548,7 @@ xfs_log_unmount_write(xfs_mount_t *mp) .magic = XLOG_UNMOUNT_TYPE, }; struct xfs_log_iovec reg = { - .i_addr = (void *)&magic, + .i_addr = &magic, .i_len = sizeof(magic), .i_type = XLOG_REG_TYPE_UNMOUNT, }; Index: xfs/fs/xfs/xfs_log.h =================================================================== --- xfs.orig/fs/xfs/xfs_log.h 2010-05-29 18:34:05.795254730 +0200 +++ xfs/fs/xfs/xfs_log.h 2010-05-29 18:44:56.012049463 +0200 @@ -104,7 +104,7 @@ static inline xfs_lsn_t _lsn_cmp(xfs_lsn #define XLOG_REG_TYPE_MAX 19 typedef struct xfs_log_iovec { - xfs_caddr_t i_addr; /* beginning address of region */ + void *i_addr; /* beginning address of region */ int i_len; /* length in bytes of region */ uint i_type; /* type of region */ } xfs_log_iovec_t; Index: xfs/fs/xfs/xfs_log_cil.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_cil.c 2010-05-29 18:44:44.299005460 +0200 +++ xfs/fs/xfs/xfs_log_cil.c 2010-05-29 18:44:56.016261643 +0200 @@ -552,7 +552,7 @@ xlog_cil_push( thdr.th_type = XFS_TRANS_CHECKPOINT; thdr.th_tid = tic->t_tid; thdr.th_num_items = num_iovecs; - lhdr.i_addr = (xfs_caddr_t)&thdr; + lhdr.i_addr = &thdr; lhdr.i_len = sizeof(xfs_trans_header_t); lhdr.i_type = XLOG_REG_TYPE_TRANSHDR; tic->t_curr_res -= lhdr.i_len + sizeof(xlog_op_header_t); Index: xfs/fs/xfs/xfs_log_recover.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_recover.c 2010-05-29 18:44:44.185264996 +0200 +++ xfs/fs/xfs/xfs_log_recover.c 2010-05-29 18:44:56.019268488 +0200 @@ -1561,9 +1561,7 @@ xlog_recover_reorder_trans( list_splice_init(&trans->r_itemq, &sort_list); list_for_each_entry_safe(item, n, &sort_list, ri_list) { - xfs_buf_log_format_t *buf_f; - - buf_f = (xfs_buf_log_format_t *)item->ri_buf[0].i_addr; + xfs_buf_log_format_t *buf_f = item->ri_buf[0].i_addr; switch (ITEM_TYPE(item)) { case XFS_LI_BUF: @@ -1888,9 +1886,8 @@ xlog_recover_do_inode_buffer( * current di_next_unlinked field. Extract its value * and copy it to the buffer copy. */ - logged_nextp = (xfs_agino_t *) - ((char *)(item->ri_buf[item_index].i_addr) + - (next_unlinked_offset - reg_buf_offset)); + logged_nextp = item->ri_buf[item_index].i_addr + + next_unlinked_offset - reg_buf_offset; if (unlikely(*logged_nextp == 0)) { xfs_fs_cmn_err(CE_ALERT, mp, "bad inode buffer log record (ptr = 0x%p, bp = 0x%p). XFS trying to replay bad (0) inode di_next_unlinked field", @@ -1969,8 +1966,7 @@ xlog_recover_do_reg_buffer( item->ri_buf[i].i_len, __func__); goto next; } - error = xfs_qm_dqcheck((xfs_disk_dquot_t *) - item->ri_buf[i].i_addr, + error = xfs_qm_dqcheck(item->ri_buf[i].i_addr, -1, 0, XFS_QMOPT_DOWARN, "dquot_buf_recover"); if (error) @@ -2183,7 +2179,7 @@ xlog_recover_do_buffer_trans( xlog_recover_item_t *item, int pass) { - xfs_buf_log_format_t *buf_f; + xfs_buf_log_format_t *buf_f = item->ri_buf[0].i_addr; xfs_mount_t *mp; xfs_buf_t *bp; int error; @@ -2193,8 +2189,6 @@ xlog_recover_do_buffer_trans( ushort flags; uint buf_flags; - buf_f = (xfs_buf_log_format_t *)item->ri_buf[0].i_addr; - if (pass == XLOG_RECOVER_PASS1) { /* * In this pass we're only looking for buf items @@ -2315,10 +2309,9 @@ xlog_recover_do_inode_trans( } if (item->ri_buf[0].i_len == sizeof(xfs_inode_log_format_t)) { - in_f = (xfs_inode_log_format_t *)item->ri_buf[0].i_addr; + in_f = item->ri_buf[0].i_addr; } else { - in_f = (xfs_inode_log_format_t *)kmem_alloc( - sizeof(xfs_inode_log_format_t), KM_SLEEP); + in_f = kmem_alloc(sizeof(xfs_inode_log_format_t), KM_SLEEP); need_free = 1; error = xfs_inode_item_format_convert(&item->ri_buf[0], in_f); if (error) @@ -2366,7 +2359,7 @@ xlog_recover_do_inode_trans( error = EFSCORRUPTED; goto error; } - dicp = (xfs_icdinode_t *)(item->ri_buf[1].i_addr); + dicp = item->ri_buf[1].i_addr; if (unlikely(dicp->di_magic != XFS_DINODE_MAGIC)) { xfs_buf_relse(bp); xfs_fs_cmn_err(CE_ALERT, mp, @@ -2457,7 +2450,7 @@ xlog_recover_do_inode_trans( } /* The core is in in-core format */ - xfs_dinode_to_disk(dip, (xfs_icdinode_t *)item->ri_buf[1].i_addr); + xfs_dinode_to_disk(dip, item->ri_buf[1].i_addr); /* the rest is in on-disk format */ if (item->ri_buf[1].i_len > sizeof(struct xfs_icdinode)) { @@ -2574,7 +2567,7 @@ xlog_recover_do_quotaoff_trans( return (0); } - qoff_f = (xfs_qoff_logformat_t *)item->ri_buf[0].i_addr; + qoff_f = item->ri_buf[0].i_addr; ASSERT(qoff_f); /* @@ -2618,9 +2611,8 @@ xlog_recover_do_dquot_trans( if (mp->m_qflags == 0) return (0); - recddq = (xfs_disk_dquot_t *)item->ri_buf[1].i_addr; - - if (item->ri_buf[1].i_addr == NULL) { + recddq = item->ri_buf[1].i_addr; + if (recddq == NULL) { cmn_err(CE_ALERT, "XFS: NULL dquot in %s.", __func__); return XFS_ERROR(EIO); @@ -2650,7 +2642,7 @@ xlog_recover_do_dquot_trans( * The other possibility, of course, is that the quota subsystem was * removed since the last mount - ENOSYS. */ - dq_f = (xfs_dq_logformat_t *)item->ri_buf[0].i_addr; + dq_f = item->ri_buf[0].i_addr; ASSERT(dq_f); if ((error = xfs_qm_dqcheck(recddq, dq_f->qlf_id, @@ -2717,7 +2709,7 @@ xlog_recover_do_efi_trans( return 0; } - efi_formatp = (xfs_efi_log_format_t *)item->ri_buf[0].i_addr; + efi_formatp = item->ri_buf[0].i_addr; mp = log->l_mp; efip = xfs_efi_init(mp, efi_formatp->efi_nextents); @@ -2763,7 +2755,7 @@ xlog_recover_do_efd_trans( return; } - efd_formatp = (xfs_efd_log_format_t *)item->ri_buf[0].i_addr; + efd_formatp = item->ri_buf[0].i_addr; ASSERT((item->ri_buf[0].i_len == (sizeof(xfs_efd_log_format_32_t) + ((efd_formatp->efd_nextents - 1) * sizeof(xfs_extent_32_t)))) || (item->ri_buf[0].i_len == (sizeof(xfs_efd_log_format_64_t) + From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6YSQ178921 for ; Mon, 31 May 2010 11:06:34 -0500 X-ASG-Debug-ID: 1275322273-3d0500460000-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 1CE6E157FB97 for ; Mon, 31 May 2010 09:11:13 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id XfhQD6p1pmWh3pKd for ; Mon, 31 May 2010 09:11:13 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xw-0000uz-6s for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:00 +0000 Message-Id: <20100531160900.057188886@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:32 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 05/17] xfs: remove unneeded #include statements Subject: [PATCH 05/17] xfs: remove unneeded #include statements References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-reduce-includes 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: 1275322274 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Christoph Hellwig --- V1 -> V2 - updated to account for the delayed logging branch merge Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-05-25 11:14:59.286031150 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-05-25 11:38:00.497004330 +0200 @@ -21,18 +21,12 @@ #include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_trans.h" #include "xfs_mount.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_alloc.h" -#include "xfs_btree.h" #include "xfs_error.h" #include "xfs_rw.h" #include "xfs_iomap.h" Index: xfs/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_file.c 2010-05-25 11:14:59.236274548 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-05-25 11:38:00.498004261 +0200 @@ -22,22 +22,15 @@ #include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_trans.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" #include "xfs_alloc.h" -#include "xfs_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_vnodeops.h" #include "xfs_da_btree.h" #include "xfs_ioctl.h" Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-25 11:14:59.237275526 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-25 11:38:00.505033035 +0200 @@ -23,23 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_ioctl.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" #include "xfs_rtalloc.h" #include "xfs_itable.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_bmap.h" #include "xfs_buf_item.h" Index: xfs/fs/xfs/linux-2.6/xfs_ioctl32.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-05-25 11:14:59.317003422 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-05-25 11:38:00.512033733 +0200 @@ -28,11 +28,8 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dir2_sf.h" #include "xfs_vnode.h" #include "xfs_dinode.h" #include "xfs_inode.h" Index: xfs/fs/xfs/linux-2.6/xfs_iops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_iops.c 2010-05-25 11:14:59.319042045 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_iops.c 2010-05-25 11:38:00.519033454 +0200 @@ -24,20 +24,13 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_bmap.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_itable.h" Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2010-05-25 11:15:23.496005936 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-05-25 11:38:00.525005726 +0200 @@ -30,8 +30,6 @@ #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" @@ -42,7 +40,6 @@ #include "xfs_error.h" #include "xfs_itable.h" #include "xfs_fsops.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_utils.h" Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2010-05-25 11:14:59.335006286 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2010-05-25 11:38:00.531005657 +0200 @@ -24,24 +24,14 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_inode.h" #include "xfs_dinode.h" #include "xfs_error.h" -#include "xfs_mru_cache.h" #include "xfs_filestream.h" #include "xfs_vnodeops.h" -#include "xfs_utils.h" -#include "xfs_buf_item.h" #include "xfs_inode_item.h" -#include "xfs_rw.h" #include "xfs_quota.h" #include "xfs_trace.h" Index: xfs/fs/xfs/linux-2.6/xfs_trace.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.c 2010-05-25 11:14:59.338005727 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_trace.c 2010-05-25 11:38:00.534004958 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_da_btree.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" Index: xfs/fs/xfs/quota/xfs_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot.c 2010-05-25 11:14:59.344006076 +0200 +++ xfs/fs/xfs/quota/xfs_dquot.c 2010-05-25 11:38:00.540006006 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_itable.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_space.h" Index: xfs/fs/xfs/quota/xfs_dquot_item.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot_item.c 2010-05-25 11:14:59.350033035 +0200 +++ xfs/fs/xfs/quota/xfs_dquot_item.c 2010-05-25 11:38:00.546006565 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_bmap.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_itable.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" Index: xfs/fs/xfs/quota/xfs_qm.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm.c 2010-05-25 11:14:59.357004121 +0200 +++ xfs/fs/xfs/quota/xfs_qm.c 2010-05-25 11:38:00.552267005 +0200 @@ -23,24 +23,18 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_itable.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_bmap.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_space.h" Index: xfs/fs/xfs/quota/xfs_qm_bhv.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_bhv.c 2010-05-25 11:14:59.361013061 +0200 +++ xfs/fs/xfs/quota/xfs_qm_bhv.c 2010-05-25 11:38:00.557255481 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_itable.h" -#include "xfs_btree.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_qm.h" Index: xfs/fs/xfs/quota/xfs_qm_stats.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_stats.c 2010-05-25 11:14:59.363010267 +0200 +++ xfs/fs/xfs/quota/xfs_qm_stats.c 2010-05-25 11:38:00.560284396 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_itable.h" #include "xfs_bmap.h" -#include "xfs_btree.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_qm.h" Index: xfs/fs/xfs/quota/xfs_qm_syscalls.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_syscalls.c 2010-05-25 11:14:59.368004121 +0200 +++ xfs/fs/xfs/quota/xfs_qm_syscalls.c 2010-05-25 11:38:00.565285095 +0200 @@ -26,24 +26,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_itable.h" #include "xfs_bmap.h" -#include "xfs_btree.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_utils.h" Index: xfs/fs/xfs/quota/xfs_trans_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c 2010-05-25 11:14:59.372003632 +0200 +++ xfs/fs/xfs/quota/xfs_trans_dquot.c 2010-05-25 11:38:00.570255481 +0200 @@ -23,24 +23,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dir2_sf.h" -#include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_ialloc.h" #include "xfs_itable.h" -#include "xfs_btree.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2010-05-25 11:14:59.381273222 +0200 +++ xfs/fs/xfs/xfs_alloc.c 2010-05-25 11:38:00.578255621 +0200 @@ -24,17 +24,13 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_ialloc.h" #include "xfs_alloc.h" #include "xfs_error.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_alloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc_btree.c 2010-05-25 11:14:59.386036737 +0200 +++ xfs/fs/xfs/xfs_alloc_btree.c 2010-05-25 11:38:00.584254923 +0200 @@ -24,18 +24,14 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_btree_trace.h" -#include "xfs_ialloc.h" #include "xfs_alloc.h" #include "xfs_error.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_attr.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr.c 2010-05-25 11:14:59.390255762 +0200 +++ xfs/fs/xfs/xfs_attr.c 2010-05-25 11:38:00.592255901 +0200 @@ -25,18 +25,13 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_da_btree.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_alloc.h" -#include "xfs_btree.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_attr.h" Index: xfs/fs/xfs/xfs_attr_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr_leaf.c 2010-05-25 11:14:59.398255692 +0200 +++ xfs/fs/xfs/xfs_attr_leaf.c 2010-05-25 11:38:00.599285444 +0200 @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" @@ -32,7 +31,6 @@ #include "xfs_ialloc_btree.h" #include "xfs_alloc.h" #include "xfs_btree.h" -#include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" Index: xfs/fs/xfs/xfs_bmap_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap_btree.c 2010-05-25 11:14:59.404255552 +0200 +++ xfs/fs/xfs/xfs_bmap_btree.c 2010-05-25 11:38:00.605255621 +0200 @@ -24,20 +24,16 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" #include "xfs_alloc.h" #include "xfs_btree.h" #include "xfs_btree_trace.h" -#include "xfs_ialloc.h" #include "xfs_itable.h" #include "xfs_bmap.h" #include "xfs_error.h" Index: xfs/fs/xfs/xfs_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_btree.c 2010-05-25 11:14:59.410003911 +0200 +++ xfs/fs/xfs/xfs_btree.c 2010-05-25 11:38:00.611255412 +0200 @@ -24,19 +24,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" #include "xfs_btree.h" #include "xfs_btree_trace.h" -#include "xfs_ialloc.h" #include "xfs_error.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_dfrag.c =================================================================== --- xfs.orig/fs/xfs/xfs_dfrag.c 2010-05-25 11:14:59.430031918 +0200 +++ xfs/fs/xfs/xfs_dfrag.c 2010-05-25 11:38:00.613284745 +0200 @@ -24,23 +24,15 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" #include "xfs_bmap.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" #include "xfs_itable.h" #include "xfs_dfrag.h" #include "xfs_error.h" -#include "xfs_rw.h" #include "xfs_vnodeops.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_error.c =================================================================== --- xfs.orig/fs/xfs/xfs_error.c 2010-05-25 11:14:59.684255901 +0200 +++ xfs/fs/xfs/xfs_error.c 2010-05-25 11:38:00.620282861 +0200 @@ -23,11 +23,8 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_utils.h" Index: xfs/fs/xfs/xfs_filestream.c =================================================================== --- xfs.orig/fs/xfs/xfs_filestream.c 2010-05-25 11:14:59.694256111 +0200 +++ xfs/fs/xfs/xfs_filestream.c 2010-05-25 11:38:00.627283908 +0200 @@ -18,9 +18,6 @@ #include "xfs.h" #include "xfs_bmap_btree.h" #include "xfs_inum.h" -#include "xfs_dir2.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_ag.h" Index: xfs/fs/xfs/xfs_fsops.c =================================================================== --- xfs.orig/fs/xfs/xfs_fsops.c 2010-05-25 11:14:59.700275318 +0200 +++ xfs/fs/xfs/xfs_fsops.c 2010-05-25 11:38:00.634282791 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" Index: xfs/fs/xfs/xfs_ialloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc.c 2010-05-25 11:14:59.705254086 +0200 +++ xfs/fs/xfs/xfs_ialloc.c 2010-05-25 11:38:00.640284956 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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" Index: xfs/fs/xfs/xfs_ialloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc_btree.c 2010-05-25 11:14:59.709254155 +0200 +++ xfs/fs/xfs/xfs_ialloc_btree.c 2010-05-25 11:38:00.646284886 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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" Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-05-25 11:14:59.713253736 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-05-25 11:38:00.653255482 +0200 @@ -25,13 +25,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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" Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-05-25 11:14:59.716253946 +0200 +++ xfs/fs/xfs/xfs_inode.c 2010-05-25 11:38:00.661255413 +0200 @@ -27,12 +27,10 @@ #include "xfs_trans_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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" @@ -43,7 +41,6 @@ #include "xfs_alloc.h" #include "xfs_ialloc.h" #include "xfs_bmap.h" -#include "xfs_rw.h" #include "xfs_error.h" #include "xfs_utils.h" #include "xfs_quota.h" Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-05-25 11:14:59.722275178 +0200 +++ xfs/fs/xfs/xfs_inode_item.c 2010-05-25 11:38:00.664256321 +0200 @@ -22,23 +22,14 @@ #include "xfs_log.h" #include "xfs_inum.h" #include "xfs_trans.h" -#include "xfs_buf_item.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_trans_priv.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_inode_item.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" -#include "xfs_rw.h" #include "xfs_error.h" #include "xfs_trace.h" Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c 2010-05-25 11:14:59.733005937 +0200 +++ xfs/fs/xfs/xfs_iomap.c 2010-05-25 11:38:00.669284676 +0200 @@ -23,18 +23,14 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.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_ialloc.h" #include "xfs_btree.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" Index: xfs/fs/xfs/xfs_itable.c =================================================================== --- xfs.orig/fs/xfs/xfs_itable.c 2010-05-25 11:14:59.740006635 +0200 +++ xfs/fs/xfs/xfs_itable.c 2010-05-25 11:38:00.674285794 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_ialloc.h" Index: xfs/fs/xfs/xfs_log.c =================================================================== --- xfs.orig/fs/xfs/xfs_log.c 2010-05-25 11:14:59.753006007 +0200 +++ xfs/fs/xfs/xfs_log.c 2010-05-25 11:38:00.683255622 +0200 @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_log_priv.h" @@ -34,8 +33,6 @@ #include "xfs_ialloc_btree.h" #include "xfs_log_recover.h" #include "xfs_trans_priv.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_rw.h" Index: xfs/fs/xfs/xfs_log_recover.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_recover.c 2010-05-25 11:14:59.762003492 +0200 +++ xfs/fs/xfs/xfs_log_recover.c 2010-05-25 11:38:00.689033734 +0200 @@ -24,14 +24,11 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_error.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_inode_item.h" Index: xfs/fs/xfs/xfs_mount.c =================================================================== --- xfs.orig/fs/xfs/xfs_mount.c 2010-05-25 11:14:59.764011664 +0200 +++ xfs/fs/xfs/xfs_mount.c 2010-05-25 11:38:00.697283978 +0200 @@ -29,8 +29,6 @@ #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" Index: xfs/fs/xfs/xfs_rename.c =================================================================== --- xfs.orig/fs/xfs/xfs_rename.c 2010-05-25 11:14:59.266265051 +0200 +++ xfs/fs/xfs/xfs_rename.c 2010-05-25 11:38:00.703005448 +0200 @@ -27,8 +27,6 @@ #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_rtalloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_rtalloc.c 2010-05-25 11:14:59.778003841 +0200 +++ xfs/fs/xfs/xfs_rtalloc.c 2010-05-25 11:38:00.706025842 +0200 @@ -27,14 +27,8 @@ #include "xfs_dir2.h" #include "xfs_mount.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_ialloc.h" #include "xfs_alloc.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" Index: xfs/fs/xfs/xfs_rw.c =================================================================== --- xfs.orig/fs/xfs/xfs_rw.c 2010-05-25 11:14:59.784026331 +0200 +++ xfs/fs/xfs/xfs_rw.c 2010-05-25 11:38:00.711005378 +0200 @@ -24,26 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_inode_item.h" -#include "xfs_itable.h" -#include "xfs_btree.h" -#include "xfs_alloc.h" -#include "xfs_ialloc.h" -#include "xfs_attr.h" -#include "xfs_bmap.h" #include "xfs_error.h" -#include "xfs_buf_item.h" #include "xfs_rw.h" -#include "xfs_trace.h" /* * Force a shutdown of the filesystem instantly while keeping Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-25 11:14:59.797257578 +0200 +++ xfs/fs/xfs/xfs_trans.c 2010-05-25 11:38:00.715067607 +0200 @@ -24,15 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_da_btree.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" Index: xfs/fs/xfs/xfs_trans_buf.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_buf.c 2010-05-25 11:14:59.808006007 +0200 +++ xfs/fs/xfs/xfs_trans_buf.c 2010-05-25 11:38:00.720005588 +0200 @@ -24,13 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_buf_item.h" Index: xfs/fs/xfs/xfs_trans_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_inode.c 2010-05-25 11:14:59.816006845 +0200 +++ xfs/fs/xfs/xfs_trans_inode.c 2010-05-25 11:38:00.729033873 +0200 @@ -24,17 +24,13 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.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_ialloc.h" #include "xfs_trans_priv.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_utils.c =================================================================== --- xfs.orig/fs/xfs/xfs_utils.c 2010-05-25 11:14:59.820006076 +0200 +++ xfs/fs/xfs/xfs_utils.c 2010-05-25 11:38:00.736033663 +0200 @@ -27,15 +27,12 @@ #include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_error.h" #include "xfs_quota.h" -#include "xfs_rw.h" #include "xfs_itable.h" #include "xfs_utils.h" Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c 2010-05-25 11:14:59.274016343 +0200 +++ xfs/fs/xfs/xfs_vnodeops.c 2010-05-25 11:38:00.742005377 +0200 @@ -29,15 +29,11 @@ #include "xfs_mount.h" #include "xfs_da_btree.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_inode_item.h" #include "xfs_itable.h" -#include "xfs_btree.h" #include "xfs_ialloc.h" #include "xfs_alloc.h" #include "xfs_bmap.h" Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-05-25 11:14:59.261004260 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2010-05-25 11:38:00.753005587 +0200 @@ -30,12 +30,10 @@ #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_mount.h" -#include "xfs_ialloc.h" #include "xfs_itable.h" #include "xfs_dir2_data.h" #include "xfs_dir2_leaf.h" Index: xfs/fs/xfs/xfs_da_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_da_btree.c 2010-05-25 11:14:59.424006216 +0200 +++ xfs/fs/xfs/xfs_da_btree.c 2010-05-25 11:38:00.760005726 +0200 @@ -28,15 +28,11 @@ #include "xfs_mount.h" #include "xfs_da_btree.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_inode_item.h" #include "xfs_alloc.h" -#include "xfs_btree.h" #include "xfs_bmap.h" #include "xfs_attr.h" #include "xfs_attr_leaf.h" Index: xfs/fs/xfs/xfs_dir2.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2.c 2010-05-25 11:14:59.435037366 +0200 +++ xfs/fs/xfs/xfs_dir2.c 2010-05-25 11:38:00.762068235 +0200 @@ -30,7 +30,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_dir2_block.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_block.c 2010-05-25 11:14:59.440014527 +0200 +++ xfs/fs/xfs/xfs_dir2_block.c 2010-05-25 11:38:00.767067886 +0200 @@ -28,7 +28,6 @@ #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_dir2_data.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_data.c 2010-05-25 11:14:59.442011873 +0200 +++ xfs/fs/xfs/xfs_dir2_data.c 2010-05-25 11:38:00.775006634 +0200 @@ -28,7 +28,6 @@ #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_dir2_data.h" Index: xfs/fs/xfs/xfs_dir2_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_leaf.c 2010-05-25 11:14:59.454006216 +0200 +++ xfs/fs/xfs/xfs_dir2_leaf.c 2010-05-25 11:38:00.780034013 +0200 @@ -28,7 +28,6 @@ #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_attr_sf.h" #include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" Index: xfs/fs/xfs/xfs_dir2_node.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_node.c 2010-05-25 11:14:59.671255345 +0200 +++ xfs/fs/xfs/xfs_dir2_node.c 2010-05-25 11:38:00.788005377 +0200 @@ -28,7 +28,6 @@ #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_bmap.h" Index: xfs/fs/xfs/xfs_dir2_sf.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_sf.c 2010-05-25 11:14:59.678033455 +0200 +++ xfs/fs/xfs/xfs_dir2_sf.c 2010-05-25 11:38:00.794039181 +0200 @@ -28,7 +28,6 @@ #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" Index: xfs/fs/xfs/xfs_log_cil.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_cil.c 2010-05-25 11:38:09.226004051 +0200 +++ xfs/fs/xfs/xfs_log_cil.c 2010-05-25 11:40:49.242004818 +0200 @@ -26,7 +26,6 @@ #include "xfs_log_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir2.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_alloc.h" From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_61, J_CHICKENPOX_64,J_CHICKENPOX_66,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6YbE178926 for ; Mon, 31 May 2010 11:06:34 -0500 X-ASG-Debug-ID: 1275322273-3cd800570000-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 65DC1157FD1E for ; Mon, 31 May 2010 09:11:13 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id jVd6Mw9M4LgONP2F for ; Mon, 31 May 2010 09:11:13 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xw-0000xp-GG for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:00 +0000 Message-Id: <20100531160900.319050257@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:33 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 06/17] xfs: simplify log item descriptor tracking Subject: [PATCH 06/17] xfs: simplify log item descriptor tracking References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-log_item_desc-list 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: 1275322274 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Currently we track log item descriptor belonging to a transaction using a complex opencoded chunk allocator. This code has been there since day one and seems to work around the lack of an efficient slab allocator. This patch replaces it with dynamically allocated log item descriptors from a dedicated slab pool, linked to the transaction by a linked list. This allows to greatly simplify the log item descriptor tracking to the point where it's just a couple hundred lines in xfs_trans.c instead of a separate file. The external API has also been simplified while we're at it - the xfs_trans_add_item and xfs_trans_del_item functions to add/ delete items from a transaction have been simplified to the bare minium, and the xfs_trans_find_item function is replaced with a direct dereference of the li_desc field. All debug code walking the list of log items in a transaction is down to a simple list_for_each_entry. Note that we could easily use a singly linked list here instead of the double linked list from list.h as the fastpath only does deletion from sequential traversal. But given that we don't have one available as a library function yet I use the list.h functions for simplicity. [the patch applies ontop of Dave's delayed-logging branch] Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/quota/xfs_trans_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c 2010-05-25 11:40:59.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_trans_dquot.c 2010-05-25 12:43:47.925004680 +0200 @@ -49,16 +49,14 @@ xfs_trans_dqjoin( xfs_trans_t *tp, xfs_dquot_t *dqp) { - xfs_dq_logitem_t *lp = &dqp->q_logitem; - ASSERT(dqp->q_transp != tp); ASSERT(XFS_DQ_IS_LOCKED(dqp)); - ASSERT(lp->qli_dquot == dqp); + ASSERT(dqp->q_logitem.qli_dquot == dqp); /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)(lp)); + xfs_trans_add_item(tp, &dqp->q_logitem.qli_item); /* * Initialize i_transp so we can later determine if this dquot is @@ -83,16 +81,11 @@ xfs_trans_log_dquot( xfs_trans_t *tp, xfs_dquot_t *dqp) { - xfs_log_item_desc_t *lidp; - ASSERT(dqp->q_transp == tp); ASSERT(XFS_DQ_IS_LOCKED(dqp)); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)(&dqp->q_logitem)); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + dqp->q_logitem.qli_item.li_desc->lid_flags |= XFS_LID_DIRTY; } /* @@ -864,9 +857,8 @@ xfs_trans_get_qoff_item( /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)q); - - return (q); + xfs_trans_add_item(tp, &q->qql_item); + return q; } @@ -880,13 +872,8 @@ xfs_trans_log_quotaoff_item( xfs_trans_t *tp, xfs_qoff_logitem_t *qlp) { - xfs_log_item_desc_t *lidp; - - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)qlp); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + qlp->qql_item.li_desc->lid_flags |= XFS_LID_DIRTY; } STATIC void Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2010-05-25 11:40:58.000000000 +0200 +++ xfs/fs/xfs/xfs_buf_item.c 2010-05-25 12:43:47.926004470 +0200 @@ -460,13 +460,10 @@ xfs_buf_item_unpin_remove( * occurs later in the xfs_trans_uncommit() will try to * reference the buffer which we no longer have a hold on. */ - struct xfs_log_item_desc *lidp; - ASSERT(XFS_BUF_VALUSEMA(bip->bli_buf) <= 0); trace_xfs_buf_item_unpin_stale(bip); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)bip); - xfs_trans_free_item(tp, lidp); + xfs_trans_del_item(&bip->bli_item); /* * Since the transaction no longer refers to the buffer, the Index: xfs/fs/xfs/xfs_extfree_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_extfree_item.c 2010-05-25 11:40:58.000000000 +0200 +++ xfs/fs/xfs/xfs_extfree_item.c 2010-05-25 12:43:47.938004470 +0200 @@ -131,18 +131,18 @@ STATIC void xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) { struct xfs_ail *ailp = efip->efi_item.li_ailp; - xfs_log_item_desc_t *lidp; spin_lock(&ailp->xa_lock); if (efip->efi_flags & XFS_EFI_CANCELED) { + struct xfs_log_item *lip = &efip->efi_item; + /* * free the xaction descriptor pointing to this item */ - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *) efip); - xfs_trans_free_item(tp, lidp); + xfs_trans_del_item(lip); /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); + xfs_trans_ail_delete(ailp, lip); xfs_efi_item_free(efip); } else { efip->efi_flags |= XFS_EFI_COMMITTED; Index: xfs/fs/xfs/xfs_trans_buf.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_buf.c 2010-05-25 11:40:59.292005935 +0200 +++ xfs/fs/xfs/xfs_trans_buf.c 2010-05-25 12:43:47.945004470 +0200 @@ -47,36 +47,17 @@ xfs_trans_buf_item_match( xfs_daddr_t blkno, int len) { - xfs_log_item_chunk_t *licp; - xfs_log_item_desc_t *lidp; - xfs_buf_log_item_t *blip; - int i; + struct xfs_log_item_desc *lidp; + struct xfs_buf_log_item *blip; len = BBTOB(len); - for (licp = &tp->t_items; licp != NULL; licp = licp->lic_next) { - if (xfs_lic_are_all_free(licp)) { - ASSERT(licp == &tp->t_items); - ASSERT(licp->lic_next == NULL); - return NULL; - } - - for (i = 0; i < licp->lic_unused; i++) { - /* - * Skip unoccupied slots. - */ - if (xfs_lic_isfree(licp, i)) - continue; - - lidp = xfs_lic_slot(licp, i); - blip = (xfs_buf_log_item_t *)lidp->lid_item; - if (blip->bli_item.li_type != XFS_LI_BUF) - continue; - - if (XFS_BUF_TARGET(blip->bli_buf) == target && - XFS_BUF_ADDR(blip->bli_buf) == blkno && - XFS_BUF_COUNT(blip->bli_buf) == len) - return blip->bli_buf; - } + list_for_each_entry(lidp, &tp->t_items, lid_trans) { + blip = (struct xfs_buf_log_item *)lidp->lid_item; + if (blip->bli_item.li_type == XFS_LI_BUF && + XFS_BUF_TARGET(blip->bli_buf) == target && + XFS_BUF_ADDR(blip->bli_buf) == blkno && + XFS_BUF_COUNT(blip->bli_buf) == len) + return blip->bli_buf; } return NULL; @@ -123,7 +104,7 @@ _xfs_trans_bjoin( /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t *)bip); + xfs_trans_add_item(tp, &bip->bli_item); /* * Initialize b_fsprivate2 so we can find it with incore_match() @@ -479,7 +460,6 @@ xfs_trans_brelse(xfs_trans_t *tp, { xfs_buf_log_item_t *bip; xfs_log_item_t *lip; - xfs_log_item_desc_t *lidp; /* * Default to a normal brelse() call if the tp is NULL. @@ -510,13 +490,6 @@ xfs_trans_brelse(xfs_trans_t *tp, ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); ASSERT(atomic_read(&bip->bli_refcount) > 0); - /* - * Find the item descriptor pointing to this buffer's - * log item. It must be there. - */ - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); - ASSERT(lidp != NULL); - trace_xfs_trans_brelse(bip); /* @@ -532,7 +505,7 @@ xfs_trans_brelse(xfs_trans_t *tp, * If the buffer is dirty within this transaction, we can't * release it until we commit. */ - if (lidp->lid_flags & XFS_LID_DIRTY) + if (bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY) return; /* @@ -549,7 +522,7 @@ xfs_trans_brelse(xfs_trans_t *tp, /* * Free up the log item descriptor tracking the released item. */ - xfs_trans_free_item(tp, lidp); + xfs_trans_del_item(&bip->bli_item); /* * Clear the hold flag in the buf log item if it is set. @@ -661,7 +634,6 @@ xfs_trans_log_buf(xfs_trans_t *tp, uint last) { xfs_buf_log_item_t *bip; - xfs_log_item_desc_t *lidp; ASSERT(XFS_BUF_ISBUSY(bp)); ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); @@ -703,11 +675,8 @@ xfs_trans_log_buf(xfs_trans_t *tp, bip->bli_format.blf_flags &= ~XFS_BLF_CANCEL; } - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY; bip->bli_flags |= XFS_BLI_LOGGED; xfs_buf_item_log(bip, first, last); } @@ -736,7 +705,6 @@ xfs_trans_binval( xfs_trans_t *tp, xfs_buf_t *bp) { - xfs_log_item_desc_t *lidp; xfs_buf_log_item_t *bip; ASSERT(XFS_BUF_ISBUSY(bp)); @@ -744,8 +712,6 @@ xfs_trans_binval( ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); - ASSERT(lidp != NULL); ASSERT(atomic_read(&bip->bli_refcount) > 0); trace_xfs_trans_binval(bip); @@ -760,7 +726,7 @@ xfs_trans_binval( ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_INODE_BUF)); ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); - ASSERT(lidp->lid_flags & XFS_LID_DIRTY); + ASSERT(bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY); ASSERT(tp->t_flags & XFS_TRANS_DIRTY); return; } @@ -793,7 +759,7 @@ xfs_trans_binval( bip->bli_format.blf_flags |= XFS_BLF_CANCEL; memset((char *)(bip->bli_format.blf_data_map), 0, (bip->bli_format.blf_map_size * sizeof(uint))); - lidp->lid_flags |= XFS_LID_DIRTY; + bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY; tp->t_flags |= XFS_TRANS_DIRTY; } Index: xfs/fs/xfs/xfs_trans_extfree.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_extfree.c 2010-05-25 11:40:58.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_extfree.c 2010-05-25 12:43:47.950004191 +0200 @@ -48,9 +48,8 @@ xfs_trans_get_efi(xfs_trans_t *tp, /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)efip); - - return (efip); + xfs_trans_add_item(tp, &efip->efi_item); + return efip; } /* @@ -64,15 +63,11 @@ xfs_trans_log_efi_extent(xfs_trans_t *t xfs_fsblock_t start_block, xfs_extlen_t ext_len) { - xfs_log_item_desc_t *lidp; uint next_extent; xfs_extent_t *extp; - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)efip); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + efip->efi_item.li_desc->lid_flags |= XFS_LID_DIRTY; next_extent = efip->efi_next_extent; ASSERT(next_extent < efip->efi_format.efi_nextents); @@ -105,9 +100,8 @@ xfs_trans_get_efd(xfs_trans_t *tp, /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)efdp); - - return (efdp); + xfs_trans_add_item(tp, &efdp->efd_item); + return efdp; } /* @@ -121,15 +115,11 @@ xfs_trans_log_efd_extent(xfs_trans_t *t xfs_fsblock_t start_block, xfs_extlen_t ext_len) { - xfs_log_item_desc_t *lidp; uint next_extent; xfs_extent_t *extp; - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)efdp); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + efdp->efd_item.li_desc->lid_flags |= XFS_LID_DIRTY; next_extent = efdp->efd_next_extent; ASSERT(next_extent < efdp->efd_format.efd_nextents); Index: xfs/fs/xfs/xfs_trans_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_inode.c 2010-05-25 11:40:59.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_inode.c 2010-05-25 12:43:47.956003422 +0200 @@ -88,7 +88,7 @@ xfs_trans_ijoin( /* * Get a log_item_desc to point at the new item. */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)(iip)); + xfs_trans_add_item(tp, &iip->ili_item); xfs_trans_inode_broot_debug(ip); @@ -144,17 +144,12 @@ xfs_trans_log_inode( xfs_inode_t *ip, uint flags) { - xfs_log_item_desc_t *lidp; - ASSERT(ip->i_transp == tp); ASSERT(ip->i_itemp != NULL); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)(ip->i_itemp)); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + ip->i_itemp->ili_item.li_desc->lid_flags |= XFS_LID_DIRTY; /* * Always OR in the bits from the ili_last_fields field. Index: xfs/fs/xfs/xfs_trans_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_item.c 2010-05-25 12:43:55.924003980 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,440 +0,0 @@ -/* - * Copyright (c) 2000-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_log.h" -#include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h" -/* XXX: from here down needed until struct xfs_trans has its own ailp */ -#include "xfs_bit.h" -#include "xfs_buf_item.h" -#include "xfs_sb.h" -#include "xfs_ag.h" -#include "xfs_dir2.h" -#include "xfs_mount.h" - -STATIC int xfs_trans_unlock_chunk(xfs_log_item_chunk_t *, - int, int, xfs_lsn_t); - -/* - * This is called to add the given log item to the transaction's - * list of log items. It must find a free log item descriptor - * or allocate a new one and add the item to that descriptor. - * The function returns a pointer to item descriptor used to point - * to the new item. The log item will now point to its new descriptor - * with its li_desc field. - */ -xfs_log_item_desc_t * -xfs_trans_add_item(xfs_trans_t *tp, xfs_log_item_t *lip) -{ - xfs_log_item_desc_t *lidp; - xfs_log_item_chunk_t *licp; - int i=0; - - /* - * If there are no free descriptors, allocate a new chunk - * of them and put it at the front of the chunk list. - */ - if (tp->t_items_free == 0) { - licp = (xfs_log_item_chunk_t*) - kmem_alloc(sizeof(xfs_log_item_chunk_t), KM_SLEEP); - ASSERT(licp != NULL); - /* - * Initialize the chunk, and then - * claim the first slot in the newly allocated chunk. - */ - xfs_lic_init(licp); - xfs_lic_claim(licp, 0); - licp->lic_unused = 1; - xfs_lic_init_slot(licp, 0); - lidp = xfs_lic_slot(licp, 0); - - /* - * Link in the new chunk and update the free count. - */ - licp->lic_next = tp->t_items.lic_next; - tp->t_items.lic_next = licp; - tp->t_items_free = XFS_LIC_NUM_SLOTS - 1; - - /* - * Initialize the descriptor and the generic portion - * of the log item. - * - * Point the new slot at this item and return it. - * Also point the log item at its currently active - * descriptor and set the item's mount pointer. - */ - lidp->lid_item = lip; - lidp->lid_flags = 0; - lidp->lid_size = 0; - lip->li_desc = lidp; - lip->li_mountp = tp->t_mountp; - lip->li_ailp = tp->t_mountp->m_ail; - return lidp; - } - - /* - * Find the free descriptor. It is somewhere in the chunklist - * of descriptors. - */ - licp = &tp->t_items; - while (licp != NULL) { - if (xfs_lic_vacancy(licp)) { - if (licp->lic_unused <= XFS_LIC_MAX_SLOT) { - i = licp->lic_unused; - ASSERT(xfs_lic_isfree(licp, i)); - break; - } - for (i = 0; i <= XFS_LIC_MAX_SLOT; i++) { - if (xfs_lic_isfree(licp, i)) - break; - } - ASSERT(i <= XFS_LIC_MAX_SLOT); - break; - } - licp = licp->lic_next; - } - ASSERT(licp != NULL); - /* - * If we find a free descriptor, claim it, - * initialize it, and return it. - */ - xfs_lic_claim(licp, i); - if (licp->lic_unused <= i) { - licp->lic_unused = i + 1; - xfs_lic_init_slot(licp, i); - } - lidp = xfs_lic_slot(licp, i); - tp->t_items_free--; - lidp->lid_item = lip; - lidp->lid_flags = 0; - lidp->lid_size = 0; - lip->li_desc = lidp; - lip->li_mountp = tp->t_mountp; - lip->li_ailp = tp->t_mountp->m_ail; - return lidp; -} - -/* - * Free the given descriptor. - * - * This requires setting the bit in the chunk's free mask corresponding - * to the given slot. - */ -void -xfs_trans_free_item(xfs_trans_t *tp, xfs_log_item_desc_t *lidp) -{ - uint slot; - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t **licpp; - - slot = xfs_lic_desc_to_slot(lidp); - licp = xfs_lic_desc_to_chunk(lidp); - xfs_lic_relse(licp, slot); - lidp->lid_item->li_desc = NULL; - tp->t_items_free++; - - /* - * If there are no more used items in the chunk and this is not - * the chunk embedded in the transaction structure, then free - * the chunk. First pull it from the chunk list and then - * free it back to the heap. We didn't bother with a doubly - * linked list here because the lists should be very short - * and this is not a performance path. It's better to save - * the memory of the extra pointer. - * - * Also decrement the transaction structure's count of free items - * by the number in a chunk since we are freeing an empty chunk. - */ - if (xfs_lic_are_all_free(licp) && (licp != &(tp->t_items))) { - licpp = &(tp->t_items.lic_next); - while (*licpp != licp) { - ASSERT(*licpp != NULL); - licpp = &((*licpp)->lic_next); - } - *licpp = licp->lic_next; - kmem_free(licp); - tp->t_items_free -= XFS_LIC_NUM_SLOTS; - } -} - -/* - * This is called to find the descriptor corresponding to the given - * log item. It returns a pointer to the descriptor. - * The log item MUST have a corresponding descriptor in the given - * transaction. This routine does not return NULL, it panics. - * - * The descriptor pointer is kept in the log item's li_desc field. - * Just return it. - */ -/*ARGSUSED*/ -xfs_log_item_desc_t * -xfs_trans_find_item(xfs_trans_t *tp, xfs_log_item_t *lip) -{ - ASSERT(lip->li_desc != NULL); - - return lip->li_desc; -} - - -/* - * Return a pointer to the first descriptor in the chunk list. - * This does not return NULL if there are none, it panics. - * - * The first descriptor must be in either the first or second chunk. - * This is because the only chunk allowed to be empty is the first. - * All others are freed when they become empty. - * - * At some point this and xfs_trans_next_item() should be optimized - * to quickly look at the mask to determine if there is anything to - * look at. - */ -xfs_log_item_desc_t * -xfs_trans_first_item(xfs_trans_t *tp) -{ - xfs_log_item_chunk_t *licp; - int i; - - licp = &tp->t_items; - /* - * If it's not in the first chunk, skip to the second. - */ - if (xfs_lic_are_all_free(licp)) { - licp = licp->lic_next; - } - - /* - * Return the first non-free descriptor in the chunk. - */ - ASSERT(!xfs_lic_are_all_free(licp)); - for (i = 0; i < licp->lic_unused; i++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - - return xfs_lic_slot(licp, i); - } - cmn_err(CE_WARN, "xfs_trans_first_item() -- no first item"); - return NULL; -} - - -/* - * Given a descriptor, return the next descriptor in the chunk list. - * This returns NULL if there are no more used descriptors in the list. - * - * We do this by first locating the chunk in which the descriptor resides, - * and then scanning forward in the chunk and the list for the next - * used descriptor. - */ -/*ARGSUSED*/ -xfs_log_item_desc_t * -xfs_trans_next_item(xfs_trans_t *tp, xfs_log_item_desc_t *lidp) -{ - xfs_log_item_chunk_t *licp; - int i; - - licp = xfs_lic_desc_to_chunk(lidp); - - /* - * First search the rest of the chunk. The for loop keeps us - * from referencing things beyond the end of the chunk. - */ - for (i = (int)xfs_lic_desc_to_slot(lidp) + 1; i < licp->lic_unused; i++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - - return xfs_lic_slot(licp, i); - } - - /* - * Now search the next chunk. It must be there, because the - * next chunk would have been freed if it were empty. - * If there is no next chunk, return NULL. - */ - if (licp->lic_next == NULL) { - return NULL; - } - - licp = licp->lic_next; - ASSERT(!xfs_lic_are_all_free(licp)); - for (i = 0; i < licp->lic_unused; i++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - - return xfs_lic_slot(licp, i); - } - ASSERT(0); - /* NOTREACHED */ - return NULL; /* keep gcc quite */ -} - -/* - * This is called to unlock all of the items of a transaction and to free - * all the descriptors of that transaction. - * - * It walks the list of descriptors and unlocks each item. It frees - * each chunk except that embedded in the transaction as it goes along. - */ -void -xfs_trans_free_items( - xfs_trans_t *tp, - xfs_lsn_t commit_lsn, - int flags) -{ - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t *next_licp; - int abort; - - abort = flags & XFS_TRANS_ABORT; - licp = &tp->t_items; - /* - * Special case the embedded chunk so we don't free it below. - */ - if (!xfs_lic_are_all_free(licp)) { - (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn); - xfs_lic_all_free(licp); - licp->lic_unused = 0; - } - licp = licp->lic_next; - - /* - * Unlock each item in each chunk and free the chunks. - */ - while (licp != NULL) { - ASSERT(!xfs_lic_are_all_free(licp)); - (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn); - next_licp = licp->lic_next; - kmem_free(licp); - licp = next_licp; - } - - /* - * Reset the transaction structure's free item count. - */ - tp->t_items_free = XFS_LIC_NUM_SLOTS; - tp->t_items.lic_next = NULL; -} - - - -/* - * This is called to unlock the items associated with a transaction. - * Items which were not logged should be freed. - * Those which were logged must still be tracked so they can be unpinned - * when the transaction commits. - */ -void -xfs_trans_unlock_items(xfs_trans_t *tp, xfs_lsn_t commit_lsn) -{ - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t *next_licp; - xfs_log_item_chunk_t **licpp; - int freed; - - freed = 0; - licp = &tp->t_items; - - /* - * Special case the embedded chunk so we don't free. - */ - if (!xfs_lic_are_all_free(licp)) { - freed = xfs_trans_unlock_chunk(licp, 0, 0, commit_lsn); - } - licpp = &(tp->t_items.lic_next); - licp = licp->lic_next; - - /* - * Unlock each item in each chunk, free non-dirty descriptors, - * and free empty chunks. - */ - while (licp != NULL) { - ASSERT(!xfs_lic_are_all_free(licp)); - freed += xfs_trans_unlock_chunk(licp, 0, 0, commit_lsn); - next_licp = licp->lic_next; - if (xfs_lic_are_all_free(licp)) { - *licpp = next_licp; - kmem_free(licp); - freed -= XFS_LIC_NUM_SLOTS; - } else { - licpp = &(licp->lic_next); - } - ASSERT(*licpp == next_licp); - licp = next_licp; - } - - /* - * Fix the free descriptor count in the transaction. - */ - tp->t_items_free += freed; -} - -/* - * Unlock each item pointed to by a descriptor in the given chunk. - * Stamp the commit lsn into each item if necessary. - * Free descriptors pointing to items which are not dirty if freeing_chunk - * is zero. If freeing_chunk is non-zero, then we need to unlock all - * items in the chunk. - * - * Return the number of descriptors freed. - */ -STATIC int -xfs_trans_unlock_chunk( - xfs_log_item_chunk_t *licp, - int freeing_chunk, - int abort, - xfs_lsn_t commit_lsn) -{ - xfs_log_item_desc_t *lidp; - xfs_log_item_t *lip; - int i; - int freed; - - freed = 0; - lidp = licp->lic_descs; - for (i = 0; i < licp->lic_unused; i++, lidp++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - lip = lidp->lid_item; - lip->li_desc = NULL; - - if (commit_lsn != NULLCOMMITLSN) - IOP_COMMITTING(lip, commit_lsn); - if (abort) - lip->li_flags |= XFS_LI_ABORTED; - IOP_UNLOCK(lip); - - /* - * Free the descriptor if the item is not dirty - * within this transaction and the caller is not - * going to just free the entire thing regardless. - */ - if (!(freeing_chunk) && - (!(lidp->lid_flags & XFS_LID_DIRTY) || abort)) { - xfs_lic_relse(licp, i); - freed++; - } - } - - return freed; -} Index: xfs/fs/xfs/xfs_trans_priv.h =================================================================== --- xfs.orig/fs/xfs/xfs_trans_priv.h 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_priv.h 2010-05-25 12:43:47.958004191 +0200 @@ -23,22 +23,8 @@ struct xfs_log_item_desc; struct xfs_mount; struct xfs_trans; -/* - * From xfs_trans_item.c - */ -struct xfs_log_item_desc *xfs_trans_add_item(struct xfs_trans *, - struct xfs_log_item *); -void xfs_trans_free_item(struct xfs_trans *, - struct xfs_log_item_desc *); -struct xfs_log_item_desc *xfs_trans_find_item(struct xfs_trans *, - struct xfs_log_item *); -struct xfs_log_item_desc *xfs_trans_first_item(struct xfs_trans *); -struct xfs_log_item_desc *xfs_trans_next_item(struct xfs_trans *, - struct xfs_log_item_desc *); - -void xfs_trans_unlock_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn); -void xfs_trans_free_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn, - int flags); +void xfs_trans_add_item(struct xfs_trans *, struct xfs_log_item *); +void xfs_trans_del_item(struct xfs_log_item *); void xfs_trans_item_committed(struct xfs_log_item *lip, xfs_lsn_t commit_lsn, int aborted); Index: xfs/fs/xfs/Makefile =================================================================== --- xfs.orig/fs/xfs/Makefile 2010-05-25 11:40:58.000000000 +0200 +++ xfs/fs/xfs/Makefile 2010-05-25 12:43:47.961004819 +0200 @@ -87,7 +87,6 @@ xfs-y += xfs_alloc.o \ xfs_trans_buf.o \ xfs_trans_extfree.o \ xfs_trans_inode.o \ - xfs_trans_item.o \ xfs_utils.o \ xfs_vnodeops.o \ xfs_rw.o Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2010-05-25 11:40:59.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-05-25 12:43:47.966004540 +0200 @@ -1702,6 +1702,12 @@ xfs_init_zones(void) if (!xfs_trans_zone) goto out_destroy_ifork_zone; + xfs_log_item_desc_zone = + kmem_zone_init(sizeof(struct xfs_log_item_desc), + "xfs_log_item_desc"); + if (!xfs_log_item_desc_zone) + goto out_destroy_trans_zone; + /* * The size of the zone allocated buf log item is the maximum * size possible under XFS. This wastes a little bit of memory, @@ -1711,7 +1717,7 @@ xfs_init_zones(void) (((XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK) / NBWORD) * sizeof(int))), "xfs_buf_item"); if (!xfs_buf_item_zone) - goto out_destroy_trans_zone; + goto out_destroy_log_item_desc_zone; xfs_efd_zone = kmem_zone_init((sizeof(xfs_efd_log_item_t) + ((XFS_EFD_MAX_FAST_EXTENTS - 1) * @@ -1748,6 +1754,8 @@ xfs_init_zones(void) kmem_zone_destroy(xfs_efd_zone); out_destroy_buf_item_zone: kmem_zone_destroy(xfs_buf_item_zone); + out_destroy_log_item_desc_zone: + kmem_zone_destroy(xfs_log_item_desc_zone); out_destroy_trans_zone: kmem_zone_destroy(xfs_trans_zone); out_destroy_ifork_zone: @@ -1778,6 +1786,7 @@ xfs_destroy_zones(void) kmem_zone_destroy(xfs_efi_zone); kmem_zone_destroy(xfs_efd_zone); kmem_zone_destroy(xfs_buf_item_zone); + kmem_zone_destroy(xfs_log_item_desc_zone); kmem_zone_destroy(xfs_trans_zone); kmem_zone_destroy(xfs_ifork_zone); kmem_zone_destroy(xfs_dabuf_zone); Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-05-25 11:40:59.000000000 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2010-05-25 12:43:47.970004889 +0200 @@ -5857,43 +5857,18 @@ xfs_bmap_get_bp( bp = NULL; if (!bp) { /* Chase down all the log items to see if the bp is there */ - xfs_log_item_chunk_t *licp; - xfs_trans_t *tp; + struct xfs_log_item_desc *lidp; + struct xfs_buf_log_item *bip; - tp = cur->bc_tp; - licp = &tp->t_items; - while (!bp && licp != NULL) { - if (xfs_lic_are_all_free(licp)) { - licp = licp->lic_next; - continue; - } - for (i = 0; i < licp->lic_unused; i++) { - xfs_log_item_desc_t *lidp; - xfs_log_item_t *lip; - xfs_buf_log_item_t *bip; - xfs_buf_t *lbp; - - if (xfs_lic_isfree(licp, i)) { - continue; - } - - lidp = xfs_lic_slot(licp, i); - lip = lidp->lid_item; - if (lip->li_type != XFS_LI_BUF) - continue; - - bip = (xfs_buf_log_item_t *)lip; - lbp = bip->bli_buf; - - if (XFS_BUF_ADDR(lbp) == bno) { - bp = lbp; - break; /* Found it */ - } - } - licp = licp->lic_next; + list_for_each_entry(lidp, &cur->bc_tp->t_items, lid_trans) { + bip = (struct xfs_buf_log_item *)lidp->lid_item; + if (bip->bli_item.li_type == XFS_LI_BUF && + XFS_BUF_ADDR(bip->bli_buf) == bno) + return bip->bli_buf; } } - return(bp); + + return bp; } STATIC void Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-25 12:43:44.000000000 +0200 +++ xfs/fs/xfs/xfs_trans.c 2010-05-25 12:43:47.977004330 +0200 @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (C) 2010 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -43,6 +44,7 @@ #include "xfs_trace.h" kmem_zone_t *xfs_trans_zone; +kmem_zone_t *xfs_log_item_desc_zone; /* @@ -593,8 +595,7 @@ _xfs_trans_alloc( tp->t_magic = XFS_TRANS_MAGIC; tp->t_type = type; tp->t_mountp = mp; - tp->t_items_free = XFS_LIC_NUM_SLOTS; - xfs_lic_init(&(tp->t_items)); + INIT_LIST_HEAD(&tp->t_items); INIT_LIST_HEAD(&tp->t_busy); return tp; } @@ -639,8 +640,7 @@ xfs_trans_dup( ntp->t_magic = XFS_TRANS_MAGIC; ntp->t_type = tp->t_type; ntp->t_mountp = tp->t_mountp; - ntp->t_items_free = XFS_LIC_NUM_SLOTS; - xfs_lic_init(&(ntp->t_items)); + INIT_LIST_HEAD(&ntp->t_items); INIT_LIST_HEAD(&ntp->t_busy); ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); @@ -1120,6 +1120,108 @@ xfs_trans_unreserve_and_mod_sb( } /* + * Add the given log item to the transaction's list of log items. + * + * The log item will now point to its new descriptor with its li_desc field. + */ +void +xfs_trans_add_item( + struct xfs_trans *tp, + struct xfs_log_item *lip) +{ + struct xfs_log_item_desc *lidp; + + ASSERT(lip->li_mountp = tp->t_mountp); + ASSERT(lip->li_ailp = tp->t_mountp->m_ail); + + lidp = kmem_zone_zalloc(xfs_log_item_desc_zone, KM_SLEEP); + + lidp->lid_item = lip; + lidp->lid_flags = 0; + lidp->lid_size = 0; + list_add_tail(&lidp->lid_trans, &tp->t_items); + + lip->li_desc = lidp; +} + +STATIC void +xfs_trans_free_item_desc( + struct xfs_log_item_desc *lidp) +{ + list_del_init(&lidp->lid_trans); + kmem_zone_free(xfs_log_item_desc_zone, lidp); +} + +/* + * Unlink and free the given descriptor. + */ +void +xfs_trans_del_item( + struct xfs_log_item *lip) +{ + xfs_trans_free_item_desc(lip->li_desc); + lip->li_desc = NULL; +} + +/* + * Unlock all of the items of a transaction and free all the descriptors + * of that transaction. + */ +STATIC void +xfs_trans_free_items( + struct xfs_trans *tp, + xfs_lsn_t commit_lsn, + int flags) +{ + struct xfs_log_item_desc *lidp, *next; + + list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) { + struct xfs_log_item *lip = lidp->lid_item; + + lip->li_desc = NULL; + + if (commit_lsn != NULLCOMMITLSN) + IOP_COMMITTING(lip, commit_lsn); + if (flags & XFS_TRANS_ABORT) + lip->li_flags |= XFS_LI_ABORTED; + IOP_UNLOCK(lip); + + xfs_trans_free_item_desc(lidp); + } +} + +/* + * Unlock the items associated with a transaction. + * + * Items which were not logged should be freed. Those which were logged must + * still be tracked so they can be unpinned when the transaction commits. + */ +STATIC void +xfs_trans_unlock_items( + struct xfs_trans *tp, + xfs_lsn_t commit_lsn) +{ + struct xfs_log_item_desc *lidp, *next; + + list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) { + struct xfs_log_item *lip = lidp->lid_item; + + lip->li_desc = NULL; + + if (commit_lsn != NULLCOMMITLSN) + IOP_COMMITTING(lip, commit_lsn); + IOP_UNLOCK(lip); + + /* + * Free the descriptor if the item is not dirty + * within this transaction. + */ + if (!(lidp->lid_flags & XFS_LID_DIRTY)) + xfs_trans_free_item_desc(lidp); + } +} + +/* * Total up the number of log iovecs needed to commit this * transaction. The transaction itself needs one for the * transaction header. Ask each dirty item in turn how many @@ -1130,30 +1232,27 @@ xfs_trans_count_vecs( struct xfs_trans *tp) { int nvecs; - xfs_log_item_desc_t *lidp; + struct xfs_log_item_desc *lidp; nvecs = 1; - lidp = xfs_trans_first_item(tp); - ASSERT(lidp != NULL); /* In the non-debug case we need to start bailing out if we * didn't find a log_item here, return zero and let trans_commit * deal with it. */ - if (lidp == NULL) + if (list_empty(&tp->t_items)) { + ASSERT(0); return 0; + } - while (lidp != NULL) { + list_for_each_entry(lidp, &tp->t_items, lid_trans) { /* * Skip items which aren't dirty in this transaction. */ - if (!(lidp->lid_flags & XFS_LID_DIRTY)) { - lidp = xfs_trans_next_item(tp, lidp); + if (!(lidp->lid_flags & XFS_LID_DIRTY)) continue; - } lidp->lid_size = IOP_SIZE(lidp->lid_item); nvecs += lidp->lid_size; - lidp = xfs_trans_next_item(tp, lidp); } return nvecs; @@ -1173,7 +1272,7 @@ xfs_trans_fill_vecs( struct xfs_trans *tp, struct xfs_log_iovec *log_vector) { - xfs_log_item_desc_t *lidp; + struct xfs_log_item_desc *lidp; struct xfs_log_iovec *vecp; uint nitems; @@ -1184,14 +1283,11 @@ xfs_trans_fill_vecs( vecp = log_vector + 1; nitems = 0; - lidp = xfs_trans_first_item(tp); - ASSERT(lidp); - while (lidp) { + ASSERT(!list_empty(&tp->t_items)); + list_for_each_entry(lidp, &tp->t_items, lid_trans) { /* Skip items which aren't dirty in this transaction. */ - if (!(lidp->lid_flags & XFS_LID_DIRTY)) { - lidp = xfs_trans_next_item(tp, lidp); + if (!(lidp->lid_flags & XFS_LID_DIRTY)) continue; - } /* * The item may be marked dirty but not log anything. This can @@ -1202,7 +1298,6 @@ xfs_trans_fill_vecs( IOP_FORMAT(lidp->lid_item, vecp); vecp += lidp->lid_size; IOP_PIN(lidp->lid_item); - lidp = xfs_trans_next_item(tp, lidp); } /* @@ -1297,24 +1392,15 @@ xfs_trans_committed( struct xfs_trans *tp, int abortflag) { - xfs_log_item_desc_t *lidp; - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t *next_licp; + struct xfs_log_item_desc *lidp, *next; /* Call the transaction's completion callback if there is one. */ if (tp->t_callback != NULL) tp->t_callback(tp, tp->t_callarg); - for (lidp = xfs_trans_first_item(tp); - lidp != NULL; - lidp = xfs_trans_next_item(tp, lidp)) { + list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) { xfs_trans_item_committed(lidp->lid_item, tp->t_lsn, abortflag); - } - - /* free the item chunks, ignoring the embedded chunk */ - for (licp = tp->t_items.lic_next; licp != NULL; licp = next_licp) { - next_licp = licp->lic_next; - kmem_free(licp); + xfs_trans_free_item_desc(lidp); } xfs_trans_free(tp); @@ -1329,11 +1415,9 @@ xfs_trans_uncommit( struct xfs_trans *tp, uint flags) { - xfs_log_item_desc_t *lidp; + struct xfs_log_item_desc *lidp; - for (lidp = xfs_trans_first_item(tp); - lidp != NULL; - lidp = xfs_trans_next_item(tp, lidp)) { + list_for_each_entry(lidp, &tp->t_items, lid_trans) { /* * Unpin all but those that aren't dirty. */ @@ -1504,33 +1588,28 @@ STATIC struct xfs_log_vec * xfs_trans_alloc_log_vecs( xfs_trans_t *tp) { - xfs_log_item_desc_t *lidp; + struct xfs_log_item_desc *lidp; struct xfs_log_vec *lv = NULL; struct xfs_log_vec *ret_lv = NULL; - lidp = xfs_trans_first_item(tp); /* Bail out if we didn't find a log item. */ - if (!lidp) { + if (list_empty(&tp->t_items)) { ASSERT(0); return NULL; } - while (lidp != NULL) { + list_for_each_entry(lidp, &tp->t_items, lid_trans) { struct xfs_log_vec *new_lv; /* Skip items which aren't dirty in this transaction. */ - if (!(lidp->lid_flags & XFS_LID_DIRTY)) { - lidp = xfs_trans_next_item(tp, lidp); + if (!(lidp->lid_flags & XFS_LID_DIRTY)) continue; - } /* Skip items that do not have any vectors for writing */ lidp->lid_size = IOP_SIZE(lidp->lid_item); - if (!lidp->lid_size) { - lidp = xfs_trans_next_item(tp, lidp); + if (!lidp->lid_size) continue; - } new_lv = kmem_zalloc(sizeof(*new_lv) + lidp->lid_size * sizeof(struct xfs_log_iovec), @@ -1545,7 +1624,6 @@ xfs_trans_alloc_log_vecs( else lv->lv_next = new_lv; lv = new_lv; - lidp = xfs_trans_next_item(tp, lidp); } return ret_lv; @@ -1704,12 +1782,6 @@ xfs_trans_cancel( int flags) { int log_flags; -#ifdef DEBUG - xfs_log_item_chunk_t *licp; - xfs_log_item_desc_t *lidp; - xfs_log_item_t *lip; - int i; -#endif xfs_mount_t *mp = tp->t_mountp; /* @@ -1728,21 +1800,11 @@ xfs_trans_cancel( xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); } #ifdef DEBUG - if (!(flags & XFS_TRANS_ABORT)) { - licp = &(tp->t_items); - while (licp != NULL) { - lidp = licp->lic_descs; - for (i = 0; i < licp->lic_unused; i++, lidp++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - - lip = lidp->lid_item; - if (!XFS_FORCED_SHUTDOWN(mp)) - ASSERT(!(lip->li_type == XFS_LI_EFD)); - } - licp = licp->lic_next; - } + if (!(flags & XFS_TRANS_ABORT) && !XFS_FORCED_SHUTDOWN(mp)) { + struct xfs_log_item_desc *lidp; + + list_for_each_entry(lidp, &tp->t_items, lid_trans) + ASSERT(!(lidp->lid_item->li_type == XFS_LI_EFD)); } #endif xfs_trans_unreserve_and_mod_sb(tp); Index: xfs/fs/xfs/xfs_trans.h =================================================================== --- xfs.orig/fs/xfs/xfs_trans.h 2010-05-25 12:43:44.000000000 +0200 +++ xfs/fs/xfs/xfs_trans.h 2010-05-25 12:43:47.986004051 +0200 @@ -161,105 +161,14 @@ typedef struct xfs_trans_header { * the amount of space needed to log the item it describes * once we get to commit processing (see xfs_trans_commit()). */ -typedef struct xfs_log_item_desc { +struct xfs_log_item_desc { struct xfs_log_item *lid_item; - ushort lid_size; - unsigned char lid_flags; - unsigned char lid_index; -} xfs_log_item_desc_t; + ushort lid_size; + unsigned char lid_flags; + struct list_head lid_trans; +}; #define XFS_LID_DIRTY 0x1 -#define XFS_LID_PINNED 0x2 - -/* - * This structure is used to maintain a chunk list of log_item_desc - * structures. The free field is a bitmask indicating which descriptors - * in this chunk's array are free. The unused field is the first value - * not used since this chunk was allocated. - */ -#define XFS_LIC_NUM_SLOTS 15 -typedef struct xfs_log_item_chunk { - struct xfs_log_item_chunk *lic_next; - ushort lic_free; - ushort lic_unused; - xfs_log_item_desc_t lic_descs[XFS_LIC_NUM_SLOTS]; -} xfs_log_item_chunk_t; - -#define XFS_LIC_MAX_SLOT (XFS_LIC_NUM_SLOTS - 1) -#define XFS_LIC_FREEMASK ((1 << XFS_LIC_NUM_SLOTS) - 1) - - -/* - * Initialize the given chunk. Set the chunk's free descriptor mask - * to indicate that all descriptors are free. The caller gets to set - * lic_unused to the right value (0 matches all free). The - * lic_descs.lid_index values are set up as each desc is allocated. - */ -static inline void xfs_lic_init(xfs_log_item_chunk_t *cp) -{ - cp->lic_free = XFS_LIC_FREEMASK; -} - -static inline void xfs_lic_init_slot(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_descs[slot].lid_index = (unsigned char)(slot); -} - -static inline int xfs_lic_vacancy(xfs_log_item_chunk_t *cp) -{ - return cp->lic_free & XFS_LIC_FREEMASK; -} - -static inline void xfs_lic_all_free(xfs_log_item_chunk_t *cp) -{ - cp->lic_free = XFS_LIC_FREEMASK; -} - -static inline int xfs_lic_are_all_free(xfs_log_item_chunk_t *cp) -{ - return ((cp->lic_free & XFS_LIC_FREEMASK) == XFS_LIC_FREEMASK); -} - -static inline int xfs_lic_isfree(xfs_log_item_chunk_t *cp, int slot) -{ - return (cp->lic_free & (1 << slot)); -} - -static inline void xfs_lic_claim(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_free &= ~(1 << slot); -} - -static inline void xfs_lic_relse(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_free |= 1 << slot; -} - -static inline xfs_log_item_desc_t * -xfs_lic_slot(xfs_log_item_chunk_t *cp, int slot) -{ - return &(cp->lic_descs[slot]); -} - -static inline int xfs_lic_desc_to_slot(xfs_log_item_desc_t *dp) -{ - return (uint)dp->lid_index; -} - -/* - * Calculate the address of a chunk given a descriptor pointer: - * dp - dp->lid_index give the address of the start of the lic_descs array. - * From this we subtract the offset of the lic_descs field in a chunk. - * All of this yields the address of the chunk, which is - * cast to a chunk pointer. - */ -static inline xfs_log_item_chunk_t * -xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp) -{ - return (xfs_log_item_chunk_t*) \ - (((xfs_caddr_t)((dp) - (dp)->lid_index)) - \ - (xfs_caddr_t)(((xfs_log_item_chunk_t*)0)->lic_descs)); -} #define XFS_TRANS_MAGIC 0x5452414E /* 'TRAN' */ /* @@ -516,8 +425,7 @@ typedef struct xfs_trans { int64_t t_rblocks_delta;/* superblock rblocks change */ int64_t t_rextents_delta;/* superblocks rextents chg */ int64_t t_rextslog_delta;/* superblocks rextslog chg */ - unsigned int t_items_free; /* log item descs free */ - xfs_log_item_chunk_t t_items; /* first log item desc chunk */ + struct list_head t_items; /* log item descriptors */ xfs_trans_header_t t_header; /* header for in-log trans */ struct list_head t_busy; /* list of busy extents */ unsigned long t_pflags; /* saved process flags state */ @@ -595,6 +503,7 @@ int xfs_trans_ail_init(struct xfs_mount void xfs_trans_ail_destroy(struct xfs_mount *); extern kmem_zone_t *xfs_trans_zone; +extern kmem_zone_t *xfs_log_item_desc_zone; #endif /* __KERNEL__ */ From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_32, J_CHICKENPOX_63,J_CHICKENPOX_64,J_CHICKENPOX_65,J_CHICKENPOX_66, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6axJ179002 for ; Mon, 31 May 2010 11:06:36 -0500 X-ASG-Debug-ID: 1275322142-271502df0000-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 1FB6014678E4 for ; Mon, 31 May 2010 09:09:02 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id R1sl2av0uDnJ6Ki8 for ; Mon, 31 May 2010 09:09:02 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xy-0001BE-LA for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:02 +0000 Message-Id: <20100531160902.541889062@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:44 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 17/17] xfs: remove unused delta tracking code in xfs_bmapi Subject: [PATCH 17/17] xfs: remove unused delta tracking code in xfs_bmapi References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-bmapi-delta-cleanup 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: 1275322143 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This code was introduced four years ago in commit 3e57ecf640428c01ba1ed8c8fc538447ada1715b without any review and has been unused since. Remove it just as the rest of the code introduced in that commit to reduce that stack usage and complexity in this central piece of code. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-05-29 18:44:44.017005812 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-05-29 18:45:03.756004695 +0200 @@ -974,7 +974,7 @@ xfs_aops_discard_page( */ error = xfs_bmapi(NULL, ip, offset_fsb, 1, XFS_BMAPI_ENTIRE, NULL, 0, &imap, - &nimaps, NULL, NULL); + &nimaps, NULL); if (error) { /* something screwed, just bail */ @@ -1002,7 +1002,7 @@ xfs_aops_discard_page( */ xfs_bmap_init(&flist, &firstblock); error = xfs_bunmapi(NULL, ip, offset_fsb, 1, 0, 1, &firstblock, - &flist, NULL, &done); + &flist, &done); ASSERT(!flist.xbf_count && !flist.xbf_first); if (error) { Index: xfs/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_file.c 2010-05-29 18:44:47.747005393 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-05-29 18:45:03.757024530 +0200 @@ -414,7 +414,7 @@ xfs_zero_last_block( last_fsb = XFS_B_TO_FSBT(mp, isize); nimaps = 1; error = xfs_bmapi(NULL, ip, last_fsb, 1, 0, NULL, 0, &imap, - &nimaps, NULL, NULL); + &nimaps, NULL); if (error) { return error; } @@ -509,7 +509,7 @@ xfs_zero_eof( nimaps = 1; zero_count_fsb = end_zero_fsb - start_zero_fsb + 1; error = xfs_bmapi(NULL, ip, start_zero_fsb, zero_count_fsb, - 0, NULL, 0, &imap, &nimaps, NULL, NULL); + 0, NULL, 0, &imap, &nimaps, NULL); if (error) { ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); return error; Index: xfs/fs/xfs/quota/xfs_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot.c 2010-05-29 18:44:47.671005673 +0200 +++ xfs/fs/xfs/quota/xfs_dquot.c 2010-05-29 18:45:03.762254380 +0200 @@ -385,7 +385,7 @@ xfs_qm_dqalloc( XFS_BMAPI_METADATA | XFS_BMAPI_WRITE, &firstblock, XFS_QM_DQALLOC_SPACE_RES(mp), - &map, &nmaps, &flist, NULL))) { + &map, &nmaps, &flist))) { goto error0; } ASSERT(map.br_blockcount == XFS_DQUOT_CLUSTER_SIZE_FSB); @@ -501,7 +501,7 @@ xfs_qm_dqtobp( error = xfs_bmapi(NULL, quotip, dqp->q_fileoffset, XFS_DQUOT_CLUSTER_SIZE_FSB, XFS_BMAPI_METADATA, - NULL, 0, &map, &nmaps, NULL, NULL); + NULL, 0, &map, &nmaps, NULL); xfs_iunlock(quotip, XFS_ILOCK_SHARED); if (error) Index: xfs/fs/xfs/quota/xfs_qm.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm.c 2010-05-29 18:44:44.061032213 +0200 +++ xfs/fs/xfs/quota/xfs_qm.c 2010-05-29 18:45:03.769254450 +0200 @@ -1490,7 +1490,7 @@ xfs_qm_dqiterate( maxlblkcnt - lblkno, XFS_BMAPI_METADATA, NULL, - 0, map, &nmaps, NULL, NULL); + 0, map, &nmaps, NULL); xfs_iunlock(qip, XFS_ILOCK_SHARED); if (error) break; Index: xfs/fs/xfs/xfs_attr.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr.c 2010-05-29 18:44:47.702005742 +0200 +++ xfs/fs/xfs/xfs_attr.c 2010-05-29 18:45:03.775276311 +0200 @@ -1977,7 +1977,7 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) error = xfs_bmapi(args->trans, args->dp, (xfs_fileoff_t)lblkno, args->rmtblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - NULL, 0, map, &nmap, NULL, NULL); + NULL, 0, map, &nmap, NULL); if (error) return(error); ASSERT(nmap >= 1); @@ -2056,7 +2056,7 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA | XFS_BMAPI_WRITE, args->firstblock, args->total, &map, &nmap, - args->flist, NULL); + args->flist); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, &committed); @@ -2107,7 +2107,7 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) args->rmtblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, args->firstblock, 0, &map, &nmap, - NULL, NULL); + NULL); if (error) { return(error); } @@ -2172,7 +2172,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *ar args->rmtblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, args->firstblock, 0, &map, &nmap, - args->flist, NULL); + args->flist); if (error) { return(error); } @@ -2210,7 +2210,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *ar error = xfs_bunmapi(args->trans, args->dp, lblkno, blkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, 1, args->firstblock, args->flist, - NULL, &done); + &done); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, &committed); Index: xfs/fs/xfs/xfs_attr_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr_leaf.c 2010-05-29 18:44:44.107255638 +0200 +++ xfs/fs/xfs/xfs_attr_leaf.c 2010-05-29 18:45:03.779011469 +0200 @@ -2928,7 +2928,7 @@ xfs_attr_leaf_freextent(xfs_trans_t **tr nmap = 1; error = xfs_bmapi(*trans, dp, (xfs_fileoff_t)tblkno, tblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - NULL, 0, &map, &nmap, NULL, NULL); + NULL, 0, &map, &nmap, NULL); if (error) { return(error); } Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-05-29 18:45:02.175004206 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2010-05-29 18:45:03.785016777 +0200 @@ -101,7 +101,6 @@ xfs_bmap_add_extent( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd); /* OK to allocate reserved blocks */ @@ -119,7 +118,6 @@ xfs_bmap_add_extent_delay_real( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd); /* OK to allocate reserved blocks */ /* @@ -132,7 +130,6 @@ xfs_bmap_add_extent_hole_delay( xfs_extnum_t idx, /* extent number to update/insert */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp,/* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd); /* OK to allocate reserved blocks */ /* @@ -146,7 +143,6 @@ xfs_bmap_add_extent_hole_real( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork); /* data or attr fork */ /* @@ -159,8 +155,7 @@ xfs_bmap_add_extent_unwritten_real( xfs_extnum_t idx, /* extent number to update/insert */ xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta); /* Change made to incore extents */ + int *logflagsp); /* inode logging flags */ /* * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. @@ -197,7 +192,6 @@ xfs_bmap_del_extent( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp,/* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd); /* OK to allocate reserved blocks */ @@ -486,7 +480,6 @@ xfs_bmap_add_extent( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd) /* OK to use reserved data blocks */ { @@ -521,15 +514,6 @@ xfs_bmap_add_extent( logflags = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else logflags = 0; - /* DELTA: single new extent */ - if (delta) { - if (delta->xed_startoff > new->br_startoff) - delta->xed_startoff = new->br_startoff; - if (delta->xed_blockcount < - new->br_startoff + new->br_blockcount) - delta->xed_blockcount = new->br_startoff + - new->br_blockcount; - } } /* * Any kind of new delayed allocation goes here. @@ -539,7 +523,7 @@ xfs_bmap_add_extent( ASSERT((cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL) == 0); if ((error = xfs_bmap_add_extent_hole_delay(ip, idx, new, - &logflags, delta, rsvd))) + &logflags, rsvd))) goto done; } /* @@ -550,7 +534,7 @@ xfs_bmap_add_extent( ASSERT((cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL) == 0); if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, new, - &logflags, delta, whichfork))) + &logflags, whichfork))) goto done; } else { xfs_bmbt_irec_t prev; /* old extent at offset idx */ @@ -575,17 +559,17 @@ xfs_bmap_add_extent( XFS_BTCUR_BPRV_WASDEL); if ((error = xfs_bmap_add_extent_delay_real(ip, idx, &cur, new, &da_new, first, flist, - &logflags, delta, rsvd))) + &logflags, rsvd))) goto done; } else if (new->br_state == XFS_EXT_NORM) { ASSERT(new->br_state == XFS_EXT_NORM); if ((error = xfs_bmap_add_extent_unwritten_real( - ip, idx, &cur, new, &logflags, delta))) + ip, idx, &cur, new, &logflags))) goto done; } else { ASSERT(new->br_state == XFS_EXT_UNWRITTEN); if ((error = xfs_bmap_add_extent_unwritten_real( - ip, idx, &cur, new, &logflags, delta))) + ip, idx, &cur, new, &logflags))) goto done; } ASSERT(*curp == cur || *curp == NULL); @@ -598,7 +582,7 @@ xfs_bmap_add_extent( ASSERT((cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL) == 0); if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, - new, &logflags, delta, whichfork))) + new, &logflags, whichfork))) goto done; } } @@ -663,7 +647,6 @@ xfs_bmap_add_extent_delay_real( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd) /* OK to use reserved data block allocation */ { xfs_btree_cur_t *cur; /* btree cursor */ @@ -794,11 +777,6 @@ xfs_bmap_add_extent_delay_real( goto done; } *dnew = 0; - /* DELTA: Three in-core extents are replaced by one. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount + - RIGHT.br_blockcount; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: @@ -829,10 +807,6 @@ xfs_bmap_add_extent_delay_real( goto done; } *dnew = 0; - /* DELTA: Two in-core extents are replaced by one. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -864,10 +838,6 @@ xfs_bmap_add_extent_delay_real( goto done; } *dnew = 0; - /* DELTA: Two in-core extents are replaced by one. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount + - RIGHT.br_blockcount; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: @@ -897,9 +867,6 @@ xfs_bmap_add_extent_delay_real( XFS_WANT_CORRUPTED_GOTO(i == 1, done); } *dnew = 0; - /* DELTA: The in-core extent described by new changed type. */ - temp = new->br_startoff; - temp2 = new->br_blockcount; break; case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: @@ -939,10 +906,6 @@ xfs_bmap_add_extent_delay_real( xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); *dnew = temp; - /* DELTA: The boundary between two in-core extents moved. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount; break; case BMAP_LEFT_FILLING: @@ -987,9 +950,6 @@ xfs_bmap_add_extent_delay_real( xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); *dnew = temp; - /* DELTA: One in-core extent is split in two. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -1028,10 +988,6 @@ xfs_bmap_add_extent_delay_real( xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); *dnew = temp; - /* DELTA: The boundary between two in-core extents moved. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount + - RIGHT.br_blockcount; break; case BMAP_RIGHT_FILLING: @@ -1075,9 +1031,6 @@ xfs_bmap_add_extent_delay_real( xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); *dnew = temp; - /* DELTA: One in-core extent is split in two. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; case 0: @@ -1158,9 +1111,6 @@ xfs_bmap_add_extent_delay_real( nullstartblock((int)temp2)); trace_xfs_bmap_post_update(ip, idx + 2, state, _THIS_IP_); *dnew = temp + temp2; - /* DELTA: One in-core extent is split in three. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: @@ -1176,13 +1126,6 @@ xfs_bmap_add_extent_delay_real( ASSERT(0); } *curp = cur; - if (delta) { - temp2 += temp; - if (delta->xed_startoff > temp) - delta->xed_startoff = temp; - if (delta->xed_blockcount < temp2) - delta->xed_blockcount = temp2; - } done: *logflagsp = rval; return error; @@ -1201,8 +1144,7 @@ xfs_bmap_add_extent_unwritten_real( xfs_extnum_t idx, /* extent number to update/insert */ xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta) /* Change made to incore extents */ + int *logflagsp) /* inode logging flags */ { xfs_btree_cur_t *cur; /* btree cursor */ xfs_bmbt_rec_host_t *ep; /* extent entry for idx */ @@ -1216,8 +1158,6 @@ xfs_bmap_add_extent_unwritten_real( /* left is 0, right is 1, prev is 2 */ int rval=0; /* return value (logging flags) */ int state = 0;/* state bits, accessed thru macros */ - xfs_filblks_t temp=0; - xfs_filblks_t temp2=0; #define LEFT r[0] #define RIGHT r[1] @@ -1338,11 +1278,6 @@ xfs_bmap_add_extent_unwritten_real( RIGHT.br_blockcount, LEFT.br_state))) goto done; } - /* DELTA: Three in-core extents are replaced by one. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount + - RIGHT.br_blockcount; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: @@ -1379,10 +1314,6 @@ xfs_bmap_add_extent_unwritten_real( LEFT.br_state))) goto done; } - /* DELTA: Two in-core extents are replaced by one. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -1419,10 +1350,6 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } - /* DELTA: Two in-core extents are replaced by one. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount + - RIGHT.br_blockcount; break; case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: @@ -1450,9 +1377,6 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } - /* DELTA: The in-core extent described by new changed type. */ - temp = new->br_startoff; - temp2 = new->br_blockcount; break; case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: @@ -1498,10 +1422,6 @@ xfs_bmap_add_extent_unwritten_real( LEFT.br_state)) goto done; } - /* DELTA: The boundary between two in-core extents moved. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount; break; case BMAP_LEFT_FILLING: @@ -1541,9 +1461,6 @@ xfs_bmap_add_extent_unwritten_real( goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - /* DELTA: One in-core extent is split in two. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -1584,10 +1501,6 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } - /* DELTA: The boundary between two in-core extents moved. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount + - RIGHT.br_blockcount; break; case BMAP_RIGHT_FILLING: @@ -1627,9 +1540,6 @@ xfs_bmap_add_extent_unwritten_real( goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - /* DELTA: One in-core extent is split in two. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; case 0: @@ -1689,9 +1599,6 @@ xfs_bmap_add_extent_unwritten_real( goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - /* DELTA: One in-core extent is split in three. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: @@ -1707,13 +1614,6 @@ xfs_bmap_add_extent_unwritten_real( ASSERT(0); } *curp = cur; - if (delta) { - temp2 += temp; - if (delta->xed_startoff > temp) - delta->xed_startoff = temp; - if (delta->xed_blockcount < temp2) - delta->xed_blockcount = temp2; - } done: *logflagsp = rval; return error; @@ -1733,7 +1633,6 @@ xfs_bmap_add_extent_hole_delay( xfs_extnum_t idx, /* extent number to update/insert */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd) /* OK to allocate reserved blocks */ { xfs_bmbt_rec_host_t *ep; /* extent record for idx */ @@ -1744,7 +1643,6 @@ xfs_bmap_add_extent_hole_delay( xfs_bmbt_irec_t right; /* right neighbor extent entry */ int state; /* state bits, accessed thru macros */ xfs_filblks_t temp=0; /* temp for indirect calculations */ - xfs_filblks_t temp2=0; ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); ep = xfs_iext_get_ext(ifp, idx); @@ -1816,9 +1714,6 @@ xfs_bmap_add_extent_hole_delay( xfs_iext_remove(ip, idx, 1, state); ip->i_df.if_lastex = idx - 1; - /* DELTA: Two in-core extents were replaced by one. */ - temp2 = temp; - temp = left.br_startoff; break; case BMAP_LEFT_CONTIG: @@ -1838,9 +1733,6 @@ xfs_bmap_add_extent_hole_delay( trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); ip->i_df.if_lastex = idx - 1; - /* DELTA: One in-core extent grew into a hole. */ - temp2 = temp; - temp = left.br_startoff; break; case BMAP_RIGHT_CONTIG: @@ -1859,9 +1751,6 @@ xfs_bmap_add_extent_hole_delay( trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); ip->i_df.if_lastex = idx; - /* DELTA: One in-core extent grew into a hole. */ - temp2 = temp; - temp = new->br_startoff; break; case 0: @@ -1873,9 +1762,6 @@ xfs_bmap_add_extent_hole_delay( oldlen = newlen = 0; xfs_iext_insert(ip, idx, 1, new, state); ip->i_df.if_lastex = idx; - /* DELTA: A new in-core extent was added in a hole. */ - temp2 = new->br_blockcount; - temp = new->br_startoff; break; } if (oldlen != newlen) { @@ -1886,13 +1772,6 @@ xfs_bmap_add_extent_hole_delay( * Nothing to do for disk quota accounting here. */ } - if (delta) { - temp2 += temp; - if (delta->xed_startoff > temp) - delta->xed_startoff = temp; - if (delta->xed_blockcount < temp2) - delta->xed_blockcount = temp2; - } *logflagsp = 0; return 0; } @@ -1908,7 +1787,6 @@ xfs_bmap_add_extent_hole_real( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork) /* data or attr fork */ { xfs_bmbt_rec_host_t *ep; /* pointer to extent entry ins. point */ @@ -1919,8 +1797,6 @@ xfs_bmap_add_extent_hole_real( xfs_bmbt_irec_t right; /* right neighbor extent entry */ int rval=0; /* return value (logging flags) */ int state; /* state bits, accessed thru macros */ - xfs_filblks_t temp=0; - xfs_filblks_t temp2=0; ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT(idx <= ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); @@ -2017,11 +1893,6 @@ xfs_bmap_add_extent_hole_real( left.br_state))) goto done; } - /* DELTA: Two in-core extents were replaced by one. */ - temp = left.br_startoff; - temp2 = left.br_blockcount + - new->br_blockcount + - right.br_blockcount; break; case BMAP_LEFT_CONTIG: @@ -2053,10 +1924,6 @@ xfs_bmap_add_extent_hole_real( left.br_state))) goto done; } - /* DELTA: One in-core extent grew. */ - temp = left.br_startoff; - temp2 = left.br_blockcount + - new->br_blockcount; break; case BMAP_RIGHT_CONTIG: @@ -2089,10 +1956,6 @@ xfs_bmap_add_extent_hole_real( right.br_state))) goto done; } - /* DELTA: One in-core extent grew. */ - temp = new->br_startoff; - temp2 = new->br_blockcount + - right.br_blockcount; break; case 0: @@ -2120,18 +1983,8 @@ xfs_bmap_add_extent_hole_real( goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - /* DELTA: A new extent was added in a hole. */ - temp = new->br_startoff; - temp2 = new->br_blockcount; break; } - if (delta) { - temp2 += temp; - if (delta->xed_startoff > temp) - delta->xed_startoff = temp; - if (delta->xed_blockcount < temp2) - delta->xed_blockcount = temp2; - } done: *logflagsp = rval; return error; @@ -2944,7 +2797,6 @@ xfs_bmap_del_extent( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *del, /* data to remove from extents */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd) /* OK to allocate reserved blocks */ { @@ -3250,14 +3102,6 @@ xfs_bmap_del_extent( if (da_old > da_new) xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, (int64_t)(da_old - da_new), rsvd); - if (delta) { - /* DELTA: report the original extent. */ - if (delta->xed_startoff > got.br_startoff) - delta->xed_startoff = got.br_startoff; - if (delta->xed_blockcount < got.br_startoff+got.br_blockcount) - delta->xed_blockcount = got.br_startoff + - got.br_blockcount; - } done: *logflagsp = flags; return error; @@ -4469,8 +4313,7 @@ xfs_bmapi( xfs_extlen_t total, /* total blocks needed */ xfs_bmbt_irec_t *mval, /* output: map values */ int *nmap, /* i/o: mval size/count */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - xfs_extdelta_t *delta) /* o: change made to incore extents */ + xfs_bmap_free_t *flist) /* i/o: list extents to free */ { xfs_fsblock_t abno; /* allocated block number */ xfs_extlen_t alen; /* allocated extent length */ @@ -4582,10 +4425,7 @@ xfs_bmapi( end = bno + len; obno = bno; bma.ip = NULL; - if (delta) { - delta->xed_startoff = NULLFILEOFF; - delta->xed_blockcount = 0; - } + while (bno < end && n < *nmap) { /* * Reading past eof, act as though there's a hole @@ -4811,7 +4651,7 @@ xfs_bmapi( got.br_state = XFS_EXT_UNWRITTEN; } error = xfs_bmap_add_extent(ip, lastx, &cur, &got, - firstblock, flist, &tmp_logflags, delta, + firstblock, flist, &tmp_logflags, whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); logflags |= tmp_logflags; if (error) @@ -4907,7 +4747,7 @@ xfs_bmapi( } mval->br_state = XFS_EXT_NORM; error = xfs_bmap_add_extent(ip, lastx, &cur, mval, - firstblock, flist, &tmp_logflags, delta, + firstblock, flist, &tmp_logflags, whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); logflags |= tmp_logflags; if (error) @@ -4997,14 +4837,6 @@ xfs_bmapi( ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE || XFS_IFORK_NEXTENTS(ip, whichfork) > ifp->if_ext_max); error = 0; - if (delta && delta->xed_startoff != NULLFILEOFF) { - /* A change was actually made. - * Note that delta->xed_blockount is an offset at this - * point and needs to be converted to a block count. - */ - ASSERT(delta->xed_blockcount > delta->xed_startoff); - delta->xed_blockcount -= delta->xed_startoff; - } error0: /* * Log everything. Do this after conversion, there's no point in @@ -5116,8 +4948,6 @@ xfs_bunmapi( xfs_fsblock_t *firstblock, /* first allocated block controls a.g. for allocs */ xfs_bmap_free_t *flist, /* i/o: list extents to free */ - xfs_extdelta_t *delta, /* o: change made to incore - extents */ int *done) /* set if not done yet */ { xfs_btree_cur_t *cur; /* bmap btree cursor */ @@ -5176,10 +5006,7 @@ xfs_bunmapi( bno = start + len - 1; ep = xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, &prev); - if (delta) { - delta->xed_startoff = NULLFILEOFF; - delta->xed_blockcount = 0; - } + /* * Check to see if the given block number is past the end of the * file, back up to the last block if so... @@ -5277,7 +5104,7 @@ xfs_bunmapi( } del.br_state = XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx, &cur, &del, - firstblock, flist, &logflags, delta, + firstblock, flist, &logflags, XFS_DATA_FORK, 0); if (error) goto error0; @@ -5332,7 +5159,7 @@ xfs_bunmapi( prev.br_state = XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx - 1, &cur, &prev, firstblock, flist, &logflags, - delta, XFS_DATA_FORK, 0); + XFS_DATA_FORK, 0); if (error) goto error0; goto nodelete; @@ -5341,7 +5168,7 @@ xfs_bunmapi( del.br_state = XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx, &cur, &del, firstblock, flist, &logflags, - delta, XFS_DATA_FORK, 0); + XFS_DATA_FORK, 0); if (error) goto error0; goto nodelete; @@ -5394,7 +5221,7 @@ xfs_bunmapi( goto error0; } error = xfs_bmap_del_extent(ip, tp, lastx, flist, cur, &del, - &tmp_logflags, delta, whichfork, rsvd); + &tmp_logflags, whichfork, rsvd); logflags |= tmp_logflags; if (error) goto error0; @@ -5451,14 +5278,6 @@ nodelete: ASSERT(ifp->if_ext_max == XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); error = 0; - if (delta && delta->xed_startoff != NULLFILEOFF) { - /* A change was actually made. - * Note that delta->xed_blockount is an offset at this - * point and needs to be converted to a block count. - */ - ASSERT(delta->xed_blockcount > delta->xed_startoff); - delta->xed_blockcount -= delta->xed_startoff; - } error0: /* * Log everything. Do this after conversion, there's no point in @@ -5671,7 +5490,7 @@ xfs_getbmap( error = xfs_bmapi(NULL, ip, XFS_BB_TO_FSBT(mp, bmv->bmv_offset), XFS_BB_TO_FSB(mp, bmv->bmv_length), bmapi_flags, NULL, 0, map, &nmap, - NULL, NULL); + NULL); if (error) goto out_free_map; ASSERT(nmap <= subnex); Index: xfs/fs/xfs/xfs_bmap.h =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.h 2010-05-29 18:45:02.175004206 +0200 +++ xfs/fs/xfs/xfs_bmap.h 2010-05-29 18:45:03.792276730 +0200 @@ -28,20 +28,6 @@ struct xfs_trans; extern kmem_zone_t *xfs_bmap_free_item_zone; /* - * DELTA: describe a change to the in-core extent list. - * - * Internally the use of xed_blockount is somewhat funky. - * xed_blockcount contains an offset much of the time because this - * makes merging changes easier. (xfs_fileoff_t and xfs_filblks_t are - * the same underlying type). - */ -typedef struct xfs_extdelta -{ - xfs_fileoff_t xed_startoff; /* offset of range */ - xfs_filblks_t xed_blockcount; /* blocks in range */ -} xfs_extdelta_t; - -/* * List of extents to be free "later". * The list is kept sorted on xbf_startblock. */ @@ -305,9 +291,7 @@ xfs_bmapi( xfs_extlen_t total, /* total blocks needed */ struct xfs_bmbt_irec *mval, /* output: map values */ int *nmap, /* i/o: mval size/count */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - xfs_extdelta_t *delta); /* o: change made to incore - extents */ + xfs_bmap_free_t *flist); /* i/o: list extents to free */ /* * Map file blocks to filesystem blocks, simple version. @@ -341,8 +325,6 @@ xfs_bunmapi( xfs_fsblock_t *firstblock, /* first allocated block controls a.g. for allocs */ xfs_bmap_free_t *flist, /* i/o: list extents to free */ - xfs_extdelta_t *delta, /* o: change made to incore - extents */ int *done); /* set if not done yet */ /* Index: xfs/fs/xfs/xfs_da_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_da_btree.c 2010-05-29 18:44:44.247005742 +0200 +++ xfs/fs/xfs/xfs_da_btree.c 2010-05-29 18:45:03.800254799 +0200 @@ -1596,7 +1596,7 @@ xfs_da_grow_inode(xfs_da_args_t *args, x xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE|XFS_BMAPI_METADATA| XFS_BMAPI_CONTIG, args->firstblock, args->total, &map, &nmap, - args->flist, NULL))) { + args->flist))) { return error; } ASSERT(nmap <= 1); @@ -1617,8 +1617,7 @@ xfs_da_grow_inode(xfs_da_args_t *args, x xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE| XFS_BMAPI_METADATA, args->firstblock, args->total, - &mapp[mapi], &nmap, args->flist, - NULL))) { + &mapp[mapi], &nmap, args->flist))) { kmem_free(mapp); return error; } @@ -1879,7 +1878,7 @@ xfs_da_shrink_inode(xfs_da_args_t *args, */ if ((error = xfs_bunmapi(tp, dp, dead_blkno, count, xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, - 0, args->firstblock, args->flist, NULL, + 0, args->firstblock, args->flist, &done)) == ENOSPC) { if (w != XFS_DATA_FORK) break; @@ -1984,7 +1983,7 @@ xfs_da_do_buf( nfsb, XFS_BMAPI_METADATA | xfs_bmapi_aflag(whichfork), - NULL, 0, mapp, &nmap, NULL, NULL))) + NULL, 0, mapp, &nmap, NULL))) goto exit0; } } else { Index: xfs/fs/xfs/xfs_dir2.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2.c 2010-05-29 18:44:44.250006161 +0200 +++ xfs/fs/xfs/xfs_dir2.c 2010-05-29 18:45:03.805255777 +0200 @@ -547,7 +547,7 @@ xfs_dir2_grow_inode( if ((error = xfs_bmapi(tp, dp, bno, count, XFS_BMAPI_WRITE|XFS_BMAPI_METADATA|XFS_BMAPI_CONTIG, args->firstblock, args->total, &map, &nmap, - args->flist, NULL))) + args->flist))) return error; ASSERT(nmap <= 1); if (nmap == 1) { @@ -579,8 +579,7 @@ xfs_dir2_grow_inode( if ((error = xfs_bmapi(tp, dp, b, c, XFS_BMAPI_WRITE|XFS_BMAPI_METADATA, args->firstblock, args->total, - &mapp[mapi], &nmap, args->flist, - NULL))) { + &mapp[mapi], &nmap, args->flist))) { kmem_free(mapp); return error; } @@ -713,7 +712,7 @@ xfs_dir2_shrink_inode( */ if ((error = xfs_bunmapi(tp, dp, da, mp->m_dirblkfsbs, XFS_BMAPI_METADATA, 0, args->firstblock, args->flist, - NULL, &done))) { + &done))) { /* * ENOSPC actually can happen if we're in a removename with * no space reservation, and the resulting block removal Index: xfs/fs/xfs/xfs_dir2_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_leaf.c 2010-05-29 18:44:44.260005393 +0200 +++ xfs/fs/xfs/xfs_dir2_leaf.c 2010-05-29 18:45:03.809255847 +0200 @@ -873,7 +873,7 @@ xfs_dir2_leaf_getdents( xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET) - map_off, XFS_BMAPI_METADATA, NULL, 0, - &map[map_valid], &nmap, NULL, NULL); + &map[map_valid], &nmap, NULL); /* * Don't know if we should ignore this or * try to return an error. Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-05-29 18:45:02.178253752 +0200 +++ xfs/fs/xfs/xfs_inode.c 2010-05-29 18:45:03.814005812 +0200 @@ -1225,7 +1225,7 @@ xfs_isize_check( (xfs_ufsize_t)XFS_MAXIOFFSET(mp)) - map_first), XFS_BMAPI_ENTIRE, NULL, 0, imaps, &nimaps, - NULL, NULL)) + NULL)) return; ASSERT(nimaps == 1); ASSERT(imaps[0].br_startblock == HOLESTARTBLOCK); @@ -1591,7 +1591,7 @@ xfs_itruncate_finish( xfs_bmapi_aflag(fork), XFS_ITRUNC_MAX_EXTENTS, &first_block, &free_list, - NULL, &done); + &done); if (error) { /* * If the bunmapi call encounters an error, Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c 2010-05-29 18:44:47.721006022 +0200 +++ xfs/fs/xfs/xfs_iomap.c 2010-05-29 18:45:03.820005533 +0200 @@ -118,7 +118,7 @@ xfs_iomap( error = xfs_bmapi(NULL, ip, offset_fsb, (xfs_filblks_t)(end_fsb - offset_fsb), bmapi_flags, NULL, 0, imap, - nimaps, NULL, NULL); + nimaps, NULL); if (error) goto out; @@ -341,7 +341,7 @@ xfs_iomap_write_direct( xfs_bmap_init(&free_list, &firstfsb); nimaps = 1; error = xfs_bmapi(tp, ip, offset_fsb, count_fsb, bmapi_flag, - &firstfsb, 0, &imap, &nimaps, &free_list, NULL); + &firstfsb, 0, &imap, &nimaps, &free_list); if (error) goto error0; @@ -419,7 +419,7 @@ xfs_iomap_eof_want_preallocate( imaps = nimaps; firstblock = NULLFSBLOCK; error = xfs_bmapi(NULL, ip, start_fsb, count_fsb, 0, - &firstblock, 0, imap, &imaps, NULL, NULL); + &firstblock, 0, imap, &imaps, NULL); if (error) return error; for (n = 0; n < imaps; n++) { @@ -494,7 +494,7 @@ retry: (xfs_filblks_t)(last_fsb - offset_fsb), XFS_BMAPI_DELAY | XFS_BMAPI_WRITE | XFS_BMAPI_ENTIRE, &firstblock, 1, imap, - &nimaps, NULL, NULL); + &nimaps, NULL); if (error && (error != ENOSPC)) return XFS_ERROR(error); @@ -650,7 +650,7 @@ xfs_iomap_write_allocate( /* Go get the actual blocks */ error = xfs_bmapi(tp, ip, map_start_fsb, count_fsb, XFS_BMAPI_WRITE, &first_block, 1, - &imap, &nimaps, &free_list, NULL); + &imap, &nimaps, &free_list); if (error) goto trans_cancel; @@ -768,7 +768,7 @@ xfs_iomap_write_unwritten( nimaps = 1; error = xfs_bmapi(tp, ip, offset_fsb, count_fsb, XFS_BMAPI_WRITE|XFS_BMAPI_CONVERT, &firstfsb, - 1, &imap, &nimaps, &free_list, NULL); + 1, &imap, &nimaps, &free_list); if (error) goto error_on_bmapi_transaction; Index: xfs/fs/xfs/xfs_rtalloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_rtalloc.c 2010-05-29 18:44:44.204005882 +0200 +++ xfs/fs/xfs/xfs_rtalloc.c 2010-05-29 18:45:03.826256825 +0200 @@ -122,7 +122,7 @@ xfs_growfs_rt_alloc( cancelflags |= XFS_TRANS_ABORT; error = xfs_bmapi(tp, ip, oblocks, nblocks - oblocks, XFS_BMAPI_WRITE | XFS_BMAPI_METADATA, &firstblock, - resblks, &map, &nmap, &flist, NULL); + resblks, &map, &nmap, &flist); if (!error && nmap < 1) error = XFS_ERROR(ENOSPC); if (error) Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c 2010-05-29 18:44:47.686004066 +0200 +++ xfs/fs/xfs/xfs_vnodeops.c 2010-05-29 18:45:03.835005393 +0200 @@ -492,7 +492,7 @@ xfs_readlink_bmap( int error = 0; error = xfs_bmapi(NULL, ip, 0, XFS_B_TO_FSB(mp, pathlen), 0, NULL, 0, - mval, &nmaps, NULL, NULL); + mval, &nmaps, NULL); if (error) goto out; @@ -596,7 +596,7 @@ xfs_free_eofblocks( nimaps = 1; xfs_ilock(ip, XFS_ILOCK_SHARED); error = xfs_bmapi(NULL, ip, end_fsb, map_len, 0, - NULL, 0, &imap, &nimaps, NULL, NULL); + NULL, 0, &imap, &nimaps, NULL); xfs_iunlock(ip, XFS_ILOCK_SHARED); if (!error && (nimaps != 0) && @@ -733,7 +733,7 @@ xfs_inactive_symlink_rmt( nmaps = ARRAY_SIZE(mval); if ((error = xfs_bmapi(tp, ip, 0, XFS_B_TO_FSB(mp, size), XFS_BMAPI_METADATA, &first_block, 0, mval, &nmaps, - &free_list, NULL))) + &free_list))) goto error0; /* * Invalidate the block(s). @@ -748,7 +748,7 @@ xfs_inactive_symlink_rmt( * Unmap the dead block(s) to the free_list. */ if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, - &first_block, &free_list, NULL, &done))) + &first_block, &free_list, &done))) goto error1; ASSERT(done); /* @@ -2095,7 +2095,7 @@ xfs_symlink( error = xfs_bmapi(tp, ip, first_fsb, fs_blocks, XFS_BMAPI_WRITE | XFS_BMAPI_METADATA, &first_block, resblks, mval, &nmaps, - &free_list, NULL); + &free_list); if (error) { goto error1; } @@ -2347,7 +2347,7 @@ xfs_alloc_file_space( error = xfs_bmapi(tp, ip, startoffset_fsb, allocatesize_fsb, bmapi_flag, &firstfsb, 0, imapp, &nimaps, - &free_list, NULL); + &free_list); if (error) { goto error0; } @@ -2436,7 +2436,7 @@ xfs_zero_remaining_bytes( offset_fsb = XFS_B_TO_FSBT(mp, offset); nimap = 1; error = xfs_bmapi(NULL, ip, offset_fsb, 1, 0, - NULL, 0, &imap, &nimap, NULL, NULL); + NULL, 0, &imap, &nimap, NULL); if (error || nimap < 1) break; ASSERT(imap.br_blockcount >= 1); @@ -2556,7 +2556,7 @@ xfs_free_file_space( if (rt && !xfs_sb_version_hasextflgbit(&mp->m_sb)) { nimap = 1; error = xfs_bmapi(NULL, ip, startoffset_fsb, - 1, 0, NULL, 0, &imap, &nimap, NULL, NULL); + 1, 0, NULL, 0, &imap, &nimap, NULL); if (error) goto out_unlock_iolock; ASSERT(nimap == 0 || nimap == 1); @@ -2571,7 +2571,7 @@ xfs_free_file_space( } nimap = 1; error = xfs_bmapi(NULL, ip, endoffset_fsb - 1, - 1, 0, NULL, 0, &imap, &nimap, NULL, NULL); + 1, 0, NULL, 0, &imap, &nimap, NULL); if (error) goto out_unlock_iolock; ASSERT(nimap == 0 || nimap == 1); @@ -2647,7 +2647,7 @@ xfs_free_file_space( xfs_bmap_init(&free_list, &firstfsb); error = xfs_bunmapi(tp, ip, startoffset_fsb, endoffset_fsb - startoffset_fsb, - 0, 2, &firstfsb, &free_list, NULL, &done); + 0, 2, &firstfsb, &free_list, &done); if (error) { goto error0; } From BATV+6bf37f0509865caf467e+2472+infradead.org+hch@bombadil.srs.infradead.org Mon May 31 11:06:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_22, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VG6YmT178919 for ; Mon, 31 May 2010 11:06:34 -0500 X-ASG-Debug-ID: 1275322273-3cd900530000-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 E438F157FB5A for ; Mon, 31 May 2010 09:11:13 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id rdoyTN6z5ivjbtdK for ; Mon, 31 May 2010 09:11:13 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJ7Xv-0000tM-TI for xfs@oss.sgi.com; Mon, 31 May 2010 16:09:00 +0000 Message-Id: <20100531160859.618170031@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 31 May 2010 12:07:31 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 04/17] xfs: drop dmapi hooks Subject: [PATCH 04/17] xfs: drop dmapi hooks References: <20100531160727.842750532@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-drop-dmapi-hooks 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: 1275322273 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dmapi support was never merged upstream, but we still have a lot of hooks bloating XFS for it, all over the fast pathes of the filesystem. This patch drops over 700 lines of dmapi overhead. If we'll ever get HSM support in mainline at least the namespace events can be done much saner in the VFS instead of the individual filesystem, so it's not like this is much help for future work. Signed-off-by: Christoph Hellwig --- V1 -> V2 - updated to account for the delayed logging branch merge - remove a few more left overs pointed out by Eric Index: xfs/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_file.c 2010-05-22 00:40:37.890004594 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-05-25 11:14:59.236274548 +0200 @@ -24,7 +24,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_trans.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" @@ -275,20 +274,6 @@ xfs_file_aio_read( mutex_lock(&inode->i_mutex); xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { - int dmflags = FILP_DELAY_FLAG(file) | DM_SEM_FLAG_RD(ioflags); - int iolock = XFS_IOLOCK_SHARED; - - ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, ip, iocb->ki_pos, size, - dmflags, &iolock); - if (ret) { - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - if (unlikely(ioflags & IO_ISDIRECT)) - mutex_unlock(&inode->i_mutex); - return ret; - } - } - if (unlikely(ioflags & IO_ISDIRECT)) { if (inode->i_mapping->nrpages) { ret = -xfs_flushinval_pages(ip, @@ -321,7 +306,6 @@ xfs_file_splice_read( unsigned int flags) { struct xfs_inode *ip = XFS_I(infilp->f_mapping->host); - struct xfs_mount *mp = ip->i_mount; int ioflags = 0; ssize_t ret; @@ -335,18 +319,6 @@ xfs_file_splice_read( xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { - int iolock = XFS_IOLOCK_SHARED; - int error; - - error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, *ppos, count, - FILP_DELAY_FLAG(infilp), &iolock); - if (error) { - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - return -error; - } - } - trace_xfs_file_splice_read(ip, count, *ppos, ioflags); ret = generic_file_splice_read(infilp, ppos, pipe, count, flags); @@ -367,7 +339,6 @@ xfs_file_splice_write( { struct inode *inode = outfilp->f_mapping->host; struct xfs_inode *ip = XFS_I(inode); - struct xfs_mount *mp = ip->i_mount; xfs_fsize_t isize, new_size; int ioflags = 0; ssize_t ret; @@ -382,18 +353,6 @@ xfs_file_splice_write( xfs_ilock(ip, XFS_IOLOCK_EXCL); - if (DM_EVENT_ENABLED(ip, DM_EVENT_WRITE) && !(ioflags & IO_INVIS)) { - int iolock = XFS_IOLOCK_EXCL; - int error; - - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, *ppos, count, - FILP_DELAY_FLAG(outfilp), &iolock); - if (error) { - xfs_iunlock(ip, XFS_IOLOCK_EXCL); - return -error; - } - } - new_size = *ppos + count; xfs_ilock(ip, XFS_ILOCK_EXCL); @@ -627,7 +586,6 @@ xfs_file_aio_write( int ioflags = 0; xfs_fsize_t isize, new_size; int iolock; - int eventsent = 0; size_t ocount = 0, count; int need_i_mutex; @@ -673,33 +631,6 @@ start: goto out_unlock_mutex; } - if ((DM_EVENT_ENABLED(ip, DM_EVENT_WRITE) && - !(ioflags & IO_INVIS) && !eventsent)) { - int dmflags = FILP_DELAY_FLAG(file); - - if (need_i_mutex) - dmflags |= DM_FLAGS_IMUX; - - xfs_iunlock(ip, XFS_ILOCK_EXCL); - error = XFS_SEND_DATA(ip->i_mount, DM_EVENT_WRITE, ip, - pos, count, dmflags, &iolock); - if (error) { - goto out_unlock_internal; - } - xfs_ilock(ip, XFS_ILOCK_EXCL); - eventsent = 1; - - /* - * The iolock was dropped and reacquired in XFS_SEND_DATA - * so we have to recheck the size when appending. - * We will only "goto start;" once, since having sent the - * event prevents another call to XFS_SEND_DATA, which is - * what allows the size to change in the first place. - */ - if ((file->f_flags & O_APPEND) && pos != ip->i_size) - goto start; - } - if (ioflags & IO_ISDIRECT) { xfs_buftarg_t *target = XFS_IS_REALTIME_INODE(ip) ? @@ -830,22 +761,6 @@ write_retry: xfs_iunlock(ip, XFS_ILOCK_EXCL); } - if (ret == -ENOSPC && - DM_EVENT_ENABLED(ip, DM_EVENT_NOSPACE) && !(ioflags & IO_INVIS)) { - xfs_iunlock(ip, iolock); - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); - error = XFS_SEND_NAMESP(ip->i_mount, DM_EVENT_NOSPACE, ip, - DM_RIGHT_NULL, ip, DM_RIGHT_NULL, NULL, NULL, - 0, 0, 0); /* Delay flag intentionally unused */ - if (need_i_mutex) - mutex_lock(&inode->i_mutex); - xfs_ilock(ip, iolock); - if (error) - goto out_unlock_internal; - goto start; - } - error = -ret; if (ret <= 0) goto out_unlock_internal; Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2010-05-25 11:14:59.237275526 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" @@ -1117,16 +1116,7 @@ xfs_ioctl_setattr( xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); - if (code) - return code; - - if (DM_EVENT_ENABLED(ip, DM_EVENT_ATTRIBUTE)) { - XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL, - NULL, DM_RIGHT_NULL, NULL, NULL, 0, 0, - (mask & FSX_NONBLOCK) ? DM_FLAGS_NDELAY : 0); - } - - return 0; + return code; error_return: xfs_qm_dqrele(udqp); Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2010-05-24 23:11:41.018253918 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-05-25 11:15:23.496005936 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" @@ -116,9 +115,6 @@ mempool_t *xfs_ioend_pool; #define MNTOPT_GQUOTANOENF "gqnoenforce"/* group quota limit enforcement */ #define MNTOPT_PQUOTANOENF "pqnoenforce"/* project quota limit enforcement */ #define MNTOPT_QUOTANOENF "qnoenforce" /* same as uqnoenforce */ -#define MNTOPT_DMAPI "dmapi" /* DMI enabled (DMAPI / XDSM) */ -#define MNTOPT_XDSM "xdsm" /* DMI enabled (DMAPI / XDSM) */ -#define MNTOPT_DMI "dmi" /* DMI enabled (DMAPI / XDSM) */ #define MNTOPT_DELAYLOG "delaylog" /* Delayed loging enabled */ #define MNTOPT_NODELAYLOG "nodelaylog" /* Delayed loging disabled */ @@ -172,15 +168,13 @@ suffix_strtoul(char *s, char **endp, uns STATIC int xfs_parseargs( struct xfs_mount *mp, - char *options, - char **mtpt) + char *options) { struct super_block *sb = mp->m_super; char *this_char, *value, *eov; int dsunit = 0; int dswidth = 0; int iosize = 0; - int dmapi_implies_ikeep = 1; __uint8_t iosizelog = 0; /* @@ -243,15 +237,10 @@ xfs_parseargs( if (!mp->m_logname) return ENOMEM; } else if (!strcmp(this_char, MNTOPT_MTPT)) { - if (!value || !*value) { - cmn_err(CE_WARN, - "XFS: %s option requires an argument", - this_char); - return EINVAL; - } - *mtpt = kstrndup(value, MAXNAMELEN, GFP_KERNEL); - if (!*mtpt) - return ENOMEM; + cmn_err(CE_WARN, + "XFS: %s option not allowed on this system", + this_char); + return EINVAL; } else if (!strcmp(this_char, MNTOPT_RTDEV)) { if (!value || !*value) { cmn_err(CE_WARN, @@ -329,7 +318,6 @@ xfs_parseargs( } else if (!strcmp(this_char, MNTOPT_IKEEP)) { mp->m_flags |= XFS_MOUNT_IKEEP; } else if (!strcmp(this_char, MNTOPT_NOIKEEP)) { - dmapi_implies_ikeep = 0; mp->m_flags &= ~XFS_MOUNT_IKEEP; } else if (!strcmp(this_char, MNTOPT_LARGEIO)) { mp->m_flags &= ~XFS_MOUNT_COMPAT_IOSIZE; @@ -370,12 +358,6 @@ xfs_parseargs( } else if (!strcmp(this_char, MNTOPT_GQUOTANOENF)) { mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE); mp->m_qflags &= ~XFS_OQUOTA_ENFD; - } else if (!strcmp(this_char, MNTOPT_DMAPI)) { - mp->m_flags |= XFS_MOUNT_DMAPI; - } else if (!strcmp(this_char, MNTOPT_XDSM)) { - mp->m_flags |= XFS_MOUNT_DMAPI; - } else if (!strcmp(this_char, MNTOPT_DMI)) { - mp->m_flags |= XFS_MOUNT_DMAPI; } else if (!strcmp(this_char, MNTOPT_DELAYLOG)) { mp->m_flags |= XFS_MOUNT_DELAYLOG; cmn_err(CE_WARN, @@ -430,12 +412,6 @@ xfs_parseargs( return EINVAL; } - if ((mp->m_flags & XFS_MOUNT_DMAPI) && (!*mtpt || *mtpt[0] == '\0')) { - printk("XFS: %s option needs the mount point option as well\n", - MNTOPT_DMAPI); - return EINVAL; - } - if ((dsunit && !dswidth) || (!dsunit && dswidth)) { cmn_err(CE_WARN, "XFS: sunit and swidth must be specified together"); @@ -449,18 +425,6 @@ xfs_parseargs( return EINVAL; } - /* - * Applications using DMI filesystems often expect the - * inode generation number to be monotonically increasing. - * If we delete inode chunks we break this assumption, so - * keep unused inode chunks on disk for DMI filesystems - * until we come up with a better solution. - * Note that if "ikeep" or "noikeep" mount options are - * supplied, then they are honored. - */ - if ((mp->m_flags & XFS_MOUNT_DMAPI) && dmapi_implies_ikeep) - mp->m_flags |= XFS_MOUNT_IKEEP; - done: if (!(mp->m_flags & XFS_MOUNT_NOALIGN)) { /* @@ -542,7 +506,6 @@ xfs_showargs( { XFS_MOUNT_OSYNCISOSYNC, "," MNTOPT_OSYNCISOSYNC }, { XFS_MOUNT_ATTR2, "," MNTOPT_ATTR2 }, { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, - { XFS_MOUNT_DMAPI, "," MNTOPT_DMAPI }, { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, { XFS_MOUNT_DELAYLOG, "," MNTOPT_DELAYLOG }, { 0, NULL } @@ -1206,8 +1169,6 @@ xfs_fs_put_super( xfs_sync_attr(mp, 0); } - XFS_SEND_PREUNMOUNT(mp); - /* * Blow away any referenced inode in the filestreams cache. * This can and will cause log traffic as inodes go inactive @@ -1217,14 +1178,11 @@ xfs_fs_put_super( XFS_bflush(mp->m_ddev_targp); - XFS_SEND_UNMOUNT(mp); - xfs_unmountfs(mp); xfs_freesb(mp); xfs_inode_shrinker_unregister(mp); xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); - xfs_dmops_put(mp); xfs_free_fsname(mp); kfree(mp); } @@ -1542,7 +1500,6 @@ xfs_fs_fill_super( struct inode *root; struct xfs_mount *mp = NULL; int flags = 0, error = ENOMEM; - char *mtpt = NULL; mp = kzalloc(sizeof(struct xfs_mount), GFP_KERNEL); if (!mp) @@ -1558,7 +1515,7 @@ xfs_fs_fill_super( mp->m_super = sb; sb->s_fs_info = mp; - error = xfs_parseargs(mp, (char *)data, &mtpt); + error = xfs_parseargs(mp, (char *)data); if (error) goto out_free_fsname; @@ -1570,16 +1527,12 @@ xfs_fs_fill_super( #endif sb->s_op = &xfs_super_operations; - error = xfs_dmops_get(mp); - if (error) - goto out_free_fsname; - if (silent) flags |= XFS_MFSI_QUIET; error = xfs_open_devices(mp); if (error) - goto out_put_dmops; + goto out_free_fsname; if (xfs_icsb_init_counters(mp)) mp->m_flags |= XFS_MOUNT_NO_PERCPU_SB; @@ -1607,8 +1560,6 @@ xfs_fs_fill_super( if (error) goto out_filestream_unmount; - XFS_SEND_MOUNT(mp, DM_RIGHT_NULL, mtpt, mp->m_fsname); - sb->s_magic = XFS_SB_MAGIC; sb->s_blocksize = mp->m_sb.sb_blocksize; sb->s_blocksize_bits = ffs(sb->s_blocksize) - 1; @@ -1637,7 +1588,6 @@ xfs_fs_fill_super( xfs_inode_shrinker_register(mp); - kfree(mtpt); return 0; out_filestream_unmount: @@ -1647,11 +1597,8 @@ xfs_fs_fill_super( out_destroy_counters: xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); - out_put_dmops: - xfs_dmops_put(mp); out_free_fsname: xfs_free_fsname(mp); - kfree(mtpt); kfree(mp); out: return -error; Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_bmap.c 2010-05-25 11:14:59.261004260 +0200 @@ -34,7 +34,6 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_ialloc.h" #include "xfs_itable.h" @@ -5605,28 +5604,6 @@ xfs_getbmap( prealloced = 0; fixlen = 1LL << 32; } else { - /* - * If the BMV_IF_NO_DMAPI_READ interface bit specified, do - * not generate a DMAPI read event. Otherwise, if the - * DM_EVENT_READ bit is set for the file, generate a read - * event in order that the DMAPI application may do its thing - * before we return the extents. Usually this means restoring - * user file data to regions of the file that look like holes. - * - * The "old behavior" (from XFS_IOC_GETBMAP) is to not specify - * BMV_IF_NO_DMAPI_READ so that read events are generated. - * If this were not true, callers of ioctl(XFS_IOC_GETBMAP) - * could misinterpret holes in a DMAPI file as true holes, - * when in fact they may represent offline user data. - */ - if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && - !(iflags & BMV_IF_NO_DMAPI_READ)) { - error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, - 0, 0, 0, NULL); - if (error) - return XFS_ERROR(error); - } - if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS && ip->i_d.di_format != XFS_DINODE_FMT_BTREE && ip->i_d.di_format != XFS_DINODE_FMT_LOCAL) Index: xfs/fs/xfs/xfs_rename.c =================================================================== --- xfs.orig/fs/xfs/xfs_rename.c 2010-05-22 00:39:04.104004455 +0200 +++ xfs/fs/xfs/xfs_rename.c 2010-05-25 11:14:59.266265051 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" @@ -119,18 +118,6 @@ xfs_rename( xfs_itrace_entry(src_dp); xfs_itrace_entry(target_dp); - if (DM_EVENT_ENABLED(src_dp, DM_EVENT_RENAME) || - DM_EVENT_ENABLED(target_dp, DM_EVENT_RENAME)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_RENAME, - src_dp, DM_RIGHT_NULL, - target_dp, DM_RIGHT_NULL, - src_name->name, target_name->name, - 0, 0, 0); - if (error) - return error; - } - /* Return through std_return after this point. */ - new_parent = (src_dp != target_dp); src_is_directory = ((src_ip->i_d.di_mode & S_IFMT) == S_IFDIR); @@ -369,26 +356,13 @@ xfs_rename( * trans_commit will unlock src_ip, target_ip & decrement * the vnode references. */ - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - - /* Fall through to std_return with error = 0 or errno from - * xfs_trans_commit */ -std_return: - if (DM_EVENT_ENABLED(src_dp, DM_EVENT_POSTRENAME) || - DM_EVENT_ENABLED(target_dp, DM_EVENT_POSTRENAME)) { - (void) XFS_SEND_NAMESP (mp, DM_EVENT_POSTRENAME, - src_dp, DM_RIGHT_NULL, - target_dp, DM_RIGHT_NULL, - src_name->name, target_name->name, - 0, error, 0); - } - return error; + return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); abort_return: cancel_flags |= XFS_TRANS_ABORT; - /* FALLTHROUGH */ error_return: xfs_bmap_cancel(&free_list); xfs_trans_cancel(tp, cancel_flags); - goto std_return; + std_return: + return error; } Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c 2010-05-22 00:40:37.991004874 +0200 +++ xfs/fs/xfs/xfs_vnodeops.c 2010-05-25 11:14:59.274016343 +0200 @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" @@ -143,16 +142,6 @@ xfs_setattr( goto error_return; } } else { - if (DM_EVENT_ENABLED(ip, DM_EVENT_TRUNCATE) && - !(flags & XFS_ATTR_DMI)) { - int dmflags = AT_DELAY_FLAG(flags) | DM_SEM_FLAG_WR; - code = XFS_SEND_DATA(mp, DM_EVENT_TRUNCATE, ip, - iattr->ia_size, 0, dmflags, NULL); - if (code) { - lock_flags = 0; - goto error_return; - } - } if (need_iolock) lock_flags |= XFS_IOLOCK_EXCL; } @@ -470,17 +459,10 @@ xfs_setattr( return XFS_ERROR(code); } - if (DM_EVENT_ENABLED(ip, DM_EVENT_ATTRIBUTE) && - !(flags & XFS_ATTR_DMI)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL, - NULL, DM_RIGHT_NULL, NULL, NULL, - 0, 0, AT_DELAY_FLAG(flags)); - } return 0; abort_return: commit_flags |= XFS_TRANS_ABORT; - /* FALLTHROUGH */ error_return: xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); @@ -1060,9 +1042,6 @@ xfs_inactive( mp = ip->i_mount; - if (ip->i_d.di_nlink == 0 && DM_EVENT_ENABLED(ip, DM_EVENT_DESTROY)) - XFS_SEND_DESTROY(mp, ip, DM_RIGHT_NULL); - error = 0; /* If this is a read-only mount, don't do this (would generate I/O) */ @@ -1314,16 +1293,6 @@ xfs_create( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - if (DM_EVENT_ENABLED(dp, DM_EVENT_CREATE)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE, - dp, DM_RIGHT_NULL, NULL, - DM_RIGHT_NULL, name->name, NULL, - mode, 0, 0); - - if (error) - return error; - } - if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) prid = dp->i_d.di_projid; else @@ -1487,16 +1456,7 @@ xfs_create( xfs_qm_dqrele(gdqp); *ipp = ip; - - /* Fallthrough to std_return with error = 0 */ - std_return: - if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTCREATE)) { - XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE, dp, DM_RIGHT_NULL, - ip, DM_RIGHT_NULL, name->name, NULL, mode, - error, 0); - } - - return error; + return 0; out_bmap_cancel: xfs_bmap_cancel(&free_list); @@ -1510,8 +1470,8 @@ xfs_create( if (unlock_dp_on_error) xfs_iunlock(dp, XFS_ILOCK_EXCL); - - goto std_return; + std_return: + return error; out_abort_rele: /* @@ -1732,14 +1692,6 @@ xfs_remove( 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, - ip->i_d.di_mode, 0, 0); - if (error) - return error; - } - error = xfs_qm_dqattach(dp, 0); if (error) goto std_return; @@ -1877,21 +1829,15 @@ xfs_remove( if (!is_dir && link_zero && xfs_inode_is_filestream(ip)) xfs_filestream_deassociate(ip); - std_return: - if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTREMOVE)) { - 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; + return 0; 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; + std_return: + return error; } int @@ -1917,17 +1863,6 @@ xfs_link( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - if (DM_EVENT_ENABLED(tdp, DM_EVENT_LINK)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_LINK, - tdp, DM_RIGHT_NULL, - sip, DM_RIGHT_NULL, - target_name->name, NULL, 0, 0, 0); - if (error) - return error; - } - - /* Return through std_return after this point. */ - error = xfs_qm_dqattach(sip, 0); if (error) goto std_return; @@ -2014,27 +1949,14 @@ xfs_link( goto abort_return; } - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - if (error) - goto std_return; - - /* Fall through to std_return with error = 0. */ -std_return: - if (DM_EVENT_ENABLED(sip, DM_EVENT_POSTLINK)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTLINK, - tdp, DM_RIGHT_NULL, - sip, DM_RIGHT_NULL, - target_name->name, NULL, 0, error, 0); - } - return error; + return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); abort_return: cancel_flags |= XFS_TRANS_ABORT; - /* FALLTHROUGH */ - error_return: xfs_trans_cancel(tp, cancel_flags); - goto std_return; + std_return: + return error; } int @@ -2086,17 +2008,6 @@ xfs_symlink( if (pathlen >= MAXPATHLEN) /* total string too long */ return XFS_ERROR(ENAMETOOLONG); - if (DM_EVENT_ENABLED(dp, DM_EVENT_SYMLINK)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_SYMLINK, dp, - DM_RIGHT_NULL, NULL, DM_RIGHT_NULL, - link_name->name, - (unsigned char *)target_path, 0, 0, 0); - if (error) - return error; - } - - /* Return through std_return after this point. */ - udqp = gdqp = NULL; if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) prid = dp->i_d.di_projid; @@ -2278,21 +2189,8 @@ xfs_symlink( xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); - /* Fall through to std_return with error = 0 or errno from - * xfs_trans_commit */ -std_return: - if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTSYMLINK)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTSYMLINK, - dp, DM_RIGHT_NULL, - error ? NULL : ip, - DM_RIGHT_NULL, link_name->name, - (unsigned char *)target_path, - 0, error, 0); - } - - if (!error) - *ipp = ip; - return error; + *ipp = ip; + return 0; error2: IRELE(ip); @@ -2306,8 +2204,8 @@ std_return: if (unlock_dp_on_error) xfs_iunlock(dp, XFS_ILOCK_EXCL); - - goto std_return; + std_return: + return error; } int @@ -2412,25 +2310,9 @@ xfs_alloc_file_space( startoffset_fsb = XFS_B_TO_FSBT(mp, offset); allocatesize_fsb = XFS_B_TO_FSB(mp, count); - /* Generate a DMAPI event if needed. */ - if (alloc_type != 0 && offset < ip->i_size && - (attr_flags & XFS_ATTR_DMI) == 0 && - DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) { - xfs_off_t end_dmi_offset; - - end_dmi_offset = offset+len; - if (end_dmi_offset > ip->i_size) - end_dmi_offset = ip->i_size; - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, offset, - end_dmi_offset - offset, 0, NULL); - if (error) - return error; - } - /* * Allocate file space until done or until there is an error */ -retry: while (allocatesize_fsb && !error) { xfs_fileoff_t s, e; @@ -2527,17 +2409,6 @@ retry: startoffset_fsb += allocated_fsb; allocatesize_fsb -= allocated_fsb; } -dmapi_enospc_check: - if (error == ENOSPC && (attr_flags & XFS_ATTR_DMI) == 0 && - DM_EVENT_ENABLED(ip, DM_EVENT_NOSPACE)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_NOSPACE, - ip, DM_RIGHT_NULL, - ip, DM_RIGHT_NULL, - NULL, NULL, 0, 0, 0); /* Delay flag intentionally unused */ - if (error == 0) - goto retry; /* Maybe DMAPI app. has made space */ - /* else fall through with error from XFS_SEND_DATA */ - } return error; @@ -2548,7 +2419,7 @@ error0: /* Cancel bmap, unlock inode, un error1: /* Just cancel transaction */ xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); xfs_iunlock(ip, XFS_ILOCK_EXCL); - goto dmapi_enospc_check; + return error; } /* @@ -2661,7 +2532,6 @@ xfs_free_file_space( { int committed; int done; - xfs_off_t end_dmi_offset; xfs_fileoff_t endoffset_fsb; int error; xfs_fsblock_t firstfsb; @@ -2691,19 +2561,7 @@ xfs_free_file_space( return error; rt = XFS_IS_REALTIME_INODE(ip); startoffset_fsb = XFS_B_TO_FSB(mp, offset); - end_dmi_offset = offset + len; - endoffset_fsb = XFS_B_TO_FSBT(mp, end_dmi_offset); - - if (offset < ip->i_size && (attr_flags & XFS_ATTR_DMI) == 0 && - DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) { - if (end_dmi_offset > ip->i_size) - end_dmi_offset = ip->i_size; - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, - offset, end_dmi_offset - offset, - AT_DELAY_FLAG(attr_flags), NULL); - if (error) - return error; - } + endoffset_fsb = XFS_B_TO_FSBT(mp, offset + len); if (attr_flags & XFS_ATTR_NOLOCK) need_iolock = 0; Index: xfs/fs/xfs/Makefile =================================================================== --- xfs.orig/fs/xfs/Makefile 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/Makefile 2010-05-25 11:14:59.282031778 +0200 @@ -90,8 +90,7 @@ xfs-y += xfs_alloc.o \ xfs_trans_item.o \ xfs_utils.o \ xfs_vnodeops.o \ - xfs_rw.o \ - xfs_dmops.o + xfs_rw.o xfs-$(CONFIG_XFS_TRACE) += xfs_btree_trace.o Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-05-25 11:14:59.286031150 +0200 @@ -23,7 +23,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_trans.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_buf.c 2010-05-25 11:14:59.297023956 +0200 @@ -39,7 +39,6 @@ #include "xfs_inum.h" #include "xfs_log.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trace.h" Index: xfs/fs/xfs/linux-2.6/xfs_export.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_export.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_export.c 2010-05-25 11:14:59.303023816 +0200 @@ -23,7 +23,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_export.h" #include "xfs_vnodeops.h" Index: xfs/fs/xfs/linux-2.6/xfs_fs_subr.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_fs_subr.c 2010-05-22 00:40:37.890004594 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_fs_subr.c 2010-05-25 11:14:59.310005937 +0200 @@ -21,10 +21,6 @@ #include "xfs_inode.h" #include "xfs_trace.h" -int fs_noerr(void) { return 0; } -int fs_nosys(void) { return ENOSYS; } -void fs_noval(void) { return; } - /* * note: all filemap functions return negative error codes. These * need to be inverted before returning to the xfs core functions. Index: xfs/fs/xfs/linux-2.6/xfs_fs_subr.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_fs_subr.h 2010-05-22 00:39:04.000000000 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2000,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 - */ -#ifndef __XFS_FS_SUBR_H__ -#define __XFS_FS_SUBR_H__ - -extern int fs_noerr(void); -extern int fs_nosys(void); -extern void fs_noval(void); - -#endif /* __XFS_FS_SUBR_H__ */ Index: xfs/fs/xfs/linux-2.6/xfs_ioctl32.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-05-25 11:14:59.317003422 +0200 @@ -29,7 +29,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_attr_sf.h" Index: xfs/fs/xfs/linux-2.6/xfs_iops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_iops.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_iops.c 2010-05-25 11:14:59.319042045 +0200 @@ -26,7 +26,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/linux-2.6/xfs_linux.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_linux.h 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_linux.h 2010-05-25 11:14:59.324043582 +0200 @@ -87,7 +87,6 @@ #include #include #include -#include #include /* Index: xfs/fs/xfs/linux-2.6/xfs_quotaops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_quotaops.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_quotaops.c 2010-05-25 11:14:59.329274410 +0200 @@ -16,7 +16,6 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" -#include "xfs_dmapi.h" #include "xfs_sb.h" #include "xfs_inum.h" #include "xfs_log.h" Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2010-05-25 11:14:59.335006286 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/linux-2.6/xfs_trace.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_trace.c 2010-05-25 11:14:59.338005727 +0200 @@ -34,7 +34,6 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_ialloc.h" #include "xfs_itable.h" Index: xfs/fs/xfs/quota/xfs_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_dquot.c 2010-05-25 11:14:59.344006076 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_dquot_item.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot_item.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_dquot_item.c 2010-05-25 11:14:59.350033035 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_qm.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm.c 2010-05-25 11:14:59.357004121 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_qm_bhv.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_bhv.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm_bhv.c 2010-05-25 11:14:59.361013061 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_qm_stats.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_stats.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm_stats.c 2010-05-25 11:14:59.363010267 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_qm_syscalls.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_syscalls.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm_syscalls.c 2010-05-25 11:14:59.368004121 +0200 @@ -28,7 +28,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/quota/xfs_trans_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_trans_dquot.c 2010-05-25 11:14:59.372003632 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/support/debug.c =================================================================== --- xfs.orig/fs/xfs/support/debug.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/support/debug.c 2010-05-25 11:14:59.376020813 +0200 @@ -22,7 +22,6 @@ #include "xfs_sb.h" #include "xfs_inum.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_alloc.c 2010-05-25 11:14:59.381273222 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_alloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc_btree.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_alloc_btree.c 2010-05-25 11:14:59.386036737 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_attr.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_attr.c 2010-05-25 11:14:59.390255762 +0200 @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_attr_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr_leaf.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_attr_leaf.c 2010-05-25 11:14:59.398255692 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_bmap_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap_btree.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_bmap_btree.c 2010-05-25 11:14:59.404255552 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_btree.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_btree.c 2010-05-25 11:14:59.410003911 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_buf_item.c 2010-05-25 11:14:59.418034083 +0200 @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" Index: xfs/fs/xfs/xfs_da_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_da_btree.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_da_btree.c 2010-05-25 11:14:59.424006216 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dfrag.c =================================================================== --- xfs.orig/fs/xfs/xfs_dfrag.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_dfrag.c 2010-05-25 11:14:59.430031918 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_dir2.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2.c 2010-05-25 11:14:59.435037366 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_block.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_block.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_block.c 2010-05-25 11:14:59.440014527 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_data.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_data.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_data.c 2010-05-25 11:14:59.442011873 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_leaf.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_leaf.c 2010-05-25 11:14:59.454006216 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_node.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_node.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_node.c 2010-05-25 11:14:59.671255345 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dir2_sf.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2_sf.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_dir2_sf.c 2010-05-25 11:14:59.678033455 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_dmapi.h =================================================================== --- xfs.orig/fs/xfs/xfs_dmapi.h 2010-05-22 00:39:04.000000000 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2000-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 - */ -#ifndef __XFS_DMAPI_H__ -#define __XFS_DMAPI_H__ - -/* Values used to define the on-disk version of dm_attrname_t. All - * on-disk attribute names start with the 8-byte string "SGI_DMI_". - * - * In the on-disk inode, DMAPI attribute names consist of the user-provided - * name with the DMATTR_PREFIXSTRING pre-pended. This string must NEVER be - * changed. - */ - -#define DMATTR_PREFIXLEN 8 -#define DMATTR_PREFIXSTRING "SGI_DMI_" - -typedef enum { - DM_EVENT_INVALID = -1, - DM_EVENT_CANCEL = 0, /* not supported */ - DM_EVENT_MOUNT = 1, - DM_EVENT_PREUNMOUNT = 2, - DM_EVENT_UNMOUNT = 3, - DM_EVENT_DEBUT = 4, /* not supported */ - DM_EVENT_CREATE = 5, - DM_EVENT_CLOSE = 6, /* not supported */ - DM_EVENT_POSTCREATE = 7, - DM_EVENT_REMOVE = 8, - DM_EVENT_POSTREMOVE = 9, - DM_EVENT_RENAME = 10, - DM_EVENT_POSTRENAME = 11, - DM_EVENT_LINK = 12, - DM_EVENT_POSTLINK = 13, - DM_EVENT_SYMLINK = 14, - DM_EVENT_POSTSYMLINK = 15, - DM_EVENT_READ = 16, - DM_EVENT_WRITE = 17, - DM_EVENT_TRUNCATE = 18, - DM_EVENT_ATTRIBUTE = 19, - DM_EVENT_DESTROY = 20, - DM_EVENT_NOSPACE = 21, - DM_EVENT_USER = 22, - DM_EVENT_MAX = 23 -} dm_eventtype_t; -#define HAVE_DM_EVENTTYPE_T - -typedef enum { - DM_RIGHT_NULL, - DM_RIGHT_SHARED, - DM_RIGHT_EXCL -} dm_right_t; -#define HAVE_DM_RIGHT_T - -/* Defines for determining if an event message should be sent. */ -#ifdef HAVE_DMAPI -#define DM_EVENT_ENABLED(ip, event) ( \ - unlikely ((ip)->i_mount->m_flags & XFS_MOUNT_DMAPI) && \ - ( ((ip)->i_d.di_dmevmask & (1 << event)) || \ - ((ip)->i_mount->m_dmevmask & (1 << event)) ) \ - ) -#else -#define DM_EVENT_ENABLED(ip, event) (0) -#endif - -#define DM_XFS_VALID_FS_EVENTS ( \ - (1 << DM_EVENT_PREUNMOUNT) | \ - (1 << DM_EVENT_UNMOUNT) | \ - (1 << DM_EVENT_NOSPACE) | \ - (1 << DM_EVENT_DEBUT) | \ - (1 << DM_EVENT_CREATE) | \ - (1 << DM_EVENT_POSTCREATE) | \ - (1 << DM_EVENT_REMOVE) | \ - (1 << DM_EVENT_POSTREMOVE) | \ - (1 << DM_EVENT_RENAME) | \ - (1 << DM_EVENT_POSTRENAME) | \ - (1 << DM_EVENT_LINK) | \ - (1 << DM_EVENT_POSTLINK) | \ - (1 << DM_EVENT_SYMLINK) | \ - (1 << DM_EVENT_POSTSYMLINK) | \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - -/* Events valid in dm_set_eventlist() when called with a file handle for - a regular file or a symlink. These events are persistent. -*/ - -#define DM_XFS_VALID_FILE_EVENTS ( \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - -/* Events valid in dm_set_eventlist() when called with a file handle for - a directory. These events are persistent. -*/ - -#define DM_XFS_VALID_DIRECTORY_EVENTS ( \ - (1 << DM_EVENT_CREATE) | \ - (1 << DM_EVENT_POSTCREATE) | \ - (1 << DM_EVENT_REMOVE) | \ - (1 << DM_EVENT_POSTREMOVE) | \ - (1 << DM_EVENT_RENAME) | \ - (1 << DM_EVENT_POSTRENAME) | \ - (1 << DM_EVENT_LINK) | \ - (1 << DM_EVENT_POSTLINK) | \ - (1 << DM_EVENT_SYMLINK) | \ - (1 << DM_EVENT_POSTSYMLINK) | \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - -/* Events supported by the XFS filesystem. */ -#define DM_XFS_SUPPORTED_EVENTS ( \ - (1 << DM_EVENT_MOUNT) | \ - (1 << DM_EVENT_PREUNMOUNT) | \ - (1 << DM_EVENT_UNMOUNT) | \ - (1 << DM_EVENT_NOSPACE) | \ - (1 << DM_EVENT_CREATE) | \ - (1 << DM_EVENT_POSTCREATE) | \ - (1 << DM_EVENT_REMOVE) | \ - (1 << DM_EVENT_POSTREMOVE) | \ - (1 << DM_EVENT_RENAME) | \ - (1 << DM_EVENT_POSTRENAME) | \ - (1 << DM_EVENT_LINK) | \ - (1 << DM_EVENT_POSTLINK) | \ - (1 << DM_EVENT_SYMLINK) | \ - (1 << DM_EVENT_POSTSYMLINK) | \ - (1 << DM_EVENT_READ) | \ - (1 << DM_EVENT_WRITE) | \ - (1 << DM_EVENT_TRUNCATE) | \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - - -/* - * Definitions used for the flags field on dm_send_*_event(). - */ - -#define DM_FLAGS_NDELAY 0x001 /* return EAGAIN after dm_pending() */ -#define DM_FLAGS_UNWANTED 0x002 /* event not in fsys dm_eventset_t */ -#define DM_FLAGS_IMUX 0x004 /* thread holds i_mutex */ -#define DM_FLAGS_IALLOCSEM_RD 0x010 /* thread holds i_alloc_sem rd */ -#define DM_FLAGS_IALLOCSEM_WR 0x020 /* thread holds i_alloc_sem wr */ - -/* - * Pull in platform specific event flags defines - */ -#include "xfs_dmapi_priv.h" - -/* - * Macros to turn caller specified delay/block flags into - * dm_send_xxxx_event flag DM_FLAGS_NDELAY. - */ - -#define FILP_DELAY_FLAG(filp) ((filp->f_flags&(O_NDELAY|O_NONBLOCK)) ? \ - DM_FLAGS_NDELAY : 0) -#define AT_DELAY_FLAG(f) ((f & XFS_ATTR_NONBLOCK) ? DM_FLAGS_NDELAY : 0) - -#endif /* __XFS_DMAPI_H__ */ Index: xfs/fs/xfs/xfs_dmops.c =================================================================== --- xfs.orig/fs/xfs/xfs_dmops.c 2010-05-22 00:39:04.000000000 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2000-2003,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_log.h" -#include "xfs_trans.h" -#include "xfs_sb.h" -#include "xfs_dmapi.h" -#include "xfs_inum.h" -#include "xfs_ag.h" -#include "xfs_mount.h" - - -static struct xfs_dmops xfs_dmcore_stub = { - .xfs_send_data = (xfs_send_data_t)fs_nosys, - .xfs_send_mmap = (xfs_send_mmap_t)fs_noerr, - .xfs_send_destroy = (xfs_send_destroy_t)fs_nosys, - .xfs_send_namesp = (xfs_send_namesp_t)fs_nosys, - .xfs_send_mount = (xfs_send_mount_t)fs_nosys, - .xfs_send_unmount = (xfs_send_unmount_t)fs_noerr, -}; - -int -xfs_dmops_get(struct xfs_mount *mp) -{ - if (mp->m_flags & XFS_MOUNT_DMAPI) { - cmn_err(CE_WARN, - "XFS: dmapi support not available in this kernel."); - return EINVAL; - } - - mp->m_dm_ops = &xfs_dmcore_stub; - return 0; -} - -void -xfs_dmops_put(struct xfs_mount *mp) -{ -} Index: xfs/fs/xfs/xfs_error.c =================================================================== --- xfs.orig/fs/xfs/xfs_error.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_error.c 2010-05-25 11:14:59.684255901 +0200 @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" Index: xfs/fs/xfs/xfs_extfree_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_extfree_item.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_extfree_item.c 2010-05-25 11:14:59.687282511 +0200 @@ -24,7 +24,6 @@ #include "xfs_buf_item.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_extfree_item.h" Index: xfs/fs/xfs/xfs_filestream.c =================================================================== --- xfs.orig/fs/xfs/xfs_filestream.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_filestream.c 2010-05-25 11:14:59.694256111 +0200 @@ -24,7 +24,6 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" Index: xfs/fs/xfs/xfs_fsops.c =================================================================== --- xfs.orig/fs/xfs/xfs_fsops.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_fsops.c 2010-05-25 11:14:59.700275318 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_ialloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_ialloc.c 2010-05-25 11:14:59.705254086 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_ialloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc_btree.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/xfs_ialloc_btree.c 2010-05-25 11:14:59.709254155 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-05-25 11:14:59.713253736 +0200 @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_inode.c 2010-05-25 11:14:59.716253946 +0200 @@ -28,7 +28,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_inode_item.c 2010-05-25 11:14:59.722275178 +0200 @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_iomap.c 2010-05-25 11:14:59.733005937 +0200 @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_itable.c =================================================================== --- xfs.orig/fs/xfs/xfs_itable.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_itable.c 2010-05-25 11:14:59.740006635 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_log.c =================================================================== --- xfs.orig/fs/xfs/xfs_log.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_log.c 2010-05-25 11:14:59.753006007 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_log_priv.h" Index: xfs/fs/xfs/xfs_log_recover.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_recover.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_log_recover.c 2010-05-25 11:14:59.762003492 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_bmap_btree.h" Index: xfs/fs/xfs/xfs_mount.c =================================================================== --- xfs.orig/fs/xfs/xfs_mount.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_mount.c 2010-05-25 11:14:59.764011664 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_mount.h =================================================================== --- xfs.orig/fs/xfs/xfs_mount.h 2010-05-24 23:11:41.025253988 +0200 +++ xfs/fs/xfs/xfs_mount.h 2010-05-25 11:15:46.687030871 +0200 @@ -66,65 +66,6 @@ struct xfs_nameops; struct xfs_ail; struct xfs_quotainfo; - -/* - * Prototypes and functions for the Data Migration subsystem. - */ - -typedef int (*xfs_send_data_t)(int, struct xfs_inode *, - xfs_off_t, size_t, int, int *); -typedef int (*xfs_send_mmap_t)(struct vm_area_struct *, uint); -typedef int (*xfs_send_destroy_t)(struct xfs_inode *, dm_right_t); -typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct xfs_mount *, - struct xfs_inode *, dm_right_t, - struct xfs_inode *, dm_right_t, - const unsigned char *, const unsigned char *, - mode_t, int, int); -typedef int (*xfs_send_mount_t)(struct xfs_mount *, dm_right_t, - char *, char *); -typedef void (*xfs_send_unmount_t)(struct xfs_mount *, struct xfs_inode *, - dm_right_t, mode_t, int, int); - -typedef struct xfs_dmops { - xfs_send_data_t xfs_send_data; - xfs_send_mmap_t xfs_send_mmap; - xfs_send_destroy_t xfs_send_destroy; - xfs_send_namesp_t xfs_send_namesp; - xfs_send_mount_t xfs_send_mount; - xfs_send_unmount_t xfs_send_unmount; -} xfs_dmops_t; - -#define XFS_DMAPI_UNMOUNT_FLAGS(mp) \ - (((mp)->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? 0 : DM_FLAGS_UNWANTED) - -#define XFS_SEND_DATA(mp, ev,ip,off,len,fl,lock) \ - (*(mp)->m_dm_ops->xfs_send_data)(ev,ip,off,len,fl,lock) -#define XFS_SEND_MMAP(mp, vma,fl) \ - (*(mp)->m_dm_ops->xfs_send_mmap)(vma,fl) -#define XFS_SEND_DESTROY(mp, ip,right) \ - (*(mp)->m_dm_ops->xfs_send_destroy)(ip,right) -#define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ - (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) -#define XFS_SEND_MOUNT(mp,right,path,name) \ - (*(mp)->m_dm_ops->xfs_send_mount)(mp,right,path,name) -#define XFS_SEND_PREUNMOUNT(mp) \ -do { \ - if (mp->m_flags & XFS_MOUNT_DMAPI) { \ - (*(mp)->m_dm_ops->xfs_send_namesp)(DM_EVENT_PREUNMOUNT, mp, \ - (mp)->m_rootip, DM_RIGHT_NULL, \ - (mp)->m_rootip, DM_RIGHT_NULL, \ - NULL, NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ - } \ -} while (0) -#define XFS_SEND_UNMOUNT(mp) \ -do { \ - if (mp->m_flags & XFS_MOUNT_DMAPI) { \ - (*(mp)->m_dm_ops->xfs_send_unmount)(mp, (mp)->m_rootip, \ - DM_RIGHT_NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ - } \ -} while (0) - - #ifdef HAVE_PERCPU_SB /* @@ -241,8 +182,6 @@ typedef struct xfs_mount { uint m_chsize; /* size of next field */ struct xfs_chash *m_chash; /* fs private inode per-cluster * hash table */ - struct xfs_dmops *m_dm_ops; /* vector of DMI ops */ - struct xfs_qmops *m_qm_ops; /* vector of XQM ops */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB xfs_icsb_cnts_t __percpu *m_sb_cnts; /* per-cpu superblock counters */ @@ -269,7 +208,6 @@ typedef struct xfs_mount { must be synchronous except for space allocations */ #define XFS_MOUNT_DELAYLOG (1ULL << 1) /* delayed logging is enabled */ -#define XFS_MOUNT_DMAPI (1ULL << 2) /* dmapi is enabled */ #define XFS_MOUNT_WAS_CLEAN (1ULL << 3) #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem operations, typically for @@ -440,11 +378,6 @@ extern int xfs_sb_validate_fsb_count(str extern int xfs_dev_is_read_only(struct xfs_mount *, char *); -extern int xfs_dmops_get(struct xfs_mount *); -extern void xfs_dmops_put(struct xfs_mount *); - -extern struct xfs_dmops xfs_dmcore_xfs; - #endif /* __KERNEL__ */ extern void xfs_mod_sb(struct xfs_trans *, __int64_t); Index: xfs/fs/xfs/xfs_rtalloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_rtalloc.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/xfs_rtalloc.c 2010-05-25 11:14:59.778003841 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_rw.c =================================================================== --- xfs.orig/fs/xfs/xfs_rw.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_rw.c 2010-05-25 11:14:59.784026331 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_trans.c 2010-05-25 11:14:59.797257578 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_da_btree.h" Index: xfs/fs/xfs/xfs_trans_ail.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_ail.c 2010-05-22 00:40:37.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_ail.c 2010-05-25 11:14:59.802255482 +0200 @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_error.h" Index: xfs/fs/xfs/xfs_trans_buf.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_buf.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_buf.c 2010-05-25 11:14:59.808006007 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_trans_extfree.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_extfree.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_extfree.c 2010-05-25 11:14:59.812006356 +0200 @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_extfree_item.h" Index: xfs/fs/xfs/xfs_trans_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_inode.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_inode.c 2010-05-25 11:14:59.816006845 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: xfs/fs/xfs/xfs_utils.c =================================================================== --- xfs.orig/fs/xfs/xfs_utils.c 2010-05-22 00:39:04.000000000 +0200 +++ xfs/fs/xfs/xfs_utils.c 2010-05-25 11:14:59.820006076 +0200 @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" Index: xfs/fs/xfs/xfs_trans_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_item.c 2010-05-24 23:11:41.000000000 +0200 +++ xfs/fs/xfs/xfs_trans_item.c 2010-05-25 11:14:59.823006076 +0200 @@ -28,7 +28,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" STATIC int xfs_trans_unlock_chunk(xfs_log_item_chunk_t *, Index: xfs/fs/xfs/linux-2.6/xfs_dmapi_priv.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_dmapi_priv.h 2010-05-22 00:39:04.000000000 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2000-2006 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 - */ -#ifndef __XFS_DMAPI_PRIV_H__ -#define __XFS_DMAPI_PRIV_H__ - -/* - * Based on IO_ISDIRECT, decide which i_ flag is set. - */ -#define DM_SEM_FLAG_RD(ioflags) (((ioflags) & IO_ISDIRECT) ? \ - DM_FLAGS_IMUX : 0) -#define DM_SEM_FLAG_WR (DM_FLAGS_IALLOCSEM_WR | DM_FLAGS_IMUX) - -#endif /*__XFS_DMAPI_PRIV_H__*/ Index: xfs/fs/xfs/linux-2.6/xfs_super.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.h 2010-05-22 00:39:04.089004246 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.h 2010-05-25 11:14:59.826005657 +0200 @@ -56,12 +56,6 @@ extern void xfs_qm_exit(void); # define XFS_BIGFS_STRING #endif -#ifdef CONFIG_XFS_DMAPI -# define XFS_DMAPI_STRING "dmapi support, " -#else -# define XFS_DMAPI_STRING -#endif - #ifdef DEBUG # define XFS_DBG_STRING "debug" #else @@ -72,7 +66,6 @@ extern void xfs_qm_exit(void); XFS_SECURITY_STRING \ XFS_REALTIME_STRING \ XFS_BIGFS_STRING \ - XFS_DMAPI_STRING \ XFS_DBG_STRING /* DBG must be last */ struct xfs_inode; Index: xfs/fs/xfs/xfs_log_cil.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_cil.c 2010-05-25 11:16:08.428003561 +0200 +++ xfs/fs/xfs/xfs_log_cil.c 2010-05-25 11:16:11.151344325 +0200 @@ -27,7 +27,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_alloc.h" From kiwiroy@paradise.net.nz Mon May 31 11:23:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VGN2Rc180949 for ; Mon, 31 May 2010 11:23:03 -0500 X-ASG-Debug-ID: 1275323258-38d201590000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4.clear.net.nz (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C15FE15804C9; Mon, 31 May 2010 09:27:39 -0700 (PDT) Received: from smtp4.clear.net.nz (smtp4.clear.net.nz [203.97.37.64]) by cuda.sgi.com with ESMTP id 0nbes3du6TGHO27Y; Mon, 31 May 2010 09:27:39 -0700 (PDT) Received: from ux422.paradise.net.nz (www-3.paradise.net.nz [203.96.152.152]) by smtp4.clear.net.nz (CLEAR Net Mail) with ESMTP id <0L3A00913LMBMH00@smtp4.clear.net.nz>; Tue, 01 Jun 2010 04:25:25 +1200 (NZST) Received: by ux422.paradise.net.nz (Postfix, from userid 30) id 768751036; Tue, 01 Jun 2010 04:25:18 +1200 (NZST) Date: Tue, 01 Jun 2010 04:25:18 +1200 (NZST) From: Account Management Team X-ASG-Orig-Subj: Account Update Subject: Account Update X-Originating-IP: 41.138.172.218 To: info@accountupdate.com Message-id: <1275323118.4c03e2ee54d34@www.paradise.net.nz> MIME-version: 1.0 Content-type: text/plain; charset=ISO-8859-1 Content-transfer-encoding: 8bit User-Agent: IMP/PHP IMAP webmail program 2.2.7 X-Barracuda-Connect: smtp4.clear.net.nz[203.97.37.64] X-Barracuda-Start-Time: 1275323261 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5446 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 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.2, rules version 3.2.2.31245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This message is from the webmail IT service, you are to provide to us the below information to re-validate your account due to spam. In order to continue using our service you are require updating and re-confirmation of your email account details as requested. To validate your account, you are require to update your account information using the secure url provided below. http://account-solutions.co.cc/acct/verify.htm It is also pertinent, you understand that our primary concern is security for our customers, and for the security of their files and data. From klonatos@ics.forth.gr Mon May 31 11:30:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VGUAYY181565 for ; Mon, 31 May 2010 11:30:10 -0500 X-ASG-Debug-ID: 1275323555-1d2902900000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailgate.ics.forth.gr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 69790387615 for ; Mon, 31 May 2010 09:32:35 -0700 (PDT) Received: from mailgate.ics.forth.gr (mailgate.ics.forth.gr [139.91.1.2]) by cuda.sgi.com with ESMTP id eD6X3VEaaka35IzC for ; Mon, 31 May 2010 09:32:35 -0700 (PDT) X-DNSBL-MILTER: Passed Received: from av1.ics.forth.gr ([139.91.157.71]) by mailgate.ics.forth.gr (8.14.3/ICS-FORTH/V10-1.8-GATE) with ESMTP id o4VGW1HT002000 for ; Mon, 31 May 2010 19:32:34 +0300 (EEST) X-AuditID: 8b5b9d47-b7ceaae000006f4f-02-4c03e481b6dc Received: from enigma.ics.forth.gr (webmail.ics.forth.gr [139.91.1.30]) by av1.ics.forth.gr (SMTP Outbound / FORTH / ICS) with SMTP id 05.34.28495.184E30C4; Mon, 31 May 2010 19:32:01 +0300 (EEST) Received: from [139.91.92.13] ([139.91.92.13]) (authenticated bits=0) by enigma.ics.forth.gr (8.14.3//ICS-FORTH/V10.3.0C-EXTNULL-SSL-SASL) with ESMTP id o4VGW1eJ001676 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 31 May 2010 19:32:01 +0300 Message-ID: <4C03E46B.9040407@ics.forth.gr> Date: Mon, 31 May 2010 19:31:39 +0300 From: Yannis Klonatos User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: xfs_buf and buffercache/pagecache connection Subject: xfs_buf and buffercache/pagecache connection Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Brightmail-Tracker: AAAAAA== X-j-chkmail-Score: MSGID : 4C03E481.000 on mailgate : j-chkmail score : . : R=. U=. O=. B=0.000 -> S=0.000 X-ICS-JCHK-SCL: Ham X-Barracuda-Connect: mailgate.ics.forth.gr[139.91.1.2] X-Barracuda-Start-Time: 1275323556 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0601 1.0000 -1.6365 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.64 X-Barracuda-Spam-Status: No, SCORE=-1.64 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.2, rules version 3.2.2.31246 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello, I was looking to add a kernel hook to my system in order to monitor buffer-cache hit and misses. Initially I was planning to add my modifications to the __getblk(). However, i noticed that XFS does not directly use the buffer-cache for its pages but it seems to implement its own buffer. What I am now looking for is 1) the place where XFS checks whether a page exists in its buffer or not and 2) what are the possible interactions between xfs_buf and the Linux kernel buffer-cache. I would appreciate any information regarding the above issues. Thanks in advance, Yannis Klonatos From andi@firstfloor.org Mon May 31 13:02:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VI2Oo3190029 for ; Mon, 31 May 2010 13:02:25 -0500 X-ASG-Debug-ID: 1275329223-79cb00cd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from one.firstfloor.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D479E9D300E for ; Mon, 31 May 2010 11:07:03 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id rqWtGjRdoNQdYSpE for ; Mon, 31 May 2010 11:07:03 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB8FB.dip0.t-ipconnect.de [91.60.184.251]) by one.firstfloor.org (Postfix) with ESMTP id E37031EE801D; Mon, 31 May 2010 20:04:46 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 2A833B1A1C; Mon, 31 May 2010 20:04:46 +0200 (CEST) To: Yannis Klonatos Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_buf and buffercache/pagecache connection Subject: Re: xfs_buf and buffercache/pagecache connection From: Andi Kleen References: <4C03E46B.9040407@ics.forth.gr> Date: Mon, 31 May 2010 20:04:46 +0200 In-Reply-To: <4C03E46B.9040407@ics.forth.gr> (Yannis Klonatos's message of "Mon\, 31 May 2010 19\:31\:39 +0300") Message-ID: <87aargt0ap.fsf@basil.nowhere.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1275329224 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0005 1.0000 -2.0178 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.2, rules version 3.2.2.31253 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Yannis Klonatos writes: > I was looking to add a kernel hook to my system in order to > monitor buffer-cache hit and misses. Initially I was > planning to add my modifications to the __getblk(). However, i noticed > that XFS does not directly use the buffer-cache > for its pages but it seems to implement its own buffer. > What I am now looking for is 1) the place where XFS checks > whether a page exists in its buffer or not and 2) > what are the possible interactions between xfs_buf and the Linux > kernel buffer-cache. > I would appreciate any information regarding the above issues. The kernel does not track all accesses, e.g. through mmap. So you can only get misses (which is essentially IO rate and already accounted), but not hits. -Andi -- ak@linux.intel.com -- Speaking for myself only. From klonatos@ics.forth.gr Mon May 31 13:23:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,HTML_MESSAGE autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VINhA1191965 for ; Mon, 31 May 2010 13:23:44 -0500 X-ASG-Debug-ID: 1275330502-79bf013d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailgate.ics.forth.gr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9BBF0158070F for ; Mon, 31 May 2010 11:28:22 -0700 (PDT) Received: from mailgate.ics.forth.gr (mailgate.ics.forth.gr [139.91.1.2]) by cuda.sgi.com with ESMTP id IKWTkZL28mUxGdK2 for ; Mon, 31 May 2010 11:28:22 -0700 (PDT) X-DNSBL-MILTER: Passed Received: from av1.ics.forth.gr ([139.91.157.71]) by mailgate.ics.forth.gr (8.14.3/ICS-FORTH/V10-1.8-GATE) with ESMTP id o4VIPeTg007794; Mon, 31 May 2010 21:25:52 +0300 (EEST) X-AuditID: 8b5b9d47-b7ceaae000006f4f-ab-4c03ff23ddd6 Received: from enigma.ics.forth.gr (webmail.ics.forth.gr [139.91.1.30]) by av1.ics.forth.gr (SMTP Outbound / FORTH / ICS) with SMTP id 14.74.28495.32FF30C4; Mon, 31 May 2010 21:25:39 +0300 (EEST) Received: from [192.168.1.63] (adsl-130.109.242.11.tellas.gr [109.242.11.130]) (authenticated bits=0) by enigma.ics.forth.gr (8.14.3//ICS-FORTH/V10.3.0C-EXTNULL-SSL-SASL) with ESMTP id o4VIPcFO002549 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 31 May 2010 21:25:39 +0300 Message-ID: <4C03FF19.2070608@ics.forth.gr> Date: Mon, 31 May 2010 21:25:29 +0300 From: Yannis Klonatos User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; el; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: Andi Kleen CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_buf and buffercache/pagecache connection Subject: Re: xfs_buf and buffercache/pagecache connection References: <4C03E46B.9040407@ics.forth.gr> <87aargt0ap.fsf@basil.nowhere.org> In-Reply-To: <87aargt0ap.fsf@basil.nowhere.org> Content-Type: multipart/alternative; boundary="------------030401060206070607000305" X-Brightmail-Tracker: AAAAAA== X-j-chkmail-Score: MSGID : 4C03FF24.000 on mailgate : j-chkmail score : . : R=. U=. O=. B=0.000 -> S=0.000 X-ICS-JCHK-SCL: Ham X-Barracuda-Connect: mailgate.ics.forth.gr[139.91.1.2] X-Barracuda-Start-Time: 1275330503 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0502 1.0000 -1.6986 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.70 X-Barracuda-Spam-Status: No, SCORE=-1.70 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.2, rules version 3.2.2.31253 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. --------------030401060206070607000305 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit ???? 5/31/2010 9:04 PM, O/H Andi Kleen ??????: > Yannis Klonatos writes: > > >> I was looking to add a kernel hook to my system in order to >> monitor buffer-cache hit and misses. Initially I was >> planning to add my modifications to the __getblk(). However, i noticed >> that XFS does not directly use the buffer-cache >> for its pages but it seems to implement its own buffer. >> What I am now looking for is 1) the place where XFS checks >> whether a page exists in its buffer or not and 2) >> what are the possible interactions between xfs_buf and the Linux >> kernel buffer-cache. >> I would appreciate any information regarding the above issues. >> > The kernel does not track all accesses, e.g. through mmap. > So you can only get misses (which is essentially IO rate and already > accounted), but not hits. > > -Andi > First of all thanks for your quick reply. So, if i understand correctly, what you are saying is that it is basically impossible to modify xfs code so that i get that specific information? This sounds a bit strange since if XFS was indeed using the buffercache as ext3 or other fs does, the following modification would suffice (file fs/buffer.c): structbuffer_head <+code=buffer_head> * find_get_block <+code=__find_get_block>(structblock_device <+code=block_device> *bdev <+code=bdev>,sector_t <+code=sector_t> block <+code=block>, intsize <+code=size>) { structbuffer_head <+code=buffer_head> *bh <+code=bh> =lookup_bh_lru <+code=lookup_bh_lru>(bdev <+code=bdev>,block <+code=block>,size <+code=size>); /* BEGIN MODIFICATION */ if (bh) buffercache_hits++; else buffercache_misses++; /* END MODIFICATION */ if (bh <+code=bh> ==NULL <+code=NULL>) { bh <+code=bh> =__find_get_block_slow <+code=__find_get_block_slow>(bdev <+code=bdev>,block <+code=block>); if (bh <+code=bh>) bh_lru_install <+code=bh_lru_install>(bh <+code=bh>); } if (bh <+code=bh>) { touch_buffer <+code=touch_buffer>(bh <+code=bh>); returnbh <+code=bh>; } XPORT_SYMBOL <+code=EXPORT_SYMBOL>(__find_get_block <+code=__find_get_block>); --------------030401060206070607000305 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit στις 5/31/2010 9:04 PM, O/H Andi Kleen έγραψε:
Yannis Klonatos <klonatos@ics.forth.gr> writes:

  
        I was looking to add a kernel hook to my system in order to
monitor buffer-cache hit and misses. Initially I was
planning to add my modifications to the __getblk(). However, i noticed
that XFS does not directly use the buffer-cache
for its pages but it seems to implement its own buffer.
        What I am now looking for is 1) the place where XFS checks
whether a page exists in its buffer or not and 2)
what are the possible interactions between xfs_buf and the Linux
kernel buffer-cache.
        I would appreciate any information regarding the above issues.
    
The kernel does not track all accesses, e.g. through mmap.
So you can only get misses (which is essentially IO rate and already
accounted), but not hits.

-Andi
  

First of all thanks for your quick reply.

So, if i understand correctly, what you are saying is that it is basically impossible to modify xfs code
so that i get that specific information? This sounds a bit strange since if XFS was indeed using the
buffercache as ext3 or other fs does, the following modification would suffice (file fs/buffer.c):

struct buffer_head *
find_get_block(struct block_device *bdev, sector_t block, int size) {

     	struct buffer_head *bh = lookup_bh_lru(bdev, block, size);
	/* BEGIN MODIFICATION */
	if (bh) buffercache_hits++;
	else buffercache_misses++;
	/* END MODIFICATION */
        if (bh == NULL) {
               bh = __find_get_block_slow(bdev, block);
               if (bh)
                       bh_lru_install(bh);
       }
       if (bh) {
               touch_buffer(bh);
       return bh;

}

XPORT_SYMBOL(__find_get_block);

--------------030401060206070607000305-- From SRS0+ELDK+0+fromorbit.com=david@internode.on.net Mon May 31 17:03:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o4VM3fJf206754 for ; Mon, 31 May 2010 17:03:42 -0500 X-ASG-Debug-ID: 1275343566-063001c50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0204514672B8 for ; Mon, 31 May 2010 15:06:06 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id e9HvAXYs1pv4EPiu for ; Mon, 31 May 2010 15:06:06 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14653022-1927428 for multiple; Tue, 01 Jun 2010 07:36:04 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJD7T-0008U6-4t; Tue, 01 Jun 2010 08:06:03 +1000 Date: Tue, 1 Jun 2010 08:06:03 +1000 From: Dave Chinner To: Yannis Klonatos Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_buf and buffercache/pagecache connection Subject: Re: xfs_buf and buffercache/pagecache connection Message-ID: <20100531220603.GF1395@dastard> References: <4C03E46B.9040407@ics.forth.gr> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C03E46B.9040407@ics.forth.gr> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1275343568 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0006 1.0000 -2.0172 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=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31268 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 07:31:39PM +0300, Yannis Klonatos wrote: > Hello, > > I was looking to add a kernel hook to my system in order to > monitor buffer-cache hit and misses. Initially I was > planning to add my modifications to the __getblk(). However, i > noticed that XFS does not directly use the buffer-cache > for its pages but it seems to implement its own buffer. > What I am now looking for is 1) the place where XFS checks > whether a page exists in its buffer or not and 2) > what are the possible interactions between xfs_buf and the Linux > kernel buffer-cache. > I would appreciate any information regarding the above issues. There are already stats in place to tell you about this. http://xfs.org/index.php/Runtime_Stats#buf_-_Buf_Statistics They aren't documented there, but if you look at fs/xfs/linux-2.6/xfs_buf.c an search for XFS_STATS_INC you'll find what they all mean from the code. It isn't as simple as hit or miss counters - there's different counters for different types of hits and misses.... Cheers, Dave. -- Dave Chinner david@fromorbit.com