From BATV+c2a8630ad946b3a996ee+2353+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 1 05:00:54 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o11B0lHk102574 for ; Mon, 1 Feb 2010 05:00:54 -0600 X-ASG-Debug-ID: 1265022114-1bdd02640000-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 BE5C813695CC for ; Mon, 1 Feb 2010 03:01:55 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id WHxJ1kckxRg7Fq0O for ; Mon, 01 Feb 2010 03:01:55 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nbu2U-0000Gp-1j; Mon, 01 Feb 2010 11:01:54 +0000 Date: Mon, 1 Feb 2010 06:01:54 -0500 From: Christoph Hellwig To: Nick Piggin Cc: Christoph Hellwig , xfs@oss.sgi.com, linux-mm@kvack.org X-ASG-Orig-Subj: Re: [patch 2/2] xfs: use scalable vmap API Subject: Re: [patch 2/2] xfs: use scalable vmap API Message-ID: <20100201110153.GA588@infradead.org> References: <20081021082735.GB6974@wotan.suse.de> <20081021120932.GB13348@infradead.org> <20081022093018.GD4359@wotan.suse.de> <20100119121505.GA9428@infradead.org> <20100125075445.GD19664@laptop> <20100125081750.GA20012@infradead.org> <20100125083309.GF19664@laptop> <20100125123746.GA24406@laptop> <20100125213403.GA1309@infradead.org> <20100127083819.GA11072@laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100127083819.GA11072@laptop> 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: 1265022115 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, Jan 27, 2010 at 07:38:19PM +1100, Nick Piggin wrote: > > So far I've not run out of vmalloc space yet with quite a few xfstests > > iterations and not encountered any other problems either. > > > > Thanks for looking into this! > > OK thanks for testing. I'll send it upstream if you haven't had any > problems so far. Still working fine, so please send it upstream ASAP. That'll make re-eabling the scalable vmap API in XFS much more easier for 2.6.34. From npiggin@suse.de Mon Feb 1 05:27:20 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o11BRJtv104831 for ; Mon, 1 Feb 2010 05:27:20 -0600 X-ASG-Debug-ID: 1265023706-6dcd03d20000-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 048881C95CFF for ; Mon, 1 Feb 2010 03:28:27 -0800 (PST) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id TRayOJ7yMFSWbx6c for ; Mon, 01 Feb 2010 03:28:27 -0800 (PST) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 4E27486EE4; Mon, 1 Feb 2010 12:28:26 +0100 (CET) Received: by laptop.local0.net (Postfix, from userid 1000) id 1354A29856; Mon, 1 Feb 2010 22:28:14 +1100 (EST) Date: Mon, 1 Feb 2010 22:28:14 +1100 From: Nick Piggin To: Christoph Hellwig Cc: xfs@oss.sgi.com, linux-mm@kvack.org X-ASG-Orig-Subj: Re: [patch 2/2] xfs: use scalable vmap API Subject: Re: [patch 2/2] xfs: use scalable vmap API Message-ID: <20100201112813.GA17689@laptop> References: <20081021120932.GB13348@infradead.org> <20081022093018.GD4359@wotan.suse.de> <20100119121505.GA9428@infradead.org> <20100125075445.GD19664@laptop> <20100125081750.GA20012@infradead.org> <20100125083309.GF19664@laptop> <20100125123746.GA24406@laptop> <20100125213403.GA1309@infradead.org> <20100127083819.GA11072@laptop> <20100201110153.GA588@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100201110153.GA588@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: 1265023708 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21356 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, Feb 01, 2010 at 06:01:54AM -0500, Christoph Hellwig wrote: > On Wed, Jan 27, 2010 at 07:38:19PM +1100, Nick Piggin wrote: > > > So far I've not run out of vmalloc space yet with quite a few xfstests > > > iterations and not encountered any other problems either. > > > > > > Thanks for looking into this! > > > > OK thanks for testing. I'll send it upstream if you haven't had any > > problems so far. > > Still working fine, so please send it upstream ASAP. That'll make > re-eabling the scalable vmap API in XFS much more easier for 2.6.34. Done. Thanks for testing this. From patrick@news-service.com Mon Feb 1 10:51:31 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o11GpUYA121572 for ; Mon, 1 Feb 2010 10:51:31 -0600 X-ASG-Debug-ID: 1265043155-781b00c20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from pu01.news-service.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 38A141A1DEF for ; Mon, 1 Feb 2010 08:52:35 -0800 (PST) Received: from pu01.news-service.com (ns1.news-service.com [195.114.240.3]) by cuda.sgi.com with ESMTP id 9Zs2tj1qs8uV2RY4 for ; Mon, 01 Feb 2010 08:52:35 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by pu01.news-service.com (Postfix) with ESMTP id 6531D13E2C; Mon, 1 Feb 2010 17:52:34 +0100 (CET) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: Debian amavisd-new at pu01.news-service.com Received: from pu01.news-service.com ([127.0.0.1]) by localhost (pu01.nse [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id yAZm-KzBZbHj; Mon, 1 Feb 2010 17:52:31 +0100 (CET) Received: from [172.25.4.10] (fw01.nse [172.25.8.1]) by pu01.news-service.com (Postfix) with ESMTP id 5977313E24; Mon, 1 Feb 2010 17:52:31 +0100 (CET) Message-ID: <4B6706CE.1020207@news-service.com> Date: Mon, 01 Feb 2010 17:52:30 +0100 From: Patrick Schreurs User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.7) Gecko/20100111 Thunderbird/3.0.1 MIME-Version: 1.0 To: Dave Chinner CC: Christoph Hellwig , Tommy van Leeuwen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Subject: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) References: <89c4f90c0910270341r7833f490g60810f2817eb0950@mail.gmail.com> <89c4f90c0910280519k759230c1r7b1586932ac792f7@mail.gmail.com> <20091030101601.GA11142@infradead.org> <4AF0422D.1070104@news-service.com> <20091114162126.GB17658@infradead.org> <4B0A8075.8080008@news-service.com> <20091211115932.GA20632@infradead.org> <4B3F9F88.9030307@news-service.com> <20100107110446.GA13802@discord.disaster> <4B45CFAC.4000607@news-service.com> <20100108113114.GA8654@discord.disaster> <4B504B03.7050604@news-service.com> In-Reply-To: <4B504B03.7050604@news-service.com> Content-Type: multipart/mixed; boundary="------------090200000407090003070100" X-Barracuda-Connect: ns1.news-service.com[195.114.240.3] X-Barracuda-Start-Time: 1265043157 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21377 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean This is a multi-part message in MIME format. --------------090200000407090003070100 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hello Dave, I'm afraid we had another crash a few days ago. Have a look at the screenshot. Can you make anything out of it? This server is running 2.6.32.3 with your inode-reclaim patch applied and XFS_DEBUG still enabled. Thanks for looking into this. -Patrick On 15-1-2010 12:01, Patrick Schreurs wrote: > Hi Dave, > > I think it's save to consider this issue fixed. We have currently 9 > servers operational with these patches and they have been stable so far. > For a 100% certainty we'll have to test/wait a little bit longer, but > considering the frequency of crashes we saw earlier i think it's save to > come to a conclusion. > > I hope these patches will be included in 2.6.33 and will be back ported > to at least 2.6.32. > > Many thanks to Dave and to Christoph for fixing this apparently rare and > seldom triggered condition. > > -Patrick > > Dave Chinner wrote: >> Hi Patrick, >> >> I've attached two compendium patches that will hopefully fix >> the inode reclaim problems you've been seeing - one is for 2.6.31, >> the other is for 2.6.32. I've cc'd this to the XFS list ѕo that >> anyone else who has been seeing crashes, assert failures and >> general nastiness around inode reclaim can test them as well. >> >> These are not final patches - there's a few changes that Christoph >> has picked up on during review - so there'll be another round of >> patches before checkins and -stable backports can be requested. >> >> I'm hoping that these patches fix your problem, because with them >> I can't make my machines fall over anymore.... >> >> Cheers, >> >> Dave. >> >> >> ------------------------------------------------------------------------ >> >> _______________________________________________ >> 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 --------------090200000407090003070100 Content-Type: image/jpeg; name="sb06-20100128.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="sb06-20100128.jpg" /9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRof Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwh MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAAR CAHgAoADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDz3U9Qik8NzW6alaN4iFugv7lZVJuIct+6 WXo7gGPdg5bGMtjFHizX5YrHT4YtSnnuJNOSC4aDUkliL4IkEkYDbmIY/NuGcgj7tGp6hFJ4 bmt01K0bxELdBf3KyqTcQ5b90svR3AMe7By2MZbGKPFmvyxWOnwxalPPcSackFw0GpJLEXwR IJIwG3MQx+bcM5BH3aSAl1TUUvLLUml1K3t4HsVEUVtexzWrsAmEjtmUPHnHXgoQTXnleh6p qKXllqTS6lb28D2KiKK2vY5rV2ATCR2zKHjzjrwUIJrzyhbAd/qWneCkbVbGzdfNtrV2guvt u4SOioykfwszl2UgZx5fAGar6hp3hqMamIDZf2fHZh7G7S8LXMs2EwGj3nGSWBHlrj2qxqWn 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 2Q== --------------090200000407090003070100-- From sgi-linux-xfs@lo.gmane.org Mon Feb 1 11:29:20 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o11HTJQk123353 for ; Mon, 1 Feb 2010 11:29:20 -0600 X-ASG-Debug-ID: 1265045425-30ce00a30000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lo.gmane.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E973C1520B5B for ; Mon, 1 Feb 2010 09:30:25 -0800 (PST) Received: from lo.gmane.org (lo.gmane.org [80.91.229.12]) by cuda.sgi.com with ESMTP id cHf2Cfxj10UhFCHm for ; Mon, 01 Feb 2010 09:30:25 -0800 (PST) Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1Nc06O-0004nq-AT for linux-xfs@oss.sgi.com; Mon, 01 Feb 2010 18:30:20 +0100 Received: from vm15c-113.broadinstitute.org ([69.173.114.122]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 01 Feb 2010 18:30:20 +0100 Received: from nico by vm15c-113.broadinstitute.org with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 01 Feb 2010 18:30:20 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com From: Nicolas Stransky X-ASG-Orig-Subj: Re: Filesystem corrupted: "Sorry, could not find valid secondary superblock" Subject: Re: Filesystem corrupted: "Sorry, could not find valid secondary superblock" Date: Mon, 01 Feb 2010 12:29:55 -0500 Lines: 73 Message-ID: References: <4B63010D.1080608@sandeen.net> <4B631704.8080902@sandeen.net> <4B6325E2.2040703@sandeen.net> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: vm15c-113.broadinstitute.org User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.7) Gecko/20100129 Shredder/3.0.2pre In-Reply-To: <4B6325E2.2040703@sandeen.net> Sender: news X-Barracuda-Connect: lo.gmane.org[80.91.229.12] X-Barracuda-Start-Time: 1265045426 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21378 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, Unfortunately I am still having big problems with this filesystem. I can mount it OK but there are problems reading files: du: cannot access `./DCIS 2 AB': Structure needs cleaning The previous goes together with a lot of these in dmesg: [ 431.976517] 00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ [ 431.988072] Filesystem "sda1": XFS internal error xfs_da_do_buf(2) at line 2085 of file fs/xfs/xfs_da_btree.c. Caller 0xffffffffa016749f [ 431.993185] Pid: 4246, comm: du Not tainted 2.6.26-2-amd64 #1 [ 431.998308] [ 431.998309] Call Trace: [ 432.010348] [] :xfs:xfs_da_read_buf+0x24/0x29 [ 432.015530] [] :xfs:xfs_da_do_buf+0x54e/0x636 [ 432.020696] [] :xfs:xfs_da_read_buf+0x24/0x29 [ 432.025860] [] :xfs:_xfs_buf_lookup_pages+0x298/0x2ca [ 432.031974] [] :xfs:xfs_da_read_buf+0x24/0x29 [ 432.037173] [] :xfs:xfs_dir2_leaf_getdents+0x381/0x61a [ 432.042391] [] :xfs:xfs_dir2_leaf_getdents+0x381/0x61a [ 432.047617] [] :xfs:xfs_hack_filldir+0x0/0x5b [ 432.052673] [] :xfs:xfs_hack_filldir+0x0/0x5b [ 432.057517] [] :xfs:xfs_readdir+0xa6/0xb5 [ 432.062197] [] :xfs:xfs_file_readdir+0xff/0x14c [ 432.066835] [] filldir+0x0/0xb7 [ 432.071987] [] filldir+0x0/0xb7 [ 432.076557] [] vfs_readdir+0x75/0xa7 [ 432.081137] [] sys_getdents+0x75/0xbd [ 432.085716] [] sys_fcntl+0x2eb/0x2f7 [ 432.090267] [] system_call_after_swapgs+0x8a/0x8f The server has 2GB of RAM and 4GB of swap. I have tried several times to xfs_repair but it always fails because of memory problems, even if I use 'xfs_repair -m1500 /dev/sda1' to limit the memory usage. xfs_repair produces an awful lot of output. I could of course send it but it's 130k lines long. Here is what it is currently printing, I have started "xfs_repair -t15 -m500 /dev/sda1" again a few minutes ago. It is currently in Phase 3. bp=(bno 1211109312, len 8192 bytes) key=(bno 1211109312, len 4096 bytes) 429f7950: Badness in key lookup (length) bp=(bno 1211109328, len 8192 bytes) key=(bno 1211109328, len 4096 bytes) bad directory block magic # 0x2f49cdbc in block 2 for directory inode 2952790372 corrupt block 2 in directory inode 2952790372 will junk block bad directory block magic # 0 in block 5 for directory inode 2952790372 corrupt block 5 in directory inode 2952790372 will junk block no . entry for directory 2952790372 no .. entry for directory 2952790372 bad directory block magic # 0 in block 0 for directory inode 2952790373 corrupt block 0 in directory inode 2952790373 will junk block bad directory block magic # 0 in block 1 for directory inode 2952790373 corrupt block 1 in directory inode 2952790373 will junk block doubling cache size to 66768 doubling cache size to 133536 doubling cache size to 267072 doubling cache size to 534144 doubling cache size to 1068288 Any ideas on how I could repair this filesystem? Thanks a lot! -- Nico From BATV+c2a8630ad946b3a996ee+2353+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 1 16:07:07 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o11M75cf136973 for ; Mon, 1 Feb 2010 16:07:07 -0600 X-ASG-Debug-ID: 1265062093-264b01660000-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 0429B136BC8C for ; Mon, 1 Feb 2010 14:08:13 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id XdvGi3IpadFmJoY3 for ; Mon, 01 Feb 2010 14:08:13 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nc4RJ-00014e-Eo for xfs@oss.sgi.com; Mon, 01 Feb 2010 22:08:13 +0000 Date: Mon, 1 Feb 2010 17:08:13 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH for-2.6.33] xfs: flush all log buffers in xlog_dealloc_log Subject: [PATCH for-2.6.33] xfs: flush all log buffers in xlog_dealloc_log Message-ID: <20100201220813.GA3519@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: 1265062094 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 Make sure all log buffers have made it to disk before we free them. Otherwise we might reference freed buffers or a NULL mp->m_log from the I/O completion handlers. This fixes kernel.org bz #15150. Signed-off-by: Christoph Hellwig Reported-by: Ed Cashin Reported-by: ghani Tested-by: ghani Index: linux-2.6/fs/xfs/xfs_log.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_log.c 2009-11-09 22:09:08.858026060 +0100 +++ linux-2.6/fs/xfs/xfs_log.c 2009-11-09 22:13:13.958255857 +0100 @@ -1602,6 +1602,8 @@ xlog_dealloc_log(xlog_t *log) xlog_in_core_t *iclog, *next_iclog; int i; + xfs_flush_buftarg(log->l_mp->m_logdev_targp, 1); + iclog = log->l_iclog; for (i=0; il_iclog_bufs; i++) { sv_destroy(&iclog->ic_force_wait); From edward.shishkin@gmail.com Mon Feb 1 19:39:19 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o121cwVQ147614 for ; Mon, 1 Feb 2010 19:39:09 -0600 X-ASG-Debug-ID: 1265074783-2ee200e20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ey-out-1920.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0FA221A3FE6 for ; Mon, 1 Feb 2010 17:39:43 -0800 (PST) Received: from ey-out-1920.google.com (ey-out-1920.google.com [74.125.78.145]) by cuda.sgi.com with ESMTP id IEEgjKxGlXpjBfrn for ; Mon, 01 Feb 2010 17:39:43 -0800 (PST) Received: by ey-out-1920.google.com with SMTP id 26so1474966eyw.22 for ; Mon, 01 Feb 2010 17:39:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:received:from:to:subject:date :user-agent:mime-version:message-id:cc:content-type :content-transfer-encoding; bh=8phbelOUN7gAqV0QeYNcaf/vko4/bnGeLVk6flfcHls=; b=YTO2SyokFMgUJnwIJMClHKJjDzLW6q7gSkhqWzZq+bBSTI08QYBJCiKbAx979XBhSO 0GQCODLYL2D9qRo6M6ft8zG6SI3KPdaWbp9UYhGmKqsstyJGmuO9vAhEa8Ferp6z5PEn ejcQevzhv4728TwzcnL6GgTFZyoJL2T5R2Jns= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:subject:date:user-agent:mime-version:message-id:cc :content-type:content-transfer-encoding; b=MC35OFo/6xQU4DOKq68CGzN0LuKeP2K//SPOKD+0tA8NghBn/46NjfNByHjcm/VvhZ bb5WAjdSm60yFEe89vXnsD1dJ8KFX3J7DQfGtQ2lFpT6Zqr+R/8qtZiBeAO3H8+KafOA S2wCpCAzJpe3ti22Pu/ARD9BRervtSBv4nho4= Received: by 10.213.100.68 with SMTP id x4mr44449ebn.33.1265074781877; Mon, 01 Feb 2010 17:39:41 -0800 (PST) Received: from zeta.englab.brq.redhat.com (nat-pool-brq-t.redhat.com [209.132.186.34]) by mx.google.com with ESMTPS id 16sm4132961ewy.14.2010.02.01.17.39.40 (version=SSLv3 cipher=RC4-MD5); Mon, 01 Feb 2010 17:39:41 -0800 (PST) Received: from zeta.englab.brq.redhat.com (nat-pool-brq-t.redhat.com [209.132.186.34]) by mx.google.com with ESMTPS id 16sm4096070ewy.2.2010.02.01.16.14.25 (version=SSLv3 cipher=RC4-MD5); Mon, 01 Feb 2010 16:14:25 -0800 (PST) From: Edward Shishkin To: Andrew Morton , ReiserFS Development List X-ASG-Orig-Subj: [patch 0/7] per-bdi flushing model improvements. reiser4 Subject: [patch 0/7] per-bdi flushing model improvements. reiser4 Date: Tue, 2 Feb 2010 02:39:27 +0100 User-Agent: KMail/1.12.3 (Linux/2.6.27.41-170.2.117.fc10.i686; KDE/4.3.3; i686; ; ) MIME-Version: 1.0 Message-Id: <201002020239.27368.edward.shishkin@gmail.com> Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, jens.axboe@oracle.com Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ey-out-1920.google.com[74.125.78.145] X-Barracuda-Start-Time: 1265074788 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.21411 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. Andrew Morton wrote: > reiser4 is currently disabled in -mm (via reiser4-disable.patch) > because recent changes to fs/fs/writeback.c wrecked the build. I fixed > it about ten times as the underlying code was churning, then gave up. It > would be nice if you take a look at that sometime please. > > I have taken a look at fs/fs-writeback.c and found that per-superblock flushing interface is eliminated. However migrating to per-bdi flushing model doesn't necessarily means that such interface doesn't exist or is not needed anymore. Flushing in accordance with the scheme "data-inode- data-inode-..." would be very suboptimal for reiser4. Also xfs people were unhappy with such flushing model: http://article.gmane.org/gmane.linux.file-systems/30153 Moreover, the current stuff looks rather ugly. Why do we pin/unpin superblock for every inode? It would be more reasonable to pin it for the whole group of inodes and call a flushing handler for them. The patch 4 introduces such handler writeback_sb_inodes (which resembles dropped sync_sb_inodes, the difference is that the newer version doesn't flush necessarily all inodes of the superblock). Please, consider pushing this patch to mainline. The patch 5 adds super operation .writeback_inodes (former .sync_inodes) which allows a file system to make optimizations. It can happen that reiser4 will flush a bit more inodes then generic implementation suggests. "a bit more" doesn't mean "all dirty inodes of the superblock" (see a comment about atoms in the header of patch 6). Finally, some file systems have its own means for periodical writeout of dirty data. Since b_io contains inodes of many superblocks we need to evict our inodes back to dirty list when flushing is going on with for_kupdate flag installed. The new library function writeback_skip_sb_inodes() provides such possibility. Patch 7 fixes a race in checkin-checkout jnodes for entd task (reiser4). Please, apply. Thanks, Edward. From edward.shishkin@gmail.com Mon Feb 1 19:55:47 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.1 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, HEADER_ESQ autolearn=no version=3.3.0-rupdated 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 o121tRO3148061 for ; Mon, 1 Feb 2010 19:55:37 -0600 X-ASG-Debug-ID: 1265075779-2ee7012c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 81F341A3D57 for ; Mon, 1 Feb 2010 17:56:19 -0800 (PST) Received: from mail-ew0-f227.google.com (mail-ew0-f227.google.com [209.85.219.227]) by cuda.sgi.com with ESMTP id 3cDKARroc4Iw00w7 for ; Mon, 01 Feb 2010 17:56:19 -0800 (PST) Received: by ewy27 with SMTP id 27so915298ewy.18 for ; Mon, 01 Feb 2010 17:56:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:received:from:to:subject:date :user-agent:mime-version:message-id:cc:content-type :content-transfer-encoding; bh=c3zD/LlZNEeBkuHpWllRmZolDyQkFE7bA0yGA23VOjo=; b=YZVZ5UYv6yyweDU1ka5n0/Yb0vUTQCw6ym+6gbPWXEVWU2qLunQte8+zg0/Jda2OP0 xhdP+ZYS6DnFBlYe2MDa85dO9t1hBoP8im4vLN8qRrVEob8vVi3IQjhzsDSjXWWPxt1b T/YZ8yme2rPzuiy9q+HJDYEsQHurWJOCApQOc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:subject:date:user-agent:mime-version:message-id:cc :content-type:content-transfer-encoding; b=mSNopl94VL/shJkT79l6HGUudldBRccHdL/NePvff+PQa92HVKDpmLwX6Mj0cQ5juf QOiZJcEqjNEWECLU2FvWTqmlhC9FFRw4P/IqfwILyehSOI3xzi2oBdhWW2H4mWzy3+mm nfPywJNwd25o6U1IxYHiPA3/fOkBVcFwzIX9U= Received: by 10.213.38.11 with SMTP id z11mr54600ebd.36.1265075778625; Mon, 01 Feb 2010 17:56:18 -0800 (PST) Received: from zeta.englab.brq.redhat.com (nat-pool-brq-t.redhat.com [209.132.186.34]) by mx.google.com with ESMTPS id 16sm4138426ewy.10.2010.02.01.17.56.18 (version=SSLv3 cipher=RC4-MD5); Mon, 01 Feb 2010 17:56:18 -0800 (PST) Received: from zeta.englab.brq.redhat.com (nat-pool-brq-t.redhat.com [209.132.186.34]) by mx.google.com with ESMTPS id 14sm4074067ewy.15.2010.02.01.16.15.03 (version=SSLv3 cipher=RC4-MD5); Mon, 01 Feb 2010 16:15:03 -0800 (PST) From: Edward Shishkin To: Andrew Morton , ReiserFS Development List X-ASG-Orig-Subj: [patch 6/7] reiser4: writeback_inodes implementation Subject: [patch 6/7] reiser4: writeback_inodes implementation Date: Tue, 2 Feb 2010 02:56:27 +0100 User-Agent: KMail/1.12.3 (Linux/2.6.27.41-170.2.117.fc10.i686; KDE/4.3.3; i686; ; ) MIME-Version: 1.0 Message-Id: <201002020256.27208.edward.shishkin@gmail.com> Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, jens.axboe@oracle.com Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ew0-f227.google.com[209.85.219.227] X-Barracuda-Start-Time: 1265075782 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.21413 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 . add reiser4 implementation of ->writeback_inodes() super operation; . cleanup comments. Signed-off-by: Edward Shishkin --- fs/reiser4/context.c | 3 +- fs/reiser4/context.h | 2 - fs/reiser4/entd.c | 7 ++++-- fs/reiser4/page_cache.c | 12 +++++------ fs/reiser4/super_ops.c | 49 +++++++++++++++++++++++++++++------------------- fs/reiser4/txnmgr.c | 2 - 6 files changed, 45 insertions(+), 30 deletions(-) Index: linux-2.6.33-rc5-mm1/fs/reiser4/context.c =================================================================== --- linux-2.6.33-rc5-mm1.orig/fs/reiser4/context.c +++ linux-2.6.33-rc5-mm1/fs/reiser4/context.c @@ -151,7 +151,8 @@ static void reiser4_throttle_write_at(re */ if (sbinfo != NULL && sbinfo->fake != NULL && context->nr_marked_dirty != 0 && - !(current->flags & PF_MEMALLOC)) + !(current->flags & PF_MEMALLOC) && + !current_is_flush_bd_task()) /* FIXME-EDWARD: throttle with nr_marked_dirty? */ reiser4_throttle_write(sbinfo->fake, 1); } Index: linux-2.6.33-rc5-mm1/fs/reiser4/context.h =================================================================== --- linux-2.6.33-rc5-mm1.orig/fs/reiser4/context.h +++ linux-2.6.33-rc5-mm1/fs/reiser4/context.h @@ -66,7 +66,7 @@ struct reiser4_context { /* count non-trivial jnode_set_dirty() calls */ unsigned long nr_marked_dirty; - /* reiser4_sync_inodes calls (via generic_sync_sb_inodes) + /* reiser4_writeback_inodes calls (via generic_writeback_sb_inodes) * reiser4_writepages for each of dirty inodes. Reiser4_writepages * captures pages. When number of pages captured in one * reiser4_sync_inodes reaches some threshold - some atoms get Index: linux-2.6.33-rc5-mm1/fs/reiser4/entd.c =================================================================== --- linux-2.6.33-rc5-mm1.orig/fs/reiser4/entd.c +++ linux-2.6.33-rc5-mm1/fs/reiser4/entd.c @@ -236,16 +236,19 @@ static void entd_flush(struct super_bloc rq->wbc->range_end = rq->wbc->range_start + (ENTD_CAPTURE_APAGE_BURST << PAGE_CACHE_SHIFT); tmp = rq->wbc->nr_to_write; + + assert("edward-1561", super == rq->wbc->sb); + rq->mapping->a_ops->writepages(rq->mapping, rq->wbc); if (rq->wbc->nr_to_write > 0) { rq->wbc->range_start = 0; rq->wbc->range_end = LLONG_MAX; - generic_sync_sb_inodes(rq->wbc); + writeback_inodes_wbc(rq->wbc); } rq->wbc->nr_to_write = ENTD_CAPTURE_APAGE_BURST; - reiser4_writeout(super, rq->wbc); + reiser4_writeout(super, rq->wbc); context_set_commit_async(&ctx); reiser4_exit_context(&ctx); } Index: linux-2.6.33-rc5-mm1/fs/reiser4/page_cache.c =================================================================== --- linux-2.6.33-rc5-mm1.orig/fs/reiser4/page_cache.c +++ linux-2.6.33-rc5-mm1/fs/reiser4/page_cache.c @@ -486,15 +486,15 @@ static int can_hit_entd(reiser4_context int reiser4_writepage(struct page *page, struct writeback_control *wbc) { - struct super_block *s; - reiser4_context *ctx; - + /* + * assert("edward-1562", + * can_hit_entd(get_current_context_check(), sb)); + */ assert("vs-828", PageLocked(page)); - s = page->mapping->host->i_sb; - ctx = get_current_context_check(); + wbc->sb = page->mapping->host->i_sb; + wbc->bdi = page->mapping->backing_dev_info; - /* assert("", can_hit_entd(ctx, s)); */ return write_page_by_ent(page, wbc); } Index: linux-2.6.33-rc5-mm1/fs/reiser4/super_ops.c =================================================================== --- linux-2.6.33-rc5-mm1.orig/fs/reiser4/super_ops.c +++ linux-2.6.33-rc5-mm1/fs/reiser4/super_ops.c @@ -379,48 +379,59 @@ static void reiser4_clear_inode(struct i } /** - * reiser4_sync_inodes - sync_inodes of super operations + * reiser4_writeback_inodes - writeback_inodes of super operations * @super: + * @wb: * @wbc: * * This method is called by background and non-backgound writeback. Reiser4's - * implementation uses generic_sync_sb_inodes to call reiser4_writepages for - * each of dirty inodes. Reiser4_writepages handles pages dirtied via shared - * mapping - dirty pages get into atoms. Writeout is called to flush some - * atoms. + * implementation uses generic_writeback_sb_inodes to call reiser4_writepages + * for each of dirty inodes. reiser4_writepages handles pages dirtied via shared + * mapping - dirty pages get into atoms. Writeout is called to flush some atoms. */ -static void reiser4_sync_inodes(struct super_block *super, - struct writeback_control *wbc) +static int reiser4_writeback_inodes(struct super_block *super, + struct bdi_writeback *wb, + struct writeback_control *wbc) { - reiser4_context *ctx; + int ret; long to_write; + reiser4_context *ctx; if (wbc->for_kupdate) /* reiser4 has its own means of periodical write-out */ - return; - - to_write = wbc->nr_to_write; + goto skip; assert("vs-49", wbc->older_than_this == NULL); + spin_unlock(&inode_lock); ctx = reiser4_init_context(super); if (IS_ERR(ctx)) { warning("vs-13", "failed to init context"); - return; + spin_lock(&inode_lock); + goto skip; } - + to_write = wbc->nr_to_write; /* - * call reiser4_writepages for each of dirty inodes to turn dirty pages - * into transactions if they were not yet. + * call reiser4_writepages for each of dirty inodes to turn + * dirty pages into transactions if they were not yet. */ - generic_sync_sb_inodes(wbc); + spin_lock(&inode_lock); + ret = generic_writeback_sb_inodes(super, wb, wbc); + spin_unlock(&inode_lock); - /* flush goes here */ wbc->nr_to_write = to_write; + + /* flush goes here */ reiser4_writeout(super, wbc); - /* avoid recursive calls to ->sync_inodes */ + /* avoid recursive calls to ->writeback_inodes */ context_set_commit_async(ctx); reiser4_exit_context(ctx); + spin_lock(&inode_lock); + + return wbc->nr_to_write <= 0 ? 1 : ret; + skip: + writeback_skip_sb_inodes(super, wb); + return 0; } /** @@ -458,7 +469,7 @@ struct super_operations reiser4_super_op .write_super = reiser4_write_super, .statfs = reiser4_statfs, .clear_inode = reiser4_clear_inode, - .sync_inodes = reiser4_sync_inodes, + .writeback_inodes = reiser4_writeback_inodes, .show_options = reiser4_show_options }; Index: linux-2.6.33-rc5-mm1/fs/reiser4/txnmgr.c =================================================================== --- linux-2.6.33-rc5-mm1.orig/fs/reiser4/txnmgr.c +++ linux-2.6.33-rc5-mm1/fs/reiser4/txnmgr.c @@ -1410,7 +1410,7 @@ flush_some_atom(jnode * start, long *nr_ * Write throttling is case of no one atom can be * flushed/committed. */ - if (!wbc->nonblocking) { + if (!wbc->nonblocking && !current_is_flush_bd_task()) { list_for_each_entry(atom, &tmgr->atoms_list, atom_link) { spin_lock_atom(atom); /* Repeat the check from the above. */ From edward.shishkin@gmail.com Mon Feb 1 19:56:01 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.4 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o121tfb5148068 for ; Mon, 1 Feb 2010 19:55:51 -0600 X-ASG-Debug-ID: 1265075774-33c803840000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D12661C978D6 for ; Mon, 1 Feb 2010 17:56:14 -0800 (PST) Received: from mail-ew0-f227.google.com (mail-ew0-f227.google.com [209.85.219.227]) by cuda.sgi.com with ESMTP id xUjXQr4GeMEZhLPp for ; Mon, 01 Feb 2010 17:56:14 -0800 (PST) Received: by ewy27 with SMTP id 27so915224ewy.18 for ; Mon, 01 Feb 2010 17:56:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:received:from:to:subject:date :user-agent:mime-version:message-id:cc:content-type :content-transfer-encoding; bh=8XRM8+zUYcaWPP+4tswejqVP/EH9DBkNfX+Nx4FroHw=; b=DQ62v01F0+kYEr7R+pw4C4EGOpkzf6IAhOBFj6PKnnhVZ40jWcjimiLsHsa7e1bbyW mEOMl2g13ZBdXYcKM4QGNkzsiOjpZ6v1vjx2A/zuIA+7GzKKozG1ktos78sWJPs/5ukb 2fzfxs8LSF1lPqV/MC6RlIsGTUYEN039hwZmA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:subject:date:user-agent:mime-version:message-id:cc :content-type:content-transfer-encoding; b=uaPxGXUwo+4deC6xCXDM8sUfKl7OUnqefFo4hBoXxquoEtfuSxtbw/A2uEmmBFsUHr CUDxhxY9Vmeh4lhTamAVM1BMbjVdeTxmNCqPc71NUEcdHLGcBO2L6MAurg1oS1HR4sLE JZ204wBFdO0L1RLQIPMpkIsOTgmE25SDnZ6uU= Received: by 10.213.2.79 with SMTP id 15mr1317664ebi.96.1265075770522; Mon, 01 Feb 2010 17:56:10 -0800 (PST) Received: from zeta.englab.brq.redhat.com (nat-pool-brq-t.redhat.com [209.132.186.34]) by mx.google.com with ESMTPS id 13sm4118001ewy.9.2010.02.01.17.56.09 (version=SSLv3 cipher=RC4-MD5); Mon, 01 Feb 2010 17:56:10 -0800 (PST) Received: from zeta.englab.brq.redhat.com (nat-pool-brq-t.redhat.com [209.132.186.34]) by mx.google.com with ESMTPS id 13sm4090804ewy.13.2010.02.01.16.14.52 (version=SSLv3 cipher=RC4-MD5); Mon, 01 Feb 2010 16:14:52 -0800 (PST) From: Edward Shishkin To: Andrew Morton , ReiserFS Development List X-ASG-Orig-Subj: [patch 4/7] VFS: improve writeback_inodes_wb Subject: [patch 4/7] VFS: improve writeback_inodes_wb Date: Tue, 2 Feb 2010 02:56:18 +0100 User-Agent: KMail/1.12.3 (Linux/2.6.27.41-170.2.117.fc10.i686; KDE/4.3.3; i686; ; ) MIME-Version: 1.0 Message-Id: <201002020256.18841.edward.shishkin@gmail.com> Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, jens.axboe@oracle.com Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ew0-f227.google.com[209.85.219.227] X-Barracuda-Start-Time: 1265075799 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.21413 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 Do not pin/unpin superblock for every inode in writeback_inodes_wb(), pin it for the whole group of inodes which belong to the same superblock and call writeback_sb_inodes() handler for them. Signed-off-by: Edward Shishkin --- fs/fs-writeback.c | 133 +++++++++++++++++++++++++--------------------- include/linux/writeback.h | 3 + 2 files changed, 76 insertions(+), 60 deletions(-) Index: linux-2.6.33-rc5-mm1/fs/fs-writeback.c =================================================================== --- linux-2.6.33-rc5-mm1.orig/fs/fs-writeback.c +++ linux-2.6.33-rc5-mm1/fs/fs-writeback.c @@ -553,108 +553,85 @@ select_queue: return ret; } -static void unpin_sb_for_writeback(struct super_block **psb) +static void unpin_sb_for_writeback(struct super_block *sb) { - struct super_block *sb = *psb; - - if (sb) { - up_read(&sb->s_umount); - put_super(sb); - *psb = NULL; - } + up_read(&sb->s_umount); + put_super(sb); } +enum sb_pin_state { + SB_PINNED, + SB_NOT_PINNED, + SB_PIN_FAILED +}; + /* * For WB_SYNC_NONE writeback, the caller does not have the sb pinned * before calling writeback. So make sure that we do pin it, so it doesn't * go away while we are writing inodes from it. - * - * Returns 0 if the super was successfully pinned (or pinning wasn't needed), - * 1 if we failed. */ -static int pin_sb_for_writeback(struct writeback_control *wbc, - struct inode *inode, struct super_block **psb) +static enum sb_pin_state pin_sb_for_writeback(struct writeback_control *wbc, + struct super_block *sb) { - struct super_block *sb = inode->i_sb; - - /* - * If this sb is already pinned, nothing more to do. If not and - * *psb is non-NULL, unpin the old one first - */ - if (sb == *psb) - return 0; - else if (*psb) - unpin_sb_for_writeback(psb); - /* * Caller must already hold the ref for this */ if (wbc->sync_mode == WB_SYNC_ALL) { WARN_ON(!rwsem_is_locked(&sb->s_umount)); - return 0; + return SB_NOT_PINNED; } - spin_lock(&sb_lock); sb->s_count++; if (down_read_trylock(&sb->s_umount)) { if (sb->s_root) { spin_unlock(&sb_lock); - goto pinned; + return SB_PINNED; } /* * umounted, drop rwsem again and fall through to failure */ up_read(&sb->s_umount); } - sb->s_count--; spin_unlock(&sb_lock); - return 1; -pinned: - *psb = sb; - return 0; + return SB_PIN_FAILED; } -static void writeback_inodes_wb(struct bdi_writeback *wb, - struct writeback_control *wbc) +/* + * Write a portion of b_io inodes which belong to @sb. + * If @wbc->sb != NULL, then find and write all such + * inodes. Otherwise write only ones which go sequentially + * in reverse order. + * Return 1, if the caller writeback routine should be + * interrupted. Otherwise return 0. + */ +static int writeback_sb_inodes(struct super_block *sb, + struct bdi_writeback *wb, + struct writeback_control *wbc) { - struct super_block *sb = wbc->sb, *pin_sb = NULL; - const unsigned long start = jiffies; /* livelock avoidance */ - - spin_lock(&inode_lock); - - if (!wbc->for_kupdate || list_empty(&wb->b_io)) - queue_io(wb, wbc->older_than_this); - while (!list_empty(&wb->b_io)) { - struct inode *inode = list_entry(wb->b_io.prev, - struct inode, i_list); long pages_skipped; - - /* - * super block given and doesn't match, skip this inode - */ - if (sb && sb != inode->i_sb) { + struct inode *inode = list_entry(wb->b_io.prev, + struct inode, i_list); + if (wbc->sb && sb != inode->i_sb) { + /* super block given and doesn't + match, skip this inode */ redirty_tail(inode); continue; } - + if (sb != inode->i_sb) + /* finish with this superblock */ + return 0; if (inode->i_state & (I_NEW | I_WILL_FREE)) { requeue_io(inode); continue; } - /* * Was this inode dirtied after sync_sb_inodes was called? * This keeps sync from extra jobs and livelock. */ - if (inode_dirtied_after(inode, start)) - break; - - if (pin_sb_for_writeback(wbc, inode, &pin_sb)) { - requeue_io(inode); - continue; - } + if (inode_dirtied_after(inode, wbc->wb_start)) + return 1; BUG_ON(inode->i_state & (I_FREEING | I_CLEAR)); __iget(inode); @@ -673,14 +650,50 @@ static void writeback_inodes_wb(struct b spin_lock(&inode_lock); if (wbc->nr_to_write <= 0) { wbc->more_io = 1; - break; + return 1; } if (!list_empty(&wb->b_more_io)) wbc->more_io = 1; } + /* b_io is empty */ + return 1; +} + +static void writeback_inodes_wb(struct bdi_writeback *wb, + struct writeback_control *wbc) +{ + int ret = 0; - unpin_sb_for_writeback(&pin_sb); + wbc->wb_start = jiffies; /* livelock avoidance */ + spin_lock(&inode_lock); + if (!wbc->for_kupdate || list_empty(&wb->b_io)) + queue_io(wb, wbc->older_than_this); + while (!list_empty(&wb->b_io)) { + struct inode *inode = list_entry(wb->b_io.prev, + struct inode, i_list); + struct super_block *sb = inode->i_sb; + enum sb_pin_state state; + + if (wbc->sb && sb != wbc->sb) { + /* super block given and doesn't + match, skip this inode */ + redirty_tail(inode); + continue; + } + state = pin_sb_for_writeback(wbc, sb); + + if (state == SB_PIN_FAILED) { + requeue_io(inode); + continue; + } + ret = writeback_sb_inodes(sb, wb, wbc); + + if (state == SB_PINNED) + unpin_sb_for_writeback(sb); + if (ret) + break; + } spin_unlock(&inode_lock); /* Leave any unwritten inodes on b_io */ } Index: linux-2.6.33-rc5-mm1/include/linux/writeback.h =================================================================== --- linux-2.6.33-rc5-mm1.orig/include/linux/writeback.h +++ linux-2.6.33-rc5-mm1/include/linux/writeback.h @@ -34,6 +34,9 @@ struct writeback_control { enum writeback_sync_modes sync_mode; unsigned long *older_than_this; /* If !NULL, only write back inodes older than this */ + unsigned long wb_start; /* Time writeback_inodes_wb was + called. This is needed to avoid + extra jobs and livelock */ long nr_to_write; /* Write this many pages, and decrement this for each page written */ long pages_skipped; /* Pages which were not written */ From edward.shishkin@gmail.com Mon Feb 1 20:02:05 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1221i8u148270 for ; Mon, 1 Feb 2010 20:01:55 -0600 X-ASG-Debug-ID: 1265076159-2ee601320000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7AB711A3D7E for ; Mon, 1 Feb 2010 18:02:39 -0800 (PST) Received: from mail-ew0-f227.google.com (mail-ew0-f227.google.com [209.85.219.227]) by cuda.sgi.com with ESMTP id jHLs40rkYbdGyUr6 for ; Mon, 01 Feb 2010 18:02:39 -0800 (PST) Received: by ewy27 with SMTP id 27so918342ewy.18 for ; Mon, 01 Feb 2010 18:02:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:received:from:to:subject:date :user-agent:mime-version:message-id:cc:content-type :content-transfer-encoding; bh=BGDOYJkpSLs+yza6iJEfng+32tDSs5+CLnsMuKVhdg0=; b=NST20EMr1cUgP1Nk5uqYJqpFHlxH33G0i0P2s65tT6ZcNAr7++a6FxrsQROBsUuD9h UzddYzM+qXansiESvkvsPU/l4v92Nru4vcs8ZODyICewI7vRT6i03KGEXrZT/IL2LtSh ze54ilK+9aIAYn1uboDsQzLeNUatGCUHxaD0o= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:subject:date:user-agent:mime-version:message-id:cc :content-type:content-transfer-encoding; b=ekVFOExD3nmZqCU3AnfwVcYlGAWNn/rNEiqTi045JgWk79f/mWLKBIAyFCMouUXafl IIkwg7WfzNNpN8+fNSHFj6rYbqmc4rUO6tGy2WASVRH63GchnT4N/L3H/wXS3QQPBbtb g6o9YXbDap82fc43/JWQUUI+lD+r7h+C/WGBU= Received: by 10.213.41.133 with SMTP id o5mr746809ebe.86.1265075772521; Mon, 01 Feb 2010 17:56:12 -0800 (PST) Received: from zeta.englab.brq.redhat.com (nat-pool-brq-t.redhat.com [209.132.186.34]) by mx.google.com with ESMTPS id 15sm4131032ewy.12.2010.02.01.17.56.12 (version=SSLv3 cipher=RC4-MD5); Mon, 01 Feb 2010 17:56:12 -0800 (PST) Received: from zeta.englab.brq.redhat.com (nat-pool-brq-t.redhat.com [209.132.186.34]) by mx.google.com with ESMTPS id 15sm4072935ewy.8.2010.02.01.16.14.58 (version=SSLv3 cipher=RC4-MD5); Mon, 01 Feb 2010 16:14:58 -0800 (PST) From: Edward Shishkin To: Andrew Morton , ReiserFS Development List X-ASG-Orig-Subj: [patch 5/7] VFS: add super operation writeback_inodes Subject: [patch 5/7] VFS: add super operation writeback_inodes Date: Tue, 2 Feb 2010 02:56:21 +0100 User-Agent: KMail/1.12.3 (Linux/2.6.27.41-170.2.117.fc10.i686; KDE/4.3.3; i686; ; ) MIME-Version: 1.0 Message-Id: <201002020256.21266.edward.shishkin@gmail.com> Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, jens.axboe@oracle.com Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ew0-f227.google.com[209.85.219.227] X-Barracuda-Start-Time: 1265076160 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.21413 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 . add ->writeback_inodes() super operation. This patch adds new operation to struct super_operations - writeback_inodes, generic implementaion and changes fs-writeback.c:writeback_inodes_wb() to call filesystem's writeback_inodes if it is defined or generic implementaion otherwise. This new operation allows filesystem to decide itself what to flush. Reiser4 flushes dirty pages on basic of atoms, not of inodes. writeback_inodes_wb used to call address space flushing method (writepages) for every dirty inode. For reiser4 it caused having to commit atoms unnecessarily often. This turned into substantial slowdown. Having this method helped to fix that problem. . add vfs library function writeback_skip_sb_inodes() This function is for file systems which have their own means of periodical writeout of old data. Signed-off-by: Edward Shishkin --- fs/fs-writeback.c | 47 ++++++++++++++++++++++++++++++++++++++++++---- include/linux/fs.h | 10 +++++++++ include/linux/writeback.h | 6 +++++ 3 files changed, 59 insertions(+), 4 deletions(-) Index: linux-2.6.33-rc5-mm1/include/linux/fs.h =================================================================== --- linux-2.6.33-rc5-mm1.orig/include/linux/fs.h +++ linux-2.6.33-rc5-mm1/include/linux/fs.h @@ -514,6 +514,7 @@ enum positive_aop_returns { struct page; struct address_space; struct writeback_control; +struct bdi_writeback; struct iov_iter { const struct iovec *iov; @@ -1565,6 +1566,9 @@ struct super_operations { int (*remount_fs) (struct super_block *, int *, char *); void (*clear_inode) (struct inode *); void (*umount_begin) (struct super_block *); + int (*writeback_inodes)(struct super_block *sb, + struct bdi_writeback *wb, + struct writeback_control *wbc); int (*show_options)(struct seq_file *, struct vfsmount *); int (*show_stats)(struct seq_file *, struct vfsmount *); @@ -2073,6 +2077,12 @@ extern int invalidate_inode_pages2(struc extern int invalidate_inode_pages2_range(struct address_space *mapping, pgoff_t start, pgoff_t end); extern int write_inode_now(struct inode *, int); +extern void writeback_skip_sb_inodes(struct super_block *sb, + struct bdi_writeback *wb); +extern void writeback_inodes_wbc(struct writeback_control *wbc); +extern int generic_writeback_sb_inodes(struct super_block *sb, + struct bdi_writeback *wb, + struct writeback_control *wbc); extern int filemap_fdatawrite(struct address_space *); extern int filemap_flush(struct address_space *); extern int filemap_fdatawait(struct address_space *); Index: linux-2.6.33-rc5-mm1/include/linux/writeback.h =================================================================== --- linux-2.6.33-rc5-mm1.orig/include/linux/writeback.h +++ linux-2.6.33-rc5-mm1/include/linux/writeback.h @@ -13,6 +13,12 @@ extern spinlock_t inode_lock; extern struct list_head inode_in_use; extern struct list_head inode_unused; +static inline int is_flush_bd_task(struct task_struct *task) +{ + return task->flags & PF_FLUSHER; +} +#define current_is_flush_bd_task() is_flush_bd_task(current) + /* * fs/fs-writeback.c */ Index: linux-2.6.33-rc5-mm1/fs/fs-writeback.c =================================================================== --- linux-2.6.33-rc5-mm1.orig/fs/fs-writeback.c +++ linux-2.6.33-rc5-mm1/fs/fs-writeback.c @@ -605,9 +605,9 @@ static enum sb_pin_state pin_sb_for_writ * Return 1, if the caller writeback routine should be * interrupted. Otherwise return 0. */ -static int writeback_sb_inodes(struct super_block *sb, - struct bdi_writeback *wb, - struct writeback_control *wbc) +int generic_writeback_sb_inodes(struct super_block *sb, + struct bdi_writeback *wb, + struct writeback_control *wbc) { while (!list_empty(&wb->b_io)) { long pages_skipped; @@ -658,6 +658,32 @@ static int writeback_sb_inodes(struct su /* b_io is empty */ return 1; } +EXPORT_SYMBOL(generic_writeback_sb_inodes); + +/* + * This function is for file systems which have their + * own means of periodical write-out of old data. + * NOTE: inode_lock should be hold. + * + * Skip a portion of b_io inodes which belong to @sb + * and go sequentially in reverse order. + */ +void writeback_skip_sb_inodes(struct super_block *sb, + struct bdi_writeback *wb) +{ + while (1) { + struct inode *inode; + + if (list_empty(&wb->b_io)) + break; + inode = list_entry(wb->b_io.prev, struct inode, i_list); + if (sb != inode->i_sb) + break; + redirty_tail(inode); + } +} +EXPORT_SYMBOL(writeback_skip_sb_inodes); + static void writeback_inodes_wb(struct bdi_writeback *wb, struct writeback_control *wbc) @@ -687,7 +713,10 @@ static void writeback_inodes_wb(struct b requeue_io(inode); continue; } - ret = writeback_sb_inodes(sb, wb, wbc); + if (sb->s_op->writeback_inodes) + ret = sb->s_op->writeback_inodes(sb, wb, wbc); + else + ret = generic_writeback_sb_inodes(sb, wb, wbc); if (state == SB_PINNED) unpin_sb_for_writeback(sb); @@ -704,6 +733,7 @@ void writeback_inodes_wbc(struct writeba writeback_inodes_wb(&bdi->wb, wbc); } +EXPORT_SYMBOL(writeback_inodes_wbc); /* * The maximum number of pages to writeout in a single bdi flush/kupdate @@ -1289,3 +1319,12 @@ int sync_inode(struct inode *inode, stru return ret; } EXPORT_SYMBOL(sync_inode); +/* + * Local variables: + * c-indentation-style: "K&R" + * mode-name: "LC" + * c-basic-offset: 8 + * tab-width: 8 + * fill-column: 79 + * End: + */ From morfic@gmail.com Mon Feb 1 21:24:19 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.6 required=5.0 tests=BAYES_00,DEAR_SOMETHING, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o123NxmH150879 for ; Mon, 1 Feb 2010 21:24:09 -0600 X-ASG-Debug-ID: 1265081074-254103700000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ww0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B458A1A3842 for ; Mon, 1 Feb 2010 19:24:34 -0800 (PST) Received: from mail-ww0-f53.google.com (mail-ww0-f53.google.com [74.125.82.53]) by cuda.sgi.com with ESMTP id 66fyaAi4vqPORNeu for ; Mon, 01 Feb 2010 19:24:34 -0800 (PST) Received: by wwc33 with SMTP id 33so173485wwc.26 for ; Mon, 01 Feb 2010 19:24:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:date:message-id:subject :from:to:content-type; bh=m/Y3XP0EIKPDgUU7IGuzDSnx6QRhYRVOHRpbS8iYuvI=; b=aWeeW12BxF6MZRYoypEL1j9Tho/9Qwd8US9C6rZ/L3yr+PuN541goXEzDvN5YTDt4z 7ImjhJSvbJcsUm5ACCTe7CTXXYix7QvuP1mlSYOy7NCRrEJ59Sfq1Y5NZAvW3PMyL7EQ 6egcslASq8roZOwWvevmu62Fl1mwpgZPmzkg8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=oVWPXyHiM25YZF2rrudolOmGO1ILwCth2HCCo+ggIKfOgHhx1NWjbN6e0nsvQ+xhe1 f7hJordwJI9h97o7gLaTlFvE+ZPPQdNh17i7XTw21F2Q98m7Fvn3uJJSzc7PP4+Zaymg HFWCwP7XR1zVqi5BDFRd2xPZ+RHSHDXuJzlFw= MIME-Version: 1.0 Received: by 10.216.87.204 with SMTP id y54mr1869075wee.164.1265081073100; Mon, 01 Feb 2010 19:24:33 -0800 (PST) Date: Mon, 1 Feb 2010 21:24:33 -0600 Message-ID: <13bb8ce11002011924h611099feh4955eedcc6e588a6@mail.gmail.com> X-ASG-Orig-Subj: State of XFS on ARM Subject: State of XFS on ARM From: Daniel Goller To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ww0-f53.google.com[74.125.82.53] X-Barracuda-Start-Time: 1265081098 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.21419 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 Dear Sir or Madam, I Would like to find out about the current state of XFS on ARM. I have been using XFS for a while successfully on my laptop, and was using XFS on a ARM device (little endian) since it would hold the same data i had on the laptop. It seems i have not been able to unmount it and then mounting it cleanly once, always required xfs_repair -L /dev/sdc3 I Could understand power issues or lockups causing this, but on clean umount and followed mount to see it fail is surprising. When mounting fails on the headless arm machine i move the drive to a x86_64 and run xfs_repair there when mounting there fails too (so log can't be replayed, making -L necessary). All of this leads me to ask: "Is XFS as well maintained on ARM as it is on x86/x86_64?" Thank you in advance for any info you can provide, Daniel Goller From edward.shishkin@gmail.com Mon Feb 1 21:33:01 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o123WfEm151097 for ; Mon, 1 Feb 2010 21:32:51 -0600 X-ASG-Debug-ID: 1265081599-620602d10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ABF1A1C97ADE for ; Mon, 1 Feb 2010 19:33:20 -0800 (PST) Received: from mail-ew0-f227.google.com (mail-ew0-f227.google.com [209.85.219.227]) by cuda.sgi.com with ESMTP id mH24HTzrbIMnKiVN for ; Mon, 01 Feb 2010 19:33:20 -0800 (PST) Received: by ewy27 with SMTP id 27so955584ewy.18 for ; Mon, 01 Feb 2010 19:33:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:subject:date :user-agent:mime-version:message-id:cc:content-type :content-transfer-encoding; bh=WvTl84i6AssHSnJeG9IiC9Zb7FQlV2PJhaSSdLfavFg=; b=Um3YKDDQTTWMuGEmfb67eythFwLQWZ0KlSzhyZIrfQDeMU2uDKA72a6jP46I9NQEG6 IUnoDzyfybpFiUyG4eWwN+wD/PDpKgg45iXMQhauHwbPIQKd5Vah54oZx6t9fxj72rz1 GtJ6+4Q4voGb8q6FKbGM2YgCCPJR7T3Pc59y0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:subject:date:user-agent:mime-version:message-id:cc :content-type:content-transfer-encoding; b=VxM+xISKAEtQZgcWfOOCu4cjm2RkcfHcGd5vSK9jQiQmMnrX3fTiAqhlNkVPcwItZ3 /qQFmSX72GX+jWK2hlrzkRZP2/4FXhokCbZmAs8Zw4kpu1Ir8js/dMVuAl7oPFSy/Ca7 m+tvWQpcjB1ytwx58z9Cp1DYSDhxkvXOYpBhw= Received: by 10.213.97.85 with SMTP id k21mr29869ebn.79.1265075739276; Mon, 01 Feb 2010 17:55:39 -0800 (PST) Received: from zeta.englab.brq.redhat.com (nat-pool-brq-t.redhat.com [209.132.186.34]) by mx.google.com with ESMTPS id 14sm4125601ewy.3.2010.02.01.17.55.38 (version=SSLv3 cipher=RC4-MD5); Mon, 01 Feb 2010 17:55:38 -0800 (PST) From: Edward Shishkin To: Andrew Morton , ReiserFS Development List X-ASG-Orig-Subj: [patch 0/7] per-bdi flushing model improvements. reiser4 Subject: [patch 0/7] per-bdi flushing model improvements. reiser4 Date: Tue, 2 Feb 2010 02:55:46 +0100 User-Agent: KMail/1.12.3 (Linux/2.6.27.41-170.2.117.fc10.i686; KDE/4.3.3; i686; ; ) MIME-Version: 1.0 Message-Id: <201002020255.46920.edward.shishkin@gmail.com> Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, jens.axboe@oracle.com Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ew0-f227.google.com[209.85.219.227] X-Barracuda-Start-Time: 1265081607 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.21419 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. Andrew Morton wrote: > reiser4 is currently disabled in -mm (via reiser4-disable.patch) > because recent changes to fs/fs/writeback.c wrecked the build. I fixed > it about ten times as the underlying code was churning, then gave up. It > would be nice if you take a look at that sometime please. > > I have taken a look at fs/fs-writeback.c and found that per-superblock flushing interface is eliminated. However migrating to per-bdi flushing model doesn't necessarily means that such interface doesn't exist or is not needed anymore. Flushing in accordance with the scheme "data-inode- data-inode-..." would be very suboptimal for reiser4. Also xfs people were unhappy with such flushing model: http://article.gmane.org/gmane.linux.file-systems/30153 Moreover, current stuff doesn't look fine. Why do we pin/unpin superblock for every inode? It would be more reasonable to pin it for the whole group of inodes and call a flushing handler for them. The patch 4 introduces such handler writeback_sb_inodes (which resembles dropped sync_sb_inodes, the difference is that the newer version doesn't flush necessarily all inodes of the superblock). Please, consider pushing this patch to mainline. The patch 5 adds a super operation .writeback_inodes (former .sync_inodes) which allows a file system to make optimizations. It can happen that reiser4 will flush a bit more inodes then generic implementation suggests. "a bit more" doesn't mean "all dirty inodes of the superblock" (see a comment about atoms in the header of patch 6). Finally, some file systems have its own means for periodical writeout of dirty data. Since b_io contains inodes of many superblocks we need to evict our inodes back to dirty list when flushing is going on with for_kupdate flag installed. The new library function writeback_skip_sb_inodes() provides such possibility. Please, apply. Thanks, Edward. From sandeen@sandeen.net Mon Feb 1 21:51:39 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.7 required=5.0 tests=AWL,BAYES_00,DEAR_SOMETHING, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o123pc7R151877 for ; Mon, 1 Feb 2010 21:51:39 -0600 X-ASG-Debug-ID: 1265082764-5e4803400000-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 62ED71C97B46 for ; Mon, 1 Feb 2010 19:52:44 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id kGrsNSW9m32gcf2o for ; Mon, 01 Feb 2010 19:52:44 -0800 (PST) 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 5C2E2917EC6; Mon, 1 Feb 2010 21:52:44 -0600 (CST) Message-ID: <4B67A18C.8010009@sandeen.net> Date: Mon, 01 Feb 2010 21:52:44 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Daniel Goller CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: State of XFS on ARM Subject: Re: State of XFS on ARM References: <13bb8ce11002011924h611099feh4955eedcc6e588a6@mail.gmail.com> In-Reply-To: <13bb8ce11002011924h611099feh4955eedcc6e588a6@mail.gmail.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: 1265082765 X-Barracuda-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.21421 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 Daniel Goller wrote: > Dear Sir or Madam, > > I Would like to find out about the current state of XFS on ARM. > I have been using XFS for a while successfully on my laptop, and was > using XFS on a ARM device (little endian) since it would hold the same > data i had on the laptop. > It seems i have not been able to unmount it and then mounting it > cleanly once, always required xfs_repair -L /dev/sdc3 > I Could understand power issues or lockups causing this, but on clean > umount and followed mount to see it fail is surprising. well, actually neither power issues nor lockups should cause it either ;) > When mounting fails on the headless arm machine i move the drive to a > x86_64 and run xfs_repair there when mounting there fails too (so log > can't be replayed, making -L necessary). > All of this leads me to ask: "Is XFS as well maintained on ARM as it > is on x86/x86_64?" Short answer no, but effort is made. The last known issue, as far as I know, is a cache aliasing problem. This patch is a big-hammer approach, better things have been proposed but not yet upstream as far as I know. With "what doesn't work" helpfully commented out ;) Index: linux-2.6.22.18/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- linux-2.6.22.18.orig/fs/xfs/linux-2.6/xfs_buf.c +++ linux-2.6.22.18/fs/xfs/linux-2.6/xfs_buf.c @@ -1185,6 +1185,8 @@ _xfs_buf_ioapply( bio->bi_end_io = xfs_buf_bio_end_io; bio->bi_private = bp; + //flush_dcache_page(bp->b_pages[0]); + flush_cache_all(); bio_add_page(bio, bp->b_pages[0], PAGE_CACHE_SIZE, 0); size = 0; @@ -1211,6 +1213,8 @@ next_chunk: if (nbytes > size) nbytes = size; + //flush_dcache_page(bp->b_pages[map_i]); + flush_cache_all(); rbytes = bio_add_page(bio, bp->b_pages[map_i], nbytes, offset); if (rbytes < nbytes) break; > Thank you in advance for any info you can provide, > > Daniel Goller > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From BATV+d426e2b78c7c125350ad+2354+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 2 02:16:23 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o128GMDc162512 for ; Tue, 2 Feb 2010 02:16:23 -0600 X-ASG-Debug-ID: 1265098650-636601e70000-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 B7941136D56C for ; Tue, 2 Feb 2010 00:17:30 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 1WKjkXNK3cG35nfn for ; Tue, 02 Feb 2010 00:17:30 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NcDwu-0000dS-D7; Tue, 02 Feb 2010 08:17:28 +0000 Date: Tue, 2 Feb 2010 03:17:28 -0500 From: Christoph Hellwig To: Edward Shishkin Cc: Andrew Morton , ReiserFS Development List , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 Subject: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 Message-ID: <20100202081728.GA2384@infradead.org> References: <201002020255.46920.edward.shishkin@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201002020255.46920.edward.shishkin@gmail.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: 1265098651 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 got this introduction twice, but patches 1-3 didn't make it to any of the lists. From BATV+d426e2b78c7c125350ad+2354+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 2 05:21:56 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o12BLrEm168669 for ; Tue, 2 Feb 2010 05:21:56 -0600 X-ASG-Debug-ID: 1265109782-0f36003b0000-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 861F7136DC3A for ; Tue, 2 Feb 2010 03:23:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Ro98E6BXUKfx6ANR for ; Tue, 02 Feb 2010 03:23:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NcGqS-0006T9-B2; Tue, 02 Feb 2010 11:23:00 +0000 Date: Tue, 2 Feb 2010 06:23:00 -0500 From: Christoph Hellwig To: Daniel Goller , James.Bottomley@HansenPartnership.com Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: State of XFS on ARM Subject: Re: State of XFS on ARM Message-ID: <20100202112300.GA23809@infradead.org> References: <13bb8ce11002011924h611099feh4955eedcc6e588a6@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <13bb8ce11002011924h611099feh4955eedcc6e588a6@mail.gmail.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: 1265109782 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, Feb 01, 2010 at 09:24:33PM -0600, Daniel Goller wrote: > It seems i have not been able to unmount it and then mounting it > cleanly once, always required xfs_repair -L /dev/sdc3 > I Could understand power issues or lockups causing this, but on clean > umount and followed mount to see it fail is surprising. > When mounting fails on the headless arm machine i move the drive to a > x86_64 and run xfs_repair there when mounting there fails too (so log > can't be replayed, making -L necessary). > All of this leads me to ask: "Is XFS as well maintained on ARM as it > is on x86/x86_64?" XFS itself is platform neutral. But it seems like you have an ARM platform with virtually indexed caches, which currently can't support the I/O XFS does. James has been working on fixing this for a while, but so far the architecture support patches for it unfortunately still haven't made it to mainline despite many people running into this issue. The git tree with the current versions of the patches to fix this is here: http://git.kernel.org/?p=linux/kernel/git/jejb/xfs-vipt/.git;a=summary From ebb9@byu.net Tue Feb 2 08:01:31 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o12E1UaT174551 for ; Tue, 2 Feb 2010 08:01:31 -0600 X-ASG-Debug-ID: 1265119358-7e2402d60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from qmta01.emeryville.ca.mail.comcast.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5826D1C98FB6 for ; Tue, 2 Feb 2010 06:02:38 -0800 (PST) Received: from qmta01.emeryville.ca.mail.comcast.net (qmta01.emeryville.ca.mail.comcast.net [76.96.30.16]) by cuda.sgi.com with ESMTP id sjQmJPVc7rTwjUwK for ; Tue, 02 Feb 2010 06:02:38 -0800 (PST) Received: from omta08.emeryville.ca.mail.comcast.net ([76.96.30.12]) by qmta01.emeryville.ca.mail.comcast.net with comcast id d1K41d0090FhH24A122fhr; Tue, 02 Feb 2010 14:02:39 +0000 Received: from [192.168.0.5] ([24.10.247.83]) by omta08.emeryville.ca.mail.comcast.net with comcast id d22d1d0021ohlF48U22dQ3; Tue, 02 Feb 2010 14:02:39 +0000 Message-ID: <4B683082.3040803@byu.net> Date: Tue, 02 Feb 2010 07:02:42 -0700 From: Eric Blake User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.23) Gecko/20090812 Thunderbird/2.0.0.23 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: Eric Sandeen CC: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: add test for ctimes updates in futimens Subject: Re: [PATCH] xfstests: add test for ctimes updates in futimens References: <20100110215227.GA15354@infradead.org> <4B61FAA0.8020304@sandeen.net> In-Reply-To: <4B61FAA0.8020304@sandeen.net> X-Enigmail-Version: 0.96.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: qmta01.emeryville.ca.mail.comcast.net[76.96.30.16] X-Barracuda-Start-Time: 1265119359 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21459 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 According to Eric Sandeen on 1/28/2010 1:59 PM: > Late on review, but this won't build on older glibc's :( > > need some auto-fu somewhere? was going to put: > > +# > +# Check if we have a working futimens libc call > +# > +AC_DEFUN([AC_HAVE_FUTIMENS], > + [ AC_MSG_CHECKING([for futimens ]) > + AC_TRY_COMPILE([ > +#define _GNU_SOURCE > +#include > + ], [ > + struct timespec t[2] = { { 1000000000, 0 }, { 0, UTIME_OMIT } }; > + futimens(0, t); > + ], have_futimens=yes > + AC_MSG_RESULT(yes), > + AC_MSG_RESULT(no)) > + AC_SUBST(have_futimens) > + ]) You are missing some m4 quoting, and are using deprecated macros; also, caching the value speeds up subsequent configure runs. Furthermore, you are impinging on the autoconf macro namespace, which is discouraged (what if autoconf later introduces AC_HAVE_FUTIMENS with different semantics than your macro?). Then, since you are only checking for compilation, you can avoid messing with struct timespec. AC_SUBST is useful for makefiles, but AC_DEFINE is useful for preprocessor macros; I'm assuming you wanted the latter? So, assuming that you are using xfs_ as your package-specific namespace, I would write this as: AC_DEFUN([XFS_HAVE_FUTIMENS], [ AC_CACHE_CHECK([for futimens], [xfs_cv_have_futimens], [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #define _GNU_SOURCE #include ]], [[futimens (0, 0); ]])], [xfs_cv_have_futimens=yes], [xfs_cv_have_futimens=no]) ]) if test "x$xfs_cv_have_futimens" = xyes; then AC_DEFINE([HAVE_FUTIMENS], [1], [Define to 1 if futimens compiles]) fi ]) -- Don't work too hard, make some time for fun as well! Eric Blake ebb9@byu.net From edward.shishkin@gmail.com Tue Feb 2 09:25:04 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o12FP31O177225 for ; Tue, 2 Feb 2010 09:25:04 -0600 X-ASG-Debug-ID: 1265124371-63e0006e0000-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 15EC5136EEC5 for ; Tue, 2 Feb 2010 07:26:11 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DhTjhL5sr6fYoHcq for ; Tue, 02 Feb 2010 07:26:11 -0800 (PST) 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 o12FPLou014330 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Feb 2010 10:25:22 -0500 Received: from zeta.englab.brq.redhat.com (dhcp-lab-156.englab.brq.redhat.com [10.34.33.156]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o12FPJ8a030241; Tue, 2 Feb 2010 10:25:20 -0500 Message-ID: <4B6843E9.9070600@gmail.com> Date: Tue, 02 Feb 2010 16:25:29 +0100 From: Edward Shishkin User-Agent: Thunderbird 2.0.0.23 (X11/20090825) MIME-Version: 1.0 To: Christoph Hellwig CC: Andrew Morton , ReiserFS Development List , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 Subject: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 References: <201002020255.46920.edward.shishkin@gmail.com> <20100202081728.GA2384@infradead.org> In-Reply-To: <20100202081728.GA2384@infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed 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: 1265124372 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21464 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 wrote: > I got this introduction twice, but patches 1-3 didn't make it to any of > the lists. > > > done From realrichardsharpe@gmail.com Tue Feb 2 09:41:05 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o12Ff5gZ177797 for ; Tue, 2 Feb 2010 09:41:05 -0600 X-ASG-Debug-ID: 1265125332-485001450000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-bw0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1E27A1A5DC5 for ; Tue, 2 Feb 2010 07:42:13 -0800 (PST) Received: from mail-bw0-f227.google.com (mail-bw0-f227.google.com [209.85.218.227]) by cuda.sgi.com with ESMTP id OOxtF6MYT45UoZbk for ; Tue, 02 Feb 2010 07:42:13 -0800 (PST) Received: by bwz27 with SMTP id 27so186411bwz.19 for ; Tue, 02 Feb 2010 07:42:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=zUbvrxwoetXw1avJyC8+qhoCZd6wfcjOX4O6PDDds24=; b=lx5vbisnVHQs6cRb6e/6yHkif2cAZyH4WI08H8yZGizQ3Y/IMle0EIXEM200v1iYrr 8adOolzLS3WXE8+vqSQ0WvbnkQD8BQL4PAxZeJU01acqUFif/DQaVQj62yomOQT3jpxJ sb8qVEqmd/vR1FZg/7D08WSE2Py6shI9berws= 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=n72QJufJLausX446zEj5xpZJ03L2TUjOQzfUPhPBTGM66KIx+9CBiQs4AmLTEkKyrv QlAdUc2eET0ubZspIxEBo0ZOvk3scjhtYoOgdQAnG2Q/3pSXPKK8QHG2ORSboX8nEJzU +qFQ6nRQY64TmaH/w+Eij/UPV+QMj5qu7O3Xw= MIME-Version: 1.0 Received: by 10.204.137.215 with SMTP id x23mr4581952bkt.151.1265125331430; Tue, 02 Feb 2010 07:42:11 -0800 (PST) In-Reply-To: <20100202112300.GA23809@infradead.org> References: <13bb8ce11002011924h611099feh4955eedcc6e588a6@mail.gmail.com> <20100202112300.GA23809@infradead.org> Date: Tue, 2 Feb 2010 07:42:11 -0800 Message-ID: <46b8a8851002020742w28891d18g24d01982631cdf2b@mail.gmail.com> X-ASG-Orig-Subj: Re: State of XFS on ARM Subject: Re: State of XFS on ARM From: Richard Sharpe To: Christoph Hellwig Cc: Daniel Goller , James.Bottomley@hansenpartnership.com, xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-bw0-f227.google.com[209.85.218.227] X-Barracuda-Start-Time: 1265125334 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.21465 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, Feb 2, 2010 at 3:23 AM, Christoph Hellwig wrote= : > On Mon, Feb 01, 2010 at 09:24:33PM -0600, Daniel Goller wrote: >> It seems i have not been able to unmount it and then mounting it >> cleanly once, always required xfs_repair -L =A0 /dev/sdc3 >> I Could understand power issues or lockups causing this, but on clean >> umount and followed mount to see it fail is surprising. >> When mounting fails on the headless arm machine i move the drive to a >> x86_64 and run xfs_repair there when mounting there fails too (so log >> can't be replayed, making -L necessary). >> All of this leads me to ask: =A0"Is XFS as well maintained on ARM as it >> is on x86/x86_64?" > > XFS itself is platform neutral. =A0But it seems like you have an ARM > platform with virtually indexed caches, which currently can't support > the I/O XFS does. =A0James has been working on fixing this for a while, > but so far the architecture support patches for it unfortunately still > haven't made it to mainline despite many people running into this issue. I would be interested in a precise explanation for this problem. We ran into an issue here with XFS on the Marvell 78200 (ARM) which has a VIVT cache. We eventually solved the problem by using flush_icache_range in a strategic place (after also discovering the need for flush_dcache_page, but that has to do with doing IO between the cores on the 78200), but we really did not understand why that fixed the problem. However, it stopped the corruption we were experiencing when using a file system exerciser. (We have subsequently stopped using XFS, but not because of any corruption issues.) --=20 Regards, Richard Sharpe From James.Bottomley@HansenPartnership.com Tue Feb 2 10:11:15 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o12GBE55178783 for ; Tue, 2 Feb 2010 10:11:14 -0600 X-ASG-Debug-ID: 1265127142-5a8502880000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bedivere.hansenpartnership.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EFD591DB8174 for ; Tue, 2 Feb 2010 08:12:22 -0800 (PST) Received: from bedivere.hansenpartnership.com (bedivere.hansenpartnership.com [66.63.167.143]) by cuda.sgi.com with ESMTP id yyTlTwX952cbwvql for ; Tue, 02 Feb 2010 08:12:22 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by bedivere.hansenpartnership.com (Postfix) with ESMTP id 1F00C8EE0F2; Tue, 2 Feb 2010 08:12:22 -0800 (PST) Received: from bedivere.hansenpartnership.com ([127.0.0.1]) by localhost (bedivere.hansenpartnership.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id inFNtFy4T8KV; Tue, 2 Feb 2010 08:12:22 -0800 (PST) Received: from [192.168.10.224] (newmulgrave.ext.hansenpartnership.com [192.168.10.224]) by bedivere.hansenpartnership.com (Postfix) with ESMTP id 24F608EE0D2; Tue, 2 Feb 2010 08:12:19 -0800 (PST) X-ASG-Orig-Subj: Re: State of XFS on ARM Subject: Re: State of XFS on ARM From: James Bottomley To: Richard Sharpe Cc: Christoph Hellwig , Daniel Goller , xfs@oss.sgi.com In-Reply-To: <46b8a8851002020742w28891d18g24d01982631cdf2b@mail.gmail.com> References: <13bb8ce11002011924h611099feh4955eedcc6e588a6@mail.gmail.com> <20100202112300.GA23809@infradead.org> <46b8a8851002020742w28891d18g24d01982631cdf2b@mail.gmail.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 02 Feb 2010 10:12:17 -0600 Message-Id: <1265127137.2800.67.camel@mulgrave.site> Mime-Version: 1.0 X-Mailer: Evolution 2.28.0 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: bedivere.hansenpartnership.com[66.63.167.143] X-Barracuda-Start-Time: 1265127142 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21467 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, 2010-02-02 at 07:42 -0800, Richard Sharpe wrote: > On Tue, Feb 2, 2010 at 3:23 AM, Christoph Hellwig wrote: > > On Mon, Feb 01, 2010 at 09:24:33PM -0600, Daniel Goller wrote: > >> It seems i have not been able to unmount it and then mounting it > >> cleanly once, always required xfs_repair -L /dev/sdc3 > >> I Could understand power issues or lockups causing this, but on clean > >> umount and followed mount to see it fail is surprising. > >> When mounting fails on the headless arm machine i move the drive to a > >> x86_64 and run xfs_repair there when mounting there fails too (so log > >> can't be replayed, making -L necessary). > >> All of this leads me to ask: "Is XFS as well maintained on ARM as it > >> is on x86/x86_64?" > > > > XFS itself is platform neutral. But it seems like you have an ARM > > platform with virtually indexed caches, which currently can't support > > the I/O XFS does. James has been working on fixing this for a while, > > but so far the architecture support patches for it unfortunately still > > haven't made it to mainline despite many people running into this issue. > > I would be interested in a precise explanation for this problem. We > ran into an issue here with XFS on the Marvell 78200 (ARM) which has a > VIVT cache. We eventually solved the problem by using > flush_icache_range in a strategic place (after also discovering the > need for flush_dcache_page, but that has to do with doing IO between > the cores on the 78200), but we really did not understand why that > fixed the problem. However, it stopped the corruption we were > experiencing when using a file system exerciser. XFS uses large buffers for log operations. Because large physically contiguous pieces of memory are hard to come by, it makes its logs from virtually contiguous pages. The problem is that doing this sets up aliasing within the kernel: each page in the range now has two virtual addresses: one for the standard kernel offset map and the other for the xfs created virtual area. When I/O is done on a kernel page, the kernel always flushes the offset map to ensure that the data is in main memory. However, when the page has another alias in the xfs created virtual area, the kernel I/O subsystem has no idea about this. Since xfs is reading and writing to this other alias, that's what needs to be flushed to make sure the data is safely in main memory before I/O takes place. James From axboe@kernel.dk Tue Feb 2 13:41:02 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o12Jf1qU188198 for ; Tue, 2 Feb 2010 13:41:02 -0600 X-ASG-Debug-ID: 1265139729-1c9800df0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kernel.dk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9138D1A59D4 for ; Tue, 2 Feb 2010 11:42:09 -0800 (PST) Received: from kernel.dk (0122700014.0.fullrate.dk [95.166.99.235]) by cuda.sgi.com with ESMTP id E0qgPPya4BEYcUjs for ; Tue, 02 Feb 2010 11:42:09 -0800 (PST) Received: by kernel.dk (Postfix, from userid 1000) id 3991E37A0B3; Tue, 2 Feb 2010 20:42:08 +0100 (CET) Date: Tue, 2 Feb 2010 20:42:08 +0100 From: Jens Axboe To: Edward Shishkin Cc: Christoph Hellwig , Andrew Morton , ReiserFS Development List , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 Subject: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 Message-ID: <20100202194208.GD5733@kernel.dk> References: <201002020255.46920.edward.shishkin@gmail.com> <20100202081728.GA2384@infradead.org> <4B6843E9.9070600@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B6843E9.9070600@gmail.com> X-Barracuda-Connect: 0122700014.0.fullrate.dk[95.166.99.235] X-Barracuda-Start-Time: 1265139730 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21480 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, Feb 02 2010, Edward Shishkin wrote: > Christoph Hellwig wrote: >> I got this introduction twice, but patches 1-3 didn't make it to any of >> the lists. >> >> >> > done Where? -- Jens Axboe From theronni@gmail.com Tue Feb 2 15:44:16 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.7 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX, HTML_MESSAGE,J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated 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 o12LiGZo193832 for ; Tue, 2 Feb 2010 15:44:16 -0600 X-ASG-Debug-ID: 1265147123-42f201070000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-fx0-f211.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D0BC11C9ADFB for ; Tue, 2 Feb 2010 13:45:23 -0800 (PST) Received: from mail-fx0-f211.google.com (mail-fx0-f211.google.com [209.85.220.211]) by cuda.sgi.com with ESMTP id jXaVeH2vAm5xDHr3 for ; Tue, 02 Feb 2010 13:45:23 -0800 (PST) Received: by fxm3 with SMTP id 3so612129fxm.19 for ; Tue, 02 Feb 2010 13:45:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type; bh=Vf3bPjAm7kpKCih6ILFvGpzDAEQqbMVbO+WOCgWnU1g=; b=VgSz7lwwS96MwTwxQ4rWgUi46W4f3uEp7YYen/9gFziCLz+IkJ+bsA3xOvbORkomJ1 hGnWrGmsENeXSRZyYemKlJuwb7H479EBYPsU78flDIAGuLf0KtQ4NjYBe4W8S1vnmnKo fUTJkCY6bglkSp2Dsu+PlqDigDF95EQaeblLw= 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=XBbHtHaSR4fHDnQyBgT++kZ0TLuzV1b4dzQN410R2LsaUfzH004nuyW/UOsDjCL8PW ENZt4K7Mor88L/3eZYq4sb+XLs8tAHEJ25G1AwPu6W6R7HcrI22Mx9XdgdkLlMfYkM+E ZnWr3lO68dEORwIz96FVwSH1wt9squORIoZ68= MIME-Version: 1.0 Received: by 10.223.2.149 with SMTP id 21mr5077891faj.49.1265147122448; Tue, 02 Feb 2010 13:45:22 -0800 (PST) In-Reply-To: <20100202194208.GD5733@kernel.dk> References: <201002020255.46920.edward.shishkin@gmail.com> <20100202081728.GA2384@infradead.org> <4B6843E9.9070600@gmail.com> <20100202194208.GD5733@kernel.dk> Date: Wed, 3 Feb 2010 01:45:22 +0400 Message-ID: <5e2ec5ac1002021345g569c743dtc5ccf77cde6738ae@mail.gmail.com> X-ASG-Orig-Subj: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 Subject: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 From: Ronni Holm-Nielsen To: Jens Axboe Cc: Edward Shishkin , Christoph Hellwig , Andrew Morton , ReiserFS Development List , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=000e0ce0f19ad27bf7047ea504db X-Barracuda-Connect: mail-fx0-f211.google.com[209.85.220.211] X-Barracuda-Start-Time: 1265147124 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.21488 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 --000e0ce0f19ad27bf7047ea504db Content-Type: text/plain; charset=UTF-8 To clarify (being a ReiserFS subscriber): patch 0, 4-6 sent to Andrew, ReiserFS, linux-fsdevel, linux-kernel, xfs, jens.axboe patch 1-3, 7 sent to Andrew, ReiserFS - Ronni On Tue, Feb 2, 2010 at 11:42 PM, Jens Axboe wrote: > On Tue, Feb 02 2010, Edward Shishkin wrote: > > Christoph Hellwig wrote: > >> I got this introduction twice, but patches 1-3 didn't make it to any of > >> the lists. > >> > >> > >> > > done > > Where? > > -- > Jens Axboe > > -- > To unsubscribe from this list: send the line "unsubscribe reiserfs-devel" > in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- Venlig hilsen Ronni --000e0ce0f19ad27bf7047ea504db Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
To clarify (being a ReiserFS subscriber):

patch 0,= 4-6 sent to=C2=A0Andrew, ReiserFS, linux-fsdevel, linux-kernel, xfs, jens.= axboe
patch 1-3, 7 sent to=C2=A0Andrew, ReiserFS

- Ronni

On Tue, Feb 2, 2010 at 11:42 PM, Jens Axboe = <jens.axboe@o= racle.com> wrote:
On Tue, Feb 02 2010, Edward Shishkin wrote:
> Christoph Hellwig wrote:
>> I got this introduction twice, but patches 1-3 didn't make it = to any of
>> the lists.
>>
>>
>>
> done

Where?

--
Jens Axboe

--
To unsubscribe from this list: send the line "unsubscribe reiserfs-dev= el" in
the body of a message to major= domo@vger.kernel.org
More majordomo info at =C2=A0http://vger.kernel.org/majordomo-info.html



--
Venlig hils= en
Ronni
--000e0ce0f19ad27bf7047ea504db-- From theronni@gmail.com Tue Feb 2 15:46:43 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated 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 o12LkhDV194004 for ; Tue, 2 Feb 2010 15:46:43 -0600 X-ASG-Debug-ID: 1265147270-75cf01030000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-fx0-f211.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9A25E1A639A for ; Tue, 2 Feb 2010 13:47:51 -0800 (PST) Received: from mail-fx0-f211.google.com (mail-fx0-f211.google.com [209.85.220.211]) by cuda.sgi.com with ESMTP id rvdtzLx5K74T8gZC for ; Tue, 02 Feb 2010 13:47:51 -0800 (PST) Received: by fxm3 with SMTP id 3so614929fxm.19 for ; Tue, 02 Feb 2010 13:47:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=T/6pg1oYMwT8yInpvoYc6mW03stgNfH5H2hcbFRU1cQ=; b=YDITFTYipYYx3fo/Mm7SdcFF6tPD7RprRBfalk5ISBYlk5xz2xWcyk+3PdF9MRp5O9 5IaQVoFmeS0XDbmzrM4xaKXAIauhqzsL1tEsuWY91ThFWhDXd8XH+KyqNl+Fu6hRSoAw Icr8sRLv1UZwhGszpKZLkzNxO42dRkhkVHSjc= 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=kFUvz/1tfff6nIT+34QLrdFrJGUAASOV62EpgCzpomRVtCa+c41yHommpdbc1FNDjc xZ/CWaRYDqtNNnLDm5+uzXxBnmXGFAN37PH0KMjzjLOUYBBnK8iV5pRSfVeVg0JdgRih vYIekemFAmyWPvVqEtV1C0+4h1OPM/SFxGayU= MIME-Version: 1.0 Received: by 10.223.95.74 with SMTP id c10mr6748278fan.82.1265147270572; Tue, 02 Feb 2010 13:47:50 -0800 (PST) In-Reply-To: <20100202194208.GD5733@kernel.dk> References: <201002020255.46920.edward.shishkin@gmail.com> <20100202081728.GA2384@infradead.org> <4B6843E9.9070600@gmail.com> <20100202194208.GD5733@kernel.dk> Date: Wed, 3 Feb 2010 01:47:50 +0400 Message-ID: <5e2ec5ac1002021347k3a8cd8adta5ff76efe1eeaadb@mail.gmail.com> X-ASG-Orig-Subj: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 Subject: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 From: Ronni Holm-Nielsen To: Jens Axboe Cc: Edward Shishkin , Christoph Hellwig , Andrew Morton , ReiserFS Development List , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-fx0-f211.google.com[209.85.220.211] X-Barracuda-Start-Time: 1265147272 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.21488 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, Feb 2, 2010 at 11:42 PM, Jens Axboe wrote: > > On Tue, Feb 02 2010, Edward Shishkin wrote: > > Christoph Hellwig wrote: > >> I got this introduction twice, but patches 1-3 didn't make it to any o= f > >> the lists. > Where? To clarify (being a ReiserFS subscriber): patch 0, 4-6 sent to=C2=A0Andrew, ReiserFS, linux-fsdevel, linux-kernel, xfs, jens.axboe patch 1-3, 7 sent to=C2=A0Andrew, ReiserFS - Ronni From edward.shishkin@gmail.com Tue Feb 2 16:25:56 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=1.0 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated 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 o12MPt7P195633 for ; Tue, 2 Feb 2010 16:25:56 -0600 X-ASG-Debug-ID: 1265149624-6aa100c60000-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 B54B51C9AF24 for ; Tue, 2 Feb 2010 14:27:04 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1XUdq4pWXOeklnUm for ; Tue, 02 Feb 2010 14:27:04 -0800 (PST) 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 o12MQDJX031690 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Feb 2010 17:26:14 -0500 Received: from zeta.englab.brq.redhat.com (dhcp-lab-156.englab.brq.redhat.com [10.34.33.156]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o12MQArR026159; Tue, 2 Feb 2010 17:26:11 -0500 Message-ID: <4B68A68C.6030001@gmail.com> Date: Tue, 02 Feb 2010 23:26:20 +0100 From: Edward Shishkin User-Agent: Thunderbird 2.0.0.23 (X11/20090825) MIME-Version: 1.0 To: Ronni Holm-Nielsen CC: Jens Axboe , Christoph Hellwig , Andrew Morton , ReiserFS Development List , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Johannes Buchner , Artem Bityutskiy X-ASG-Orig-Subj: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 Subject: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 References: <201002020255.46920.edward.shishkin@gmail.com> <20100202081728.GA2384@infradead.org> <4B6843E9.9070600@gmail.com> <20100202194208.GD5733@kernel.dk> <5e2ec5ac1002021345g569c743dtc5ccf77cde6738ae@mail.gmail.com> In-Reply-To: <5e2ec5ac1002021345g569c743dtc5ccf77cde6738ae@mail.gmail.com> Content-Type: text/plain; charset=UTF-8; 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: 1265149624 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 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=BSF_SC0_SA_TO_FROM_DOMAIN_MATCH X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.21492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello everyone. The patches 1-3 are reverses for the following -mm stuff: http://userweb.kernel.org/~akpm/mmotm/broken-out/reiser4-fixed-null-pointer-dereference.patch http://userweb.kernel.org/~akpm/mmotm/broken-out/reiser4-generic_sync_sb_inodes-doesnt-exist-anymore.patch http://userweb.kernel.org/~akpm/mmotm/broken-out/reiser4-vfs-add-super_operationssync_inodes-2.patch This is incorrect attempts to adjust reiser4 to the new per-bdi flushing model. The authors are cc-ed, any comments, suggestions are welcome. Thanks, Edward. Ronni Holm-Nielsen wrote: > To clarify (being a ReiserFS subscriber): > > patch 0, 4-6 sent to Andrew, ReiserFS, linux-fsdevel, linux-kernel, xfs, > jens.axboe > patch 1-3, 7 sent to Andrew, ReiserFS > > - Ronni > > On Tue, Feb 2, 2010 at 11:42 PM, Jens Axboe wrote: > > >> On Tue, Feb 02 2010, Edward Shishkin wrote: >> >>> Christoph Hellwig wrote: >>> >>>> I got this introduction twice, but patches 1-3 didn't make it to any of >>>> the lists. >>>> >>>> >>>> >>>> >>> done >>> >> Where? >> >> -- >> Jens Axboe >> >> -- >> To unsubscribe from this list: send the line "unsubscribe reiserfs-devel" >> in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> >> > > > > From sandeen@sandeen.net Tue Feb 2 17:05:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o12N5dL6197575 for ; Tue, 2 Feb 2010 17:05:40 -0600 X-ASG-Debug-ID: 1265152007-2df503740000-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 96A5913706F4 for ; Tue, 2 Feb 2010 15:06:48 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id OLdKQtKIpdWIJOx5 for ; Tue, 02 Feb 2010 15:06:48 -0800 (PST) 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 543EB109E858 for ; Tue, 2 Feb 2010 17:06:47 -0600 (CST) Message-ID: <4B68B007.1020705@sandeen.net> Date: Tue, 02 Feb 2010 17:06:47 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH V3] xfstests: filter selinux output in _acl_ls etc Subject: [PATCH V3] xfstests: filter selinux output in _acl_ls etc References: <4B61C1BC.4050800@sandeen.net> <4B626697.3080006@sandeen.net> In-Reply-To: <4B626697.3080006@sandeen.net> 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: 1265152008 X-Barracuda-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.21495 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 When selinux is on, ls -l gives us a "." to indicate selinux attrs, which breaks some tests: === Test minimal ACE === Setup file --rwxrw-r-- id1 id2 file1 +-rwxrw-r--. id1 id2 file1 so make an _ls_l helper to filter that out. Signed-off-by: Eric Sandeen --- V3: after talking to christoph, maybe a sed that looks just for the ls -l chars might be better. diff --git a/105 b/105 index e3163fd..9544c66 100755 --- a/105 +++ b/105 @@ -76,7 +76,7 @@ chown $acl1 subdir # put a file in the directory echo data > subdir/file -ls -l subdir/file | awk '{ print $1, $3 }' +_ls_l subdir/file | awk '{ print $1, $3 }' # add an ACL with a user ACE which has no exec permission if [ "$HOSTOS" == "Linux" ]; then @@ -91,7 +91,7 @@ fi # With the bug this gives: `ls: subdir/file: Permission denied' # because one needs at least an exec perm somewhere in acl # However, this should not hold true for directories. -ls -l subdir/file | awk '{ print $1, $3 }' +_ls_l subdir/file | awk '{ print $1, $3 }' # With the bug this gives: `subdir/file2: Permission denied'. echo data2 > subdir/file2 diff --git a/common.attr b/common.attr index a6b9b3b..d12cc02 100644 --- a/common.attr +++ b/common.attr @@ -58,7 +58,7 @@ _acl_filter_id() # _acl_ls() { - ls -ln $* | awk '{ print $1, $3, $4, $NF }' | _acl_filter_id + _ls_l -n $* | awk '{ print $1, $3, $4, $NF }' | _acl_filter_id } # diff --git a/common.rc b/common.rc index 6424871..4425007 100644 --- a/common.rc +++ b/common.rc @@ -37,6 +37,14 @@ dd() fi } +# ls -l w/ selinux sometimes puts a dot at the end: +# -rwxrw-r--. id1 id2 file1 + +_ls_l() +{ + ls -l $* | sed "s/\(^[-rwxdlbcpsStT]*\)\. /\1 /" +} + _mount_opts() { case $FSTYP in From sandeen@sandeen.net Tue Feb 2 17:27:44 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_43,J_CHICKENPOX_48,J_CHICKENPOX_52 autolearn=no version=3.3.0-rupdated 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 o12NRh4l198220 for ; Tue, 2 Feb 2010 17:27:43 -0600 X-ASG-Debug-ID: 1265153331-75cb029c0000-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 1AD3C1A706E for ; Tue, 2 Feb 2010 15:28:51 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id 8yj7rB0LND90umfq for ; Tue, 02 Feb 2010 15:28:51 -0800 (PST) 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 E65D5109E84B; Tue, 2 Feb 2010 17:28:50 -0600 (CST) Message-ID: <4B68B532.9000103@sandeen.net> Date: Tue, 02 Feb 2010 17:28:50 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Christoph Hellwig CC: ext4 development , xfs-oss X-ASG-Orig-Subj: [PATCH V2] xfstests: 223 - test file alignment on stripe geometry Subject: [PATCH V2] xfstests: 223 - test file alignment on stripe geometry References: <4B621529.20708@sandeen.net> <20100130105236.GA18286@infradead.org> In-Reply-To: <20100130105236.GA18286@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: 1265153332 X-Barracuda-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.21496 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 A first-cut test to ensure that files are well-aligned on filesystems with stripe geometry. Several sizes of stripe units are mkfs'd, and then files are written and fallocated in various multiples of those stripe sizes. Each file is checked to ensure that the first block is stripe-aligned. (Ideally, for any fragmented files, we should ensure that each fragment start is well-aligned, but this does not do that yet) (slightly unrelated: don't send scratch mkfs output to /dev/null, we'd like to see mkfs output and direct it to $seq.full - this more or less matches _scratch_mkfs_xfs behavior and doesn't break any tests that I can see) Signed-off-by: Eric Sandeen --- V2: Address Christoph's review comments diff --git a/223 b/223 new file mode 100755 index 0000000..45057a3 --- /dev/null +++ b/223 @@ -0,0 +1,96 @@ +#! /bin/bash +# FS QA Test No. 223 +# +# File alignment tests +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Eric Sandeen. 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=sandeen@sandeen.net + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +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 +_require_xfs_io_falloc + +rm -f $seq.full + +_filter_scratch() +{ + sed -e "s,$SCRATCH_MNT,SCRATCH_MNT,g" +} + +BLOCKSIZE=4096 + +for SUNIT_K in 8 16 32 64 128; do + let SUNIT_BYTES=$SUNIT_K*1024 + let SUNIT_BLOCKS=$SUNIT_BYTES/$BLOCKSIZE + + echo "=== mkfs with su $SUNIT_BLOCKS blocks x 4 ===" + scratch_mkfs_geom $BLOCKSIZE $SUNIT_BYTES 4 + _scratch_mount + + for SIZE_MULT in 1 2 8 64 256; do + let SIZE=$SIZE_MULT*$SUNIT_BYTES + + echo "=== Testing size ${SIZE_MULT}*${SUNIT_K}k on ${SUNIT_K}k stripe ===" + for FILE in 1 2 3 4; do + xfs_io -F -f -c "falloc 0 $SIZE" $SCRATCH_MNT/file-$FILE-$SIZE-falloc &>> $seq.full + xfs_io -F -f -c "pwrite 0 $SIZE" $SCRATCH_MNT/file-$FILE-$SIZE-write &>> $seq.full + src/fibmap $SCRATCH_MNT/file-$FILE-$SIZE-falloc $SUNIT_BLOCKS | \ + _filter_scratch + src/fibmap $SCRATCH_MNT/file-$FILE-$SIZE-write $SUNIT_BLOCKS | \ + _filter_scratch + done + done + + echo "=== Testing size 1g falloc on ${SUNIT_K}k stripe ===" + xfs_io -F -f -c "falloc 0 1g" $SCRATCH_MNT/file-1g-falloc &>> $seq.full + src/fibmap $SCRATCH_MNT/file-1g-falloc $SUNIT_BLOCKS + + rm -f $SCRATCH_MNT/file-1g-falloc | _filter_scratch + + echo "=== Testing size 1073745920 falloc on ${SUNIT_K}k stripe ===" + xfs_io -F -f -c "falloc 0 1073745920" $SCRATCH_MNT/file-1073745920-falloc &>> $seq.full + src/fibmap $SCRATCH_MNT/file-1073745920-falloc $SUNIT_BLOCKS | _filter_scratch + + _scratch_unmount +done + +status=0 ; exit diff --git a/223.out b/223.out new file mode 100644 index 0000000..c9588ef --- /dev/null +++ b/223.out @@ -0,0 +1,251 @@ +QA output created by 223 +=== mkfs with su 2 blocks x 4 === +=== Testing size 1*8k on 8k stripe === +SCRATCH_MNT/file-1-8192-falloc: well-aligned +SCRATCH_MNT/file-1-8192-write: well-aligned +SCRATCH_MNT/file-2-8192-falloc: well-aligned +SCRATCH_MNT/file-2-8192-write: well-aligned +SCRATCH_MNT/file-3-8192-falloc: well-aligned +SCRATCH_MNT/file-3-8192-write: well-aligned +SCRATCH_MNT/file-4-8192-falloc: well-aligned +SCRATCH_MNT/file-4-8192-write: well-aligned +=== Testing size 2*8k on 8k stripe === +SCRATCH_MNT/file-1-16384-falloc: well-aligned +SCRATCH_MNT/file-1-16384-write: well-aligned +SCRATCH_MNT/file-2-16384-falloc: well-aligned +SCRATCH_MNT/file-2-16384-write: well-aligned +SCRATCH_MNT/file-3-16384-falloc: well-aligned +SCRATCH_MNT/file-3-16384-write: well-aligned +SCRATCH_MNT/file-4-16384-falloc: well-aligned +SCRATCH_MNT/file-4-16384-write: well-aligned +=== Testing size 8*8k on 8k stripe === +SCRATCH_MNT/file-1-65536-falloc: well-aligned +SCRATCH_MNT/file-1-65536-write: well-aligned +SCRATCH_MNT/file-2-65536-falloc: well-aligned +SCRATCH_MNT/file-2-65536-write: well-aligned +SCRATCH_MNT/file-3-65536-falloc: well-aligned +SCRATCH_MNT/file-3-65536-write: well-aligned +SCRATCH_MNT/file-4-65536-falloc: well-aligned +SCRATCH_MNT/file-4-65536-write: well-aligned +=== Testing size 64*8k on 8k stripe === +SCRATCH_MNT/file-1-524288-falloc: well-aligned +SCRATCH_MNT/file-1-524288-write: well-aligned +SCRATCH_MNT/file-2-524288-falloc: well-aligned +SCRATCH_MNT/file-2-524288-write: well-aligned +SCRATCH_MNT/file-3-524288-falloc: well-aligned +SCRATCH_MNT/file-3-524288-write: well-aligned +SCRATCH_MNT/file-4-524288-falloc: well-aligned +SCRATCH_MNT/file-4-524288-write: well-aligned +=== Testing size 256*8k on 8k stripe === +SCRATCH_MNT/file-1-2097152-falloc: well-aligned +SCRATCH_MNT/file-1-2097152-write: well-aligned +SCRATCH_MNT/file-2-2097152-falloc: well-aligned +SCRATCH_MNT/file-2-2097152-write: well-aligned +SCRATCH_MNT/file-3-2097152-falloc: well-aligned +SCRATCH_MNT/file-3-2097152-write: well-aligned +SCRATCH_MNT/file-4-2097152-falloc: well-aligned +SCRATCH_MNT/file-4-2097152-write: well-aligned +=== Testing size 1g falloc on 8k stripe === +/mnt/scratch/file-1g-falloc: well-aligned +=== Testing size 1073745920 falloc on 8k stripe === +SCRATCH_MNT/file-1073745920-falloc: well-aligned +=== mkfs with su 4 blocks x 4 === +=== Testing size 1*16k on 16k stripe === +SCRATCH_MNT/file-1-16384-falloc: well-aligned +SCRATCH_MNT/file-1-16384-write: well-aligned +SCRATCH_MNT/file-2-16384-falloc: well-aligned +SCRATCH_MNT/file-2-16384-write: well-aligned +SCRATCH_MNT/file-3-16384-falloc: well-aligned +SCRATCH_MNT/file-3-16384-write: well-aligned +SCRATCH_MNT/file-4-16384-falloc: well-aligned +SCRATCH_MNT/file-4-16384-write: well-aligned +=== Testing size 2*16k on 16k stripe === +SCRATCH_MNT/file-1-32768-falloc: well-aligned +SCRATCH_MNT/file-1-32768-write: well-aligned +SCRATCH_MNT/file-2-32768-falloc: well-aligned +SCRATCH_MNT/file-2-32768-write: well-aligned +SCRATCH_MNT/file-3-32768-falloc: well-aligned +SCRATCH_MNT/file-3-32768-write: well-aligned +SCRATCH_MNT/file-4-32768-falloc: well-aligned +SCRATCH_MNT/file-4-32768-write: well-aligned +=== Testing size 8*16k on 16k stripe === +SCRATCH_MNT/file-1-131072-falloc: well-aligned +SCRATCH_MNT/file-1-131072-write: well-aligned +SCRATCH_MNT/file-2-131072-falloc: well-aligned +SCRATCH_MNT/file-2-131072-write: well-aligned +SCRATCH_MNT/file-3-131072-falloc: well-aligned +SCRATCH_MNT/file-3-131072-write: well-aligned +SCRATCH_MNT/file-4-131072-falloc: well-aligned +SCRATCH_MNT/file-4-131072-write: well-aligned +=== Testing size 64*16k on 16k stripe === +SCRATCH_MNT/file-1-1048576-falloc: well-aligned +SCRATCH_MNT/file-1-1048576-write: well-aligned +SCRATCH_MNT/file-2-1048576-falloc: well-aligned +SCRATCH_MNT/file-2-1048576-write: well-aligned +SCRATCH_MNT/file-3-1048576-falloc: well-aligned +SCRATCH_MNT/file-3-1048576-write: well-aligned +SCRATCH_MNT/file-4-1048576-falloc: well-aligned +SCRATCH_MNT/file-4-1048576-write: well-aligned +=== Testing size 256*16k on 16k stripe === +SCRATCH_MNT/file-1-4194304-falloc: well-aligned +SCRATCH_MNT/file-1-4194304-write: well-aligned +SCRATCH_MNT/file-2-4194304-falloc: well-aligned +SCRATCH_MNT/file-2-4194304-write: well-aligned +SCRATCH_MNT/file-3-4194304-falloc: well-aligned +SCRATCH_MNT/file-3-4194304-write: well-aligned +SCRATCH_MNT/file-4-4194304-falloc: well-aligned +SCRATCH_MNT/file-4-4194304-write: well-aligned +=== Testing size 1g falloc on 16k stripe === +/mnt/scratch/file-1g-falloc: well-aligned +=== Testing size 1073745920 falloc on 16k stripe === +SCRATCH_MNT/file-1073745920-falloc: well-aligned +=== mkfs with su 8 blocks x 4 === +=== Testing size 1*32k on 32k stripe === +SCRATCH_MNT/file-1-32768-falloc: well-aligned +SCRATCH_MNT/file-1-32768-write: well-aligned +SCRATCH_MNT/file-2-32768-falloc: well-aligned +SCRATCH_MNT/file-2-32768-write: well-aligned +SCRATCH_MNT/file-3-32768-falloc: well-aligned +SCRATCH_MNT/file-3-32768-write: well-aligned +SCRATCH_MNT/file-4-32768-falloc: well-aligned +SCRATCH_MNT/file-4-32768-write: well-aligned +=== Testing size 2*32k on 32k stripe === +SCRATCH_MNT/file-1-65536-falloc: well-aligned +SCRATCH_MNT/file-1-65536-write: well-aligned +SCRATCH_MNT/file-2-65536-falloc: well-aligned +SCRATCH_MNT/file-2-65536-write: well-aligned +SCRATCH_MNT/file-3-65536-falloc: well-aligned +SCRATCH_MNT/file-3-65536-write: well-aligned +SCRATCH_MNT/file-4-65536-falloc: well-aligned +SCRATCH_MNT/file-4-65536-write: well-aligned +=== Testing size 8*32k on 32k stripe === +SCRATCH_MNT/file-1-262144-falloc: well-aligned +SCRATCH_MNT/file-1-262144-write: well-aligned +SCRATCH_MNT/file-2-262144-falloc: well-aligned +SCRATCH_MNT/file-2-262144-write: well-aligned +SCRATCH_MNT/file-3-262144-falloc: well-aligned +SCRATCH_MNT/file-3-262144-write: well-aligned +SCRATCH_MNT/file-4-262144-falloc: well-aligned +SCRATCH_MNT/file-4-262144-write: well-aligned +=== Testing size 64*32k on 32k stripe === +SCRATCH_MNT/file-1-2097152-falloc: well-aligned +SCRATCH_MNT/file-1-2097152-write: well-aligned +SCRATCH_MNT/file-2-2097152-falloc: well-aligned +SCRATCH_MNT/file-2-2097152-write: well-aligned +SCRATCH_MNT/file-3-2097152-falloc: well-aligned +SCRATCH_MNT/file-3-2097152-write: well-aligned +SCRATCH_MNT/file-4-2097152-falloc: well-aligned +SCRATCH_MNT/file-4-2097152-write: well-aligned +=== Testing size 256*32k on 32k stripe === +SCRATCH_MNT/file-1-8388608-falloc: well-aligned +SCRATCH_MNT/file-1-8388608-write: well-aligned +SCRATCH_MNT/file-2-8388608-falloc: well-aligned +SCRATCH_MNT/file-2-8388608-write: well-aligned +SCRATCH_MNT/file-3-8388608-falloc: well-aligned +SCRATCH_MNT/file-3-8388608-write: well-aligned +SCRATCH_MNT/file-4-8388608-falloc: well-aligned +SCRATCH_MNT/file-4-8388608-write: well-aligned +=== Testing size 1g falloc on 32k stripe === +/mnt/scratch/file-1g-falloc: well-aligned +=== Testing size 1073745920 falloc on 32k stripe === +SCRATCH_MNT/file-1073745920-falloc: well-aligned +=== mkfs with su 16 blocks x 4 === +=== Testing size 1*64k on 64k stripe === +SCRATCH_MNT/file-1-65536-falloc: well-aligned +SCRATCH_MNT/file-1-65536-write: well-aligned +SCRATCH_MNT/file-2-65536-falloc: well-aligned +SCRATCH_MNT/file-2-65536-write: well-aligned +SCRATCH_MNT/file-3-65536-falloc: well-aligned +SCRATCH_MNT/file-3-65536-write: well-aligned +SCRATCH_MNT/file-4-65536-falloc: well-aligned +SCRATCH_MNT/file-4-65536-write: well-aligned +=== Testing size 2*64k on 64k stripe === +SCRATCH_MNT/file-1-131072-falloc: well-aligned +SCRATCH_MNT/file-1-131072-write: well-aligned +SCRATCH_MNT/file-2-131072-falloc: well-aligned +SCRATCH_MNT/file-2-131072-write: well-aligned +SCRATCH_MNT/file-3-131072-falloc: well-aligned +SCRATCH_MNT/file-3-131072-write: well-aligned +SCRATCH_MNT/file-4-131072-falloc: well-aligned +SCRATCH_MNT/file-4-131072-write: well-aligned +=== Testing size 8*64k on 64k stripe === +SCRATCH_MNT/file-1-524288-falloc: well-aligned +SCRATCH_MNT/file-1-524288-write: well-aligned +SCRATCH_MNT/file-2-524288-falloc: well-aligned +SCRATCH_MNT/file-2-524288-write: well-aligned +SCRATCH_MNT/file-3-524288-falloc: well-aligned +SCRATCH_MNT/file-3-524288-write: well-aligned +SCRATCH_MNT/file-4-524288-falloc: well-aligned +SCRATCH_MNT/file-4-524288-write: well-aligned +=== Testing size 64*64k on 64k stripe === +SCRATCH_MNT/file-1-4194304-falloc: well-aligned +SCRATCH_MNT/file-1-4194304-write: well-aligned +SCRATCH_MNT/file-2-4194304-falloc: well-aligned +SCRATCH_MNT/file-2-4194304-write: well-aligned +SCRATCH_MNT/file-3-4194304-falloc: well-aligned +SCRATCH_MNT/file-3-4194304-write: well-aligned +SCRATCH_MNT/file-4-4194304-falloc: well-aligned +SCRATCH_MNT/file-4-4194304-write: well-aligned +=== Testing size 256*64k on 64k stripe === +SCRATCH_MNT/file-1-16777216-falloc: well-aligned +SCRATCH_MNT/file-1-16777216-write: well-aligned +SCRATCH_MNT/file-2-16777216-falloc: well-aligned +SCRATCH_MNT/file-2-16777216-write: well-aligned +SCRATCH_MNT/file-3-16777216-falloc: well-aligned +SCRATCH_MNT/file-3-16777216-write: well-aligned +SCRATCH_MNT/file-4-16777216-falloc: well-aligned +SCRATCH_MNT/file-4-16777216-write: well-aligned +=== Testing size 1g falloc on 64k stripe === +/mnt/scratch/file-1g-falloc: well-aligned +=== Testing size 1073745920 falloc on 64k stripe === +SCRATCH_MNT/file-1073745920-falloc: well-aligned +=== mkfs with su 32 blocks x 4 === +=== Testing size 1*128k on 128k stripe === +SCRATCH_MNT/file-1-131072-falloc: well-aligned +SCRATCH_MNT/file-1-131072-write: well-aligned +SCRATCH_MNT/file-2-131072-falloc: well-aligned +SCRATCH_MNT/file-2-131072-write: well-aligned +SCRATCH_MNT/file-3-131072-falloc: well-aligned +SCRATCH_MNT/file-3-131072-write: well-aligned +SCRATCH_MNT/file-4-131072-falloc: well-aligned +SCRATCH_MNT/file-4-131072-write: well-aligned +=== Testing size 2*128k on 128k stripe === +SCRATCH_MNT/file-1-262144-falloc: well-aligned +SCRATCH_MNT/file-1-262144-write: well-aligned +SCRATCH_MNT/file-2-262144-falloc: well-aligned +SCRATCH_MNT/file-2-262144-write: well-aligned +SCRATCH_MNT/file-3-262144-falloc: well-aligned +SCRATCH_MNT/file-3-262144-write: well-aligned +SCRATCH_MNT/file-4-262144-falloc: well-aligned +SCRATCH_MNT/file-4-262144-write: well-aligned +=== Testing size 8*128k on 128k stripe === +SCRATCH_MNT/file-1-1048576-falloc: well-aligned +SCRATCH_MNT/file-1-1048576-write: well-aligned +SCRATCH_MNT/file-2-1048576-falloc: well-aligned +SCRATCH_MNT/file-2-1048576-write: well-aligned +SCRATCH_MNT/file-3-1048576-falloc: well-aligned +SCRATCH_MNT/file-3-1048576-write: well-aligned +SCRATCH_MNT/file-4-1048576-falloc: well-aligned +SCRATCH_MNT/file-4-1048576-write: well-aligned +=== Testing size 64*128k on 128k stripe === +SCRATCH_MNT/file-1-8388608-falloc: well-aligned +SCRATCH_MNT/file-1-8388608-write: well-aligned +SCRATCH_MNT/file-2-8388608-falloc: well-aligned +SCRATCH_MNT/file-2-8388608-write: well-aligned +SCRATCH_MNT/file-3-8388608-falloc: well-aligned +SCRATCH_MNT/file-3-8388608-write: well-aligned +SCRATCH_MNT/file-4-8388608-falloc: well-aligned +SCRATCH_MNT/file-4-8388608-write: well-aligned +=== Testing size 256*128k on 128k stripe === +SCRATCH_MNT/file-1-33554432-falloc: well-aligned +SCRATCH_MNT/file-1-33554432-write: well-aligned +SCRATCH_MNT/file-2-33554432-falloc: well-aligned +SCRATCH_MNT/file-2-33554432-write: well-aligned +SCRATCH_MNT/file-3-33554432-falloc: well-aligned +SCRATCH_MNT/file-3-33554432-write: well-aligned +SCRATCH_MNT/file-4-33554432-falloc: well-aligned +SCRATCH_MNT/file-4-33554432-write: well-aligned +=== Testing size 1g falloc on 128k stripe === +/mnt/scratch/file-1g-falloc: well-aligned +=== Testing size 1073745920 falloc on 128k stripe === +SCRATCH_MNT/file-1073745920-falloc: well-aligned diff --git a/common.rc b/common.rc index 4425007..6cd11ff 100644 --- a/common.rc +++ b/common.rc @@ -300,11 +300,35 @@ _scratch_mkfs() $MKFS_UDF_PROG $MKFS_OPTIONS $* $SCRATCH_DEV > /dev/null ;; *) - /sbin/mkfs -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV > /dev/null + /sbin/mkfs -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV ;; esac } +scratch_mkfs_geom() +{ + blocksize=$1 + sunit_bytes=$2 + swidth_mult=$3 + + let sunit_blocks=$sunit_bytes/$blocksize + let swidth_blocks=$sunit_blocks*$swidth_mult + + case $FSTYP in + xfs) + MKFS_OPTIONS="-b size=$blocksize, -d su=$sunit_bytes,sw=$swidth_mult" + ;; + ext4) + MKFS_OPTIONS="-b $blocksize -E stride=$sunit_blocks,stripe_width=$swidth_blocks" + ;; + *) + _notrun "can't mkfs $FSTYP with geometry" + ;; + esac + _scratch_mkfs &>> $seq.full +} + +# Emulate a 4-data-disk stripe w/ various stripe units _scratch_xfs_db_options() { SCRATCH_OPTIONS="" diff --git a/group b/group index 342ac89..6b8528f 100644 --- a/group +++ b/group @@ -336,3 +336,4 @@ deprecated 220 auto quota quick 221 auto metadata quick 222 auto fsr ioctl quick +223 auto quick diff --git a/src/Makefile b/src/Makefile index baa2e94..d86d50a 100644 --- a/src/Makefile +++ b/src/Makefile @@ -14,7 +14,7 @@ TARGETS = dirstress fill fill2 getpagesize holes lstat64 \ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ - locktest unwritten_mmap bulkstat_unlink_test \ + locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable SUBDIRS = diff --git a/src/t_stripealign.c b/src/t_stripealign.c new file mode 100644 index 0000000..b2ef5c2 --- /dev/null +++ b/src/t_stripealign.c @@ -0,0 +1,72 @@ +/* + * t_stripealign.c + * + * Pint whether the file start block is stripe-aligned. + * + * Copyright (c) 2010 Eric Sandeen + * + * 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; either version 2, or (at your option) + * any later version. + */ +#include +#include +#include +#include +#include +#include +#include + +#define FIBMAP _IO(0x00, 1) /* bmap access */ + +/* + * If only filename given, print first block. + * + * If filename & sunit (in blocks) given, print whether we are well-aligned + */ + +int main(int argc, char ** argv) +{ + int fd; + int ret; + int sunit = 0; /* in blocks */ + char *filename; + unsigned int block = 0; + + if (argc < 3) { + printf("Usage: %s \n", argv[0]); + return 1; + } + + filename = argv[1]; + sunit = atoi(argv[2]); + + fd = open(filename, O_RDONLY); + if (fd < 0) { + perror("can't open file\n"); + return 1; + } + + ret = ioctl(fd, FIBMAP, &block); + if (ret < 0) { + close(fd); + perror("fibmap"); + return 1; + } + + close(fd); + + if (block % sunit) { + printf("%s: Start block %u not multiple of sunit %u\n", + filename, block, sunit); + return 1; + } else + printf("%s: well-aligned\n", filename); + + return 0; +} + + + + From sandeen@sandeen.net Tue Feb 2 19:47:09 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.9 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_43,J_CHICKENPOX_48,J_CHICKENPOX_52,J_CHICKENPOX_62 autolearn=no version=3.3.0-rupdated 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 o131l8Po203348 for ; Tue, 2 Feb 2010 19:47:08 -0600 X-ASG-Debug-ID: 1265161695-625403a80000-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 7D22A1371DC7 for ; Tue, 2 Feb 2010 17:48:15 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id cDgahNvP9qqvwxcC for ; Tue, 02 Feb 2010 17:48:15 -0800 (PST) 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 8E0FD1120416; Tue, 2 Feb 2010 19:48:14 -0600 (CST) Message-ID: <4B68D5DF.20808@sandeen.net> Date: Tue, 02 Feb 2010 19:48:15 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss X-ASG-Orig-Subj: [PATCH V3] xfstests: 223 - test file alignment on stripe geometry Subject: [PATCH V3] xfstests: 223 - test file alignment on stripe geometry References: <4B621529.20708@sandeen.net> <20100130105236.GA18286@infradead.org> <4B68B532.9000103@sandeen.net> In-Reply-To: <4B68B532.9000103@sandeen.net> 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: 1265161696 X-Barracuda-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.21505 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 A first-cut test to ensure that files are well-aligned on filesystems with stripe geometry. Several sizes of stripe units are mkfs'd, and then files are written and fallocated in various multiples of those stripe sizes. Each file is checked to ensure that the first block is stripe-aligned. (Ideally, for any fragmented files, we should ensure that each fragment start is well-aligned, but this does not do that yet) (slightly unrelated: don't send scratch mkfs output to /dev/null, we'd like to see mkfs output and direct it to $seq.full - this more or less matches _scratch_mkfs_xfs behavior and doesn't break any tests that I can see) Signed-off-by: Eric Sandeen --- V2: Address Christoph's review comments V3: add missing _ to the helper function, minor cleanups to the common.rc file (sorry for all the versions) :) diff --git a/223 b/223 new file mode 100755 index 0000000..a605b6d --- /dev/null +++ b/223 @@ -0,0 +1,96 @@ +#! /bin/bash +# FS QA Test No. 223 +# +# File alignment tests +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Eric Sandeen. 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=sandeen@sandeen.net + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +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 +_require_xfs_io_falloc + +rm -f $seq.full + +_filter_scratch() +{ + sed -e "s,$SCRATCH_MNT,SCRATCH_MNT,g" +} + +BLOCKSIZE=4096 + +for SUNIT_K in 8 16 32 64 128; do + let SUNIT_BYTES=$SUNIT_K*1024 + let SUNIT_BLOCKS=$SUNIT_BYTES/$BLOCKSIZE + + echo "=== mkfs with su $SUNIT_BLOCKS blocks x 4 ===" + _scratch_mkfs_geom $BLOCKSIZE $SUNIT_BYTES 4 &>> $seq.full + _scratch_mount + + for SIZE_MULT in 1 2 8 64 256; do + let SIZE=$SIZE_MULT*$SUNIT_BYTES + + echo "=== Testing size ${SIZE_MULT}*${SUNIT_K}k on ${SUNIT_K}k stripe ===" + for FILE in 1 2 3 4; do + xfs_io -F -f -c "falloc 0 $SIZE" $SCRATCH_MNT/file-$FILE-$SIZE-falloc &>> $seq.full + xfs_io -F -f -c "pwrite 0 $SIZE" $SCRATCH_MNT/file-$FILE-$SIZE-write &>> $seq.full + src/fibmap $SCRATCH_MNT/file-$FILE-$SIZE-falloc $SUNIT_BLOCKS | \ + _filter_scratch + src/fibmap $SCRATCH_MNT/file-$FILE-$SIZE-write $SUNIT_BLOCKS | \ + _filter_scratch + done + done + + echo "=== Testing size 1g falloc on ${SUNIT_K}k stripe ===" + xfs_io -F -f -c "falloc 0 1g" $SCRATCH_MNT/file-1g-falloc &>> $seq.full + src/fibmap $SCRATCH_MNT/file-1g-falloc $SUNIT_BLOCKS + + rm -f $SCRATCH_MNT/file-1g-falloc | _filter_scratch + + echo "=== Testing size 1073745920 falloc on ${SUNIT_K}k stripe ===" + xfs_io -F -f -c "falloc 0 1073745920" $SCRATCH_MNT/file-1073745920-falloc &>> $seq.full + src/fibmap $SCRATCH_MNT/file-1073745920-falloc $SUNIT_BLOCKS | _filter_scratch + + _scratch_unmount +done + +status=0 ; exit diff --git a/223.out b/223.out new file mode 100644 index 0000000..c9588ef --- /dev/null +++ b/223.out @@ -0,0 +1,251 @@ +QA output created by 223 +=== mkfs with su 2 blocks x 4 === +=== Testing size 1*8k on 8k stripe === +SCRATCH_MNT/file-1-8192-falloc: well-aligned +SCRATCH_MNT/file-1-8192-write: well-aligned +SCRATCH_MNT/file-2-8192-falloc: well-aligned +SCRATCH_MNT/file-2-8192-write: well-aligned +SCRATCH_MNT/file-3-8192-falloc: well-aligned +SCRATCH_MNT/file-3-8192-write: well-aligned +SCRATCH_MNT/file-4-8192-falloc: well-aligned +SCRATCH_MNT/file-4-8192-write: well-aligned +=== Testing size 2*8k on 8k stripe === +SCRATCH_MNT/file-1-16384-falloc: well-aligned +SCRATCH_MNT/file-1-16384-write: well-aligned +SCRATCH_MNT/file-2-16384-falloc: well-aligned +SCRATCH_MNT/file-2-16384-write: well-aligned +SCRATCH_MNT/file-3-16384-falloc: well-aligned +SCRATCH_MNT/file-3-16384-write: well-aligned +SCRATCH_MNT/file-4-16384-falloc: well-aligned +SCRATCH_MNT/file-4-16384-write: well-aligned +=== Testing size 8*8k on 8k stripe === +SCRATCH_MNT/file-1-65536-falloc: well-aligned +SCRATCH_MNT/file-1-65536-write: well-aligned +SCRATCH_MNT/file-2-65536-falloc: well-aligned +SCRATCH_MNT/file-2-65536-write: well-aligned +SCRATCH_MNT/file-3-65536-falloc: well-aligned +SCRATCH_MNT/file-3-65536-write: well-aligned +SCRATCH_MNT/file-4-65536-falloc: well-aligned +SCRATCH_MNT/file-4-65536-write: well-aligned +=== Testing size 64*8k on 8k stripe === +SCRATCH_MNT/file-1-524288-falloc: well-aligned +SCRATCH_MNT/file-1-524288-write: well-aligned +SCRATCH_MNT/file-2-524288-falloc: well-aligned +SCRATCH_MNT/file-2-524288-write: well-aligned +SCRATCH_MNT/file-3-524288-falloc: well-aligned +SCRATCH_MNT/file-3-524288-write: well-aligned +SCRATCH_MNT/file-4-524288-falloc: well-aligned +SCRATCH_MNT/file-4-524288-write: well-aligned +=== Testing size 256*8k on 8k stripe === +SCRATCH_MNT/file-1-2097152-falloc: well-aligned +SCRATCH_MNT/file-1-2097152-write: well-aligned +SCRATCH_MNT/file-2-2097152-falloc: well-aligned +SCRATCH_MNT/file-2-2097152-write: well-aligned +SCRATCH_MNT/file-3-2097152-falloc: well-aligned +SCRATCH_MNT/file-3-2097152-write: well-aligned +SCRATCH_MNT/file-4-2097152-falloc: well-aligned +SCRATCH_MNT/file-4-2097152-write: well-aligned +=== Testing size 1g falloc on 8k stripe === +/mnt/scratch/file-1g-falloc: well-aligned +=== Testing size 1073745920 falloc on 8k stripe === +SCRATCH_MNT/file-1073745920-falloc: well-aligned +=== mkfs with su 4 blocks x 4 === +=== Testing size 1*16k on 16k stripe === +SCRATCH_MNT/file-1-16384-falloc: well-aligned +SCRATCH_MNT/file-1-16384-write: well-aligned +SCRATCH_MNT/file-2-16384-falloc: well-aligned +SCRATCH_MNT/file-2-16384-write: well-aligned +SCRATCH_MNT/file-3-16384-falloc: well-aligned +SCRATCH_MNT/file-3-16384-write: well-aligned +SCRATCH_MNT/file-4-16384-falloc: well-aligned +SCRATCH_MNT/file-4-16384-write: well-aligned +=== Testing size 2*16k on 16k stripe === +SCRATCH_MNT/file-1-32768-falloc: well-aligned +SCRATCH_MNT/file-1-32768-write: well-aligned +SCRATCH_MNT/file-2-32768-falloc: well-aligned +SCRATCH_MNT/file-2-32768-write: well-aligned +SCRATCH_MNT/file-3-32768-falloc: well-aligned +SCRATCH_MNT/file-3-32768-write: well-aligned +SCRATCH_MNT/file-4-32768-falloc: well-aligned +SCRATCH_MNT/file-4-32768-write: well-aligned +=== Testing size 8*16k on 16k stripe === +SCRATCH_MNT/file-1-131072-falloc: well-aligned +SCRATCH_MNT/file-1-131072-write: well-aligned +SCRATCH_MNT/file-2-131072-falloc: well-aligned +SCRATCH_MNT/file-2-131072-write: well-aligned +SCRATCH_MNT/file-3-131072-falloc: well-aligned +SCRATCH_MNT/file-3-131072-write: well-aligned +SCRATCH_MNT/file-4-131072-falloc: well-aligned +SCRATCH_MNT/file-4-131072-write: well-aligned +=== Testing size 64*16k on 16k stripe === +SCRATCH_MNT/file-1-1048576-falloc: well-aligned +SCRATCH_MNT/file-1-1048576-write: well-aligned +SCRATCH_MNT/file-2-1048576-falloc: well-aligned +SCRATCH_MNT/file-2-1048576-write: well-aligned +SCRATCH_MNT/file-3-1048576-falloc: well-aligned +SCRATCH_MNT/file-3-1048576-write: well-aligned +SCRATCH_MNT/file-4-1048576-falloc: well-aligned +SCRATCH_MNT/file-4-1048576-write: well-aligned +=== Testing size 256*16k on 16k stripe === +SCRATCH_MNT/file-1-4194304-falloc: well-aligned +SCRATCH_MNT/file-1-4194304-write: well-aligned +SCRATCH_MNT/file-2-4194304-falloc: well-aligned +SCRATCH_MNT/file-2-4194304-write: well-aligned +SCRATCH_MNT/file-3-4194304-falloc: well-aligned +SCRATCH_MNT/file-3-4194304-write: well-aligned +SCRATCH_MNT/file-4-4194304-falloc: well-aligned +SCRATCH_MNT/file-4-4194304-write: well-aligned +=== Testing size 1g falloc on 16k stripe === +/mnt/scratch/file-1g-falloc: well-aligned +=== Testing size 1073745920 falloc on 16k stripe === +SCRATCH_MNT/file-1073745920-falloc: well-aligned +=== mkfs with su 8 blocks x 4 === +=== Testing size 1*32k on 32k stripe === +SCRATCH_MNT/file-1-32768-falloc: well-aligned +SCRATCH_MNT/file-1-32768-write: well-aligned +SCRATCH_MNT/file-2-32768-falloc: well-aligned +SCRATCH_MNT/file-2-32768-write: well-aligned +SCRATCH_MNT/file-3-32768-falloc: well-aligned +SCRATCH_MNT/file-3-32768-write: well-aligned +SCRATCH_MNT/file-4-32768-falloc: well-aligned +SCRATCH_MNT/file-4-32768-write: well-aligned +=== Testing size 2*32k on 32k stripe === +SCRATCH_MNT/file-1-65536-falloc: well-aligned +SCRATCH_MNT/file-1-65536-write: well-aligned +SCRATCH_MNT/file-2-65536-falloc: well-aligned +SCRATCH_MNT/file-2-65536-write: well-aligned +SCRATCH_MNT/file-3-65536-falloc: well-aligned +SCRATCH_MNT/file-3-65536-write: well-aligned +SCRATCH_MNT/file-4-65536-falloc: well-aligned +SCRATCH_MNT/file-4-65536-write: well-aligned +=== Testing size 8*32k on 32k stripe === +SCRATCH_MNT/file-1-262144-falloc: well-aligned +SCRATCH_MNT/file-1-262144-write: well-aligned +SCRATCH_MNT/file-2-262144-falloc: well-aligned +SCRATCH_MNT/file-2-262144-write: well-aligned +SCRATCH_MNT/file-3-262144-falloc: well-aligned +SCRATCH_MNT/file-3-262144-write: well-aligned +SCRATCH_MNT/file-4-262144-falloc: well-aligned +SCRATCH_MNT/file-4-262144-write: well-aligned +=== Testing size 64*32k on 32k stripe === +SCRATCH_MNT/file-1-2097152-falloc: well-aligned +SCRATCH_MNT/file-1-2097152-write: well-aligned +SCRATCH_MNT/file-2-2097152-falloc: well-aligned +SCRATCH_MNT/file-2-2097152-write: well-aligned +SCRATCH_MNT/file-3-2097152-falloc: well-aligned +SCRATCH_MNT/file-3-2097152-write: well-aligned +SCRATCH_MNT/file-4-2097152-falloc: well-aligned +SCRATCH_MNT/file-4-2097152-write: well-aligned +=== Testing size 256*32k on 32k stripe === +SCRATCH_MNT/file-1-8388608-falloc: well-aligned +SCRATCH_MNT/file-1-8388608-write: well-aligned +SCRATCH_MNT/file-2-8388608-falloc: well-aligned +SCRATCH_MNT/file-2-8388608-write: well-aligned +SCRATCH_MNT/file-3-8388608-falloc: well-aligned +SCRATCH_MNT/file-3-8388608-write: well-aligned +SCRATCH_MNT/file-4-8388608-falloc: well-aligned +SCRATCH_MNT/file-4-8388608-write: well-aligned +=== Testing size 1g falloc on 32k stripe === +/mnt/scratch/file-1g-falloc: well-aligned +=== Testing size 1073745920 falloc on 32k stripe === +SCRATCH_MNT/file-1073745920-falloc: well-aligned +=== mkfs with su 16 blocks x 4 === +=== Testing size 1*64k on 64k stripe === +SCRATCH_MNT/file-1-65536-falloc: well-aligned +SCRATCH_MNT/file-1-65536-write: well-aligned +SCRATCH_MNT/file-2-65536-falloc: well-aligned +SCRATCH_MNT/file-2-65536-write: well-aligned +SCRATCH_MNT/file-3-65536-falloc: well-aligned +SCRATCH_MNT/file-3-65536-write: well-aligned +SCRATCH_MNT/file-4-65536-falloc: well-aligned +SCRATCH_MNT/file-4-65536-write: well-aligned +=== Testing size 2*64k on 64k stripe === +SCRATCH_MNT/file-1-131072-falloc: well-aligned +SCRATCH_MNT/file-1-131072-write: well-aligned +SCRATCH_MNT/file-2-131072-falloc: well-aligned +SCRATCH_MNT/file-2-131072-write: well-aligned +SCRATCH_MNT/file-3-131072-falloc: well-aligned +SCRATCH_MNT/file-3-131072-write: well-aligned +SCRATCH_MNT/file-4-131072-falloc: well-aligned +SCRATCH_MNT/file-4-131072-write: well-aligned +=== Testing size 8*64k on 64k stripe === +SCRATCH_MNT/file-1-524288-falloc: well-aligned +SCRATCH_MNT/file-1-524288-write: well-aligned +SCRATCH_MNT/file-2-524288-falloc: well-aligned +SCRATCH_MNT/file-2-524288-write: well-aligned +SCRATCH_MNT/file-3-524288-falloc: well-aligned +SCRATCH_MNT/file-3-524288-write: well-aligned +SCRATCH_MNT/file-4-524288-falloc: well-aligned +SCRATCH_MNT/file-4-524288-write: well-aligned +=== Testing size 64*64k on 64k stripe === +SCRATCH_MNT/file-1-4194304-falloc: well-aligned +SCRATCH_MNT/file-1-4194304-write: well-aligned +SCRATCH_MNT/file-2-4194304-falloc: well-aligned +SCRATCH_MNT/file-2-4194304-write: well-aligned +SCRATCH_MNT/file-3-4194304-falloc: well-aligned +SCRATCH_MNT/file-3-4194304-write: well-aligned +SCRATCH_MNT/file-4-4194304-falloc: well-aligned +SCRATCH_MNT/file-4-4194304-write: well-aligned +=== Testing size 256*64k on 64k stripe === +SCRATCH_MNT/file-1-16777216-falloc: well-aligned +SCRATCH_MNT/file-1-16777216-write: well-aligned +SCRATCH_MNT/file-2-16777216-falloc: well-aligned +SCRATCH_MNT/file-2-16777216-write: well-aligned +SCRATCH_MNT/file-3-16777216-falloc: well-aligned +SCRATCH_MNT/file-3-16777216-write: well-aligned +SCRATCH_MNT/file-4-16777216-falloc: well-aligned +SCRATCH_MNT/file-4-16777216-write: well-aligned +=== Testing size 1g falloc on 64k stripe === +/mnt/scratch/file-1g-falloc: well-aligned +=== Testing size 1073745920 falloc on 64k stripe === +SCRATCH_MNT/file-1073745920-falloc: well-aligned +=== mkfs with su 32 blocks x 4 === +=== Testing size 1*128k on 128k stripe === +SCRATCH_MNT/file-1-131072-falloc: well-aligned +SCRATCH_MNT/file-1-131072-write: well-aligned +SCRATCH_MNT/file-2-131072-falloc: well-aligned +SCRATCH_MNT/file-2-131072-write: well-aligned +SCRATCH_MNT/file-3-131072-falloc: well-aligned +SCRATCH_MNT/file-3-131072-write: well-aligned +SCRATCH_MNT/file-4-131072-falloc: well-aligned +SCRATCH_MNT/file-4-131072-write: well-aligned +=== Testing size 2*128k on 128k stripe === +SCRATCH_MNT/file-1-262144-falloc: well-aligned +SCRATCH_MNT/file-1-262144-write: well-aligned +SCRATCH_MNT/file-2-262144-falloc: well-aligned +SCRATCH_MNT/file-2-262144-write: well-aligned +SCRATCH_MNT/file-3-262144-falloc: well-aligned +SCRATCH_MNT/file-3-262144-write: well-aligned +SCRATCH_MNT/file-4-262144-falloc: well-aligned +SCRATCH_MNT/file-4-262144-write: well-aligned +=== Testing size 8*128k on 128k stripe === +SCRATCH_MNT/file-1-1048576-falloc: well-aligned +SCRATCH_MNT/file-1-1048576-write: well-aligned +SCRATCH_MNT/file-2-1048576-falloc: well-aligned +SCRATCH_MNT/file-2-1048576-write: well-aligned +SCRATCH_MNT/file-3-1048576-falloc: well-aligned +SCRATCH_MNT/file-3-1048576-write: well-aligned +SCRATCH_MNT/file-4-1048576-falloc: well-aligned +SCRATCH_MNT/file-4-1048576-write: well-aligned +=== Testing size 64*128k on 128k stripe === +SCRATCH_MNT/file-1-8388608-falloc: well-aligned +SCRATCH_MNT/file-1-8388608-write: well-aligned +SCRATCH_MNT/file-2-8388608-falloc: well-aligned +SCRATCH_MNT/file-2-8388608-write: well-aligned +SCRATCH_MNT/file-3-8388608-falloc: well-aligned +SCRATCH_MNT/file-3-8388608-write: well-aligned +SCRATCH_MNT/file-4-8388608-falloc: well-aligned +SCRATCH_MNT/file-4-8388608-write: well-aligned +=== Testing size 256*128k on 128k stripe === +SCRATCH_MNT/file-1-33554432-falloc: well-aligned +SCRATCH_MNT/file-1-33554432-write: well-aligned +SCRATCH_MNT/file-2-33554432-falloc: well-aligned +SCRATCH_MNT/file-2-33554432-write: well-aligned +SCRATCH_MNT/file-3-33554432-falloc: well-aligned +SCRATCH_MNT/file-3-33554432-write: well-aligned +SCRATCH_MNT/file-4-33554432-falloc: well-aligned +SCRATCH_MNT/file-4-33554432-write: well-aligned +=== Testing size 1g falloc on 128k stripe === +/mnt/scratch/file-1g-falloc: well-aligned +=== Testing size 1073745920 falloc on 128k stripe === +SCRATCH_MNT/file-1073745920-falloc: well-aligned diff --git a/common.rc b/common.rc index 1685514..9c375dc 100644 --- a/common.rc +++ b/common.rc @@ -292,11 +292,37 @@ _scratch_mkfs() $MKFS_UDF_PROG $MKFS_OPTIONS $* $SCRATCH_DEV > /dev/null ;; *) - /sbin/mkfs -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV > /dev/null + /sbin/mkfs -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV ;; esac } +# Emulate an N-data-disk stripe w/ various stripe units +# _scratch_mkfs_geom [optional blocksize] +_scratch_mkfs_geom() +{ + sunit_bytes=$1 + swidth_mult=$2 + blocksize=$3 + [ -z "$blocksize" ] && blocksize=4096 + + let sunit_blocks=$sunit_bytes/$blocksize + let swidth_blocks=$sunit_blocks*$swidth_mult + + case $FSTYP in + xfs) + MKFS_OPTIONS="-b size=$blocksize, -d su=$sunit_bytes,sw=$swidth_mult" + ;; + ext4) + MKFS_OPTIONS="-b $blocksize -E stride=$sunit_blocks,stripe_width=$swidth_blocks" + ;; + *) + _notrun "can't mkfs $FSTYP with geometry" + ;; + esac + _scratch_mkfs +} + _scratch_xfs_db_options() { SCRATCH_OPTIONS="" diff --git a/group b/group index 342ac89..6b8528f 100644 --- a/group +++ b/group @@ -336,3 +336,4 @@ deprecated 220 auto quota quick 221 auto metadata quick 222 auto fsr ioctl quick +223 auto quick diff --git a/src/Makefile b/src/Makefile index baa2e94..d86d50a 100644 --- a/src/Makefile +++ b/src/Makefile @@ -14,7 +14,7 @@ TARGETS = dirstress fill fill2 getpagesize holes lstat64 \ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ - locktest unwritten_mmap bulkstat_unlink_test \ + locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable SUBDIRS = diff --git a/src/t_stripealign.c b/src/t_stripealign.c new file mode 100644 index 0000000..e6b0925 --- /dev/null +++ b/src/t_stripealign.c @@ -0,0 +1,68 @@ +/* + * t_stripealign.c + * + * Print whether the file start block is stripe-aligned. + * + * Copyright (c) 2010 Eric Sandeen + * + * 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; either version 2, or (at your option) + * any later version. + */ +#include +#include +#include +#include +#include +#include +#include + +#define FIBMAP _IO(0x00, 1) /* bmap access */ + +/* + * If only filename given, print first block. + * + * If filename & sunit (in blocks) given, print whether we are well-aligned + */ + +int main(int argc, char ** argv) +{ + int fd; + int ret; + int sunit = 0; /* in blocks */ + char *filename; + unsigned int block = 0; + + if (argc < 3) { + printf("Usage: %s \n", argv[0]); + return 1; + } + + filename = argv[1]; + sunit = atoi(argv[2]); + + fd = open(filename, O_RDONLY); + if (fd < 0) { + perror("can't open file\n"); + return 1; + } + + ret = ioctl(fd, FIBMAP, &block); + if (ret < 0) { + close(fd); + perror("fibmap"); + return 1; + } + + close(fd); + + if (block % sunit) { + printf("%s: Start block %u not multiple of sunit %u\n", + filename, block, sunit); + return 1; + } else + printf("%s: well-aligned\n", filename); + + return 0; +} From sandeen@sandeen.net Tue Feb 2 19:53:27 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o131rQpO203516 for ; Tue, 2 Feb 2010 19:53:27 -0600 X-ASG-Debug-ID: 1265162074-6fc602e30000-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 B92C91C9B785 for ; Tue, 2 Feb 2010 17:54:34 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id MhynKT2gwYGx9JMG for ; Tue, 02 Feb 2010 17:54:34 -0800 (PST) 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 EDFE311203F1 for ; Tue, 2 Feb 2010 19:54:33 -0600 (CST) Message-ID: <4B68D75A.9020105@sandeen.net> Date: Tue, 02 Feb 2010 19:54:34 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH V2] xfstests: routine to create scratch of certain size Subject: [PATCH V2] xfstests: routine to create scratch of certain size References: <4B621D89.8070800@sandeen.net> In-Reply-To: <4B621D89.8070800@sandeen.net> 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: 1265162075 X-Barracuda-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.21506 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 This is needed for later enospc tests to be generic Signed-off-by: Eric Sandeen --- V2: Address Christoph's comment about use of MKFS_OPTIONS; just do it like the other geom helper and explicitly -set- MKFS_OPTIONS for scratch, to set the size, then just call _scratch_mkfs (this would override any global MKFS_OPTIONS setting, but I think that's ok for now, and not sure how these options might interact w/ previously set MKFS_OPTIONS anyway) diff --git a/common.rc b/common.rc index 9c375dc..a6526a3 100644 --- a/common.rc +++ b/common.rc @@ -297,6 +297,29 @@ _scratch_mkfs() esac } +# Create fs of certain size on scratch device +# _scratch_mkfs_sized [optional blocksize] +_scratch_mkfs_sized() +{ + fssize=$1 + blocksize=$2 + [ -z "$blocksize" ] && blocksize=4096 + let blocks=$fssize/$blocksize + + case $FSTYP in + xfs) + MKFS_OPTIONS="-d size=$fssize -b size=$blocksize" + ;; + ext2|ext3|ext4) + MKFS_OPTIONS="-b $blocksize $SCRATCH_DEV $blocks" + ;; + *) + _notrun "Filesystem $FSTYP not supported in _scratch_mkfs_sized" + ;; + esac + _scratch_mkfs +} + # Emulate an N-data-disk stripe w/ various stripe units # _scratch_mkfs_geom [optional blocksize] _scratch_mkfs_geom() From SRS0+DEPi+63+fromorbit.com=dave@internode.on.net Tue Feb 2 20:09:28 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1329SLg204047 for ; Tue, 2 Feb 2010 20:09:28 -0600 X-ASG-Debug-ID: 1265163035-525703e10000-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 8131D1A72E3 for ; Tue, 2 Feb 2010 18:10:36 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id 1nfxv8mqiJXH0weA for ; Tue, 02 Feb 2010 18:10:36 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12207811-1927428 for ; Wed, 03 Feb 2010 12:40:34 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NcS7h-0003nl-Du for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:33 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NcS7W-0006j0-Cv for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:22 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 06/10] xfs: kill the unused XFS_QMOPT_* flush flags V2 Subject: [PATCH 06/10] xfs: kill the unused XFS_QMOPT_* flush flags V2 Date: Wed, 3 Feb 2010 10:25:00 +1100 Message-Id: <1265153104-29680-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265153104-29680-1-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265163037 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21506 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 dquots are never flushed asynchronously. Remove the flag and the async write support from the flush function. Make the default flush a delwri flush to make the inode flush code, which leaves the XFS_QMOPT_SYNC the only flag remaining. Convert that to use SYNC_WAIT instead, just like the inode flush code. V2: - just pass flush flags straight through Signed-off-by: Dave Chinner --- fs/xfs/quota/xfs_dquot.c | 13 ++++++------- fs/xfs/quota/xfs_dquot_item.c | 2 +- fs/xfs/quota/xfs_qm.c | 14 ++++++-------- fs/xfs/xfs_quota.h | 8 +------- 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index 1620a56..5f79dd7 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -1187,7 +1187,7 @@ xfs_qm_dqflush( * block, nada. */ if (!XFS_DQ_IS_DIRTY(dqp) || - (!(flags & XFS_QMOPT_SYNC) && atomic_read(&dqp->q_pincount) > 0)) { + (!(flags & SYNC_WAIT) && atomic_read(&dqp->q_pincount) > 0)) { xfs_dqfunlock(dqp); return 0; } @@ -1251,18 +1251,17 @@ xfs_qm_dqflush( xfs_log_force(mp, 0); } - if (flags & XFS_QMOPT_DELWRI) { - xfs_bdwrite(mp, bp); - } else { + if (flags & SYNC_WAIT) error = xfs_bwrite(mp, bp); - } + else + xfs_bdwrite(mp, bp); trace_xfs_dqflush_done(dqp); /* * dqp is still locked, but caller is free to unlock it now. */ - return (error); + return error; } @@ -1443,7 +1442,7 @@ xfs_qm_dqpurge( * We don't care about getting disk errors here. We need * to purge this dquot anyway, so we go ahead regardless. */ - error = xfs_qm_dqflush(dqp, XFS_QMOPT_SYNC); + error = xfs_qm_dqflush(dqp, SYNC_WAIT); if (error) xfs_fs_cmn_err(CE_WARN, mp, "xfs_qm_dqpurge: dquot %p flush failed", dqp); diff --git a/fs/xfs/quota/xfs_dquot_item.c b/fs/xfs/quota/xfs_dquot_item.c index dda0fb0..4e4ee9a 100644 --- a/fs/xfs/quota/xfs_dquot_item.c +++ b/fs/xfs/quota/xfs_dquot_item.c @@ -153,7 +153,7 @@ xfs_qm_dquot_logitem_push( * lock without sleeping, then there must not have been * anyone in the process of flushing the dquot. */ - error = xfs_qm_dqflush(dqp, XFS_QMOPT_DELWRI); + error = xfs_qm_dqflush(dqp, 0); if (error) xfs_fs_cmn_err(CE_WARN, dqp->q_mount, "xfs_qm_dquot_logitem_push: push error %d on dqp %p", diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 11cfd82..8699e51 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -450,7 +450,7 @@ xfs_qm_unmount_quotas( STATIC int xfs_qm_dqflush_all( xfs_mount_t *mp, - int flags) + int sync_mode) { int recl; xfs_dquot_t *dqp; @@ -486,7 +486,7 @@ again: * across a disk write. */ xfs_qm_mplist_unlock(mp); - error = xfs_qm_dqflush(dqp, flags); + error = xfs_qm_dqflush(dqp, sync_mode); xfs_dqunlock(dqp); if (error) return error; @@ -926,13 +926,11 @@ xfs_qm_sync( { int recl, restarts; xfs_dquot_t *dqp; - uint flush_flags; int error; if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp)) return 0; - flush_flags = (flags & SYNC_WAIT) ? XFS_QMOPT_SYNC : XFS_QMOPT_DELWRI; restarts = 0; again: @@ -992,7 +990,7 @@ xfs_qm_sync( * across a disk write */ xfs_qm_mplist_unlock(mp); - error = xfs_qm_dqflush(dqp, flush_flags); + error = xfs_qm_dqflush(dqp, flags); xfs_dqunlock(dqp); if (error && XFS_FORCED_SHUTDOWN(mp)) return 0; /* Need to prevent umount failure */ @@ -1796,7 +1794,7 @@ xfs_qm_quotacheck( * successfully. */ if (!error) - error = xfs_qm_dqflush_all(mp, XFS_QMOPT_DELWRI); + error = xfs_qm_dqflush_all(mp, 0); /* * We can get this error if we couldn't do a dquot allocation inside @@ -2018,7 +2016,7 @@ xfs_qm_shake_freelist( * We flush it delayed write, so don't bother * releasing the mplock. */ - error = xfs_qm_dqflush(dqp, XFS_QMOPT_DELWRI); + error = xfs_qm_dqflush(dqp, 0); if (error) { xfs_fs_cmn_err(CE_WARN, dqp->q_mount, "xfs_qm_dqflush_all: dquot %p flush failed", dqp); @@ -2201,7 +2199,7 @@ xfs_qm_dqreclaim_one(void) * We flush it delayed write, so don't bother * releasing the freelist lock. */ - error = xfs_qm_dqflush(dqp, XFS_QMOPT_DELWRI); + error = xfs_qm_dqflush(dqp, 0); if (error) { xfs_fs_cmn_err(CE_WARN, dqp->q_mount, "xfs_qm_dqreclaim: dquot %p flush failed", dqp); diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index 21d11d9..fdcab3f 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h @@ -223,15 +223,9 @@ typedef struct xfs_qoff_logformat { #define XFS_QMOPT_RES_INOS 0x0800000 /* - * flags for dqflush and dqflush_all. - */ -#define XFS_QMOPT_SYNC 0x1000000 -#define XFS_QMOPT_DELWRI 0x4000000 - -/* * flags for dqalloc. */ -#define XFS_QMOPT_INHERIT 0x8000000 +#define XFS_QMOPT_INHERIT 0x1000000 /* * flags to xfs_trans_mod_dquot. -- 1.6.5 From SRS0+DEPi+63+fromorbit.com=dave@internode.on.net Tue Feb 2 20:09:29 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1329SJo204045 for ; Tue, 2 Feb 2010 20:09:28 -0600 X-ASG-Debug-ID: 1265163035-1da700e90000-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 BEB811371D8C for ; Tue, 2 Feb 2010 18:10:35 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id ONJ5AcT2DhvfFPtz for ; Tue, 02 Feb 2010 18:10:35 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12207801-1927428 for ; Wed, 03 Feb 2010 12:40:33 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NcS7h-0003q0-LG for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:33 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NcS7g-0006jB-Iq for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:32 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 10/10] xfs: kill xfs_bawrite Subject: [PATCH 10/10] xfs: kill xfs_bawrite Date: Wed, 3 Feb 2010 10:25:04 +1100 Message-Id: <1265153104-29680-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265153104-29680-1-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265163036 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21507 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 There are no more users of this function left in the XFS code now that we've switched everything to delayed write flushing. Remove it. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_buf.c | 19 ------------------- fs/xfs/linux-2.6/xfs_buf.h | 1 - 2 files changed, 0 insertions(+), 20 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 4556a4c..d50df3a 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -1078,25 +1078,6 @@ xfs_bwrite( return error; } -int -xfs_bawrite( - void *mp, - struct xfs_buf *bp) -{ - trace_xfs_buf_bawrite(bp, _RET_IP_); - - ASSERT(bp->b_bn != XFS_BUF_DADDR_NULL); - - xfs_buf_delwri_dequeue(bp); - - bp->b_flags &= ~(XBF_READ | XBF_DELWRI | XBF_READ_AHEAD); - bp->b_flags |= (XBF_WRITE | XBF_ASYNC | _XBF_RUN_QUEUES); - - bp->b_mount = mp; - bp->b_strat = xfs_bdstrat_cb; - return xfs_bdstrat_cb(bp); -} - void xfs_bdwrite( void *mp, diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index be45e8c..386e736 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h @@ -233,7 +233,6 @@ extern void xfs_buf_unlock(xfs_buf_t *); /* Buffer Read and Write Routines */ extern int xfs_bwrite(struct xfs_mount *mp, struct xfs_buf *bp); -extern int xfs_bawrite(void *mp, xfs_buf_t *bp); extern void xfs_bdwrite(void *mp, xfs_buf_t *bp); extern void xfsbdstrat(struct xfs_mount *, struct xfs_buf *); -- 1.6.5 From SRS0+DEPi+63+fromorbit.com=dave@internode.on.net Tue Feb 2 20:09:30 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_66 autolearn=no version=3.3.0-rupdated 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 o1329Tp8204061 for ; Tue, 2 Feb 2010 20:09:30 -0600 X-ASG-Debug-ID: 1265163035-1da700e90002-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 7FCAB1371D5E for ; Tue, 2 Feb 2010 18:10:37 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id sFjwDCzyGoheCGyn for ; Tue, 02 Feb 2010 18:10:37 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12207822-1927428 for ; Wed, 03 Feb 2010 12:40:36 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NcS7h-0003pr-BW for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:33 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NcS7W-0006iu-9c for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:22 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 04/10] xfs: Sort delayed write buffers before dispatch Subject: [PATCH 04/10] xfs: Sort delayed write buffers before dispatch Date: Wed, 3 Feb 2010 10:24:58 +1100 Message-Id: <1265153104-29680-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265153104-29680-1-git-send-email-david@fromorbit.com> References: <1265153104-29680-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: 1265163038 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21507 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 Currently when the xfsbufd writes delayed write buffers, it pushes them to disk in the order they come off the delayed write list. If there are lots of buffers ѕpread widely over the disk, this results in overwhelming the elevator sort queues in the block layer and we end up losing the posibility of merging adjacent buffers to minimise the number of IOs. Use the new generic list_sort function to sort the delwri dispatch queue before issue to ensure that the buffers are pushed in the most friendly order possible to the lower layers. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_buf.c | 87 ++++++++++++++++++++++++++++++-------------- 1 files changed, 60 insertions(+), 27 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index b306265..4556a4c 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "xfs_sb.h" #include "xfs_inum.h" @@ -1877,14 +1878,42 @@ xfs_buf_delwri_split( } +/* + * Compare function is more complex than it needs to be because + * the return value is only 32 bits and we are doing comparisons + * on 64 bit values + */ +static int +xfs_buf_cmp( + void *priv, + struct list_head *a, + struct list_head *b) +{ + struct xfs_buf *ap = container_of(a, struct xfs_buf, b_list); + struct xfs_buf *bp = container_of(b, struct xfs_buf, b_list); + xfs_daddr_t diff; + + diff = ap->b_bn - bp->b_bn; + if (diff < 0) + return -1; + if (diff > 0) + return 1; + return 0; +} + +void +xfs_buf_delwri_sort( + xfs_buftarg_t *target, + struct list_head *list) +{ + list_sort(NULL, list, xfs_buf_cmp); +} + STATIC int xfsbufd( void *data) { - struct list_head tmp; - xfs_buftarg_t *target = (xfs_buftarg_t *)data; - int count; - xfs_buf_t *bp; + xfs_buftarg_t *target = (xfs_buftarg_t *)data; current->flags |= PF_MEMALLOC; @@ -1893,6 +1922,8 @@ xfsbufd( do { long age = xfs_buf_age_centisecs * msecs_to_jiffies(10); long tout = xfs_buf_timer_centisecs * msecs_to_jiffies(10); + int count = 0; + struct list_head tmp; if (unlikely(freezing(current))) { set_bit(XBT_FORCE_SLEEP, &target->bt_flags); @@ -1907,11 +1938,10 @@ xfsbufd( schedule_timeout_interruptible(tout); xfs_buf_delwri_split(target, &tmp, age); - count = 0; + list_sort(NULL, &tmp, xfs_buf_cmp); while (!list_empty(&tmp)) { - bp = list_entry(tmp.next, xfs_buf_t, b_list); - ASSERT(target == bp->b_target); - + struct xfs_buf *bp; + bp = list_first_entry(&tmp, struct xfs_buf, b_list); list_del_init(&bp->b_list); xfs_buf_iostrategy(bp); count++; @@ -1937,42 +1967,45 @@ xfs_flush_buftarg( xfs_buftarg_t *target, int wait) { - struct list_head tmp; - xfs_buf_t *bp, *n; + xfs_buf_t *bp; int pincount = 0; + LIST_HEAD(tmp_list); + LIST_HEAD(wait_list); xfs_buf_runall_queues(xfsconvertd_workqueue); xfs_buf_runall_queues(xfsdatad_workqueue); xfs_buf_runall_queues(xfslogd_workqueue); set_bit(XBT_FORCE_FLUSH, &target->bt_flags); - pincount = xfs_buf_delwri_split(target, &tmp, 0); + pincount = xfs_buf_delwri_split(target, &tmp_list, 0); /* - * Dropped the delayed write list lock, now walk the temporary list + * Dropped the delayed write list lock, now walk the temporary list. + * All I/O is issued async and then if we need to wait for completion + * we do that after issuing all the IO. */ - list_for_each_entry_safe(bp, n, &tmp, b_list) { + list_sort(NULL, &tmp_list, xfs_buf_cmp); + while (!list_empty(&tmp_list)) { + bp = list_first_entry(&tmp_list, struct xfs_buf, b_list); ASSERT(target == bp->b_target); - if (wait) + list_del_init(&bp->b_list); + if (wait) { bp->b_flags &= ~XBF_ASYNC; - else - list_del_init(&bp->b_list); - + list_add(&bp->b_list, &wait_list); + } xfs_buf_iostrategy(bp); } - if (wait) + if (wait) { + /* Expedite and wait for IO to complete. */ blk_run_address_space(target->bt_mapping); + while (!list_empty(&wait_list)) { + bp = list_first_entry(&wait_list, struct xfs_buf, b_list); - /* - * Remaining list items must be flushed before returning - */ - while (!list_empty(&tmp)) { - bp = list_entry(tmp.next, xfs_buf_t, b_list); - - list_del_init(&bp->b_list); - xfs_iowait(bp); - xfs_buf_relse(bp); + list_del_init(&bp->b_list); + xfs_iowait(bp); + xfs_buf_relse(bp); + } } return pincount; -- 1.6.5 From SRS0+DEPi+63+fromorbit.com=dave@internode.on.net Tue Feb 2 20:09:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1329V6g204081 for ; Tue, 2 Feb 2010 20:09:31 -0600 X-ASG-Debug-ID: 1265163035-1da700e90004-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 48B591371DC4 for ; Tue, 2 Feb 2010 18:10:39 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id pfGB9etN4N5IBim6 for ; Tue, 02 Feb 2010 18:10:39 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12207830-1927428 for ; Wed, 03 Feb 2010 12:40:38 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NcS7X-0003nr-KP for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:23 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NcS7W-0006j9-I7 for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:22 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 09/10] xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 Subject: [PATCH 09/10] xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 Date: Wed, 3 Feb 2010 10:25:03 +1100 Message-Id: <1265153104-29680-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265153104-29680-1-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265163040 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21507 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 has already be flushed delayed write, xfs_inode_clean() returns true and hence xfs_fs_write_inode() can return on a synchronous inode write without having written the inode. Currently these sycnhronous writes only come sync(1), unmount, a sycnhronous NFS export and cachefiles so should be relatively rare and out of common performance paths. Realistically, a synchronous inode write is not necessary here; we can treat this like fsync where we either force the log if there are no unlogged changes, or do a sync transaction if there are unlogged changes. The will result real synchronous semantics as the fsync will issue barriers, but may slow down the above two configurations as a result. However, if the inode is not pinned and has no unlogged changes, then the fsync code is a no-op and hence it may be faster than the existing code. The only thing we need tobe careful of here is if the inode has not yet been flushed to the inode buffer bulkstat scans will fail to see it. Hence even on a sync write, we should try to flush the inode to the backing buffer. This is only a best-effort delwri flush - it doesn't guarantee that the flush happens but races with other inode operations should not happen as the inode lock is not dropped between the fsync operation and the flush. For the asynchronous write, move the clean check until after we have locked up the inode. With the inode locked and the flush lock held, we know that if the inodis clean there are no pending changes in the log and there are no current outstanding delayed writes or IO in progress, so if it reports clean now it really is clean. This matches the order of locking and checks in xfs_sync_inode_attr(). Version 2: - ilock is now held external to the fsync call to close race windows between the fsync and delwri flush to the backing buffer. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 54 ++++++++++++++++++++++++----------------- 1 files changed, 32 insertions(+), 22 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 226fe20..1257a5f 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1045,35 +1045,45 @@ xfs_fs_write_inode( error = xfs_wait_on_pages(ip, 0, -1); if (error) goto out; - } - - /* - * Bypass inodes which have already been cleaned by - * the inode flush clustering code inside xfs_iflush - */ - if (xfs_inode_clean(ip)) - goto out; - - /* - * We make this non-blocking if the inode is contended, return - * EAGAIN to indicate to the caller that they did not succeed. - * This prevents the flush path from blocking on inodes inside - * another operation right now, they get caught later by xfs_sync. - */ - if (sync) { + /* + * The fsync operation makes inode changes stable and it + * reduces the IOs we have to do here from two (log and inode) + * to just the log. We still need to do a delwri write of the + * inode after this to flush it to the bacing buffer so that + * bulkstat works properly. + */ xfs_ilock(ip, XFS_ILOCK_SHARED); - xfs_iflock(ip); - - error = xfs_iflush(ip, SYNC_WAIT); + error = xfs_fsync(ip, XFS_ILOCK_SHARED); + if (error) + goto out_unlock; + error = EAGAIN; } else { + /* + * We make this non-blocking if the inode is contended, return + * EAGAIN to indicate to the caller that they did not succeed. + * This prevents the flush path from blocking on inodes inside + * another operation right now, they get caught later by xfs_sync. + */ error = EAGAIN; if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) goto out; - if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) - goto out_unlock; + } + + if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) + goto out_unlock; - error = xfs_iflush(ip, 0); + /* + * Now we have the flush lock and the inode is not pinned, we can check + * if the inode is really clean as we know that there are no pending + * transaction completions, it is not waiting on the delayed write + * queue and there is no IO in progress. + */ + error = 0; + if (xfs_inode_clean(ip)) { + xfs_ifunlock(ip); + goto out_unlock; } + error = xfs_iflush(ip, 0); out_unlock: xfs_iunlock(ip, XFS_ILOCK_SHARED); -- 1.6.5 From SRS0+DEPi+63+fromorbit.com=dave@internode.on.net Tue Feb 2 20:09:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1329Vao204083 for ; Tue, 2 Feb 2010 20:09:31 -0600 X-ASG-Debug-ID: 1265163035-525703e10004-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 C404C1A72E5 for ; Tue, 2 Feb 2010 18:10:39 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id oHQh4ljxcCsG2Eho for ; Tue, 02 Feb 2010 18:10:39 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12207816-1927428 for ; Wed, 03 Feb 2010 12:40:35 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NcS7h-0003ps-Cf for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:33 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NcS7W-0006ix-BH for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:22 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 05/10] xfs: Use delay write promotion for dquot flushing Subject: [PATCH 05/10] xfs: Use delay write promotion for dquot flushing Date: Wed, 3 Feb 2010 10:24:59 +1100 Message-Id: <1265153104-29680-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265153104-29680-1-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265163040 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21506 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 xfs_qm_dqflock_pushbuf_wait() does a very similar trick to item pushing used to do to flush out delayed write dquot buffers. Change it to use the new promotion method rather than an async flush. Also, xfs_qm_dqflock_pushbuf_wait() can return without the flush lock held, yet the callers make the assumption that after this call the flush lock is held. Always return with the flush lock held. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/quota/xfs_dquot.c | 25 ++++++++++--------------- 1 files changed, 10 insertions(+), 15 deletions(-) diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index f9baeed..1620a56 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -1528,21 +1528,16 @@ xfs_qm_dqflock_pushbuf_wait( */ bp = xfs_incore(dqp->q_mount->m_ddev_targp, dqp->q_blkno, XFS_QI_DQCHUNKLEN(dqp->q_mount), XBF_TRYLOCK); - if (bp != NULL) { - if (XFS_BUF_ISDELAYWRITE(bp)) { - int error; - - if (XFS_BUF_ISPINNED(bp)) - xfs_log_force(dqp->q_mount, 0); - error = xfs_bawrite(dqp->q_mount, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, dqp->q_mount, - "xfs_qm_dqflock_pushbuf_wait: " - "pushbuf error %d on dqp %p, bp %p", - error, dqp, bp); - } else { - xfs_buf_relse(bp); - } + if (!bp) + goto out_lock; + + if (XFS_BUF_ISDELAYWRITE(bp)) { + if (XFS_BUF_ISPINNED(bp)) + xfs_log_force(dqp->q_mount, 0); + xfs_buf_delwri_promote(bp); + wake_up_process(bp->b_target->bt_task); } + xfs_buf_relse(bp); +out_lock: xfs_dqflock(dqp); } -- 1.6.5 From SRS0+DEPi+63+fromorbit.com=dave@internode.on.net Tue Feb 2 20:09:33 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1329X2P204105 for ; Tue, 2 Feb 2010 20:09:33 -0600 X-ASG-Debug-ID: 1265163035-525703e10006-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 5BFD21A72E9 for ; Tue, 2 Feb 2010 18:10:41 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id GNDM3Qz4JB3ughFQ for ; Tue, 02 Feb 2010 18:10:41 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12207846-1927428 for ; Wed, 03 Feb 2010 12:40:40 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NcS7X-0003ne-7o for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:23 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NcS7W-0006ik-3V for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:22 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 01/10] xfs: Make inode reclaim states explicit Subject: [PATCH 01/10] xfs: Make inode reclaim states explicit Date: Wed, 3 Feb 2010 10:24:55 +1100 Message-Id: <1265153104-29680-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265153104-29680-1-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265163042 X-Barracuda-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.21506 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 A.K.A.: don't rely on xfs_iflush() return value in reclaim We have gradually been moving checks out of the reclaim code because they are duplicated in xfs_iflush(). We've had a history of problems in this area, and many of them stem from the overloading of the return values from xfs_iflush() and interaction with inode flush locking to determine if the inode is safe to reclaim. With the desire to move to delayed write flushing of inodes and non-blocking inode tree reclaim walks, the overloading of the return value of xfs_iflush makes it very difficult to determine the correct thing to do next. This patch explicitly re-adds the checks to the inode reclaim code, removing the reliance on the return value of xfs_iflush() to determine what to do next. It also means that we can clearly document all the inode states that reclaim must handle and hence we can easily see that we handled all the necessary cases. This also removes the need for the xfs_inode_clean() check in xfs_iflush() as all callers now check this first (safely). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_sync.c | 80 ++++++++++++++++++++++++++++++++---------- fs/xfs/xfs_inode.c | 11 +----- fs/xfs/xfs_inode.h | 1 + 3 files changed, 63 insertions(+), 29 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index c9b863e..98b8937 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -706,12 +706,43 @@ __xfs_inode_clear_reclaim_tag( XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); } +/* + * Inodes in different states need to be treated differently, and the return + * value of xfs_iflush is not sufficient to get this right. The following table + * lists the inode states and the reclaim actions necessary for non-blocking + * reclaim: + * + * + * inode state iflush ret required action + * --------------- ---------- --------------- + * bad - reclaim + * shutdown EIO unpin and reclaim + * clean, unpinned 0 reclaim + * stale, unpinned 0 reclaim + * clean, pinned(*) 0 unpin and reclaim + * stale, pinned 0 unpin and reclaim + * dirty, async 0 block on flush lock, reclaim + * dirty, sync flush 0 block on flush lock, reclaim + * + * (*) dgc: I don't think the clean, pinned state is possible but it gets + * handled anyway given the order of checks implemented. + * + * Hence the order of actions after gaining the locks should be: + * bad => reclaim + * shutdown => unpin and reclaim + * pinned => unpin + * stale => reclaim + * clean => reclaim + * dirty => flush, wait and reclaim + */ STATIC int xfs_reclaim_inode( struct xfs_inode *ip, struct xfs_perag *pag, int sync_mode) { + int error; + /* * The radix tree lock here protects a thread in xfs_iget from racing * with us starting reclaim on the inode. Once we have the @@ -729,30 +760,41 @@ xfs_reclaim_inode( spin_unlock(&ip->i_flags_lock); write_unlock(&pag->pag_ici_lock); - /* - * If the inode is still dirty, then flush it out. If the inode - * is not in the AIL, then it will be OK to flush it delwri as - * long as xfs_iflush() does not keep any references to the inode. - * We leave that decision up to xfs_iflush() since it has the - * knowledge of whether it's OK to simply do a delwri flush of - * the inode or whether we need to wait until the inode is - * pulled from the AIL. - * We get the flush lock regardless, though, just to make sure - * we don't free it while it is being flushed. - */ xfs_ilock(ip, XFS_ILOCK_EXCL); xfs_iflock(ip); - /* - * In the case of a forced shutdown we rely on xfs_iflush() to - * wait for the inode to be unpinned before returning an error. - */ - if (!is_bad_inode(VFS_I(ip)) && xfs_iflush(ip, sync_mode) == 0) { - /* synchronize with xfs_iflush_done */ - xfs_iflock(ip); - xfs_ifunlock(ip); + if (is_bad_inode(VFS_I(ip))) + goto reclaim; + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) { + xfs_iunpin_wait(ip); + goto reclaim; + } + if (xfs_ipincount(ip)) + xfs_iunpin_wait(ip); + if (xfs_iflags_test(ip, XFS_ISTALE)) + goto reclaim; + if (xfs_inode_clean(ip)) + goto reclaim; + + /* Now we have an inode that needs flushing */ + error = xfs_iflush(ip, sync_mode); + if (!error) { + switch(sync_mode) { + case XFS_IFLUSH_DELWRI_ELSE_ASYNC: + case XFS_IFLUSH_DELWRI: + case XFS_IFLUSH_ASYNC: + case XFS_IFLUSH_DELWRI_ELSE_SYNC: + case XFS_IFLUSH_SYNC: + /* IO issued, synchronise with IO completion */ + xfs_iflock(ip); + default: + ASSERT(0); + break; + } } +reclaim: + xfs_ifunlock(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); xfs_ireclaim(ip); return 0; diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index d0d1b5a..8d0666d 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2493,7 +2493,7 @@ __xfs_iunpin_wait( wait_event(ip->i_ipin_wait, (atomic_read(&ip->i_pincount) == 0)); } -static inline void +void xfs_iunpin_wait( xfs_inode_t *ip) { @@ -2849,15 +2849,6 @@ xfs_iflush( mp = ip->i_mount; /* - * If the inode isn't dirty, then just release the inode flush lock and - * do nothing. - */ - if (xfs_inode_clean(ip)) { - xfs_ifunlock(ip); - return 0; - } - - /* * We can't flush the inode until it is unpinned, so wait for it if we * are allowed to block. We know noone new can pin it, because we are * holding the inode lock shared and you need to hold it exclusively to diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index ec1f28c..8b618ea 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -483,6 +483,7 @@ int xfs_iunlink(struct xfs_trans *, xfs_inode_t *); void xfs_iext_realloc(xfs_inode_t *, int, int); void xfs_ipin(xfs_inode_t *); void xfs_iunpin(xfs_inode_t *); +void xfs_iunpin_wait(xfs_inode_t *); int xfs_iflush(xfs_inode_t *, uint); void xfs_ichgtime(xfs_inode_t *, int); void xfs_lock_inodes(xfs_inode_t **, int, uint); -- 1.6.5 From SRS0+DEPi+63+fromorbit.com=dave@internode.on.net Tue Feb 2 20:09:35 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1329Ua9204063 for ; Tue, 2 Feb 2010 20:09:35 -0600 X-ASG-Debug-ID: 1265163035-525703e10002-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 1C9981A72E5 for ; Tue, 2 Feb 2010 18:10:38 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id HSHzon25eAb5NBWs for ; Tue, 02 Feb 2010 18:10:38 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12207825-1927428 for ; Wed, 03 Feb 2010 12:40:37 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NcS7X-0003nq-IY for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:23 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NcS7W-0006j6-GI for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:22 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 08/10] xfs: move the inode locking outside xfs_fsync() Subject: [PATCH 08/10] xfs: move the inode locking outside xfs_fsync() Date: Wed, 3 Feb 2010 10:25:02 +1100 Message-Id: <1265153104-29680-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265153104-29680-1-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265163039 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21506 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 have a need for a delayed write inode flush operation to be made atomically with an fsync to avoid physically writing inodes but still keeping inode buffer information up to date for bulkstat. Move the inode locking outside xfs_fsync() to allow this to be done. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 6 +++++- fs/xfs/linux-2.6/xfs_lrw.c | 5 +++-- fs/xfs/xfs_vnodeops.c | 34 ++++++++++++++++------------------ fs/xfs/xfs_vnodeops.h | 2 +- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index e4caeb2..a2c8321 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -177,9 +177,13 @@ xfs_file_fsync( int datasync) { struct xfs_inode *ip = XFS_I(dentry->d_inode); + int error; xfs_iflags_clear(ip, XFS_ITRUNCATED); - return -xfs_fsync(ip); + xfs_ilock(ip, XFS_ILOCK_SHARED); + error = -xfs_fsync(ip, XFS_ILOCK_SHARED); + xfs_iunlock(ip, XFS_ILOCK_SHARED); + return error; } STATIC int diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index c80fa00..508135c 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c @@ -754,11 +754,12 @@ write_retry: error = error2; if (need_i_mutex) mutex_lock(&inode->i_mutex); - xfs_ilock(xip, iolock); + xfs_ilock(xip, iolock | XFS_ILOCK_SHARED); - error2 = xfs_fsync(xip); + error2 = xfs_fsync(xip, XFS_ILOCK_SHARED); if (!error) error = error2; + xfs_iunlock(xip, XFS_ILOCK_SHARED); } out_unlock_internal: diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 43241e2..afcb635 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -590,10 +590,22 @@ xfs_readlink( * the I/O lock while flushing the data, and the inode lock while flushing the * inode. The inode lock CANNOT be held while flushing the data, so acquire * after we're done with that. + * + * We always need to make sure that the required inode state is safe on disk. + * The inode might be clean but we still might need to force the log because of + * committed transactions that haven't hit the disk yet. Likewise, there could + * be unflushed non-transactional changes to the inode core that have to go to + * disk and this requires us to issue a synchronous transaction to capture + * these changes correctly. + * + * This code relies on the assumption that if the update_* fields of the inode + * are clear and the inode is unpinned then it is clean and no action is + * required. */ int xfs_fsync( - xfs_inode_t *ip) + xfs_inode_t *ip, + int lock_mode) { xfs_trans_t *tp; int error = 0; @@ -604,20 +616,6 @@ xfs_fsync( if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return XFS_ERROR(EIO); - /* - * We always need to make sure that the required inode state is safe on - * disk. The inode might be clean but we still might need to force the - * log because of committed transactions that haven't hit the disk yet. - * Likewise, there could be unflushed non-transactional changes to the - * inode core that have to go to disk and this requires us to issue - * a synchronous transaction to capture these changes correctly. - * - * This code relies on the assumption that if the update_* fields - * of the inode are clear and the inode is unpinned then it is clean - * and no action is required. - */ - xfs_ilock(ip, XFS_ILOCK_SHARED); - if (!ip->i_update_core) { /* * Timestamps/size haven't changed since last inode flush or @@ -627,7 +625,6 @@ xfs_fsync( * disk yet, the inode will be still be pinned. If it is, * force the log. */ - xfs_iunlock(ip, XFS_ILOCK_SHARED); if (xfs_ipincount(ip)) { error = _xfs_log_force(ip->i_mount, XFS_LOG_SYNC, &log_flushed); @@ -637,7 +634,7 @@ xfs_fsync( * Kick off a transaction to log the inode core to get the * updates. The sync transaction will also force the log. */ - xfs_iunlock(ip, XFS_ILOCK_SHARED); + xfs_iunlock(ip, lock_mode); tp = xfs_trans_alloc(ip->i_mount, XFS_TRANS_FSYNC_TS); error = xfs_trans_reserve(tp, 0, XFS_FSYNC_TS_LOG_RES(ip->i_mount), 0, 0, 0); @@ -662,7 +659,8 @@ xfs_fsync( xfs_trans_set_sync(tp); error = _xfs_trans_commit(tp, 0, &log_flushed); - xfs_iunlock(ip, XFS_ILOCK_EXCL); + if (lock_mode != XFS_ILOCK_EXCL) + xfs_ilock_demote(ip, XFS_ILOCK_EXCL); } if (ip->i_mount->m_flags & XFS_MOUNT_BARRIER) { diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h index 774f407..eacd297 100644 --- a/fs/xfs/xfs_vnodeops.h +++ b/fs/xfs/xfs_vnodeops.h @@ -21,7 +21,7 @@ int xfs_setattr(struct xfs_inode *ip, struct iattr *vap, int flags); #define XFS_ATTR_NOACL 0x08 /* Don't call xfs_acl_chmod */ int xfs_readlink(struct xfs_inode *ip, char *link); -int xfs_fsync(struct xfs_inode *ip); +int xfs_fsync(struct xfs_inode *ip, int lock_mode); int xfs_release(struct xfs_inode *ip); int xfs_inactive(struct xfs_inode *ip); int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name, -- 1.6.5 From SRS0+DEPi+63+fromorbit.com=dave@internode.on.net Tue Feb 2 20:09:34 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1329XiD204108 for ; Tue, 2 Feb 2010 20:09:33 -0600 X-ASG-Debug-ID: 1265163040-163b021e0000-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 D195B1C9B81C for ; Tue, 2 Feb 2010 18:10:41 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id cm9XUFBOHV79s4LF for ; Tue, 02 Feb 2010 18:10:41 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12207807-1927428 for multiple; Wed, 03 Feb 2010 12:40:34 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NcS7h-0003pu-H3; Wed, 03 Feb 2010 10:25:33 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NcS7W-0006j3-Ee; Wed, 03 Feb 2010 10:25:22 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: Christoph Hellwig X-ASG-Orig-Subj: [PATCH 07/10] xfs: remove invalid barrier optimization from xfs_fsync Subject: [PATCH 07/10] xfs: remove invalid barrier optimization from xfs_fsync Date: Wed, 3 Feb 2010 10:25:01 +1100 Message-Id: <1265153104-29680-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265153104-29680-1-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265163042 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21506 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 We always need to flush the disk write cache and can't skip it just because the no inode attributes have changed. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/xfs_vnodeops.c | 12 ++---------- 1 files changed, 2 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index fd108b7..43241e2 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -597,7 +597,7 @@ xfs_fsync( { xfs_trans_t *tp; int error = 0; - int log_flushed = 0, changed = 1; + int log_flushed = 0; xfs_itrace_entry(ip); @@ -627,18 +627,10 @@ xfs_fsync( * disk yet, the inode will be still be pinned. If it is, * force the log. */ - xfs_iunlock(ip, XFS_ILOCK_SHARED); - if (xfs_ipincount(ip)) { error = _xfs_log_force(ip->i_mount, XFS_LOG_SYNC, &log_flushed); - } else { - /* - * If the inode is not pinned and nothing has changed - * we don't need to flush the cache. - */ - changed = 0; } } else { /* @@ -673,7 +665,7 @@ xfs_fsync( xfs_iunlock(ip, XFS_ILOCK_EXCL); } - if ((ip->i_mount->m_flags & XFS_MOUNT_BARRIER) && changed) { + if (ip->i_mount->m_flags & XFS_MOUNT_BARRIER) { /* * If the log write didn't issue an ordered tag we need * to flush the disk cache for the data device now. -- 1.6.5 From SRS0+DEPi+63+fromorbit.com=dave@internode.on.net Tue Feb 2 20:09:37 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1329a2a204153 for ; Tue, 2 Feb 2010 20:09:37 -0600 X-ASG-Debug-ID: 1265163035-1da700e90006-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 0072E1371DD6 for ; Tue, 2 Feb 2010 18:10:40 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id SfLQNDwwuLxHIoBk for ; Tue, 02 Feb 2010 18:10:40 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12207832-1927428 for ; Wed, 03 Feb 2010 12:40:39 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NcS7X-0003ng-AP for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:23 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NcS7W-0006iq-7w for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:22 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 03/10] xfs: Don't issue buffer IO direct from AIL push V2 Subject: [PATCH 03/10] xfs: Don't issue buffer IO direct from AIL push V2 Date: Wed, 3 Feb 2010 10:24:57 +1100 Message-Id: <1265153104-29680-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265153104-29680-1-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265163042 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21507 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 All buffers logged into the AIL are marked as delayed write. When the AIL needs to push the buffer out, it issues an async write of the buffer. This means that IO patterns are dependent on the order of buffers in the AIL. Instead of flushing the buffer, promote the buffer in the delayed write list so that the next time the xfsbufd is run the buffer will be flushed by the xfsbufd. Return the state to the xfsaild that the buffer was promoted so that the xfsaild knows that it needs to cause the xfsbufd to run to flush the buffers that were promoted. Using the xfsbufd for issuing the IO allows us to dispatch all buffer IO from the one queue. This means that we can make much more enlightened decisions on what order to flush buffers to disk as we don't have multiple places issuing IO. Optimisations to xfsbufd will be in a future patch. Version 2 - kill XFS_ITEM_FLUSHING as it is now unused. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_buf.c | 29 ++++++++++++ fs/xfs/linux-2.6/xfs_buf.h | 2 + fs/xfs/linux-2.6/xfs_trace.h | 1 + fs/xfs/quota/xfs_dquot_item.c | 85 +++++------------------------------ fs/xfs/quota/xfs_dquot_item.h | 4 -- fs/xfs/xfs_buf_item.c | 64 +++++++++++++++------------ fs/xfs/xfs_inode_item.c | 98 ++++++---------------------------------- fs/xfs/xfs_inode_item.h | 6 --- fs/xfs/xfs_trans.h | 3 +- fs/xfs/xfs_trans_ail.c | 13 +++--- 10 files changed, 102 insertions(+), 203 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 44e20e5..b306265 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -1778,6 +1778,35 @@ xfs_buf_delwri_dequeue( trace_xfs_buf_delwri_dequeue(bp, _RET_IP_); } +/* + * If a delwri buffer needs to be pushed before it has aged out, then promote + * it to the head of the delwri queue so that it will be flushed on the next + * xfsbufd run. We do this by resetting the queuetime of the buffer to be older + * than the age currently needed to flush the buffer. Hence the next time the + * xfsbufd sees it is guaranteed to be considered old enough to flush. + */ +void +xfs_buf_delwri_promote( + struct xfs_buf *bp) +{ + struct xfs_buftarg *btp = bp->b_target; + long age = xfs_buf_age_centisecs * msecs_to_jiffies(10) + 1; + + ASSERT(bp->b_flags & XBF_DELWRI); + ASSERT(bp->b_flags & _XBF_DELWRI_Q); + + /* + * Check the buffer age before locking the delayed write queue as we + * don't need to promote buffers that are already past the flush age. + */ + if (bp->b_queuetime < jiffies - age) + return; + bp->b_queuetime = jiffies - age; + spin_lock(&btp->bt_delwrite_lock); + list_move(&bp->b_list, &btp->bt_delwrite_queue); + spin_unlock(&btp->bt_delwrite_lock); +} + STATIC void xfs_buf_runall_queues( struct workqueue_struct *queue) diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index ea8c198..be45e8c 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h @@ -266,6 +266,7 @@ 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 *); /* Buffer Daemon Setup Routines */ extern int xfs_buf_init(void); @@ -395,6 +396,7 @@ extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *); extern void xfs_wait_buftarg(xfs_buftarg_t *); extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int); extern int xfs_flush_buftarg(xfs_buftarg_t *, int); + #ifdef CONFIG_KDB_MODULES extern struct list_head *xfs_get_buftarg_list(void); #endif diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 1bb09e7..a4574dc 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -483,6 +483,7 @@ DEFINE_BUF_ITEM_EVENT(xfs_buf_item_unlock); DEFINE_BUF_ITEM_EVENT(xfs_buf_item_unlock_stale); DEFINE_BUF_ITEM_EVENT(xfs_buf_item_committed); DEFINE_BUF_ITEM_EVENT(xfs_buf_item_push); +DEFINE_BUF_ITEM_EVENT(xfs_buf_item_pushbuf); DEFINE_BUF_ITEM_EVENT(xfs_trans_get_buf); DEFINE_BUF_ITEM_EVENT(xfs_trans_get_buf_recur); DEFINE_BUF_ITEM_EVENT(xfs_trans_getsb); diff --git a/fs/xfs/quota/xfs_dquot_item.c b/fs/xfs/quota/xfs_dquot_item.c index 1b56437..dda0fb0 100644 --- a/fs/xfs/quota/xfs_dquot_item.c +++ b/fs/xfs/quota/xfs_dquot_item.c @@ -212,66 +212,31 @@ xfs_qm_dquot_logitem_pushbuf( xfs_dquot_t *dqp; xfs_mount_t *mp; xfs_buf_t *bp; - uint dopush; dqp = qip->qli_dquot; ASSERT(XFS_DQ_IS_LOCKED(dqp)); /* - * The qli_pushbuf_flag keeps others from - * trying to duplicate our effort. - */ - ASSERT(qip->qli_pushbuf_flag != 0); - ASSERT(qip->qli_push_owner == current_pid()); - - /* * If flushlock isn't locked anymore, chances are that the * 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)) { - qip->qli_pushbuf_flag = 0; xfs_dqunlock(dqp); return; } mp = dqp->q_mount; bp = xfs_incore(mp->m_ddev_targp, qip->qli_format.qlf_blkno, XFS_QI_DQCHUNKLEN(mp), XBF_TRYLOCK); - if (bp != NULL) { - if (XFS_BUF_ISDELAYWRITE(bp)) { - dopush = ((qip->qli_item.li_flags & XFS_LI_IN_AIL) && - !completion_done(&dqp->q_flush)); - qip->qli_pushbuf_flag = 0; - xfs_dqunlock(dqp); - - if (XFS_BUF_ISPINNED(bp)) - xfs_log_force(mp, 0); - - if (dopush) { - int error; -#ifdef XFSRACEDEBUG - delay_for_intr(); - delay(300); -#endif - error = xfs_bawrite(mp, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, mp, - "xfs_qm_dquot_logitem_pushbuf: pushbuf error %d on qip %p, bp %p", - error, qip, bp); - } else { - xfs_buf_relse(bp); - } - } else { - qip->qli_pushbuf_flag = 0; - xfs_dqunlock(dqp); - xfs_buf_relse(bp); - } + xfs_dqunlock(dqp); + if (!bp) return; - } + if (XFS_BUF_ISDELAYWRITE(bp)) + xfs_buf_delwri_promote(bp); + xfs_buf_relse(bp); + return; - qip->qli_pushbuf_flag = 0; - xfs_dqunlock(dqp); } /* @@ -289,50 +254,24 @@ xfs_qm_dquot_logitem_trylock( xfs_dq_logitem_t *qip) { xfs_dquot_t *dqp; - uint retval; dqp = qip->qli_dquot; if (atomic_read(&dqp->q_pincount) > 0) - return (XFS_ITEM_PINNED); + return XFS_ITEM_PINNED; if (! xfs_qm_dqlock_nowait(dqp)) - return (XFS_ITEM_LOCKED); + return XFS_ITEM_LOCKED; - retval = XFS_ITEM_SUCCESS; if (!xfs_dqflock_nowait(dqp)) { /* - * The dquot is already being flushed. It may have been - * flushed delayed write, however, and we don't want to - * get stuck waiting for that to complete. So, we want to check - * to see if we can lock the dquot's buffer without sleeping. - * If we can and it is marked for delayed write, then we - * hold it and send it out from the push routine. We don't - * want to do that now since we might sleep in the device - * strategy routine. We also don't want to grab the buffer lock - * here because we'd like not to call into the buffer cache - * while holding the AIL lock. - * Make sure to only return PUSHBUF if we set pushbuf_flag - * ourselves. If someone else is doing it then we don't - * want to go to the push routine and duplicate their efforts. + * dquot has already been flushed to the backing buffer, + * leave it locked, pushbuf routine will unlock it. */ - if (qip->qli_pushbuf_flag == 0) { - qip->qli_pushbuf_flag = 1; - ASSERT(qip->qli_format.qlf_blkno == dqp->q_blkno); -#ifdef DEBUG - qip->qli_push_owner = current_pid(); -#endif - /* - * The dquot is left locked. - */ - retval = XFS_ITEM_PUSHBUF; - } else { - retval = XFS_ITEM_FLUSHING; - xfs_dqunlock_nonotify(dqp); - } + return XFS_ITEM_PUSHBUF; } ASSERT(qip->qli_item.li_flags & XFS_LI_IN_AIL); - return (retval); + return XFS_ITEM_SUCCESS; } diff --git a/fs/xfs/quota/xfs_dquot_item.h b/fs/xfs/quota/xfs_dquot_item.h index 5a63253..5acae2a 100644 --- a/fs/xfs/quota/xfs_dquot_item.h +++ b/fs/xfs/quota/xfs_dquot_item.h @@ -27,10 +27,6 @@ typedef struct xfs_dq_logitem { xfs_log_item_t qli_item; /* common portion */ struct xfs_dquot *qli_dquot; /* dquot ptr */ xfs_lsn_t qli_flush_lsn; /* lsn at last flush */ - unsigned short qli_pushbuf_flag; /* 1 bit used in push_ail */ -#ifdef DEBUG - uint64_t qli_push_owner; -#endif xfs_dq_logformat_t qli_format; /* logged structure */ } xfs_dq_logitem_t; diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index e0a1158..f3c49e6 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -467,8 +467,10 @@ xfs_buf_item_unpin_remove( /* * 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, pull the - * buffer from the free list, mark it busy, and return 1. + * the lock right away, return 0. If we can get the lock, take a + * reference to the buffer. If this is a delayed write buffer that + * needs AIL help to be written back, invoke the pushbuf routine + * rather than the normal success path. */ STATIC uint xfs_buf_item_trylock( @@ -477,24 +479,18 @@ xfs_buf_item_trylock( xfs_buf_t *bp; bp = bip->bli_buf; - - if (XFS_BUF_ISPINNED(bp)) { + if (XFS_BUF_ISPINNED(bp)) return XFS_ITEM_PINNED; - } - - if (!XFS_BUF_CPSEMA(bp)) { + if (!XFS_BUF_CPSEMA(bp)) return XFS_ITEM_LOCKED; - } - /* - * Remove the buffer from the free list. Only do this - * if it's on the free list. Private buffers like the - * superblock buffer are not. - */ + /* take a reference to the buffer. */ XFS_BUF_HOLD(bp); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); trace_xfs_buf_item_trylock(bip); + if (XFS_BUF_ISDELAYWRITE(bp)) + return XFS_ITEM_PUSHBUF; return XFS_ITEM_SUCCESS; } @@ -626,11 +622,9 @@ xfs_buf_item_committed( } /* - * This is called to asynchronously write the buffer associated with this - * buf log item out to disk. The buffer will already have been locked by - * a successful call to xfs_buf_item_trylock(). If the buffer still has - * B_DELWRI set, then get it going out to disk with a call to bawrite(). - * If not, then just release the buffer. + * The buffer is locked, but is not a delayed write buffer. This happens + * if we race with IO completion and hence we don't want to try to write it + * again. Just release the buffer. */ STATIC void xfs_buf_item_push( @@ -642,17 +636,29 @@ xfs_buf_item_push( trace_xfs_buf_item_push(bip); bp = bip->bli_buf; + ASSERT(!XFS_BUF_ISDELAYWRITE(bp)); + xfs_buf_relse(bp); +} - if (XFS_BUF_ISDELAYWRITE(bp)) { - int error; - error = xfs_bawrite(bip->bli_item.li_mountp, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, bip->bli_item.li_mountp, - "xfs_buf_item_push: pushbuf error %d on bip %p, bp %p", - error, bip, bp); - } else { - xfs_buf_relse(bp); - } +/* + * The buffer is locked and is a delayed write buffer. Promote the buffer + * in the delayed write queue as the caller knows that they must invoke + * the xfsbufd to get this buffer written. We have to unlock the buffer + * to allow the xfsbufd to write it, too. + */ +STATIC void +xfs_buf_item_pushbuf( + xfs_buf_log_item_t *bip) +{ + xfs_buf_t *bp; + + ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); + 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 */ @@ -677,7 +683,7 @@ static struct xfs_item_ops xfs_buf_item_ops = { .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 = NULL, + .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 }; diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 207553e..d4dc063 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -602,33 +602,20 @@ xfs_inode_item_trylock( if (!xfs_iflock_nowait(ip)) { /* - * If someone else isn't already trying to push the inode - * buffer, we get to do it. + * inode has already been flushed to the backing buffer, + * leave it locked in shared mode, pushbuf routine will + * unlock it. */ - if (iip->ili_pushbuf_flag == 0) { - iip->ili_pushbuf_flag = 1; -#ifdef DEBUG - iip->ili_push_owner = current_pid(); -#endif - /* - * Inode is left locked in shared mode. - * Pushbuf routine gets to unlock it. - */ - return XFS_ITEM_PUSHBUF; - } else { - /* - * We hold the AIL lock, so we must specify the - * NONOTIFY flag so that we won't double trip. - */ - xfs_iunlock(ip, XFS_ILOCK_SHARED|XFS_IUNLOCK_NONOTIFY); - return XFS_ITEM_FLUSHING; - } - /* NOTREACHED */ + return XFS_ITEM_PUSHBUF; } /* Stale items should force out the iclog */ if (ip->i_flags & XFS_ISTALE) { xfs_ifunlock(ip); + /* + * we hold the AIL lock - notify the unlock routine of this + * so it doesn't try to get the lock again. + */ xfs_iunlock(ip, XFS_ILOCK_SHARED|XFS_IUNLOCK_NONOTIFY); return XFS_ITEM_PINNED; } @@ -746,11 +733,8 @@ xfs_inode_item_committed( * This gets called by xfs_trans_push_ail(), when IOP_TRYLOCK * failed to get the inode flush lock but did get the inode locked SHARED. * Here we're trying to see if the inode buffer is incore, and if so whether it's - * marked delayed write. If that's the case, we'll initiate a bawrite on that - * buffer to expedite the process. - * - * We aren't holding the AIL lock (or the flush lock) when this gets called, - * so it is inherently race-y. + * marked delayed write. If that's the case, we'll promote it and that will + * allow the caller to write the buffer by triggering the xfsbufd to run. */ STATIC void xfs_inode_item_pushbuf( @@ -759,26 +743,16 @@ xfs_inode_item_pushbuf( xfs_inode_t *ip; xfs_mount_t *mp; xfs_buf_t *bp; - uint dopush; ip = iip->ili_inode; - ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED)); /* - * The ili_pushbuf_flag keeps others from - * trying to duplicate our effort. - */ - ASSERT(iip->ili_pushbuf_flag != 0); - ASSERT(iip->ili_push_owner == current_pid()); - - /* * If a flush is not in progress anymore, chances are that the * 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)) { - iip->ili_pushbuf_flag = 0; xfs_iunlock(ip, XFS_ILOCK_SHARED); return; } @@ -787,53 +761,12 @@ xfs_inode_item_pushbuf( bp = xfs_incore(mp->m_ddev_targp, iip->ili_format.ilf_blkno, iip->ili_format.ilf_len, XBF_TRYLOCK); - if (bp != NULL) { - if (XFS_BUF_ISDELAYWRITE(bp)) { - /* - * We were racing with iflush because we don't hold - * the AIL lock or the flush lock. However, at this point, - * we have the buffer, and we know that it's dirty. - * So, it's possible that iflush raced with us, and - * this item is already taken off the AIL. - * If not, we can flush it async. - */ - dopush = ((iip->ili_item.li_flags & XFS_LI_IN_AIL) && - !completion_done(&ip->i_flush)); - iip->ili_pushbuf_flag = 0; - xfs_iunlock(ip, XFS_ILOCK_SHARED); - - trace_xfs_inode_item_push(bp, _RET_IP_); - - if (XFS_BUF_ISPINNED(bp)) - xfs_log_force(mp, 0); - - if (dopush) { - int error; - error = xfs_bawrite(mp, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, mp, - "xfs_inode_item_pushbuf: pushbuf error %d on iip %p, bp %p", - error, iip, bp); - } else { - xfs_buf_relse(bp); - } - } else { - iip->ili_pushbuf_flag = 0; - xfs_iunlock(ip, XFS_ILOCK_SHARED); - xfs_buf_relse(bp); - } - return; - } - /* - * We have to be careful about resetting pushbuf flag too early (above). - * Even though in theory we can do it as soon as we have the buflock, - * we don't want others to be doing work needlessly. They'll come to - * this function thinking that pushing the buffer is their - * responsibility only to find that the buffer is still locked by - * another doing the same thing - */ - iip->ili_pushbuf_flag = 0; xfs_iunlock(ip, XFS_ILOCK_SHARED); + if (!bp) + return; + if (XFS_BUF_ISDELAYWRITE(bp)) + xfs_buf_delwri_promote(bp); + xfs_buf_relse(bp); return; } @@ -937,7 +870,6 @@ xfs_inode_item_init( /* We have zeroed memory. No need ... iip->ili_extents_buf = NULL; - iip->ili_pushbuf_flag = 0; */ iip->ili_format.ilf_type = XFS_LI_INODE; diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h index cc8df1a..9a46795 100644 --- a/fs/xfs/xfs_inode_item.h +++ b/fs/xfs/xfs_inode_item.h @@ -144,12 +144,6 @@ typedef struct xfs_inode_log_item { data exts */ struct xfs_bmbt_rec *ili_aextents_buf; /* array of logged attr exts */ - unsigned int ili_pushbuf_flag; /* one bit used in push_ail */ - -#ifdef DEBUG - uint64_t ili_push_owner; /* one who sets pushbuf_flag - above gets to push the buf */ -#endif #ifdef XFS_TRANS_DEBUG int ili_root_size; char *ili_orig_root; diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index ca64f33..c93e3a1 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -861,8 +861,7 @@ typedef struct xfs_item_ops { #define XFS_ITEM_SUCCESS 0 #define XFS_ITEM_PINNED 1 #define XFS_ITEM_LOCKED 2 -#define XFS_ITEM_FLUSHING 3 -#define XFS_ITEM_PUSHBUF 4 +#define XFS_ITEM_PUSHBUF 3 /* * This structure is used to maintain a list of block ranges that have been diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index d7b1af8..e799824 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -253,6 +253,7 @@ xfsaild_push( int flush_log, count, stuck; xfs_mount_t *mp = ailp->xa_mount; struct xfs_ail_cursor *cur = &ailp->xa_cursors; + int push_xfsbufd = 0; spin_lock(&ailp->xa_lock); xfs_trans_ail_cursor_init(ailp, cur); @@ -308,6 +309,7 @@ xfsaild_push( XFS_STATS_INC(xs_push_ail_pushbuf); IOP_PUSHBUF(lip); last_pushed_lsn = lsn; + push_xfsbufd = 1; break; case XFS_ITEM_PINNED: @@ -322,12 +324,6 @@ xfsaild_push( stuck++; break; - case XFS_ITEM_FLUSHING: - XFS_STATS_INC(xs_push_ail_flushing); - last_pushed_lsn = lsn; - stuck++; - break; - default: ASSERT(0); break; @@ -374,6 +370,11 @@ xfsaild_push( xfs_log_force(mp, 0); } + if (push_xfsbufd) { + /* we've got delayed write buffers to flush */ + wake_up_process(mp->m_ddev_targp->bt_task); + } + if (!count) { /* We're past our target or empty, so idle */ last_pushed_lsn = 0; -- 1.6.5 From SRS0+DEPi+63+fromorbit.com=dave@internode.on.net Tue Feb 2 20:09:36 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_54,J_CHICKENPOX_72 autolearn=no version=3.3.0-rupdated 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 o1329Z6u204147 for ; Tue, 2 Feb 2010 20:09:36 -0600 X-ASG-Debug-ID: 1265163040-163b021e0002-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 A97791C9B81E for ; Tue, 2 Feb 2010 18:10:43 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id 02JsoSRNQr7JT6HS for ; Tue, 02 Feb 2010 18:10:43 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12207864-1927428 for ; Wed, 03 Feb 2010 12:40:42 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NcS7X-0003nd-7k for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:23 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NcS7W-0006ih-1X for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:22 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/10] Delayed write metadata writeback V4 Subject: [PATCH 0/10] Delayed write metadata writeback V4 Date: Wed, 3 Feb 2010 10:24:54 +1100 Message-Id: <1265153104-29680-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265163044 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21506 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 While I started with killing async inode writeback, the series has grown. It's not really limited to inode writeback - it touches dquot flushing, changes the way the AIL pushes on buffers, adds xfsbufd sortingi for delayed write buffers, adds a real non-blocking mode to inode reclaim and avoids physical inode writeback from the VFS while fixing bugs in handling delayed write inodes. Hence this is more about enabling efficient delayed write metadata than it is able killing async inode writeback. The idea behind this series is to make metadata buffers get written from xfsbufd via the delayed write queue rather than being issued asynchronously from all over the place. To do this, async buffer writeback is almost entirely removed from XFS, replaced instead by delayed writes and a method to expedite flushing of delayed write buffers when required. The result of funnelling all the buffer IO into a single place is that we can more tightly control and therefore optimise the submission of metadata IO. Aggregating the buffers before dispatch allows much better sort efficiency of the buffers as the sort window is not limited to the size of the elevator congestion hysteresis limit. Hence we can approach 100% merge effeciency on large numbers of buffers when dispatched for IO and greatly reduce the amount of seeking metadata writeback causes. The major change is to the inode flushing and reclaim code. Delayed write inodes hold the flush lock for much longer than for async writeback, and hence blocking on the flush lock can cause extremely long latencies without other mechanisms to expedite the release of the flush locks. To prevent needing to flush inodes immeidately, all operations are done non-blocking unless synchronous. THis required a significant rework of the inode reclaim code, but it greatly simplified other pieces of code (e.g. log item pushing). Version 4 - rework inode reclaim checks for better legibility - add warning to reclaim code when delwri flush errors occur - kill XFS_ITEM_FLUSHING now it is not used - clean up sync_mode flags being pushed into xfs_iflush() - kill the now unused xfs_bawrite() function - include Christoph's fsync cache flush fix - rework the inode locking and call to xfs_fsync() when doing synchronous inode writes to close races between the fsync and the background delwri flush afterwards. Version 3 - rework inode reclaim to: - separate it from xfs_iflush return values - provide a non-blocking mode for background operation - apply delwri buffer promotion tricks to dquot flushing - kill unneeded dquot flushing flags, similar to inode flushing flag removal - fix sync inode flush bug when trying to flush delwri inodes Version 2: - use generic list sort function - when unmounting, push the delwri buffers first, then do sync inode reclaim so that reclaim doesn't block for 15 seconds waiting for delwri inode buffers to be aged and written before the inodes can be reclaimed. Performance numbers for this version are the same as V2, which were as follows: Perf results (average of 3 runs) on a debug XFS build (means allocation patterns are randomly varied, so runtimes are also a bit variable): Untar 2.6.32 kernel tarball, sync, then remove: Untar+sync rm -rf xfs-dev: 25.2s 13.0s xfs-dev-delwri-1: 22.5s 9.1s xfs-dev-delwri-2: 21.9s 8.4s 4 processes each creating 100,000, five byte files in separate directories concurrently, then 4 processes removing a directory each concurrently. create rm -rf xfs-dev: 8m32s 4m10s xfs-dev-delwri-1: 4m55s 3m42s xfs-dev-delwri-2: 4m56s 3m33s The patch series (plus the couple of previous bug fixes that haven't been pulled into the tree on oss yet) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/dgc/xfs for-2.6.34 Christoph Hellwig (1): xfs: remove invalid barrier optimization from xfs_fsync Dave Chinner (11): xfs: don't hold onto reserved blocks on remount,ro xfs: turn off sign warnings xfs: Make inode reclaim states explicit xfs: Use delayed write for inodes rather than async V2 xfs: Don't issue buffer IO direct from AIL push V2 xfs: Sort delayed write buffers before dispatch xfs: Use delay write promotion for dquot flushing xfs: kill the unused XFS_QMOPT_* flush flags V2 xfs: move the inode locking outside xfs_fsync() xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 xfs: kill xfs_bawrite fs/xfs/Makefile | 2 +- fs/xfs/linux-2.6/xfs_buf.c | 135 ++++++++++++++++++++++++++-------------- fs/xfs/linux-2.6/xfs_buf.h | 3 +- fs/xfs/linux-2.6/xfs_file.c | 6 ++- fs/xfs/linux-2.6/xfs_lrw.c | 5 +- fs/xfs/linux-2.6/xfs_super.c | 82 ++++++++++++++++++------- fs/xfs/linux-2.6/xfs_sync.c | 138 +++++++++++++++++++++++++++++++++------- fs/xfs/linux-2.6/xfs_trace.h | 1 + fs/xfs/quota/xfs_dquot.c | 38 +++++------- fs/xfs/quota/xfs_dquot_item.c | 87 ++++---------------------- fs/xfs/quota/xfs_dquot_item.h | 4 - fs/xfs/quota/xfs_qm.c | 14 ++--- fs/xfs/xfs_buf_item.c | 64 ++++++++++--------- fs/xfs/xfs_inode.c | 86 ++------------------------ fs/xfs/xfs_inode.h | 11 +--- fs/xfs/xfs_inode_item.c | 108 +++++++------------------------- fs/xfs/xfs_inode_item.h | 6 -- fs/xfs/xfs_mount.c | 13 ++++- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_quota.h | 8 +-- fs/xfs/xfs_trans.h | 3 +- fs/xfs/xfs_trans_ail.c | 13 ++-- fs/xfs/xfs_vnodeops.c | 46 +++++-------- fs/xfs/xfs_vnodeops.h | 2 +- 24 files changed, 415 insertions(+), 461 deletions(-) From SRS0+4mlS+63+fromorbit.com=david@internode.on.net Tue Feb 2 20:09:42 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=AWL,BAYES_00, DATE_IN_PAST_24_48,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1329f7I204182 for ; Tue, 2 Feb 2010 20:09:42 -0600 X-ASG-Debug-ID: 1265163049-6fe903540000-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 E73881C9B823 for ; Tue, 2 Feb 2010 18:10:49 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id sbNWRmucSSRvzwA7 for ; Tue, 02 Feb 2010 18:10:49 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12207897-1927428 for multiple; Wed, 03 Feb 2010 12:40:48 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Nc5Ed-000707-7C; Tue, 02 Feb 2010 09:59:11 +1100 Date: Tue, 2 Feb 2010 09:59:11 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/7] xfs: Use delayed write for inodes rather than async Subject: Re: [PATCH 2/7] xfs: Use delayed write for inodes rather than async Message-ID: <20100201225911.GA26252@discord.disaster> References: <1264400564-19704-1-git-send-email-david@fromorbit.com> <1264400564-19704-3-git-send-email-david@fromorbit.com> <20100125115308.GC8595@infradead.org> <20100125223140.GN25842@discord.disaster> <20100126161045.GB24152@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100126161045.GB24152@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265163050 X-Barracuda-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.53 X-Barracuda-Spam-Status: No, SCORE=-1.53 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DATE_IN_PAST_24_48, DATE_IN_PAST_24_48_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.21506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_24_48 Date: is 24 to 48 hours before Received: date 0.48 DATE_IN_PAST_24_48_2 DATE_IN_PAST_24_48_2 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Jan 26, 2010 at 11:10:45AM -0500, Christoph Hellwig wrote: > > > Also in this context > > > the requeue label name doesn't fit too well, even if it's the same > > > action as the requeue. > > > > I'm open to suggestions for a better name ;) > > What do you think about this version? Yeah, that looks a lot better. I'll incorporate that into the patch. Thanks. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+DEPi+63+fromorbit.com=dave@internode.on.net Tue Feb 2 20:09:36 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1329Zta204133 for ; Tue, 2 Feb 2010 20:09:35 -0600 X-ASG-Debug-ID: 1265163035-1da700e90008-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 A3DCB1371DE8 for ; Tue, 2 Feb 2010 18:10:42 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id YFzxGiejz0uiJQVN for ; Tue, 02 Feb 2010 18:10:42 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12207854-1927428 for ; Wed, 03 Feb 2010 12:40:41 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NcS7X-0003nf-8Y for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:23 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NcS7W-0006in-64 for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:25:22 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 02/10] xfs: Use delayed write for inodes rather than async V2 Subject: [PATCH 02/10] xfs: Use delayed write for inodes rather than async V2 Date: Wed, 3 Feb 2010 10:24:56 +1100 Message-Id: <1265153104-29680-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265153104-29680-1-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265163043 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21507 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 currently do background inode flush asynchronously, resulting in inodes being written in whatever order the background writeback issues them. Not only that, there are also blocking and non-blocking asynchronous inode flushes, depending on where the flush comes from. This patch completely removes asynchronous inode writeback. It removes all the strange writeback modes and replaces them with either a synchronous flush or a non-blocking delayed write flush. That is, inode flushes will only issue IO directly if they are synchronous, and background flushing may do nothing if the operation would block (e.g. on a pinned inode or buffer lock). Delayed write flushes will now result in the inode buffer sitting in the delwri queue of the buffer cache to be flushed by either an AIL push or by the xfsbufd timing out the buffer. This will allow accumulation of dirty inode buffers in memory and allow optimisation of inode cluster writeback at the xfsbufd level where we have much greater queue depths than the block layer elevators. We will also get adjacent inode cluster buffer IO merging for free when a later patch in the series allows sorting of the delayed write buffers before dispatch. This effectively means that any inode that is written back by background writeback will be seen as flush locked during AIL pushing, and will result in the buffers being pushed from there. This writeback path is currently non-optimal, but the next patch in the series will fix that problem. A side effect of this delayed write mechanism is that background inode reclaim will no longer directly flush inodes, nor can it wait on the flush lock. The result is that inode reclaim must leave the inode in the reclaimable state until it is clean. Hence attempts to reclaim a dirty inode in the background will simply skip the inode until it is clean and this allows other mechanisms (i.e. xfsbufd) to do more optimal writeback of the dirty buffers. As a result, the inode reclaim code has been rewritten so that it no longer relies on the ambiguous return values of xfs_iflush() to determine whether it is safe to reclaim an inode. Portions of this patch are derived from patches by Christoph Hellwig. Version 2: - cleanup reclaim code as suggested by Christoph - log background reclaim inode flush errors - just pass sync flags to xfs_iflush Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 4 +- fs/xfs/linux-2.6/xfs_sync.c | 104 ++++++++++++++++++++++++++++++----------- fs/xfs/xfs_inode.c | 75 ++---------------------------- fs/xfs/xfs_inode.h | 10 ---- fs/xfs/xfs_inode_item.c | 10 +++- fs/xfs/xfs_mount.c | 13 +++++- 6 files changed, 102 insertions(+), 114 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index e9c2145..226fe20 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1064,7 +1064,7 @@ xfs_fs_write_inode( xfs_ilock(ip, XFS_ILOCK_SHARED); xfs_iflock(ip); - error = xfs_iflush(ip, XFS_IFLUSH_SYNC); + error = xfs_iflush(ip, SYNC_WAIT); } else { error = EAGAIN; if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) @@ -1072,7 +1072,7 @@ xfs_fs_write_inode( if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) goto out_unlock; - error = xfs_iflush(ip, XFS_IFLUSH_ASYNC_NOBLOCK); + error = xfs_iflush(ip, 0); } out_unlock: diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 98b8937..a9f6d20 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -270,8 +270,7 @@ xfs_sync_inode_attr( goto out_unlock; } - error = xfs_iflush(ip, (flags & SYNC_WAIT) ? - XFS_IFLUSH_SYNC : XFS_IFLUSH_DELWRI); + error = xfs_iflush(ip, flags); out_unlock: xfs_iunlock(ip, XFS_ILOCK_SHARED); @@ -460,16 +459,18 @@ xfs_quiesce_fs( { int count = 0, pincount; + xfs_reclaim_inodes(mp, 0); xfs_flush_buftarg(mp->m_ddev_targp, 0); - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI_ELSE_ASYNC); /* * This loop must run at least twice. The first instance of the loop * will flush most meta data but that will generate more meta data * (typically directory updates). Which then must be flushed and - * logged before we can write the unmount record. + * logged before we can write the unmount record. We also so sync + * reclaim of inodes to catch any that the above delwri flush skipped. */ do { + xfs_reclaim_inodes(mp, SYNC_WAIT); xfs_sync_attr(mp, SYNC_WAIT); pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1); if (!pincount) { @@ -585,7 +586,7 @@ xfs_sync_worker( if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { xfs_log_force(mp, 0); - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI_ELSE_ASYNC); + xfs_reclaim_inodes(mp, 0); /* dgc: errors ignored here */ error = xfs_qm_sync(mp, SYNC_TRYLOCK); error = xfs_sync_fsdata(mp, SYNC_TRYLOCK); @@ -719,21 +720,42 @@ __xfs_inode_clear_reclaim_tag( * shutdown EIO unpin and reclaim * clean, unpinned 0 reclaim * stale, unpinned 0 reclaim - * clean, pinned(*) 0 unpin and reclaim - * stale, pinned 0 unpin and reclaim - * dirty, async 0 block on flush lock, reclaim - * dirty, sync flush 0 block on flush lock, reclaim + * clean, pinned(*) 0 requeue + * stale, pinned EAGAIN requeue + * dirty, delwri ok 0 requeue + * dirty, delwri blocked EAGAIN requeue + * dirty, sync flush 0 reclaim * * (*) dgc: I don't think the clean, pinned state is possible but it gets * handled anyway given the order of checks implemented. * + * As can be seen from the table, the return value of xfs_iflush() is not + * sufficient to correctly decide the reclaim action here. The checks in + * xfs_iflush() might look like duplicates, but they are not. + * + * Also, because we get the flush lock first, we know that any inode that has + * been flushed delwri has had the flush completed by the time we check that + * the inode is clean. The clean inode check needs to be done before flushing + * the inode delwri otherwise we would loop forever requeuing clean inodes as + * we cannot tell apart a successful delwri flush and a clean inode from the + * return value of xfs_iflush(). + * + * Note that because the inode is flushed delayed write by background + * writeback, the flush lock may already be held here and waiting on it can + * result in very long latencies. Hence for sync reclaims, where we wait on the + * flush lock, the caller should push out delayed write inodes first before + * trying to reclaim them to minimise the amount of time spent waiting. For + * background relaim, we just requeue the inode for the next pass. + * * Hence the order of actions after gaining the locks should be: * bad => reclaim * shutdown => unpin and reclaim - * pinned => unpin + * pinned, delwri => requeue + * pinned, sync => unpin * stale => reclaim * clean => reclaim - * dirty => flush, wait and reclaim + * dirty, delwri => flush and requeue + * dirty, sync => flush, wait and reclaim */ STATIC int xfs_reclaim_inode( @@ -741,7 +763,7 @@ xfs_reclaim_inode( struct xfs_perag *pag, int sync_mode) { - int error; + int error = 0; /* * The radix tree lock here protects a thread in xfs_iget from racing @@ -761,7 +783,11 @@ xfs_reclaim_inode( write_unlock(&pag->pag_ici_lock); xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_iflock(ip); + if (!xfs_iflock_nowait(ip)) { + if (!(sync_mode & SYNC_WAIT)) + goto out; + xfs_iflock(ip); + } if (is_bad_inode(VFS_I(ip))) goto reclaim; @@ -769,8 +795,13 @@ xfs_reclaim_inode( xfs_iunpin_wait(ip); goto reclaim; } - if (xfs_ipincount(ip)) + if (xfs_ipincount(ip)) { + if (!(sync_mode & SYNC_WAIT)) { + xfs_ifunlock(ip); + goto out; + } xfs_iunpin_wait(ip); + } if (xfs_iflags_test(ip, XFS_ISTALE)) goto reclaim; if (xfs_inode_clean(ip)) @@ -778,26 +809,43 @@ xfs_reclaim_inode( /* Now we have an inode that needs flushing */ error = xfs_iflush(ip, sync_mode); - if (!error) { - switch(sync_mode) { - case XFS_IFLUSH_DELWRI_ELSE_ASYNC: - case XFS_IFLUSH_DELWRI: - case XFS_IFLUSH_ASYNC: - case XFS_IFLUSH_DELWRI_ELSE_SYNC: - case XFS_IFLUSH_SYNC: - /* IO issued, synchronise with IO completion */ - xfs_iflock(ip); - default: - ASSERT(0); - break; - } + if (sync_mode & SYNC_WAIT) { + xfs_iflock(ip); + goto reclaim; } + /* + * When we have to flush an inode but don't have SYNC_WAIT set, we + * flush the inode out using a delwri buffer and wait for the next + * call into reclaim to find it in a clean state instead of waiting for + * it now. We also don't return errors here - if the error is transient + * then the next reclaim pass will flush the inode, and if the error + * is permanent then the next sync reclaim will relcaim the inode and + * pass on the error. + */ + if (error && !XFS_FORCED_SHUTDOWN(ip->i_mount)) { + xfs_fs_cmn_err(CE_WARN, ip->i_mount, + "inode 0x%llx background reclaim flush failed with %d", + (long long)ip->i_ino, error); + } +out: + xfs_iflags_clear(ip, XFS_IRECLAIM); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + /* + * We could return EAGAIN here to make reclaim rescan the inode tree in + * a short while. However, this just burns CPU time scanning the tree + * waiting for IO to complete and xfssyncd never goes back to the idle + * state. Instead, return 0 to let the next scheduled background reclaim + * attempt to reclaim the inode again. + */ + return 0; + reclaim: xfs_ifunlock(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); xfs_ireclaim(ip); - return 0; + return error; + } int diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8d0666d..fa31360 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2835,8 +2835,6 @@ xfs_iflush( xfs_dinode_t *dip; xfs_mount_t *mp; int error; - int noblock = (flags == XFS_IFLUSH_ASYNC_NOBLOCK); - enum { INT_DELWRI = (1 << 0), INT_ASYNC = (1 << 1) }; XFS_STATS_INC(xs_iflush_count); @@ -2859,7 +2857,7 @@ xfs_iflush( * in the same cluster are dirty, they will probably write the inode * out for us if they occur after the log force completes. */ - if (noblock && xfs_ipincount(ip)) { + if (!(flags & SYNC_WAIT) && xfs_ipincount(ip)) { xfs_iunpin_nowait(ip); xfs_ifunlock(ip); return EAGAIN; @@ -2893,60 +2891,10 @@ xfs_iflush( } /* - * Decide how buffer will be flushed out. This is done before - * the call to xfs_iflush_int because this field is zeroed by it. - */ - if (iip != NULL && iip->ili_format.ilf_fields != 0) { - /* - * Flush out the inode buffer according to the directions - * of the caller. In the cases where the caller has given - * us a choice choose the non-delwri case. This is because - * the inode is in the AIL and we need to get it out soon. - */ - switch (flags) { - case XFS_IFLUSH_SYNC: - case XFS_IFLUSH_DELWRI_ELSE_SYNC: - flags = 0; - break; - case XFS_IFLUSH_ASYNC_NOBLOCK: - case XFS_IFLUSH_ASYNC: - case XFS_IFLUSH_DELWRI_ELSE_ASYNC: - flags = INT_ASYNC; - break; - case XFS_IFLUSH_DELWRI: - flags = INT_DELWRI; - break; - default: - ASSERT(0); - flags = 0; - break; - } - } else { - switch (flags) { - case XFS_IFLUSH_DELWRI_ELSE_SYNC: - case XFS_IFLUSH_DELWRI_ELSE_ASYNC: - case XFS_IFLUSH_DELWRI: - flags = INT_DELWRI; - break; - case XFS_IFLUSH_ASYNC_NOBLOCK: - case XFS_IFLUSH_ASYNC: - flags = INT_ASYNC; - break; - case XFS_IFLUSH_SYNC: - flags = 0; - break; - default: - ASSERT(0); - flags = 0; - break; - } - } - - /* * Get the buffer containing the on-disk inode. */ error = xfs_itobp(mp, NULL, ip, &dip, &bp, - noblock ? XBF_TRYLOCK : XBF_LOCK); + (flags & SYNC_WAIT) ? XBF_LOCK : XBF_TRYLOCK); if (error || !bp) { xfs_ifunlock(ip); return error; @@ -2974,13 +2922,10 @@ xfs_iflush( if (error) goto cluster_corrupt_out; - if (flags & INT_DELWRI) { - xfs_bdwrite(mp, bp); - } else if (flags & INT_ASYNC) { - error = xfs_bawrite(mp, bp); - } else { + if (flags & SYNC_WAIT) error = xfs_bwrite(mp, bp); - } + else + xfs_bdwrite(mp, bp); return error; corrupt_out: @@ -3015,16 +2960,6 @@ xfs_iflush_int( iip = ip->i_itemp; mp = ip->i_mount; - - /* - * If the inode isn't dirty, then just release the inode - * flush lock and do nothing. - */ - if (xfs_inode_clean(ip)) { - xfs_ifunlock(ip); - return 0; - } - /* set *dip = inode's place in the buffer */ dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 8b618ea..6c912b0 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -420,16 +420,6 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) #define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_SHIFT) /* - * Flags for xfs_iflush() - */ -#define XFS_IFLUSH_DELWRI_ELSE_SYNC 1 -#define XFS_IFLUSH_DELWRI_ELSE_ASYNC 2 -#define XFS_IFLUSH_SYNC 3 -#define XFS_IFLUSH_ASYNC 4 -#define XFS_IFLUSH_DELWRI 5 -#define XFS_IFLUSH_ASYNC_NOBLOCK 6 - -/* * Flags for xfs_itruncate_start(). */ #define XFS_ITRUNC_DEFINITE 0x1 diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 48ec1c0..207553e 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -866,10 +866,14 @@ xfs_inode_item_push( iip->ili_format.ilf_fields != 0); /* - * Write out the inode. The completion routine ('iflush_done') will - * pull it from the AIL, mark it clean, unlock the flush lock. + * Push the inode to it's backing buffer. This will not remove the + * inode from the AIL - a further push will be required to trigger a + * buffer push. However, this allows all the dirty inodes to be pushed + * to the buffer before it is pushed to disk. THe buffer IO completion + * will pull th einode from the AIL, mark it clean and unlock the flush + * lock. */ - (void) xfs_iflush(ip, XFS_IFLUSH_ASYNC); + (void) xfs_iflush(ip, 0); xfs_iunlock(ip, XFS_ILOCK_SHARED); return; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 7f81ed7..9a036f4 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1456,7 +1456,18 @@ xfs_unmountfs( * need to force the log first. */ xfs_log_force(mp, XFS_LOG_SYNC); - xfs_reclaim_inodes(mp, XFS_IFLUSH_ASYNC); + + /* + * Do a delwri reclaim pass first so that as many dirty inodes are + * queued up for IO as possible. Then flush the buffers before making + * a synchronous path to catch all the remaining inodes are reclaimed. + * This makes the reclaim process as quick as possible by avoiding + * synchronous writeout and blocking on inodes already in the delwri + * state as much as possible. + */ + xfs_reclaim_inodes(mp, 0); + XFS_bflush(mp->m_ddev_targp); + xfs_reclaim_inodes(mp, SYNC_WAIT); xfs_qm_unmount(mp); -- 1.6.5 From SRS0+4mlS+63+fromorbit.com=david@internode.on.net Tue Feb 2 20:09:45 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=AWL,BAYES_00, DATE_IN_PAST_24_48,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1329jfM204210 for ; Tue, 2 Feb 2010 20:09:45 -0600 X-ASG-Debug-ID: 1265163049-6fc9035f0000-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 5E7BF1C9B826 for ; Tue, 2 Feb 2010 18:10:50 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id UCSoAlCTlxLpa8qb for ; Tue, 02 Feb 2010 18:10:50 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12207902-1927428 for multiple; Wed, 03 Feb 2010 12:40:49 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Nc51C-0006ez-6B; Tue, 02 Feb 2010 09:45:18 +1100 Date: Tue, 2 Feb 2010 09:45:18 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: remove invalid barrier optimization from xfs_fsync Subject: Re: [PATCH] xfs: remove invalid barrier optimization from xfs_fsync Message-ID: <20100201224518.GA28368@discord.disaster> References: <20100126213851.GA14927@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100126213851.GA14927@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265163051 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.53 X-Barracuda-Spam-Status: No, SCORE=-1.53 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DATE_IN_PAST_24_48, DATE_IN_PAST_24_48_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.21506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_24_48 Date: is 24 to 48 hours before Received: date 0.48 DATE_IN_PAST_24_48_2 DATE_IN_PAST_24_48_2 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Jan 26, 2010 at 04:38:51PM -0500, Christoph Hellwig wrote: > We always need to flush the disk write cache and can't skip it just because > the no inode attributes have changed. > > > Signed-off-by: Christoph Hellwig Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From morfic@gmail.com Tue Feb 2 20:18:24 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o132IN7B204444 for ; Tue, 2 Feb 2010 20:18:23 -0600 X-ASG-Debug-ID: 1265163570-058303280000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5A64F1371EE1 for ; Tue, 2 Feb 2010 18:19:30 -0800 (PST) Received: from mail-ew0-f227.google.com (mail-ew0-f227.google.com [209.85.219.227]) by cuda.sgi.com with ESMTP id CneUJEdzhJrdsKXf for ; Tue, 02 Feb 2010 18:19:30 -0800 (PST) Received: by ewy27 with SMTP id 27so827138ewy.18 for ; Tue, 02 Feb 2010 18:19:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=E4xbZtYNtWH/KOhT/znPcpsO5wxxOvGBF2zG34fjORA=; b=BJWKnfhe1YcInLhFDZ2aOXuExuNCVU2I5BlF0JrTdh/BTb/Vc4lKs6iNuW0ucB3t0e apR+WPVeIAHQLHqcLcKmew7CQFuauXNPlQWW4BONyprY0VqSYLhN0zm1PEQe/juZTvIA De7NVAwQjlUDfIkFT1m7vAjCyd4uJ1eOZuQPk= 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=d4nePjnaiP+4MXI3ikCbfib0rGbx4+oFGSpymA6P3iG3WvClQhdMQPY+rFniDgUlH+ 1E40MTYp8gaya/jylcl8VKBuSRMPcJ5OqoUJPA3dG46ioX73GLXMTjFOU70Q7M8FZ0gm N/60cJT7CQ8KC6VDUYhzXFNzg2u7uMKzlWFTI= MIME-Version: 1.0 Received: by 10.216.162.142 with SMTP id y14mr4090054wek.192.1265163569469; Tue, 02 Feb 2010 18:19:29 -0800 (PST) In-Reply-To: <20100202112300.GA23809@infradead.org> References: <13bb8ce11002011924h611099feh4955eedcc6e588a6@mail.gmail.com> <20100202112300.GA23809@infradead.org> Date: Tue, 2 Feb 2010 20:19:29 -0600 Message-ID: <13bb8ce11002021819l7e17dac4n5f58a9887a16fae2@mail.gmail.com> X-ASG-Orig-Subj: Re: State of XFS on ARM Subject: Re: State of XFS on ARM From: Daniel Goller To: Christoph Hellwig Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-ew0-f227.google.com[209.85.219.227] X-Barracuda-Start-Time: 1265163571 X-Barracuda-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, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.21507 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 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 Thanks for the many replys, it also made me realize how basic and general the question was, without giving much details about the hardware. I see my "can't mount a xfs partition after successful unmounting without needing to clear the log" in 2.6.32, 2.6.33-rc2 and now 2.6.33-rc6. The arm device: Processor : Feroceon 88FR131 rev 1 (v5l) BogoMIPS : 1192.75 Features : swp half thumb fastmult edsp CPU implementer : 0x56 CPU architecture: 5TE CPU variant : 0x2 CPU part : 0x131 CPU revision : 1 Hardware : Marvell SheevaPlug Reference Board Revision : 0000 Serial : 0000000000000000 Typically i just can't mount without a xfs_repair -L which seems to be all i need to get it back and lose no data in the process. In 2.6.33-rc6 i had it for the first time do this: (which basically stopped the boot process cold as it would not go past this point) keeping this partition from being mounted at boot then allowed me to record the following when manually mounting it) * Mounting local filesystems... Internal error: Oops: 5 [#1] last sysfs file: /sys/kernel/uevent_seqnum Modules linked in: CPU: 0 Not tainted (2.6.33-rc6 #1) PC is at xlog_recover_process_data+0x1c4/0x304 LR is at xlog_recover_unmount_trans+0x10/0x1c pc : [] lr : [] psr: 20000013 sp : df091c78 ip : 0000000a fp : 00000001 r10: df0794d0 r9 : df091d14 r8 : e0ffea00 r7 : df091d04 r6 : e0ffe034 r5 : 00000010 r4 : 02e00a34 r3 : 00000001 r2 : c0563190 r1 : c05631b8 r0 : 00000000 Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user Control: 0005317f Table: 1f314000 DAC: 00000015 Process mount (pid: 857, stack limit =3D 0xdf090270) Stack: (0xdf091c78 to 0xdf092000) 1c60: 00000007 df2910= 00 1c80: 00000005 df3329c0 00000000 00000001 00000005 df3329c0 df291000 000000= 05 1ca0: 00000001 00000000 df332cc0 0000000f 00000000 c0206eb0 00000001 df332c= c0 1cc0: df091d44 ffffffff c0563174 c003d13c df091d44 c058dddc c0563174 000000= 02 1ce0: 00000002 00000000 00000000 00000000 df332cc0 c003d66c 00000028 df332c= 00 1d00: c04f0121 00000000 00000000 00000000 00000000 df0ade00 00000000 000000= 00 1d20: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000000= 00 1d40: 00000000 e0ffe000 00000000 df3329c0 00000000 00000028 00000000 000000= 06 1d60: 00000000 a3d7b000 00000000 c02074d8 00000006 00000000 00000001 c04277= 58 1d80: 60000013 df3329c0 00000000 00000006 00000000 00408100 00000000 c02075= 34 1da0: 00000006 00000000 00000000 df3329c0 00000000 00000006 00000000 004081= 00 1dc0: 00000000 c0208be4 00000006 00000000 00000006 00000000 00000028 000000= 00 1de0: df0fd800 000001c0 00000000 c0202b58 00020000 df0fd800 c0220a64 df0fd8= 00 1e00: c0220a64 073904d0 00000000 073904cc 00000000 c020ac34 00020000 000002= d0 1e20: 00000001 00000000 51eb851f c02154fc 00000000 00000058 df296000 c01f1b= 1c 1e40: 0000000a 00000058 df189120 c01f1b1c 0000000a df0fda9c df296000 c01f1b= 1c 1e60: 00000000 df0fd800 df218a00 00000000 df28a000 00000000 00000000 df28a0= 00 1e80: 00000000 c0220a64 df218a00 00000000 df6b8340 00000003 df6b839c 000000= 00 1ea0: df218a00 c00991fc 33616473 df096f00 df096da0 000000d0 df096da0 df096f= 40 1ec0: 0000000a c007cdd8 df296d00 df296d00 c056dfc4 df096da0 df28a000 000000= 00 1ee0: df28a000 c021ed60 c02208e8 df296d00 00000000 c00981fc df296d00 c00ab3= 04 1f00: c056dfc4 df096d60 df28a000 df096da0 00000000 c00982d0 00000000 000000= 30 1f20: df091f48 df096da0 df096d60 c00addc4 00000a18 00200800 df28a000 df0900= 00 1f40: 00000000 0001e560 dfbebe00 df705d80 c007186c df241000 0001e560 002008= 00 1f60: 00000000 c002b044 df090000 00000000 0001e560 c00ae3f4 df28a000 c00476= c8 1f80: 00000000 df28a000 df096da0 df096d60 00000000 0001ea18 00200800 0001e5= 70 1fa0: 00000015 c002aec0 0001ea18 00200800 0001e560 0001e570 0001e988 002008= 00 1fc0: 0001ea18 00200800 0001e570 00000015 0001c444 00000000 00000000 0001e5= 60 1fe0: 00200800 befff5cc 0000b0f4 40115384 60000010 0001e560 00000000 000000= 00 [] (xlog_recover_process_data+0x1c4/0x304) from [] (xlog_do_recovery_pass+0x1b0/0x794) [] (xlog_do_recovery_pass+0x1b0/0x794) from [] (xlog_do_log_recovery+0x44/0= x88) [] (xlog_do_log_recovery+0x44/0x88) from [] (xlog_do_recover+0x18/0x124) [] (xlog_do_recover+0x18/0x124) from [] (xlog_recover+0x7c/0xc4) [] (xlog_recover+0x7c/0xc4) from [] (xfs_log_mount+0x154/0x18c) [] (xfs_log_mount+0x154/0x18c) from [] (xfs_mountfs+0x34c/0x670) [] (xfs_mountfs+0x34c/0x670) from [] (xfs_fs_fill_super+0x17c/0x2c0) [] (xfs_fs_fill_super+0x17c/0x2c0) from [] (get_sb_bdev+0x138/0x170) [] (get_sb_bdev+0x138/0x170) from [] (xfs_fs_get_sb+0x1c/0x28) [] (xfs_fs_get_sb+0x1c/0x28) from [] (vfs_kern_mount+0x50/0xe0) [] (vfs_kern_mount+0x50/0xe0) from [] (do_kern_mount+0x34/0xdc) [] (do_kern_mount+0x34/0xdc) from [] (do_mount+0x154/0x700) [] (do_mount+0x154/0x700) from [] (sys_mount+0x84/0xc4) [] (sys_mount+0x84/0xc4) from [] (ret_fast_syscall+0x0/0x28) Code: 93a03000 82033001 e3530000 0a000048 (e5d43008) ---[ end trace b80cd4d01963a09f ]--- /etc/init.d/localmount: line 15: 857 Segmentation fault mount -at "$types" it seems to operate fine since running a xfs_repair -L on it from the x86_64 laptop (It is a disk in a usb enclosure, which makes the moving of the drive to clear the log rather easy) > The git tree with the current versions of the patches to fix this is > here: > > =A0 =A0 =A0 =A0http://git.kernel.org/?p=3Dlinux/kernel/git/jejb/xfs-vipt/= .git;a=3Dsummary > > I will probably not get a chance to try pulling this from git before the weekend, if the Sheevaplug however the type of arm machine you were referring to (i honestly never looked at its cache), i would be interested in trying the fix and (hopefully) stick to xfs for this partition. Thanks, Daniel Goller Let me know if there is further information you would like to look at for this issue. From sandeen@sandeen.net Tue Feb 2 20:48:15 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o132mFs6205613 for ; Tue, 2 Feb 2010 20:48:15 -0600 X-ASG-Debug-ID: 1265165363-6a16002d0000-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 72BB31C9B883 for ; Tue, 2 Feb 2010 18:49:24 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id yH9rD321Jl0XDePx for ; Tue, 02 Feb 2010 18:49:24 -0800 (PST) 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 A3780109E852 for ; Tue, 2 Feb 2010 20:49:23 -0600 (CST) Message-ID: <4B68E433.9050309@sandeen.net> Date: Tue, 02 Feb 2010 20:49:23 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: Re: [PATCH V2] xfstests: routine to create scratch of certain size Subject: Re: [PATCH V2] xfstests: routine to create scratch of certain size References: <4B621D89.8070800@sandeen.net> <4B68D75A.9020105@sandeen.net> In-Reply-To: <4B68D75A.9020105@sandeen.net> 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: 1265165364 X-Barracuda-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.21508 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: > This is needed for later enospc tests to be generic > > Signed-off-by: Eric Sandeen > --- > > V2: Address Christoph's comment about use of MKFS_OPTIONS; > just do it like the other geom helper and explicitly -set- > MKFS_OPTIONS for scratch, to set the size, then just call > _scratch_mkfs > > (this would override any global MKFS_OPTIONS setting, but > I think that's ok for now, and not sure how these options might > interact w/ previously set MKFS_OPTIONS anyway) Scratch that, I'm not being diligent enough and didn't test this :/ (yay for "simple" changes) mke2fs takes the size arg at the end, after the device, so we cannot just set up MKFS_OPTIONS Sorry for the noise. -Eric (who will try to be more dilient now...) From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 04:54:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13AsbXx223826 for ; Wed, 3 Feb 2010 04:54:40 -0600 X-ASG-Debug-ID: 1265194546-079a02e30000-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 578C213732E3 for ; Wed, 3 Feb 2010 02:55:46 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id etcdaNkFIDviGg17 for ; Wed, 03 Feb 2010 02:55:46 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Ncctd-00019X-Lj for xfs@oss.sgi.com; Wed, 03 Feb 2010 10:55:45 +0000 Date: Wed, 3 Feb 2010 05:55:45 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH for-2.6.33] xfs: flush all log buffers in xlog_dealloc_log Subject: Re: [PATCH for-2.6.33] xfs: flush all log buffers in xlog_dealloc_log Message-ID: <20100203105545.GA1047@infradead.org> References: <20100201220813.GA3519@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100201220813.GA3519@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: 1265194547 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 Actually I'll take this one back - the log buffers aren't delwri so xfs_flush_buftarg probably only helped by timing or the xfs_buf_runall_queues on xfslogd_workqueue. Need to think about this a bit more. From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 04:55:41 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13AteTc223873 for ; Wed, 3 Feb 2010 04:55:41 -0600 X-ASG-Debug-ID: 1265194609-1ac101d50000-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 2CA5813732FD for ; Wed, 3 Feb 2010 02:56:49 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 9pF9Q0xBJySYqe0A for ; Wed, 03 Feb 2010 02:56:49 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nccuf-0001Jn-Fh; Wed, 03 Feb 2010 10:56:49 +0000 Date: Wed, 3 Feb 2010 05:56:49 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss X-ASG-Orig-Subj: Re: [PATCH V3] xfstests: filter selinux output in _acl_ls etc Subject: Re: [PATCH V3] xfstests: filter selinux output in _acl_ls etc Message-ID: <20100203105649.GB1047@infradead.org> References: <4B61C1BC.4050800@sandeen.net> <4B626697.3080006@sandeen.net> <4B68B007.1020705@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B68B007.1020705@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: 1265194610 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, Feb 02, 2010 at 05:06:47PM -0600, Eric Sandeen wrote: > When selinux is on, ls -l gives us a "." to indicate selinux > attrs, which breaks some tests: > > === Test minimal ACE === > Setup file > --rwxrw-r-- id1 id2 file1 > +-rwxrw-r--. id1 id2 file1 > > so make an _ls_l helper to filter that out. > > Signed-off-by: Eric Sandeen Looks good, Reviewed-by: Christoph Hellwig From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 04:57:20 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13AvJh0223948 for ; Wed, 3 Feb 2010 04:57:20 -0600 X-ASG-Debug-ID: 1265194708-079e02fa0000-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 46872137330D for ; Wed, 3 Feb 2010 02:58:29 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id B5UnZYyynZvTWQ82 for ; Wed, 03 Feb 2010 02:58:29 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NccwG-0001jS-NL; Wed, 03 Feb 2010 10:58:28 +0000 Date: Wed, 3 Feb 2010 05:58:28 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: Christoph Hellwig , xfs-oss X-ASG-Orig-Subj: Re: [PATCH V3] xfstests: 223 - test file alignment on stripe geometry Subject: Re: [PATCH V3] xfstests: 223 - test file alignment on stripe geometry Message-ID: <20100203105828.GC1047@infradead.org> References: <4B621529.20708@sandeen.net> <20100130105236.GA18286@infradead.org> <4B68B532.9000103@sandeen.net> <4B68D5DF.20808@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B68D5DF.20808@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: 1265194709 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, and although I haven't tested the respin yet myself it looks close enough to the original one. Reviewed-by: Christoph Hellwig From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 05:16:12 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13BGCIE224673 for ; Wed, 3 Feb 2010 05:16:12 -0600 X-ASG-Debug-ID: 1265195841-635f00ac0000-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 E20891A8437 for ; Wed, 3 Feb 2010 03:17:21 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id UZOQKzXXggDob4Q4 for ; Wed, 03 Feb 2010 03:17:21 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NcdEW-0002du-Az; Wed, 03 Feb 2010 11:17:20 +0000 Date: Wed, 3 Feb 2010 06:17:20 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 02/10] xfs: Use delayed write for inodes rather than async V2 Subject: Re: [PATCH 02/10] xfs: Use delayed write for inodes rather than async V2 Message-ID: <20100203111720.GA22957@infradead.org> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1265153104-29680-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: 1265195841 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 Still looks good with the recent changes, Reviewed-by: Christoph Hellwig From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 05:16:46 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13BGkVA224701 for ; Wed, 3 Feb 2010 05:16:46 -0600 X-ASG-Debug-ID: 1265195875-7e39015b0000-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 DD8541C9CA36 for ; Wed, 3 Feb 2010 03:17:55 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Y2vrSR7SDlID0GuE for ; Wed, 03 Feb 2010 03:17:55 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NcdF5-0003Xf-40; Wed, 03 Feb 2010 11:17:55 +0000 Date: Wed, 3 Feb 2010 06:17:55 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 06/10] xfs: kill the unused XFS_QMOPT_* flush flags V2 Subject: Re: [PATCH 06/10] xfs: kill the unused XFS_QMOPT_* flush flags V2 Message-ID: <20100203111755.GB22957@infradead.org> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1265153104-29680-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: 1265195875 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, Feb 03, 2010 at 10:25:00AM +1100, Dave Chinner wrote: > dquots are never flushed asynchronously. Remove the flag and the > async write support from the flush function. Make the default flush > a delwri flush to make the inode flush code, which leaves the > XFS_QMOPT_SYNC the only flag remaining. Convert that to use > SYNC_WAIT instead, just like the inode flush code. > > V2: > - just pass flush flags straight through Still looks good with that minor change, Reviewed-by: Christoph Hellwig From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 05:18:07 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13BI69M224769 for ; Wed, 3 Feb 2010 05:18:06 -0600 X-ASG-Debug-ID: 1265195956-637b00b80000-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 5E9A91A8440 for ; Wed, 3 Feb 2010 03:19:16 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id B8kAajtIShrFOHFg for ; Wed, 03 Feb 2010 03:19:16 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NcdGO-0006YW-2p; Wed, 03 Feb 2010 11:19:16 +0000 Date: Wed, 3 Feb 2010 06:19:16 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 10/10] xfs: kill xfs_bawrite Subject: Re: [PATCH 10/10] xfs: kill xfs_bawrite Message-ID: <20100203111916.GC22957@infradead.org> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-11-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1265153104-29680-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: 1265195956 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, Feb 03, 2010 at 10:25:04AM +1100, Dave Chinner wrote: > There are no more users of this function left in the XFS code > now that we've switched everything to delayed write flushing. > Remove it. Actually we still write the superblock async using xfs_bwrite, but getting rid of that is a separate project, so Reviewed-by: Christoph Hellwig From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 05:26:45 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13BQi7M225072 for ; Wed, 3 Feb 2010 05:26:45 -0600 X-ASG-Debug-ID: 1265196474-0e2601240000-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 51E371C9C797; Wed, 3 Feb 2010 03:27:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Y0G7kco2hYJdMUad; Wed, 03 Feb 2010 03:27:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NcdOj-0007NC-S5; Wed, 03 Feb 2010 11:27:53 +0000 Date: Wed, 3 Feb 2010 06:27:53 -0500 From: Christoph Hellwig To: Dave Chinner Cc: bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/10] xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 Subject: Re: [PATCH 09/10] xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 Message-ID: <20100203112753.GA19996@infradead.org> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-10-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1265153104-29680-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: 1265196474 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 Still not entirely happy with this one. The first one is that I think the barriers in fsync are still too heavy for the normal sync use case. I'd be more happy with exporting the body of xfs_fsync without the cache flushes (and a ebtter name than xfs_fsync) and use that for write_inode. That leaves open the NFSD case thought. I'd prefer to have that fixed if possibly. Ben, any chance you could send your patch to use fsync to the nfs list ASAP? I think we'd be even better off to just force -o wsync and disable ->write_inode entirely for NFS, any chance you could test such a patch on your setup? Besides that the patch is missing the comment from the previous iteration why we're still doing the delwri iflush for the sync == 1 case. I think keeping that one is important to explain the really weird reason for it. From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 05:28:08 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13BS8cS225113 for ; Wed, 3 Feb 2010 05:28:08 -0600 X-ASG-Debug-ID: 1265196557-0cf001490000-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 D77501C9C7BE for ; Wed, 3 Feb 2010 03:29:17 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id gH8pBKwlpsyEgUpg for ; Wed, 03 Feb 2010 03:29:17 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NcdQ5-0000zx-JU; Wed, 03 Feb 2010 11:29:17 +0000 Date: Wed, 3 Feb 2010 06:29:17 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 08/10] xfs: move the inode locking outside xfs_fsync() Subject: Re: [PATCH 08/10] xfs: move the inode locking outside xfs_fsync() Message-ID: <20100203112917.GB19996@infradead.org> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1265153104-29680-9-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: 1265196557 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, Feb 03, 2010 at 10:25:02AM +1100, Dave Chinner wrote: > We have a need for a delayed write inode flush operation > to be made atomically with an fsync to avoid physically > writing inodes but still keeping inode buffer information > up to date for bulkstat. > > Move the inode locking outside xfs_fsync() to allow this to > be done. What's the point of the lock_flags argument? It should always be IOLOCK_SHARED, so instead of passing it in as an argument I'd rather add an assert to enforce it. For more comments on if this is the right functionality to use in write_inode see my comment to the next patch. From sandeen@sandeen.net Wed Feb 3 11:49:08 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13Hn79g237935 for ; Wed, 3 Feb 2010 11:49:07 -0600 X-ASG-Debug-ID: 1265219414-797900e90000-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 C20321C9DE79 for ; Wed, 3 Feb 2010 09:50:15 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bH7lx58rpevhwmqG for ; Wed, 03 Feb 2010 09:50:15 -0800 (PST) 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 o13HoEPV005226 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 3 Feb 2010 12:50:14 -0500 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 o13HoDHI026860 for ; Wed, 3 Feb 2010 12:50:13 -0500 Message-ID: <4B69B755.2030008@sandeen.net> Date: Wed, 03 Feb 2010 11:50:13 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH] increase readdir buffer size Subject: [PATCH] increase readdir buffer size 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: 1265219415 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21562 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 While doing some testing of readdir perf a while back, I noticed that the buffer size we're using internally is smaller than what glibc gives us by default. Upping this size helped a bit, and seems safe. glibc's __alloc_dir() does: const size_t default_allocation = (4 * BUFSIZ < sizeof (struct dirent64) ? sizeof (struct dirent64) : 4 * BUFSIZ); const size_t small_allocation = (BUFSIZ < sizeof (struct dirent64) ? sizeof (struct dirent64) : BUFSIZ); size_t allocation = default_allocation; #ifdef _STATBUF_ST_BLKSIZE if (statp != NULL && default_allocation < statp->st_blksize) allocation = statp->st_blksize; #endif and #define _G_BUFSIZ 8192 #define _IO_BUFSIZ _G_BUFSIZ # define BUFSIZ _IO_BUFSIZ so the default buffer is 4 * 8192 = 32768 (except in the unlikely case of blocks > 32k....) Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index e4caeb2..44bcc67 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -203,9 +203,9 @@ xfs_file_readdir( * * Try to give it an estimate that's good enough, maybe at some * point we can change the ->readdir prototype to include the - * buffer size. + * buffer size. For now we use the current glibc buffer size. */ - bufsize = (size_t)min_t(loff_t, PAGE_SIZE, ip->i_d.di_size); + bufsize = (size_t)min_t(loff_t, 32768, ip->i_d.di_size); error = xfs_readdir(ip, dirent, bufsize, (xfs_off_t *)&filp->f_pos, filldir); From bpm@sgi.com Wed Feb 3 12:05:26 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13I5QiP238437 for ; Wed, 3 Feb 2010 12:05:26 -0600 Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id CA74FAC036; Wed, 3 Feb 2010 10:06:32 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id EEB5F4266A1; Wed, 3 Feb 2010 12:07:06 -0600 (CST) Date: Wed, 3 Feb 2010 12:07:06 -0600 From: bpm@sgi.com To: Christoph Hellwig Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 09/10] xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 Message-ID: <20100203180706.GH5702@sgi.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-10-git-send-email-david@fromorbit.com> <20100203112753.GA19996@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100203112753.GA19996@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hey Christoph, On Wed, Feb 03, 2010 at 06:27:53AM -0500, Christoph Hellwig wrote: > That leaves open the NFSD case thought. I'd prefer to have that fixed > if possibly. Ben, any chance you could send your patch to use fsync > to the nfs list ASAP? I'll make some time to work on it. > I think we'd be even better off to just force > -o wsync and disable ->write_inode entirely for NFS, any chance you > could test such a patch on your setup? Sure. IIRC, previous tests were w/ -o wsync and write_inode switched to fsync passing 1 for fdatasync. I'll try this too. -Ben From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 13:42:23 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13JgMbq241215 for ; Wed, 3 Feb 2010 13:42:23 -0600 X-ASG-Debug-ID: 1265226211-541f02140000-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 7B48B1C9E846 for ; Wed, 3 Feb 2010 11:43:32 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id DKgDPNNNKOZ3WaNO for ; Wed, 03 Feb 2010 11:43:32 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Ncl8N-0004Bw-Rv for xfs@oss.sgi.com; Wed, 03 Feb 2010 19:43:31 +0000 Date: Wed, 3 Feb 2010 14:43:31 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: only clear the suid bit once in xfs_write Subject: [PATCH] xfs: only clear the suid bit once in xfs_write Message-ID: <20100203194331.GA20199@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: 1265226212 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 file_remove_suid already calls into ->setattr to clear the suid and sgid bits if needed, no need to start a second transaction to do it ourselves. Note that xfs_write_clear_setuid issues a sync transaction while the path through ->setattr doesn't, but that is consistant with the other filesystems. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_lrw.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_lrw.c 2010-02-03 20:37:45.956003749 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_lrw.c 2010-02-03 20:37:49.348003520 +0100 @@ -630,18 +630,9 @@ start: * by root. This keeps people from modifying setuid and * setgid binaries. */ - - if (((xip->i_d.di_mode & S_ISUID) || - ((xip->i_d.di_mode & (S_ISGID | S_IXGRP)) == - (S_ISGID | S_IXGRP))) && - !capable(CAP_FSETID)) { - error = xfs_write_clear_setuid(xip); - if (likely(!error)) - error = -file_remove_suid(file); - if (unlikely(error)) { - goto out_unlock_internal; - } - } + error = -file_remove_suid(file); + if (unlikely(error)) + goto out_unlock_internal; /* We can write back this queue in page reclaim */ current->backing_dev_info = mapping->backing_dev_info; Index: xfs/fs/xfs/xfs_rw.c =================================================================== --- xfs.orig/fs/xfs/xfs_rw.c 2010-02-03 20:37:45.965004126 +0100 +++ xfs/fs/xfs/xfs_rw.c 2010-02-03 20:37:49.349010212 +0100 @@ -47,48 +47,6 @@ #include "xfs_trace.h" /* - * This is a subroutine for xfs_write() and other writers (xfs_ioctl) - * which clears the setuid and setgid bits when a file is written. - */ -int -xfs_write_clear_setuid( - xfs_inode_t *ip) -{ - xfs_mount_t *mp; - xfs_trans_t *tp; - int error; - - mp = ip->i_mount; - tp = xfs_trans_alloc(mp, XFS_TRANS_WRITEID); - if ((error = xfs_trans_reserve(tp, 0, - XFS_WRITEID_LOG_RES(mp), - 0, 0, 0))) { - xfs_trans_cancel(tp, 0); - return error; - } - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); - ip->i_d.di_mode &= ~S_ISUID; - - /* - * Note that we don't have to worry about mandatory - * file locking being disabled here because we only - * clear the S_ISGID bit if the Group execute bit is - * on, but if it was on then mandatory locking wouldn't - * have been enabled. - */ - if (ip->i_d.di_mode & S_IXGRP) { - ip->i_d.di_mode &= ~S_ISGID; - } - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - xfs_trans_set_sync(tp); - error = xfs_trans_commit(tp, 0); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - return 0; -} - -/* * Force a shutdown of the filesystem instantly while keeping * the filesystem consistent. We don't do an unmount here; just shutdown * the shop, make sure that absolutely nothing persistent happens to Index: xfs/fs/xfs/xfs_rw.h =================================================================== --- xfs.orig/fs/xfs/xfs_rw.h 2010-02-03 20:37:53.085003394 +0100 +++ xfs/fs/xfs/xfs_rw.h 2010-02-03 20:37:57.946033654 +0100 @@ -39,7 +39,6 @@ xfs_fsb_to_db(struct xfs_inode *ip, xfs_ /* * Prototypes for functions in xfs_rw.c. */ -extern int xfs_write_clear_setuid(struct xfs_inode *ip); extern int xfs_read_buf(struct xfs_mount *mp, xfs_buftarg_t *btp, xfs_daddr_t blkno, int len, uint flags, struct xfs_buf **bpp); From aelder@sgi.com Wed Feb 3 13:52:58 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13Jqw0t241543 for ; Wed, 3 Feb 2010 13:52:58 -0600 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 B27E83040B2 for ; Wed, 3 Feb 2010 11:54:05 -0800 (PST) Received: from [128.162.232.162] ([128.162.232.162]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 3 Feb 2010 13:54:05 -0600 Subject: xfstests: 219: fix awk filter for duplicate users From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Wed, 03 Feb 2010 13:54:04 -0600 Message-ID: <1265226844.2848.27.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 03 Feb 2010 19:54:05.0646 (UTC) FILETIME=[A431BEE0:01CAA50A] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The filter I added for removing duplicate users from the output of repquota didn't do the job very well. This fixes that, making it so the first time a user is seen its line is printed, not thereafter. Signed-off-by: Alex Elder --- 219 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: b/219 =================================================================== --- a/219 +++ b/219 @@ -86,7 +86,7 @@ test_accounting() done repquota -$type -s -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | - awk '/^#/ { if (! seen[$1]) { seen[$1]++; next; } } { print }' + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } } { print; }' } # real QA test starts here From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 14:30:01 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13KU1D6243100 for ; Wed, 3 Feb 2010 14:30:01 -0600 X-ASG-Debug-ID: 1265229070-3a83002b0000-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 199451C9E986 for ; Wed, 3 Feb 2010 12:31:10 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 824A2RNaoDysYjru for ; Wed, 03 Feb 2010 12:31:10 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NclsU-0006cJ-Ec; Wed, 03 Feb 2010 20:31:10 +0000 Date: Wed, 3 Feb 2010 15:31:10 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] increase readdir buffer size Subject: Re: [PATCH] increase readdir buffer size Message-ID: <20100203203110.GA24818@infradead.org> References: <4B69B755.2030008@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B69B755.2030008@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: 1265229071 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, Feb 03, 2010 at 11:50:13AM -0600, Eric Sandeen wrote: > so the default buffer is 4 * 8192 = 32768 > (except in the unlikely case of blocks > 32k....) > > Signed-off-by: Eric Sandeen Looks good, Reviewed-by: Christoph Hellwig From morfic@gmail.com Wed Feb 3 14:33:35 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13KXZEt243219 for ; Wed, 3 Feb 2010 14:33:35 -0600 X-ASG-Debug-ID: 1265229284-3ab000360000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4309A1AA2F8 for ; Wed, 3 Feb 2010 12:34:44 -0800 (PST) Received: from mail-ew0-f227.google.com (mail-ew0-f227.google.com [209.85.219.227]) by cuda.sgi.com with ESMTP id Z014WhiIZ6ReOME3 for ; Wed, 03 Feb 2010 12:34:44 -0800 (PST) Received: by ewy27 with SMTP id 27so1810776ewy.18 for ; Wed, 03 Feb 2010 12:34:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:content-type; bh=qXbPImkbiDbaTOjPdB1FrqQ0DHC50AQwfRjokLmot0Q=; b=cbaCOLBj1kJQx9Bah6hSgVgy3ALASSbEtvIBxJ0HKRN8e6Hku8ASGjASs6cQ5UA4fW 6qIBWhlUtjAWpzORRu83JSd8GP8A+pjmqVfz8gBqEj04v306qa7bcaLijL1UsskN30am wXiFopGzJCzu/E/7rOghfqCOO9ocvjopLBy2g= 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=G0+YKgjjyboa/Y0jl5ssaWpIQA1FZ59di4OU30uCB/Pza9NZ3gKylU/isISW9wALiZ fTxeq7X+xQhRBPpYeGT1V1Zq53BxFfsIUatMW4EJvt7jpG4dgciWdpYx22s5DVLzx0el wDWWEBf2zQNBqKthD3GEDSgmKmh7f6yPJb4eg= MIME-Version: 1.0 Received: by 10.216.87.6 with SMTP id x6mr42593wee.174.1265229283455; Wed, 03 Feb 2010 12:34:43 -0800 (PST) In-Reply-To: <13bb8ce11002021819l7e17dac4n5f58a9887a16fae2@mail.gmail.com> References: <13bb8ce11002011924h611099feh4955eedcc6e588a6@mail.gmail.com> <20100202112300.GA23809@infradead.org> <13bb8ce11002021819l7e17dac4n5f58a9887a16fae2@mail.gmail.com> Date: Wed, 3 Feb 2010 14:34:43 -0600 Message-ID: <13bb8ce11002031234t4b02b199g5b8dfd65ea48aa13@mail.gmail.com> X-ASG-Orig-Subj: Re: State of XFS on ARM Subject: Re: State of XFS on ARM From: Daniel Goller To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ew0-f227.google.com[209.85.219.227] X-Barracuda-Start-Time: 1265229285 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0334 1.0000 -1.8049 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.80 X-Barracuda-Spam-Status: No, SCORE=-1.80 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.21572 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 Any particular stress test you can suggest, to use once i try git for xfs on this Marvell box? To try to help bringing up issues faster than through normal use of this box? Thanks in advance for any suggestions, Daniel From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 14:37:24 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13KbN8I243397 for ; Wed, 3 Feb 2010 14:37:24 -0600 X-ASG-Debug-ID: 1265229513-54d303070000-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 D62E01C9EA39 for ; Wed, 3 Feb 2010 12:38:33 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id HjUgrfoPZpeYTLE5 for ; Wed, 03 Feb 2010 12:38:33 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nclzd-0008Qf-I8; Wed, 03 Feb 2010 20:38:33 +0000 Date: Wed, 3 Feb 2010 15:38:33 -0500 From: Christoph Hellwig To: Daniel Goller Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: State of XFS on ARM Subject: Re: State of XFS on ARM Message-ID: <20100203203833.GA31908@infradead.org> References: <13bb8ce11002011924h611099feh4955eedcc6e588a6@mail.gmail.com> <20100202112300.GA23809@infradead.org> <13bb8ce11002021819l7e17dac4n5f58a9887a16fae2@mail.gmail.com> <13bb8ce11002031234t4b02b199g5b8dfd65ea48aa13@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <13bb8ce11002031234t4b02b199g5b8dfd65ea48aa13@mail.gmail.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: 1265229513 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, Feb 03, 2010 at 02:34:43PM -0600, Daniel Goller wrote: > Any particular stress test you can suggest, to use once i try git for > xfs on this Marvell box? > To try to help bringing up issues faster than through normal use of this box? The primary use of the large buffers where this matters is the log. So you just need to cleanly unmount and mount the filesystem again, and the issues your previously reported should be gone. From sandeen@sandeen.net Wed Feb 3 14:42:46 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13Kgk86243532 for ; Wed, 3 Feb 2010 14:42:46 -0600 X-ASG-Debug-ID: 1265229834-3aff003f0000-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 C42C51AA39A; Wed, 3 Feb 2010 12:43:54 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1fwizFhxY863zvG6; Wed, 03 Feb 2010 12:43:54 -0800 (PST) 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 o13KhsLG003138 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Feb 2010 15:43:54 -0500 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 o13Khp16001049; Wed, 3 Feb 2010 15:43:53 -0500 Message-ID: <4B69E006.9020807@sandeen.net> Date: Wed, 03 Feb 2010 14:43:50 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: aelder@sgi.com CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfstests: 219: fix awk filter for duplicate users Subject: Re: xfstests: 219: fix awk filter for duplicate users References: <1265226844.2848.27.camel@doink1> In-Reply-To: <1265226844.2848.27.camel@doink1> 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: 1265229835 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0062 1.0000 -1.9802 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.21572 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 Alex Elder wrote: > The filter I added for removing duplicate users from the > output of repquota didn't do the job very well. This > fixes that, making it so the first time a user is seen > its line is printed, not thereafter. > > Signed-off-by: Alex Elder > > --- > 219 | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > Index: b/219 > =================================================================== > --- a/219 > +++ b/219 > @@ -86,7 +86,7 @@ test_accounting() > done > > repquota -$type -s -n $SCRATCH_MNT | grep -v "^#0" | > filter_scratch | > - awk '/^#/ { if (! seen[$1]) { seen[$1]++; next; } } { print }' > + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } } { print; }' > } +awk: /^#/ { if (seen[$1]) next; seen[$1]++; } } { print; } +awk: ^ syntax error but thanks for making me feel better ;) w/o the extra "}" it works for me. (incidentally is a line continuation " \ " needed too? I guess it works without...) -Eric From sandeen@sandeen.net Wed Feb 3 14:45:05 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_56 autolearn=no version=3.3.0-rupdated 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 o13Kj5gN243633 for ; Wed, 3 Feb 2010 14:45:05 -0600 X-ASG-Debug-ID: 1265229973-3ed4005d0000-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 979CA137607E for ; Wed, 3 Feb 2010 12:46:13 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id T5cn1SmYeds8yBoN for ; Wed, 03 Feb 2010 12:46:13 -0800 (PST) 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 o13KkCSH003726 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Feb 2010 15:46:12 -0500 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o13KkBQf024039; Wed, 3 Feb 2010 15:46:11 -0500 Message-ID: <4B69E093.6000105@sandeen.net> Date: Wed, 03 Feb 2010 14:46:11 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Daniel Goller CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: State of XFS on ARM Subject: Re: State of XFS on ARM References: <13bb8ce11002011924h611099feh4955eedcc6e588a6@mail.gmail.com> <20100202112300.GA23809@infradead.org> <13bb8ce11002021819l7e17dac4n5f58a9887a16fae2@mail.gmail.com> <13bb8ce11002031234t4b02b199g5b8dfd65ea48aa13@mail.gmail.com> In-Reply-To: <13bb8ce11002031234t4b02b199g5b8dfd65ea48aa13@mail.gmail.com> 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: 1265229974 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21573 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 Daniel Goller wrote: > Any particular stress test you can suggest, to use once i try git for > xfs on this Marvell box? > To try to help bringing up issues faster than through normal use of this box? Run it through the xfstests suite: http://git.kernel.org/?p=fs/xfs/xfstests-dev.git;a=summary (I have a sheevaplug too, thanks to some nice folks @Marvell, and I really need to get regular qa going on it in return... have been too busy so far) :( There's a readme in the tree, but basically just create a local.config like: # - setenv TEST_DEV "device containing TEST PARTITION" # - setenv TEST_DIR "mount point of TEST PARTITION" # - setenv SCRATCH_DEV "device containing SCRATCH PARTITION" # - setenv SCRATCH_MNT "mount point for SCRATCH PARTITION" TEST_DEV=/dev/sdb1 TEST_DIR=/mnt/test SCRATCH_DEV=/dev/sdb3 SCRATCH_MNT=/mnt/scratch mkfs.xfs $TEST_DEV, and then run #./check -g auto -Eric > Thanks in advance for any suggestions, > > Daniel > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 14:50:43 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13KogGQ243761 for ; Wed, 3 Feb 2010 14:50:42 -0600 X-ASG-Debug-ID: 1265230311-3ade005f0000-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 24AD91AA47C; Wed, 3 Feb 2010 12:51:52 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id VkHqkhslpIrFQHCD; Wed, 03 Feb 2010 12:51:52 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NcmCV-0004dH-RW; Wed, 03 Feb 2010 20:51:51 +0000 Date: Wed, 3 Feb 2010 15:51:51 -0500 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfstests: 219: fix awk filter for duplicate users Subject: Re: xfstests: 219: fix awk filter for duplicate users Message-ID: <20100203205151.GA11337@infradead.org> References: <1265226844.2848.27.camel@doink1> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1265226844.2848.27.camel@doink1> 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: 1265230312 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, Feb 03, 2010 at 01:54:04PM -0600, Alex Elder wrote: > The filter I added for removing duplicate users from the > output of repquota didn't do the job very well. This > fixes that, making it so the first time a user is seen > its line is printed, not thereafter. > > Signed-off-by: Alex Elder > > --- > 219 | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > Index: b/219 > =================================================================== > --- a/219 > +++ b/219 > @@ -86,7 +86,7 @@ test_accounting() > done > > repquota -$type -s -n $SCRATCH_MNT | grep -v "^#0" | > filter_scratch | > - awk '/^#/ { if (! seen[$1]) { seen[$1]++; next; } } { print }' > + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } } { print; }' The patch seems whitespace damages, and there's a "}" too many in the added line. After fixing that up 219 passes again for me. So more or less: Reviewed-by: Christoph Hellwig From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 14:54:26 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13KsP3m243862 for ; Wed, 3 Feb 2010 14:54:25 -0600 X-ASG-Debug-ID: 1265230535-3ae000660000-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 70D841AA4DE; Wed, 3 Feb 2010 12:55:35 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id n8B2i2fS0LPHg1KA; Wed, 03 Feb 2010 12:55:35 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NcmG5-000601-SE; Wed, 03 Feb 2010 20:55:33 +0000 Date: Wed, 3 Feb 2010 15:55:33 -0500 From: Christoph Hellwig To: bpm@sgi.com Cc: Christoph Hellwig , Dave Chinner , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/10] xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 Subject: Re: [PATCH 09/10] xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 Message-ID: <20100203205533.GB19415@infradead.org> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-10-git-send-email-david@fromorbit.com> <20100203112753.GA19996@infradead.org> <20100203180706.GH5702@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100203180706.GH5702@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: 1265230535 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, Feb 03, 2010 at 12:07:06PM -0600, bpm@sgi.com wrote: > Hey Christoph, > > On Wed, Feb 03, 2010 at 06:27:53AM -0500, Christoph Hellwig wrote: > > That leaves open the NFSD case thought. I'd prefer to have that fixed > > if possibly. Ben, any chance you could send your patch to use fsync > > to the nfs list ASAP? > > I'll make some time to work on it. > > > I think we'd be even better off to just force > > -o wsync and disable ->write_inode entirely for NFS, any chance you > > could test such a patch on your setup? > > Sure. IIRC, previous tests were w/ -o wsync and write_inode switched to > fsync passing 1 for fdatasync. I'll try this too. -o wsync should be very similar to using ->fsync or Dave's new ->write_inode. What the synchronous transaction does is causing a log force, which is exactly what fsync does in case the inode is still pinned (except not quite as optimal, but I'll send a patch for that) From BATV+db9c69c6839b08361670+2355+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 3 14:55:39 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13Ktdsi243899 for ; Wed, 3 Feb 2010 14:55:39 -0600 X-ASG-Debug-ID: 1265230608-3b0e00630000-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 EEAEA1AA4F0; Wed, 3 Feb 2010 12:56:48 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id CwIxZ4EWPcQtT8ub; Wed, 03 Feb 2010 12:56:48 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NcmHI-0006GM-MG; Wed, 03 Feb 2010 20:56:48 +0000 Date: Wed, 3 Feb 2010 15:56:48 -0500 From: Christoph Hellwig To: Dave Chinner Cc: bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/10] xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 Subject: Re: [PATCH 09/10] xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 Message-ID: <20100203205648.GA23116@infradead.org> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-10-git-send-email-david@fromorbit.com> <20100203112753.GA19996@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100203112753.GA19996@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: 1265230608 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, Feb 03, 2010 at 06:27:53AM -0500, Christoph Hellwig wrote: > Still not entirely happy with this one. The first one is that I think > the barriers in fsync are still too heavy for the normal sync use > case. I'd be more happy with exporting the body of xfs_fsync without > the cache flushes (and a ebtter name than xfs_fsync) and use that > for write_inode. > > That leaves open the NFSD case thought. I'd prefer to have that fixed > if possibly. Ben, any chance you could send your patch to use fsync > to the nfs list ASAP? I think we'd be even better off to just force > -o wsync and disable ->write_inode entirely for NFS, any chance you > could test such a patch on your setup? Thinking about it, we usually do cause a log buffer write from ->fsync which means we submit the barrier anyway. That might be the reason why you're not seeing the performance hit in your testing. With that I'm okay with the patch as-is for now, we can micro-optimize it later. Reviewed-by: Christoph Hellwig From sandeen@sandeen.net Wed Feb 3 15:34:24 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13LYN06245496 for ; Wed, 3 Feb 2010 15:34:24 -0600 X-ASG-Debug-ID: 1265232932-3aeb00d30000-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 9B0241AA772 for ; Wed, 3 Feb 2010 13:35:33 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mahnfvFOJYja4NZi for ; Wed, 03 Feb 2010 13:35:33 -0800 (PST) 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 o13LZWns013460 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 3 Feb 2010 16:35:32 -0500 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o13LZVNf004794 for ; Wed, 3 Feb 2010 16:35:32 -0500 Message-ID: <4B69EC23.8040207@sandeen.net> Date: Wed, 03 Feb 2010 15:35:31 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH 0/3] resending a few xfstests patches as a series Subject: [PATCH 0/3] resending a few xfstests patches as a series 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: 1265232933 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0249 1.0000 -1.8597 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.86 X-Barracuda-Spam-Status: No, SCORE=-1.86 using 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.21576 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 These should be cleaned up & sane by now :) -Eric From sandeen@sandeen.net Wed Feb 3 15:36:07 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13La7Lv245566 for ; Wed, 3 Feb 2010 15:36:07 -0600 X-ASG-Debug-ID: 1265233036-3ed2010d0000-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 B62D81376462 for ; Wed, 3 Feb 2010 13:37:16 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nqCyWPbM1sWwL99O for ; Wed, 03 Feb 2010 13:37:16 -0800 (PST) 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 o13LbG4V004051 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 3 Feb 2010 16:37:16 -0500 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 o13LbDFw003157 for ; Wed, 3 Feb 2010 16:37:15 -0500 Message-ID: <4B69EC89.5050400@sandeen.net> Date: Wed, 03 Feb 2010 15:37:13 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH 1/3] xfstests: routine to create scratch of certain size Subject: [PATCH 1/3] xfstests: routine to create scratch of certain size References: <4B69EC23.8040207@sandeen.net> In-Reply-To: <4B69EC23.8040207@sandeen.net> 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: 1265233036 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21577 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 needed for later enospc tests to be generic We have to explicitly call the mkfs rather than _scratch_mkfs since extN wants nr-of-blocks as an argument -after- the device name. Signed-off-by: Eric Sandeen --- diff --git a/common.rc b/common.rc index 1edea2f..0a02a2b 100644 --- a/common.rc +++ b/common.rc @@ -305,6 +305,29 @@ _scratch_mkfs() esac } +# Create fs of certain size on scratch device +# _scratch_mkfs_sized [optional blocksize] +_scratch_mkfs_sized() +{ + fssize=$1 + blocksize=$2 + [ -z "$blocksize" ] && blocksize=4096 + let blocks=$fssize/$blocksize + + case $FSTYP in + xfs) + _scratch_mkfs_xfs -d size=$fssize -b size=$blocksize + ;; + ext2|ext3|ext4) + /sbin/mkfs.$FSTYP -b $blocksize $SCRATCH_DEV $blocks + ;; + *) + _notrun "Filesystem $FSTYP not supported in _scratch_mkfs_sized" + ;; + esac + _scratch_mkfs +} + # Emulate an N-data-disk stripe w/ various stripe units # _scratch_mkfs_geom [optional blocksize] _scratch_mkfs_geom() From sandeen@sandeen.net Wed Feb 3 15:37:31 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13LbUe2245631 for ; Wed, 3 Feb 2010 15:37:30 -0600 X-ASG-Debug-ID: 1265233119-3a8c01000000-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 501611C9EDF7 for ; Wed, 3 Feb 2010 13:38:39 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6WfDqYw4KPDcG5jr for ; Wed, 03 Feb 2010 13:38:39 -0800 (PST) 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 o13LcdwD000617 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 3 Feb 2010 16:38:39 -0500 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 o13LcbY8020879 for ; Wed, 3 Feb 2010 16:38:38 -0500 Message-ID: <4B69ECDD.8050806@sandeen.net> Date: Wed, 03 Feb 2010 15:38:37 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH 2/3] xfstests: make 053 and 077 generic Subject: [PATCH 2/3] xfstests: make 053 and 077 generic References: <4B69EC23.8040207@sandeen.net> In-Reply-To: <4B69EC23.8040207@sandeen.net> 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: 1265233120 X-Barracuda-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.21576 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 053 and 077 can be generic w/ a little tweaking. Also change 077's filler to something more likely to be on a random system under test, and add it to the enospc group. Signed-off-by: Eric Sandeen --- diff --git a/053 b/053 index 98644a7..439cbe6 100755 --- a/053 +++ b/053 @@ -38,18 +38,17 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 . ./common.attr # real QA test starts here -_supported_fs xfs +_supported_fs generic _supported_os Linux -[ ! -x /bin/chacl -a ! -x /usr/bin/chacl ] && _notrun "chacl command not found" - _require_scratch +_acl_requirements _acl_setup_ids _do_die_on_error=y test=$SCRATCH_MNT/test # make filesystem on scratch using the defaults -_do 'make filesystem on $SCRATCH_DEV' '_scratch_mkfs_xfs' +_do 'make filesystem on $SCRATCH_DEV' '_scratch_mkfs' _do 'mount filesytem' '_scratch_mount' # create test files and set acls @@ -84,7 +83,7 @@ list_acls() echo "acls before repair:" list_acls _do 'unmount $SCRATCH_DEV' 'umount $SCRATCH_DEV' -_do 'repair filesystem' '_scratch_xfs_repair' +_do 'repair filesystem' '_check_scratch_fs' _do 'mount filesytem' '_scratch_mount' echo "acls after repair: " list_acls diff --git a/077 b/077 index cdee8da..a3d9334 100755 --- a/077 +++ b/077 @@ -30,8 +30,8 @@ echo "QA output created by $seq" here=`pwd` tmp=/tmp/$$ status=1 -#filler=$here/../../linux -filler=/home/fsgqa/isms/2.4.x-xfs +# Something w/ enough data to fill 50M of fs... +filler=/lib/modules/ _cleanup() { @@ -44,14 +44,16 @@ trap "_cleanup; rm -f $tmp.*; exit \$status" 0 1 2 3 15 # get standard environment, filters and checks . ./common.rc . ./common.filter +. ./common.attr # real QA test starts here -_supported_fs xfs +_supported_fs generic _supported_os Linux -[ ! -d $filler ] && _notrun "No linux directory to source files from" +[ ! -d $filler ] && _notrun "No directory to source files from" _require_scratch +_acl_requirements echo "*** create filesystem" @@ -59,7 +61,8 @@ rm -f $seq.full umount $SCRATCH_DEV >/dev/null 2>&1 echo "*** MKFS ***" >>$seq.full echo "" >>$seq.full -_scratch_mkfs_xfs -dsize=50m >>$seq.full 2>&1 \ +let SIZE=50*1024*1024 +_scratch_mkfs_sized $SIZE >>$seq.full 2>&1 \ || _fail "mkfs failed" _scratch_mount >>$seq.full 2>&1 \ || _fail "mount failed" diff --git a/group b/group index 6b8528f..c66d965 100644 --- a/group +++ b/group @@ -187,7 +187,7 @@ deprecated 074 rw udf auto 075 rw udf auto quick 076 metadata rw udf auto quick -077 acl attr auto +077 acl attr auto enospc 078 growfs auto quick 079 acl attr ioctl metadata auto quick 080 rw ioctl From sandeen@sandeen.net Wed Feb 3 15:39:55 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13Ldsf9245713 for ; Wed, 3 Feb 2010 15:39:55 -0600 X-ASG-Debug-ID: 1265233263-05dd03490000-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 219FD1AA7ED for ; Wed, 3 Feb 2010 13:41:03 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SZLVtJwBn91yLe9m for ; Wed, 03 Feb 2010 13:41:03 -0800 (PST) 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 o13Lf34U017053 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 3 Feb 2010 16:41:03 -0500 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 o13Lf2HL021587 for ; Wed, 3 Feb 2010 16:41:02 -0500 Message-ID: <4B69ED6D.6030902@sandeen.net> Date: Wed, 03 Feb 2010 15:41:01 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH 3/3] xfstests: rename _acl_requirements to _require_acls Subject: [PATCH 3/3] xfstests: rename _acl_requirements to _require_acls References: <4B69EC23.8040207@sandeen.net> In-Reply-To: <4B69EC23.8040207@sandeen.net> 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: 1265233264 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21576 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 Most requirement tests are named _require_foo, so just make this more consistent. Also remove a few redundant tests for /usr/bin/chacl since _require_acls covers that. Signed-off-by: Eric Sandeen --- diff --git a/051 b/051 index 238abe9..12febd3 100755 --- a/051 +++ b/051 @@ -73,7 +73,6 @@ _cleanup() _supported_fs xfs udf _supported_os Linux -[ -x /usr/bin/chacl ] || _notrun "chacl executable not found" [ -x $runas ] || _notrun "$runas executable not found" rm -f $seq.full @@ -82,7 +81,7 @@ _setup_testdir _need_to_be_root _acl_setup_ids -_acl_requirements +_require_acls # get dir cd $testdir diff --git a/053 b/053 index 439cbe6..ac2162d 100755 --- a/053 +++ b/053 @@ -42,7 +42,7 @@ _supported_fs generic _supported_os Linux _require_scratch -_acl_requirements +_require_acls _acl_setup_ids _do_die_on_error=y test=$SCRATCH_MNT/test diff --git a/067 b/067 index 5ab743e..f1c211f 100755 --- a/067 +++ b/067 @@ -41,10 +41,8 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 _supported_fs xfs _supported_os Linux -[ -x /usr/bin/chacl ] || _notrun "chacl executable not found" - _need_to_be_root -_acl_requirements +_require_acls _require_scratch # set up fs for 1K inodes diff --git a/077 b/077 index a3d9334..ea81c07 100755 --- a/077 +++ b/077 @@ -53,7 +53,7 @@ _supported_os Linux [ ! -d $filler ] && _notrun "No directory to source files from" _require_scratch -_acl_requirements +_require_acls echo "*** create filesystem" diff --git a/099 b/099 index 90af18f..b68bfcd 100755 --- a/099 +++ b/099 @@ -81,7 +81,8 @@ _supported_fs generic _supported_os IRIX _acl_setup_ids -_acl_requirements +_require_acls + [ -x $runas ] || _notrun "$runas executable not found" # get dir diff --git a/105 b/105 index 9544c66..aba1f6d 100755 --- a/105 +++ b/105 @@ -56,7 +56,7 @@ rm -f $seq.full _require_scratch _acl_setup_ids -_acl_requirements +_require_acls umount $SCRATCH_DEV >/dev/null 2>&1 echo "*** MKFS ***" >>$seq.full diff --git a/common.attr b/common.attr index d12cc02..5019884 100644 --- a/common.attr +++ b/common.attr @@ -112,7 +112,7 @@ _filter_aces_notypes() # test if acl code will work # -_acl_requirements() +_require_acls() { xfsdir=$TEST_DIR From aelder@sgi.com Wed Feb 3 16:34:26 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13MYQwJ248469 for ; Wed, 3 Feb 2010 16:34:26 -0600 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 41F06AC039; Wed, 3 Feb 2010 14:35:33 -0800 (PST) Received: from [128.162.232.155] ([128.162.232.155]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 3 Feb 2010 16:35:32 -0600 Subject: Re: xfstests: 219: fix awk filter for duplicate users From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20100203205151.GA11337@infradead.org> References: <1265226844.2848.27.camel@doink1> <20100203205151.GA11337@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Wed, 03 Feb 2010 16:35:32 -0600 Message-ID: <1265236532.2585.0.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 03 Feb 2010 22:35:32.0770 (UTC) FILETIME=[322B9020:01CAA521] 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-02-03 at 15:51 -0500, Christoph Hellwig wrote: > On Wed, Feb 03, 2010 at 01:54:04PM -0600, Alex Elder wrote: > > The filter I added for removing duplicate users from the > > output of repquota didn't do the job very well. This > > fixes that, making it so the first time a user is seen > > its line is printed, not thereafter. > > > > Signed-off-by: Alex Elder > > > > --- > > 219 | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > Index: b/219 > > =================================================================== > > --- a/219 > > +++ b/219 > > @@ -86,7 +86,7 @@ test_accounting() > > done > > > > repquota -$type -s -n $SCRATCH_MNT | grep -v "^#0" | > > filter_scratch | > > - awk '/^#/ { if (! seen[$1]) { seen[$1]++; next; } } { print }' > > + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } } { print; }' > > The patch seems whitespace damages, and there's a "}" too many in > the added line. After fixing that up 219 passes again for me. > > So more or less: > > > Reviewed-by: Christoph Hellwig I copy and pasted the wrong thing into my e-mail. Sorry about that. I will fix both the white space and the curly brace before commit. Thanks for the review. -Alex From SRS0+Oto3+63+fromorbit.com=david@internode.on.net Wed Feb 3 17:01:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13N1V8U250597 for ; Wed, 3 Feb 2010 17:01:31 -0600 X-ASG-Debug-ID: 1265238158-3f49020d0000-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 A78B41376E6E for ; Wed, 3 Feb 2010 15:02:38 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id MdAZr5DEwMxju6Dm for ; Wed, 03 Feb 2010 15:02:38 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12574219-1927428 for multiple; Thu, 04 Feb 2010 09:32:37 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NcoF1-0002Sw-Az; Thu, 04 Feb 2010 10:02:35 +1100 Date: Thu, 4 Feb 2010 10:02:35 +1100 From: Dave Chinner To: Christoph Hellwig Cc: bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/10] xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 Subject: Re: [PATCH 09/10] xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 Message-ID: <20100203230235.GB5332@discord.disaster> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-10-git-send-email-david@fromorbit.com> <20100203112753.GA19996@infradead.org> <20100203205648.GA23116@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100203205648.GA23116@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1265238160 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21581 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, Feb 03, 2010 at 03:56:48PM -0500, Christoph Hellwig wrote: > On Wed, Feb 03, 2010 at 06:27:53AM -0500, Christoph Hellwig wrote: > > Still not entirely happy with this one. The first one is that I think > > the barriers in fsync are still too heavy for the normal sync use > > case. I'd be more happy with exporting the body of xfs_fsync without > > the cache flushes (and a ebtter name than xfs_fsync) and use that > > for write_inode. > > > > That leaves open the NFSD case thought. I'd prefer to have that fixed > > if possibly. Ben, any chance you could send your patch to use fsync > > to the nfs list ASAP? I think we'd be even better off to just force > > -o wsync and disable ->write_inode entirely for NFS, any chance you > > could test such a patch on your setup? > > Thinking about it, we usually do cause a log buffer write from ->fsync > which means we submit the barrier anyway. That might be the reason > why you're not seeing the performance hit in your testing. With that > I'm okay with the patch as-is for now, we can micro-optimize it later. OK. I was thinking that a "inode cluster fsync" function might be appropriate here. i.e. a transaction that takes all the dirty inodes in the inode cluster and logs/forces them all in one transaction. That would substanitally reduce the number of log writes needed, I think. I'll look into this over the next few days. Thanks for the reviews, Christoph. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+O7JB+63+fromorbit.com=david@internode.on.net Wed Feb 3 17:07:28 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o13N7Sxw251063 for ; Wed, 3 Feb 2010 17:07:28 -0600 X-ASG-Debug-ID: 1265238515-3a8002250000-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 C3B5C1C9F344 for ; Wed, 3 Feb 2010 15:08:36 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id nG1hZjoQx0xLyHHh for ; Wed, 03 Feb 2010 15:08:36 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12366963-1927428 for multiple; Thu, 04 Feb 2010 09:38:34 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NcoKn-0002TS-8Y; Thu, 04 Feb 2010 10:08:33 +1100 Date: Thu, 4 Feb 2010 10:08:33 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 08/10] xfs: move the inode locking outside xfs_fsync() Subject: Re: [PATCH 08/10] xfs: move the inode locking outside xfs_fsync() Message-ID: <20100203230833.GC5332@discord.disaster> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-9-git-send-email-david@fromorbit.com> <20100203112917.GB19996@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100203112917.GB19996@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1265238517 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21582 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, Feb 03, 2010 at 06:29:17AM -0500, Christoph Hellwig wrote: > On Wed, Feb 03, 2010 at 10:25:02AM +1100, Dave Chinner wrote: > > We have a need for a delayed write inode flush operation > > to be made atomically with an fsync to avoid physically > > writing inodes but still keeping inode buffer information > > up to date for bulkstat. > > > > Move the inode locking outside xfs_fsync() to allow this to > > be done. > > What's the point of the lock_flags argument? It should always > be IOLOCK_SHARED, so instead of passing it in as an argument > I'd rather add an assert to enforce it. Fair enough. Updated patch below. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: move the inode locking outside xfs_fsync() V2 We have a need for a delayed write inode flush operation to be made atomically with an fsync to avoid physically writing inodes but still keeping inode buffer information up to date for bulkstat. Move the inode locking outside xfs_fsync() to allow this to be done. Version 2 - kill the lock_flags argument and simply assert XFS_IOLOCK_SHARED in xfs_fsync(). Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 6 +++++- fs/xfs/linux-2.6/xfs_lrw.c | 3 ++- fs/xfs/xfs_vnodeops.c | 29 +++++++++++++---------------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index e4caeb2..94d9d6d 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -177,9 +177,13 @@ xfs_file_fsync( int datasync) { struct xfs_inode *ip = XFS_I(dentry->d_inode); + int error; xfs_iflags_clear(ip, XFS_ITRUNCATED); - return -xfs_fsync(ip); + xfs_ilock(ip, XFS_ILOCK_SHARED); + error = -xfs_fsync(ip); + xfs_iunlock(ip, XFS_ILOCK_SHARED); + return error; } STATIC int diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index c80fa00..d7f1a71 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c @@ -754,11 +754,12 @@ write_retry: error = error2; if (need_i_mutex) mutex_lock(&inode->i_mutex); - xfs_ilock(xip, iolock); + xfs_ilock(xip, iolock | XFS_ILOCK_SHARED); error2 = xfs_fsync(xip); if (!error) error = error2; + xfs_iunlock(xip, XFS_ILOCK_SHARED); } out_unlock_internal: diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 43241e2..b5689a4 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -590,6 +590,17 @@ xfs_readlink( * the I/O lock while flushing the data, and the inode lock while flushing the * inode. The inode lock CANNOT be held while flushing the data, so acquire * after we're done with that. + * + * We always need to make sure that the required inode state is safe on disk. + * The inode might be clean but we still might need to force the log because of + * committed transactions that haven't hit the disk yet. Likewise, there could + * be unflushed non-transactional changes to the inode core that have to go to + * disk and this requires us to issue a synchronous transaction to capture + * these changes correctly. + * + * This code relies on the assumption that if the update_* fields of the inode + * are clear and the inode is unpinned then it is clean and no action is + * required. */ int xfs_fsync( @@ -600,24 +611,11 @@ xfs_fsync( int log_flushed = 0; xfs_itrace_entry(ip); + ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED)); if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return XFS_ERROR(EIO); - /* - * We always need to make sure that the required inode state is safe on - * disk. The inode might be clean but we still might need to force the - * log because of committed transactions that haven't hit the disk yet. - * Likewise, there could be unflushed non-transactional changes to the - * inode core that have to go to disk and this requires us to issue - * a synchronous transaction to capture these changes correctly. - * - * This code relies on the assumption that if the update_* fields - * of the inode are clear and the inode is unpinned then it is clean - * and no action is required. - */ - xfs_ilock(ip, XFS_ILOCK_SHARED); - if (!ip->i_update_core) { /* * Timestamps/size haven't changed since last inode flush or @@ -627,7 +625,6 @@ xfs_fsync( * disk yet, the inode will be still be pinned. If it is, * force the log. */ - xfs_iunlock(ip, XFS_ILOCK_SHARED); if (xfs_ipincount(ip)) { error = _xfs_log_force(ip->i_mount, XFS_LOG_SYNC, &log_flushed); @@ -662,7 +659,7 @@ xfs_fsync( xfs_trans_set_sync(tp); error = _xfs_trans_commit(tp, 0, &log_flushed); - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_ilock_demote(ip, XFS_ILOCK_EXCL); } if (ip->i_mount->m_flags & XFS_MOUNT_BARRIER) { From SRS0+KImH+64+fromorbit.com=david@internode.on.net Thu Feb 4 02:13:18 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o148DH75021666 for ; Thu, 4 Feb 2010 02:13:18 -0600 X-ASG-Debug-ID: 1265271264-4ced00580000-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 070841ABBD5 for ; Thu, 4 Feb 2010 00:14:25 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id ShmQjAKduy193ocu for ; Thu, 04 Feb 2010 00:14:25 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12524248-1927428 for multiple; Thu, 04 Feb 2010 18:44:24 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Ncwr0-0002yz-LC; Thu, 04 Feb 2010 19:14:22 +1100 Date: Thu, 4 Feb 2010 19:14:22 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH for-2.6.33] xfs: flush all log buffers in xlog_dealloc_log Subject: Re: [PATCH for-2.6.33] xfs: flush all log buffers in xlog_dealloc_log Message-ID: <20100204081422.GF5332@discord.disaster> References: <20100201220813.GA3519@infradead.org> <20100203105545.GA1047@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100203105545.GA1047@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1265271267 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21616 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, Feb 03, 2010 at 05:55:45AM -0500, Christoph Hellwig wrote: > Actually I'll take this one back - the log buffers aren't delwri > so xfs_flush_buftarg probably only helped by timing or the > xfs_buf_runall_queues on xfslogd_workqueue. Need to think about > this a bit more. Can you point me at the bug report? IIRC I've seen this in the past where we freed the log before we've done all the correct shutdown processing and they got fixed by correcting the order of shutdown to ensure the log is idle before freeing it... Cheers, Dave. -- Dave Chinner david@fromorbit.com From schulze@informatik.uni-tuebingen.de Thu Feb 4 05:09:19 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o14B9IJa031753 for ; Thu, 4 Feb 2010 05:09:19 -0600 X-ASG-Debug-ID: 1265281827-0e0c00410000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.informatik.uni-tuebingen.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5FF1813790FA for ; Thu, 4 Feb 2010 03:10:27 -0800 (PST) Received: from mx2.informatik.uni-tuebingen.de (mx2.Informatik.Uni-Tuebingen.De [134.2.12.9]) by cuda.sgi.com with ESMTP id pn2iDz0vRTdrwri1 for ; Thu, 04 Feb 2010 03:10:27 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by mx2.informatik.uni-tuebingen.de (Postfix) with ESMTP id 8B5DB345B for ; Thu, 4 Feb 2010 12:10:26 +0100 (MET) Received: from mx2.informatik.uni-tuebingen.de ([127.0.0.1]) by localhost (mx2.informatik.uni-tuebingen.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SONXO4gZcVjr for ; Thu, 4 Feb 2010 12:10:26 +0100 (MET) Received: from imap.informatik.uni-tuebingen.de (bluff.Informatik.Uni-Tuebingen.De [134.2.9.80]) by mx2.informatik.uni-tuebingen.de (Postfix) with ESMTP id 5FE173441 for ; Thu, 4 Feb 2010 12:10:26 +0100 (MET) Received: from zcs-bs.informatik.uni-tuebingen.de (zcs-bs.Informatik.Uni-Tuebingen.De [134.2.12.62]) by imap.informatik.uni-tuebingen.de (Postfix) with ESMTP id 4C0AC4CB8 for ; Thu, 4 Feb 2010 12:10:26 +0100 (MET) Received: from zcs-bs.informatik.uni-tuebingen.de (zcs-bs.Informatik.Uni-Tuebingen.De [134.2.12.62]) by zcs-bs.informatik.uni-tuebingen.de (Postfix) with ESMTP id 6CF4C364E8F for ; Thu, 4 Feb 2010 12:10:26 +0100 (CET) Date: Thu, 4 Feb 2010 12:10:26 +0100 (CET) From: Jan Schulze To: xfs@oss.sgi.com Message-ID: <13543215.8311265281826308.JavaMail.root@zcs-bs.Informatik.Uni-Tuebingen.De> X-ASG-Orig-Subj: re-enabling quota enforcement => invalid argument Subject: re-enabling quota enforcement => invalid argument MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [134.2.9.172] X-Mailer: Zimbra 5.0.19_GA_3083.MACOSXx86_10.5 (ZimbraWebClient - FF3.0 (Linux)/5.0.19_GA_3083.MACOSXx86_10.5) X-Barracuda-Connect: mx2.Informatik.Uni-Tuebingen.De[134.2.12.9] X-Barracuda-Start-Time: 1265281828 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2409 1.0000 -0.6193 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.62 X-Barracuda-Spam-Status: No, SCORE=-0.62 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.21626 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 all, I have an XFS filesystem with pquota accounting and enforcement. It was working well, but recently I had to disable enforcement for a short time. Now I want to switch it back on, but I get the error "XFS_QUOTAON: Invalid argument". Does anyone know, what to do? Any suggestions are welcome. Thanks in advance. [root@coffein raid]# xfs_quota -x -c "state -a" /raid User quota state on /raid (/dev/sdb1) Accounting: OFF Enforcement: OFF Inode: #18446744073709551615 (0 blocks, 0 extents) Group quota state on /raid (/dev/sdb1) Accounting: OFF Enforcement: OFF Inode: #259 (24 blocks, 3 extents) Project quota state on /raid (/dev/sdb1) Accounting: ON Enforcement: OFF Inode: #259 (24 blocks, 3 extents) Blocks grace time: [7 days 00:00:30] Inodes grace time: [7 days 00:00:30] Realtime Blocks grace time: [7 days 00:00:30] [root@coffein raid]# xfs_quota -x -c "enable -p -v" /raid XFS_QUOTAON: Invalid argument Best Regards, Jan From BATV+197641c031149925fcd8+2356+infradead.org+hch@bombadil.srs.infradead.org Thu Feb 4 09:28:58 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o14FSuod061237 for ; Thu, 4 Feb 2010 09:28:57 -0600 X-ASG-Debug-ID: 1265297406-0ce503390000-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 C19741CA2EC9; Thu, 4 Feb 2010 07:30:06 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id xtdA4AqJA7rOFsQu; Thu, 04 Feb 2010 07:30:06 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nd3eg-0005H6-GS; Thu, 04 Feb 2010 15:30:06 +0000 Date: Thu, 4 Feb 2010 10:30:06 -0500 From: Christoph Hellwig To: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [RFC PATCH 0/4] wsync export option Subject: Re: [RFC PATCH 0/4] wsync export option Message-ID: <20100204153006.GC22014@infradead.org> References: <20100203233755.17677.96582.stgit@case> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100203233755.17677.96582.stgit@case> 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: 1265297406 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, Feb 03, 2010 at 05:44:24PM -0600, Ben Myers wrote: > The following series is adds a 'wsync' export option to nfsd. It is intended > to be used on XFS with the wsync mount option. When you already have a > synchronous log there is no need to sync metadata separately. You don't need the xfs wsync option, as the existing write_inode calls or your new fsync calls are doing the same as the wsync mount option, just from a higher layer. The wsync option causes the log to be synchronously forced up to the log sequence number of the commit for the metadata operation, that is make all the operations affected by it synchronous. That's exactly what we'll do using fsync (actually right now we force the whole log, but I have a patch to optimize it to only force nuntil the last commit lsn), and approqimately the same as we do using write_inode, just a lot less efficiently. > This is barely tested, YMMV, I could have this all wrong, etc, etc. Here are > some very unscientific measurements taken over gigabit ethernet. > > # time tar -xvf /mnt2/quilt-0.47.tar > /dev/null > > No XFS wsync, no NFS wsync: > 0m13.177s 0m13.301s 0m13.528s > > XFS wsync set, no NFS wsync: > 0m13.019s 0m13.232s 0m13.094s > > XFS wsync set, NFS wsync set: > 0m8.361s 0m8.400s 0m8.301s > > Curious to hear if this is a reasonable thing to do. Suggestions welcome. I think it's reasonable. What might be even better it to have an export operation call out into the filesystem so that we can force wsync and not let nfsd deal with it at all. There is a fair chance that the filesystem can do the sync more efficiently. And btw, not directly related to your patch, but getting rid of this write_inode call defintively makes the usage of ->write_inode more regular. From generic code we mostly use it for full inode writeback in writeback_single_inode, and one other special case in generic_detach_inode if a filesystem is unmounting. Only having writeback_single_inode and fs code use it will make this call much more predictable for the filesystem. From BATV+197641c031149925fcd8+2356+infradead.org+hch@bombadil.srs.infradead.org Thu Feb 4 10:06:45 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o14G6iYF072847 for ; Thu, 4 Feb 2010 10:06:44 -0600 X-ASG-Debug-ID: 1265299674-6c8703840000-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 906621AF2D3 for ; Thu, 4 Feb 2010 08:07:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id jtDSlDS9nnuxAr23 for ; Thu, 04 Feb 2010 08:07:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nd4FE-0005TF-Ol; Thu, 04 Feb 2010 16:07:52 +0000 Date: Thu, 4 Feb 2010 11:07:52 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 08/10] xfs: move the inode locking outside xfs_fsync() Subject: Re: [PATCH 08/10] xfs: move the inode locking outside xfs_fsync() Message-ID: <20100204160752.GA11206@infradead.org> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-9-git-send-email-david@fromorbit.com> <20100203112917.GB19996@infradead.org> <20100203230833.GC5332@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100203230833.GC5332@discord.disaster> 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: 1265299674 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, Feb 04, 2010 at 10:08:33AM +1100, Dave Chinner wrote: > On Wed, Feb 03, 2010 at 06:29:17AM -0500, Christoph Hellwig wrote: > > On Wed, Feb 03, 2010 at 10:25:02AM +1100, Dave Chinner wrote: > > > We have a need for a delayed write inode flush operation > > > to be made atomically with an fsync to avoid physically > > > writing inodes but still keeping inode buffer information > > > up to date for bulkstat. > > > > > > Move the inode locking outside xfs_fsync() to allow this to > > > be done. > > > > What's the point of the lock_flags argument? It should always > > be IOLOCK_SHARED, so instead of passing it in as an argument > > I'd rather add an assert to enforce it. > > Fair enough. Updated patch below. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > xfs: move the inode locking outside xfs_fsync() V2 > > We have a need for a delayed write inode flush operation > to be made atomically with an fsync to avoid physically > writing inodes but still keeping inode buffer information > up to date for bulkstat. > > Move the inode locking outside xfs_fsync() to allow this to > be done. > > Version 2 > - kill the lock_flags argument and simply assert XFS_IOLOCK_SHARED > in xfs_fsync(). Looks good, Reviewed-by: Christoph Hellwig From BATV+197641c031149925fcd8+2356+infradead.org+hch@bombadil.srs.infradead.org Thu Feb 4 10:09:41 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o14G9fIf073359 for ; Thu, 4 Feb 2010 10:09:41 -0600 X-ASG-Debug-ID: 1265299851-729b010e0000-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 91F85137AB36 for ; Thu, 4 Feb 2010 08:10:51 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id azdAHOhWzQHyNbWh for ; Thu, 04 Feb 2010 08:10:51 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nd4I7-0006ed-0d; Thu, 04 Feb 2010 16:10:51 +0000 Date: Thu, 4 Feb 2010 11:10:50 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH for-2.6.33] xfs: flush all log buffers in xlog_dealloc_log Subject: Re: [PATCH for-2.6.33] xfs: flush all log buffers in xlog_dealloc_log Message-ID: <20100204161050.GB11206@infradead.org> References: <20100201220813.GA3519@infradead.org> <20100203105545.GA1047@infradead.org> <20100204081422.GF5332@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100204081422.GF5332@discord.disaster> 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: 1265299851 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, Feb 04, 2010 at 07:14:22PM +1100, Dave Chinner wrote: > On Wed, Feb 03, 2010 at 05:55:45AM -0500, Christoph Hellwig wrote: > > Actually I'll take this one back - the log buffers aren't delwri > > so xfs_flush_buftarg probably only helped by timing or the > > xfs_buf_runall_queues on xfslogd_workqueue. Need to think about > > this a bit more. > > Can you point me at the bug report? IIRC I've seen this in the > past where we freed the log before we've done all the correct > shutdown processing and they got fixed by correcting the > order of shutdown to ensure the log is idle before freeing > it... Yes, that I was going to look into next. The recent report is http://bugzilla.kernel.org/show_bug.cgi?id=15150 and there's also a very similar one from Ed Cashin in mail archives from November. From BATV+197641c031149925fcd8+2356+infradead.org+hch@bombadil.srs.infradead.org Thu Feb 4 10:17:39 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_72 autolearn=no version=3.3.0-rupdated 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 o14GHcwI074170 for ; Thu, 4 Feb 2010 10:17:39 -0600 X-ASG-Debug-ID: 1265300329-626e03c40000-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 665A81AF382 for ; Thu, 4 Feb 2010 08:18:49 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id kwDuPgY2HvtoyW6c for ; Thu, 04 Feb 2010 08:18:49 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nd4Pn-0000Oi-Li; Thu, 04 Feb 2010 16:18:47 +0000 Date: Thu, 4 Feb 2010 11:18:47 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Eric Sandeen , xfs mailing list X-ASG-Orig-Subj: Re: [PATCH, RFC] more reserved blocks fixups Subject: Re: [PATCH, RFC] more reserved blocks fixups Message-ID: <20100204161847.GA32102@infradead.org> References: <4B60C8EE.5080700@sandeen.net> <20100128015817.GH15853@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100128015817.GH15853@discord.disaster> 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: 1265300329 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, Jan 28, 2010 at 12:58:17PM +1100, Dave Chinner wrote: > On Wed, Jan 27, 2010 at 05:14:54PM -0600, Eric Sandeen wrote: > > This mangles the reserved blocks counts a little more. > > > > 1) add a helper function for the default reserved count > > 2) add helper functions to save/restore counts on ro/rw > > 3) save/restore reserved blocks on freeze/thaw > > 4) disallow changing reserved count while readonly > > > > for 2) - maybe better names (save_and_clear?) > > for 4) - maybe allow, but change the _ro field instead? > > > > (TBH not tested yet but wondered if this seems sane) > > I was wondering if the save/restore could be encapsualted entirely > within xfs_quiesce_attr(). i.e. save before the superblock write, > restore directly after. That removes the need for a variable in > the xfs_mount structure, and catches both remount,ro and freeze. Seems like a bit fragile. But I think we want Eric's version over yours for a start - we should have a clean filesystem not only after remount,ro but also for a frozen filesystem. From sandeen@redhat.com Thu Feb 4 10:32:58 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_21,J_CHICKENPOX_43,J_CHICKENPOX_46 autolearn=no version=3.3.0-rupdated 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 o14GWvjK075103 for ; Thu, 4 Feb 2010 10:32:57 -0600 X-ASG-Debug-ID: 1265301246-4fa200e70000-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 ED4571AF01C for ; Thu, 4 Feb 2010 08:34:06 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zglE7WgDrQiknUzq for ; Thu, 04 Feb 2010 08:34:06 -0800 (PST) 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 o14GY5Ew013855 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 4 Feb 2010 11:34:06 -0500 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 o14GY5a5013670; Thu, 4 Feb 2010 11:34:05 -0500 Message-ID: <4B6AF6FC.6030101@redhat.com> Date: Thu, 04 Feb 2010 10:34:04 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list CC: Jim Meyering X-ASG-Orig-Subj: [PATCH] mkfs: don't try to detect filesystems on regular files via blkid Subject: [PATCH] mkfs: don't try to detect filesystems on regular files via blkid 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: 1265301246 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21646 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 RH bug https://bugzilla.redhat.com/show_bug.cgi?id=561870 # dd if=/dev/zero of=k bs=1MB count=2 seek=20; mkfs.xfs k # mkfs.xfs: probe of k failed, cannot detect existing filesystem. # mkfs.xfs: Use the -f option to force overwrite. blkid fails to do a probe of a regular file. I wish blkid would cope with this, but for now it might be better to just turn it off. Reported-by: Jim Meyering Signed-off-by: Eric Sandeen --- diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 9baf116..de87647 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -300,10 +300,15 @@ check_overwrite( int fd; long long size; int bsz; + struct stat statbuf; if (!device || !*device) return 0; + /* blkid can't get info from a regular file */ + if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) + return 0; + ret = -1; /* will reset on success of all setup calls */ fd = open(device, O_RDONLY); From jim@meyering.net Thu Feb 4 10:45:16 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.9 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_21,J_CHICKENPOX_43,J_CHICKENPOX_46 autolearn=no version=3.3.0-rupdated 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 o14GjFs5075961 for ; Thu, 4 Feb 2010 10:45:16 -0600 X-ASG-Debug-ID: 1265301984-4f2c01a70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx.meyering.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9BBC41AF551 for ; Thu, 4 Feb 2010 08:46:25 -0800 (PST) Received: from mx.meyering.net (mx.meyering.net [82.230.74.64]) by cuda.sgi.com with ESMTP id irAlCiC5iTYgdhIx for ; Thu, 04 Feb 2010 08:46:25 -0800 (PST) Received: by rho.meyering.net (Acme Bit-Twister, from userid 1000) id CF74F11EA; Thu, 4 Feb 2010 17:46:23 +0100 (CET) From: Jim Meyering To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] mkfs: don't try to detect filesystems on regular files via blkid Subject: Re: [PATCH] mkfs: don't try to detect filesystems on regular files via blkid In-Reply-To: <4B6AF6FC.6030101@redhat.com> (Eric Sandeen's message of "Thu, 04 Feb 2010 10:34:04 -0600") References: <4B6AF6FC.6030101@redhat.com> Date: Thu, 04 Feb 2010 17:46:23 +0100 Message-ID: <878wb9j6e8.fsf@meyering.net> Lines: 51 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: mx.meyering.net[82.230.74.64] X-Barracuda-Start-Time: 1265301985 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21646 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 Eric Sandeen wrote: > https://bugzilla.redhat.com/show_bug.cgi?id=561870 > > # dd if=/dev/zero of=k bs=1MB count=2 seek=20; mkfs.xfs k > # mkfs.xfs: probe of k failed, cannot detect existing filesystem. > # mkfs.xfs: Use the -f option to force overwrite. > > blkid fails to do a probe of a regular file. > > I wish blkid would cope with this, but for now it might > be better to just turn it off. > > Reported-by: Jim Meyering > Signed-off-by: Eric Sandeen > --- > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 9baf116..de87647 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -300,10 +300,15 @@ check_overwrite( > int fd; > long long size; > int bsz; > + struct stat statbuf; > > if (!device || !*device) > return 0; > > + /* blkid can't get info from a regular file */ > + if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) > + return 0; > + > ret = -1; /* will reset on success of all setup calls */ > > fd = open(device, O_RDONLY); Hi Eric, Did you consider calling fstat after opening, rather than "stat" before? /* blkid can't get info from a regular file */ if (!fstat(fd, &statbuf) && S_ISREG(statbuf.st_mode)) { close(fd); return 0; } That's slightly more efficient, and not prone to confusion in the unlikely event that "device" changes inode between the stat and the open calls. From sandeen@sandeen.net Thu Feb 4 10:52:16 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o14GqFIO076425 for ; Thu, 4 Feb 2010 10:52:16 -0600 X-ASG-Debug-ID: 1265302404-4ee902280000-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 8AF491AF3FA for ; Thu, 4 Feb 2010 08:53:24 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SjwTRvTSRXe0K8t8 for ; Thu, 04 Feb 2010 08:53:24 -0800 (PST) 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 o14GrOfx013591 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 4 Feb 2010 11:53:24 -0500 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 o14GrNue020255 for ; Thu, 4 Feb 2010 11:53:23 -0500 Message-ID: <4B6AFB83.1070309@sandeen.net> Date: Thu, 04 Feb 2010 10:53:23 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: xfsprogs: to -DDEBUG or not to -DDEBUG? Subject: xfsprogs: to -DDEBUG or not to -DDEBUG? 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: 1265302405 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21648 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 Fedora, long ago, disabled debug in the xfsprogs specfile: http://cvs.fedoraproject.org/viewvc/F-12/xfsprogs/xfsprogs.spec?r1=1.5&r2=1.6 * Wed Apr 20 2005 Dave Jones - Disable debug. (#151438) per this bug: https://bugzilla.redhat.com/show_bug.cgi?id=151438 referencing this email thread: http://oss.sgi.com/archives/linux-xfs/2005-03/msg00038.html which no longer exists (grrrr) but is probably now here: http://oss.sgi.com/archives/xfs/2005-03/msg00416.html Fedora still builds with -DNDEBUG, but the upstream tarball has it on by default. I have seen several occasions where other distros had failing xfs_repairs which were "fixed" by disabling debug. I'd like to make a decision on whether DEBUG should be on or off by default for upstream releases. Any thoughts? Thanks, -Eric From sandeen@redhat.com Thu Feb 4 10:53:13 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_21,J_CHICKENPOX_43,J_CHICKENPOX_46 autolearn=no version=3.3.0-rupdated 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 o14GrC3d076491 for ; Thu, 4 Feb 2010 10:53:13 -0600 X-ASG-Debug-ID: 1265302461-150301260000-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 13C5E137B297 for ; Thu, 4 Feb 2010 08:54:21 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dNfnfKULmc6IqO0e for ; Thu, 04 Feb 2010 08:54:21 -0800 (PST) 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 o14GsIuA014023 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 4 Feb 2010 11:54:19 -0500 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 o14GsI9s020669; Thu, 4 Feb 2010 11:54:18 -0500 Message-ID: <4B6AFBB9.7000701@redhat.com> Date: Thu, 04 Feb 2010 10:54:17 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Jim Meyering CC: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] mkfs: don't try to detect filesystems on regular files via blkid Subject: Re: [PATCH] mkfs: don't try to detect filesystems on regular files via blkid References: <4B6AF6FC.6030101@redhat.com> <878wb9j6e8.fsf@meyering.net> In-Reply-To: <878wb9j6e8.fsf@meyering.net> Content-Type: text/plain; charset=us-ascii 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: 1265302462 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21647 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 Jim Meyering wrote: > Eric Sandeen wrote: >> https://bugzilla.redhat.com/show_bug.cgi?id=561870 >> >> # dd if=/dev/zero of=k bs=1MB count=2 seek=20; mkfs.xfs k >> # mkfs.xfs: probe of k failed, cannot detect existing filesystem. >> # mkfs.xfs: Use the -f option to force overwrite. >> >> blkid fails to do a probe of a regular file. >> >> I wish blkid would cope with this, but for now it might >> be better to just turn it off. >> >> Reported-by: Jim Meyering >> Signed-off-by: Eric Sandeen >> --- >> >> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c >> index 9baf116..de87647 100644 >> --- a/mkfs/xfs_mkfs.c >> +++ b/mkfs/xfs_mkfs.c >> @@ -300,10 +300,15 @@ check_overwrite( >> int fd; >> long long size; >> int bsz; >> + struct stat statbuf; >> >> if (!device || !*device) >> return 0; >> >> + /* blkid can't get info from a regular file */ >> + if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) >> + return 0; >> + >> ret = -1; /* will reset on success of all setup calls */ >> >> fd = open(device, O_RDONLY); > > Hi Eric, > > Did you consider calling fstat after opening, > rather than "stat" before? > > /* blkid can't get info from a regular file */ > if (!fstat(fd, &statbuf) && S_ISREG(statbuf.st_mode)) { > close(fd); > return 0; > } > > That's slightly more efficient, and not prone to confusion > in the unlikely event that "device" changes inode between > the stat and the open calls. Ok, yes that's probably better, will resend. thanks. -Eric From BATV+197641c031149925fcd8+2356+infradead.org+hch@bombadil.srs.infradead.org Thu Feb 4 11:35:08 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o14HZ6x8079462 for ; Thu, 4 Feb 2010 11:35:07 -0600 X-ASG-Debug-ID: 1265304976-5566008d0000-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 9AFBD137B3FC; Thu, 4 Feb 2010 09:36:16 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id qAyUCGvitc9ZELFI; Thu, 04 Feb 2010 09:36:16 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nd5ck-00047W-NT; Thu, 04 Feb 2010 17:36:14 +0000 Date: Thu, 4 Feb 2010 12:36:14 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/10] xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 Subject: Re: [PATCH 09/10] xfs: xfs_fs_write_inode() can fail to write inodes synchronously V2 Message-ID: <20100204173614.GA9498@infradead.org> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-10-git-send-email-david@fromorbit.com> <20100203112753.GA19996@infradead.org> <20100203205648.GA23116@infradead.org> <20100203230235.GB5332@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100203230235.GB5332@discord.disaster> 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: 1265304976 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 FYI I did some benchmarking on this, and the syncmodes 2 and 5 of fs_mark, which use sys_sync regress almost 10% on my test setup with this patch. The barriers are only a small part of it, from instrumentation it seems like the constant log forces don't really help. Now given that we only get data integrity writes from sync_filesystem do we really need to bother with catching all that pending I/O here? It would be much easier to rely on ->sync_fs to do that for us once, which is does anyway. From sandeen@sandeen.net Thu Feb 4 11:47:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_21,J_CHICKENPOX_43,J_CHICKENPOX_46 autolearn=no version=3.3.0-rupdated 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 o14Hldw4080167 for ; Thu, 4 Feb 2010 11:47:40 -0600 X-ASG-Debug-ID: 1265305729-635600920000-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 D6977137B519 for ; Thu, 4 Feb 2010 09:48:49 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 96Cd6tqr4zVqOTj9 for ; Thu, 04 Feb 2010 09:48:49 -0800 (PST) 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 o14Hmn25023698 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 4 Feb 2010 12:48:49 -0500 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 o14HmmDf005889; Thu, 4 Feb 2010 12:48:48 -0500 Message-ID: <4B6B087F.80901@sandeen.net> Date: Thu, 04 Feb 2010 11:48:47 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Eric Sandeen CC: xfs mailing list , Jim Meyering X-ASG-Orig-Subj: [PATCH V2] mkfs: don't try to detect filesystems on regular files via blkid Subject: [PATCH V2] mkfs: don't try to detect filesystems on regular files via blkid References: <4B6AF6FC.6030101@redhat.com> In-Reply-To: <4B6AF6FC.6030101@redhat.com> Content-Type: text/plain; charset=us-ascii 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: 1265305729 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21651 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 RH bug https://bugzilla.redhat.com/show_bug.cgi?id=561870 # dd if=/dev/zero of=k bs=1MB count=2 seek=20; mkfs.xfs k # mkfs.xfs: probe of k failed, cannot detect existing filesystem. # mkfs.xfs: Use the -f option to force overwrite. blkid fails to do a probe of a regular file. I wish blkid would cope with this, but for now it might be better to just turn it off. I kept the size==0 check just in case we stumble on a 0-sized device, blkid doesn't like that either... Reported-by: Jim Meyering Signed-off-by: Eric Sandeen --- V2: use fstat after the open diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 9baf116..219c81e 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -300,6 +300,7 @@ check_overwrite( int fd; long long size; int bsz; + struct stat statbuf; if (!device || !*device) return 0; @@ -309,6 +310,14 @@ check_overwrite( fd = open(device, O_RDONLY); if (fd < 0) goto out; + + /* blkid can't get info from a regular file */ + if (!fstat(fd, &statbuf) && S_ISREG(statbuf.st_mode)) { + close(fd); + ret = 0; + goto out; + } + platform_findsizes(device, fd, &size, &bsz); close(fd); From bpm@sgi.com Thu Feb 4 12:13:47 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o14IDk9M081747 for ; Thu, 4 Feb 2010 12:13:47 -0600 Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 656C58F8066; Thu, 4 Feb 2010 10:14:54 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 957614266A1; Thu, 4 Feb 2010 12:15:29 -0600 (CST) Date: Thu, 4 Feb 2010 12:15:29 -0600 From: bpm@sgi.com To: Christoph Hellwig Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC PATCH 0/4] wsync export option Message-ID: <20100204181529.GK5702@sgi.com> References: <20100203233755.17677.96582.stgit@case> <20100204153006.GC22014@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100204153006.GC22014@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Feb 04, 2010 at 10:30:06AM -0500, Christoph Hellwig wrote: > On Wed, Feb 03, 2010 at 05:44:24PM -0600, Ben Myers wrote: > > The following series is adds a 'wsync' export option to nfsd. It is intended > > to be used on XFS with the wsync mount option. When you already have a > > synchronous log there is no need to sync metadata separately. > > You don't need the xfs wsync option, as the existing write_inode calls > or your new fsync calls are doing the same as the wsync mount option, > just from a higher layer. Ok, I see that now. write_inode_now is basically a superset of what we need. The important thing is to force the log (which xfs_file_operations.xfs_file_fsync does do) but not to call xfs_super_operations.write_inode (via write_inode_now) which eventually gets into xfs_iflush and takes forever. We can take forever later-- when the log is full. ;) > The wsync option causes the log to be synchronously forced up to the > log sequence number of the commit for the metadata operation, that is > make all the operations affected by it synchronous. That's exactly > what we'll do using fsync (actually right now we force the whole log, > but I have a patch to optimize it to only force nuntil the last commit > lsn), and approqimately the same as we do using write_inode, just a > lot less efficiently. Rather than having X number of synchronous log transactions written separately as with wsync you have X number of log transactions written out together in one go by vfs_fsync (if datasync==0). That should be faster than wsync. > > Curious to hear if this is a reasonable thing to do. Suggestions > > welcome. > > I think it's reasonable. What might be even better it to have an > export operation call out into the filesystem so that we can force > wsync and not let nfsd deal with it at all. There is a fair chance > that the filesystem can do the sync more efficiently. Trond also suggested an export_operation and I think it's a good idea. I'll explore that and repost. Thanks, Ben From BATV+197641c031149925fcd8+2356+infradead.org+hch@bombadil.srs.infradead.org Thu Feb 4 12:38:00 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o14Ibws3083137 for ; Thu, 4 Feb 2010 12:38:00 -0600 X-ASG-Debug-ID: 1265308748-04a901120000-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 9F09D137BB97; Thu, 4 Feb 2010 10:39:08 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id D9R3Cjsl4DEoQawY; Thu, 04 Feb 2010 10:39:08 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nd6bc-0003G8-3C; Thu, 04 Feb 2010 18:39:08 +0000 Date: Thu, 4 Feb 2010 13:39:08 -0500 From: Christoph Hellwig To: bpm@sgi.com Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [RFC PATCH 0/4] wsync export option Subject: Re: [RFC PATCH 0/4] wsync export option Message-ID: <20100204183908.GB9329@infradead.org> References: <20100203233755.17677.96582.stgit@case> <20100204153006.GC22014@infradead.org> <20100204181529.GK5702@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100204181529.GK5702@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: 1265308748 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, Feb 04, 2010 at 12:15:29PM -0600, bpm@sgi.com wrote: > Rather than having X number of synchronous log transactions written > separately as with wsync you have X number of log transactions written > out together in one go by vfs_fsync (if datasync==0). That should be > faster than wsync. Indeed, except that there aren't a lot of different transactions usually. - nfsd_setattr is one SETATTR transaction - nfsd_create might be multiple transactions, indeed - especially the nfsv3 variant that also adds a setattr transaction - nfsd_link should be a single one but yes, doing the log force from nfsd should be a benefit for the create side at least. The additional benefit is that we can just drive it from NFSD and don't need to force mount options on the fs. So yes, let's do it from nfsd. > Trond also suggested an export_operation and I think it's a good idea. > I'll explore that and repost. Indeed. For XFS that export_operation could probably be a lot simpler than xfs_fsync. I don't think we need to catch the non-transactional timestamp and size updates at all, and we're guaranteed the transaction has already commited. So the method might be as simple as: static int xfs_nfs_force_inode(struct inode *inode) { struct xfs_inode *ip = XFS_I(inode); xfs_ilock(ip, XFS_ILOCK_SHARED); if (xfs_ipincount(ip)) { xfs_lsn_t force_lsn = ip->i_itemp->ili_last_lsn; ASSERT(force_lsn); xfs_log_force_lsn(ip->i_mount, force_lsn, XFS_LOG_SYNC); } xfs_iunlock(ip, XFS_ILOCK_SHARED); return 0; } From BATV+197641c031149925fcd8+2356+infradead.org+hch@bombadil.srs.infradead.org Thu Feb 4 13:38:54 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_21,J_CHICKENPOX_43,J_CHICKENPOX_46 autolearn=no version=3.3.0-rupdated 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 o14JcoEL086373 for ; Thu, 4 Feb 2010 13:38:53 -0600 X-ASG-Debug-ID: 1265312400-4b4400520000-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 D46CA137C185 for ; Thu, 4 Feb 2010 11:40:00 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id eLJrXEZPJscbUibq for ; Thu, 04 Feb 2010 11:40:00 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nd7YW-00027E-7d; Thu, 04 Feb 2010 19:40:00 +0000 Date: Thu, 4 Feb 2010 14:40:00 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list , Jim Meyering X-ASG-Orig-Subj: [PATCH] mkfs.xfs fix detection of empty devices Subject: [PATCH] mkfs.xfs fix detection of empty devices Message-ID: <20100204194000.GA7229@infradead.org> References: <4B6AF6FC.6030101@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B6AF6FC.6030101@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: 1265312400 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 We currently fail to detect that a device does indeed not contain any signature and we are indeed fine to proceed with it due to mishandling the return value of blkid_do_fullprobe. Fix that up and add some better diagnostics of the blkid detection. Also remove the size == 0 check in check_overwrite as blkid handles that just fine. from RH bugzilla https://bugzilla.redhat.com/show_bug.cgi?id=561870 # dd if=/dev/zero of=k bs=1MB count=2 seek=20; mkfs.xfs k # mkfs.xfs: probe of k failed, cannot detect existing filesystem. # mkfs.xfs: Use the -f option to force overwrite Signed-off-by: Christoph Hellwig Index: xfsprogs-dev/mkfs/xfs_mkfs.c =================================================================== --- xfsprogs-dev.orig/mkfs/xfs_mkfs.c 2010-02-04 19:19:36.000000000 +0000 +++ xfsprogs-dev/mkfs/xfs_mkfs.c 2010-02-04 19:33:36.000000000 +0000 @@ -297,48 +297,47 @@ check_overwrite( const char *type; blkid_probe pr = NULL; int ret; - int fd; - long long size; - int bsz; if (!device || !*device) return 0; ret = -1; /* will reset on success of all setup calls */ - fd = open(device, O_RDONLY); - if (fd < 0) - goto out; - platform_findsizes(device, fd, &size, &bsz); - close(fd); - - /* nothing to overwrite on a 0-length device */ - if (size == 0) { - ret = 0; - goto out; - } - pr = blkid_new_probe_from_filename(device); if (!pr) goto out; - if (blkid_probe_enable_partitions(pr, 1)) + ret = blkid_probe_enable_partitions(pr, 1); + if (ret < 0) + goto out; + + ret = blkid_do_fullprobe(pr); + if (ret < 0) goto out; - if (blkid_do_fullprobe(pr)) + /* + * Blkid returns 1 for nothing found and 0 when it finds a signature, + * but we want the exact opposite, so reverse the return value here. + * + * In addition print some useful diagnostics about what actually is + * on the device. + */ + ret = !ret; + if (!ret) goto out; - ret = 0; if (!blkid_probe_lookup_value(pr, "TYPE", &type, NULL)) { fprintf(stderr, _("%s: %s appears to contain an existing " "filesystem (%s).\n"), progname, device, type); - ret = 1; } else if (!blkid_probe_lookup_value(pr, "PTTYPE", &type, NULL)) { fprintf(stderr, _("%s: %s appears to contain a partition " "table (%s).\n"), progname, device, type); - ret = 1; + } else { + fprintf(stderr, + _("%s: %s appears to contain something weird " + "according to blkid\n"), progname, device); } out: From sandeen@sandeen.net Thu Feb 4 13:42:17 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_21,J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated 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 o14JgGsv086471 for ; Thu, 4 Feb 2010 13:42:17 -0600 X-ASG-Debug-ID: 1265312606-4b1a00ac0000-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 08457137C1DF for ; Thu, 4 Feb 2010 11:43:26 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id o0wdCG5IOO4qKR84 for ; Thu, 04 Feb 2010 11:43:26 -0800 (PST) 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 o14JhQoE014427 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 4 Feb 2010 14:43:26 -0500 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 o14JhPqn022520; Thu, 4 Feb 2010 14:43:25 -0500 Message-ID: <4B6B235D.5060903@sandeen.net> Date: Thu, 04 Feb 2010 13:43:25 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Eric Sandeen CC: Jim Meyering , xfs mailing list X-ASG-Orig-Subj: Re: [PATCH V2] mkfs: don't try to detect filesystems on regular files via blkid Subject: Re: [PATCH V2] mkfs: don't try to detect filesystems on regular files via blkid References: <4B6AF6FC.6030101@redhat.com> <4B6B087F.80901@sandeen.net> In-Reply-To: <4B6B087F.80901@sandeen.net> Content-Type: text/plain; charset=us-ascii 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: 1265312607 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21659 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 Eric Sandeen wrote: > from RH bug > https://bugzilla.redhat.com/show_bug.cgi?id=561870 > > # dd if=/dev/zero of=k bs=1MB count=2 seek=20; mkfs.xfs k > # mkfs.xfs: probe of k failed, cannot detect existing filesystem. > # mkfs.xfs: Use the -f option to force overwrite. > > blkid fails to do a probe of a regular file. > > I wish blkid would cope with this, but for now it might > be better to just turn it off. > > I kept the size==0 check just in case we stumble on a 0-sized > device, blkid doesn't like that either... > > Reported-by: Jim Meyering > Signed-off-by: Eric Sandeen > --- OK NAK on that, hch has a better patch, we were driving blkid wrong. -Eric From sandeen@redhat.com Thu Feb 4 14:14:02 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.2 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_21,J_CHICKENPOX_43,J_CHICKENPOX_46 autolearn=no version=3.3.0-rupdated 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 o14KE11x087949 for ; Thu, 4 Feb 2010 14:14:01 -0600 X-ASG-Debug-ID: 1265314509-7ecf01040000-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 B4E9B1B078B for ; Thu, 4 Feb 2010 12:15:09 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rshstfpXcjV4PUtR for ; Thu, 04 Feb 2010 12:15:09 -0800 (PST) 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 o14KF2vF018882 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 4 Feb 2010 15:15:02 -0500 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 o14KF19p032518; Thu, 4 Feb 2010 15:15:01 -0500 Message-ID: <4B6B2AC5.1070803@redhat.com> Date: Thu, 04 Feb 2010 14:15:01 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs mailing list , Jim Meyering X-ASG-Orig-Subj: Re: [PATCH] mkfs.xfs fix detection of empty devices Subject: Re: [PATCH] mkfs.xfs fix detection of empty devices References: <4B6AF6FC.6030101@redhat.com> <20100204194000.GA7229@infradead.org> In-Reply-To: <20100204194000.GA7229@infradead.org> 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: 1265314511 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21660 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 wrote: > We currently fail to detect that a device does indeed not contain any > signature and we are indeed fine to proceed with it due to mishandling > the return value of blkid_do_fullprobe. Fix that up and add some > better diagnostics of the blkid detection. Also remove the size == 0 > check in check_overwrite as blkid handles that just fine. Much better, thanks, minor comment below > from RH bugzilla https://bugzilla.redhat.com/show_bug.cgi?id=561870 > > # dd if=/dev/zero of=k bs=1MB count=2 seek=20; mkfs.xfs k > # mkfs.xfs: probe of k failed, cannot detect existing filesystem. > # mkfs.xfs: Use the -f option to force overwrite > > Signed-off-by: Christoph Hellwig > > Index: xfsprogs-dev/mkfs/xfs_mkfs.c > =================================================================== > --- xfsprogs-dev.orig/mkfs/xfs_mkfs.c 2010-02-04 19:19:36.000000000 +0000 > +++ xfsprogs-dev/mkfs/xfs_mkfs.c 2010-02-04 19:33:36.000000000 +0000 > @@ -297,48 +297,47 @@ check_overwrite( > const char *type; > blkid_probe pr = NULL; > int ret; > - int fd; > - long long size; > - int bsz; > > if (!device || !*device) > return 0; > > ret = -1; /* will reset on success of all setup calls */ > > - fd = open(device, O_RDONLY); > - if (fd < 0) > - goto out; > - platform_findsizes(device, fd, &size, &bsz); > - close(fd); > - > - /* nothing to overwrite on a 0-length device */ > - if (size == 0) { > - ret = 0; > - goto out; > - } > - > pr = blkid_new_probe_from_filename(device); > if (!pr) > goto out; > > - if (blkid_probe_enable_partitions(pr, 1)) > + ret = blkid_probe_enable_partitions(pr, 1); > + if (ret < 0) > + goto out; > + > + ret = blkid_do_fullprobe(pr); > + if (ret < 0) > goto out; > > - if (blkid_do_fullprobe(pr)) > + /* > + * Blkid returns 1 for nothing found and 0 when it finds a signature, > + * but we want the exact opposite, so reverse the return value here. > + * > + * In addition print some useful diagnostics about what actually is > + * on the device. > + */ > + ret = !ret; > + if (!ret) > goto out; that makes my brain hurt a little. Maybe: if (ret == 1) { /* blkid found nothing */ ret = 0; /* we return 0 for nothing found */ goto out; } else /* blkid found something */ ret = 1; /* we return 1 for something found */ it's wordy but at least not confusing. I'm ok either way, I guess, so: Reviewed-by: Eric Sandeen unless you change anything enough that you want another review. :) -Eric > - ret = 0; > if (!blkid_probe_lookup_value(pr, "TYPE", &type, NULL)) { > fprintf(stderr, > _("%s: %s appears to contain an existing " > "filesystem (%s).\n"), progname, device, type); > - ret = 1; > } else if (!blkid_probe_lookup_value(pr, "PTTYPE", &type, NULL)) { > fprintf(stderr, > _("%s: %s appears to contain a partition " > "table (%s).\n"), progname, device, type); > - ret = 1; > + } else { > + fprintf(stderr, > + _("%s: %s appears to contain something weird " > + "according to blkid\n"), progname, device); > } > > out: From f2006075@bits-goa.ac.in Thu Feb 4 15:34:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.2 required=5.0 tests=BAYES_50,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o14LYTJ8092562 for ; Thu, 4 Feb 2010 15:34:32 -0600 X-ASG-Debug-ID: 1265319314-2d5a00f90000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from warrior.bits-goa.ac.in (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0D066137CC97 for ; Thu, 4 Feb 2010 13:35:15 -0800 (PST) Received: from warrior.bits-goa.ac.in (mail.bits-goa.ac.in [210.212.160.113]) by cuda.sgi.com with ESMTP id AhvC7j4fSmLiKdNQ for ; Thu, 04 Feb 2010 13:35:15 -0800 (PST) Received: from localhost (localhost.localdomain [127.0.0.1]) by warrior.bits-goa.ac.in (Postfix) with ESMTP id 6A322B3C8990; Fri, 5 Feb 2010 03:00:21 +0530 (IST) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at bits-goa.ac.in Received: from warrior.bits-goa.ac.in ([127.0.0.1]) by localhost (warrior.bits-goa.ac.in [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ECp0oGt-hu2l; Fri, 5 Feb 2010 03:00:21 +0530 (IST) Received: from warrior.bits-goa.ac.in (localhost.localdomain [127.0.0.1]) by warrior.bits-goa.ac.in (Postfix) with ESMTP id 0F0D0B3C8985; Fri, 5 Feb 2010 03:00:19 +0530 (IST) Date: Fri, 5 Feb 2010 03:00:19 +0530 (IST) From: DEEPAK AGRAWAL Reply-To: Canadian Agent Message-ID: <1784735951.311701265319019055.JavaMail.root@warrior.bits-goa.ac.in> X-ASG-Orig-Subj: Good News!! Subject: Good News!! MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Priority: 1 Importance: high X-Mailer: Zimbra 6.0.1_GA_1816.RHEL5_64 (zclient/6.0.1_GA_1816.RHEL5_64) To: undisclosed-recipients:; X-Barracuda-Connect: mail.bits-goa.ac.in[210.212.160.113] X-Barracuda-Start-Time: 1265319316 X-Barracuda-Bayes: INNOCENT GLOBAL 0.6842 1.0000 1.2521 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.25 X-Barracuda-Spam-Status: No, SCORE=1.25 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.21667 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email X-Virus-Status: Clean Your e-mail address has made you, a winner of 2,500,000GBP in the Canadian Lottery Promo. Contact our British Agent for more details. Mr. Trevor Allan e-mail: trevorallan24@gala.net , Tel:+447031979972. Thank You. Lotto Co-ordinator (Deepak Agrawal) From BATV+197641c031149925fcd8+2356+infradead.org+hch@bombadil.srs.infradead.org Thu Feb 4 16:17:14 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_21,J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated 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 o14MHCNK094794 for ; Thu, 4 Feb 2010 16:17:14 -0600 X-ASG-Debug-ID: 1265321902-413a03920000-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 2CD801CA4D17 for ; Thu, 4 Feb 2010 14:18:22 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id UXD2StiEXwT20KFm for ; Thu, 04 Feb 2010 14:18:22 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NdA1m-00071a-6d; Thu, 04 Feb 2010 22:18:22 +0000 Date: Thu, 4 Feb 2010 17:18:22 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: Jim Meyering , xfs mailing list X-ASG-Orig-Subj: Re: [PATCH v2] mkfs.xfs fix detection of empty devices Subject: Re: [PATCH v2] mkfs.xfs fix detection of empty devices Message-ID: <20100204221822.GA26670@infradead.org> References: <4B6AF6FC.6030101@redhat.com> <20100204194000.GA7229@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100204194000.GA7229@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: 1265321903 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 We currently fail to detect that a device does indeed not contain any signature and we are indeed fine to proceed with it due to mishandling the return value of blkid_do_fullprobe. Fix that up and add some better diagnostics of the blkid detection. from RH bugzilla https://bugzilla.redhat.com/show_bug.cgi?id=561870 # dd if=/dev/zero of=k bs=1MB count=2 seek=20; mkfs.xfs k # mkfs.xfs: probe of k failed, cannot detect existing filesystem. # mkfs.xfs: Use the -f option to force overwrite Signed-off-by: Christoph Hellwig Index: xfsprogs-dev/mkfs/xfs_mkfs.c =================================================================== --- xfsprogs-dev.orig/mkfs/xfs_mkfs.c 2010-02-04 20:30:26.000000000 +0000 +++ xfsprogs-dev/mkfs/xfs_mkfs.c 2010-02-04 20:43:41.000000000 +0000 @@ -322,24 +322,40 @@ check_overwrite( if (!pr) goto out; - if (blkid_probe_enable_partitions(pr, 1)) + ret = blkid_probe_enable_partitions(pr, 1); + if (ret < 0) goto out; - if (blkid_do_fullprobe(pr)) + ret = blkid_do_fullprobe(pr); + if (ret < 0) goto out; - ret = 0; + /* + * Blkid returns 1 for nothing found and 0 when it finds a signature, + * but we want the exact opposite, so reverse the return value here. + * + * In addition print some useful diagnostics about what actually is + * on the device. + */ + if (ret) { + ret = 0; + goto out; + } + if (!blkid_probe_lookup_value(pr, "TYPE", &type, NULL)) { fprintf(stderr, _("%s: %s appears to contain an existing " "filesystem (%s).\n"), progname, device, type); - ret = 1; } else if (!blkid_probe_lookup_value(pr, "PTTYPE", &type, NULL)) { fprintf(stderr, _("%s: %s appears to contain a partition " "table (%s).\n"), progname, device, type); - ret = 1; + } else { + fprintf(stderr, + _("%s: %s appears to contain something weird " + "according to blkid\n"), progname, device); } + ret = 1; out: if (pr) From SRS0+SkGd+65+fromorbit.com=david@internode.on.net Thu Feb 4 20:30:30 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o152UTBx106048 for ; Thu, 4 Feb 2010 20:30:29 -0600 X-ASG-Debug-ID: 1265337096-091d02760000-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 E73491B1906 for ; Thu, 4 Feb 2010 18:31:37 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id 1NclDPbYEYggCNwB for ; Thu, 04 Feb 2010 18:31:37 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12739903-1927428 for multiple; Fri, 05 Feb 2010 13:01:36 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NdDyo-0004CO-Gd; Fri, 05 Feb 2010 13:31:34 +1100 Date: Fri, 5 Feb 2010 13:31:34 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: xfsprogs: to -DDEBUG or not to -DDEBUG? Subject: Re: xfsprogs: to -DDEBUG or not to -DDEBUG? Message-ID: <20100205023134.GA11483@discord.disaster> References: <4B6AFB83.1070309@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B6AFB83.1070309@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1265337098 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21686 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, Feb 04, 2010 at 10:53:23AM -0600, Eric Sandeen wrote: > Fedora, long ago, disabled debug in the xfsprogs specfile: > > http://cvs.fedoraproject.org/viewvc/F-12/xfsprogs/xfsprogs.spec?r1=1.5&r2=1.6 > > * Wed Apr 20 2005 Dave Jones > - Disable debug. (#151438) > > per this bug: https://bugzilla.redhat.com/show_bug.cgi?id=151438 > > referencing this email thread: > > http://oss.sgi.com/archives/linux-xfs/2005-03/msg00038.html > which no longer exists (grrrr) but is probably now here: > > http://oss.sgi.com/archives/xfs/2005-03/msg00416.html > > Fedora still builds with -DNDEBUG, but the upstream tarball has > it on by default. I have seen several occasions where other > distros had failing xfs_repairs which were "fixed" by disabling > debug. I'd like to make a decision on whether DEBUG should be > on or off by default for upstream releases. Any thoughts? Personally I'd prefer the repair process to stop if it comes across inconsistencies it can't handle. Ignoring them is as likely to "fix" the crash as it is to corrupt the filesystem more. On top of that we get bug reports when those problems are hit so we can look into what caused the problem. We don't really have a repair test suite that covers all the possible corruptions that can occur, so we are kind of reliant on users reporting conditions we've never had to handle before so we can fix them... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+i3iU+65+fromorbit.com=david@internode.on.net Thu Feb 4 20:57:06 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o152v5SY106759 for ; Thu, 4 Feb 2010 20:57:06 -0600 X-ASG-Debug-ID: 1265338693-334400f30000-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 13992137DFB5 for ; Thu, 4 Feb 2010 18:58:14 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id pU4cs6qm0Hs1YGUo for ; Thu, 04 Feb 2010 18:58:14 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12657070-1927428 for multiple; Fri, 05 Feb 2010 13:28:12 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NdEOZ-0004Dy-Da; Fri, 05 Feb 2010 13:58:11 +1100 Date: Fri, 5 Feb 2010 13:58:11 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH for-2.6.33] xfs: flush all log buffers in xlog_dealloc_log Subject: Re: [PATCH for-2.6.33] xfs: flush all log buffers in xlog_dealloc_log Message-ID: <20100205025811.GB11483@discord.disaster> References: <20100201220813.GA3519@infradead.org> <20100203105545.GA1047@infradead.org> <20100204081422.GF5332@discord.disaster> <20100204161050.GB11206@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100204161050.GB11206@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1265338696 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21687 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, Feb 04, 2010 at 11:10:50AM -0500, Christoph Hellwig wrote: > On Thu, Feb 04, 2010 at 07:14:22PM +1100, Dave Chinner wrote: > > On Wed, Feb 03, 2010 at 05:55:45AM -0500, Christoph Hellwig wrote: > > > Actually I'll take this one back - the log buffers aren't delwri > > > so xfs_flush_buftarg probably only helped by timing or the > > > xfs_buf_runall_queues on xfslogd_workqueue. Need to think about > > > this a bit more. > > > > Can you point me at the bug report? IIRC I've seen this in the > > past where we freed the log before we've done all the correct > > shutdown processing and they got fixed by correcting the > > order of shutdown to ensure the log is idle before freeing > > it... > > Yes, that I was going to look into next. The recent report > is http://bugzilla.kernel.org/show_bug.cgi?id=15150 That was from 2.6.27. I didn't think that we finished the mount/unmount path cleanup that fixed all those problems until 2.6.28 or .29... > and there's > also a very similar one from Ed Cashin in > mail archives from November. Yeah, that's clearly IO completion after the call to xfs_unmountfs_wait(). That does a xfs_wait_buftarg() call which waits for all hashed buffers on the buftarg except for those that are XBF_FS_MANAGED - the superblock. Looking at xfs_fs_put_super(), the superblock buffer is freed after xfs_unmountfs() frees the log, so if the superblock was logged and is undergoing IO then xfs_unmountfs_wait() would not have blocked on it and it could leak past the "no more IO should bein progress" barrier that xfs_unmountfs_wait() is supposed to provide. Does this look like a plausible cause of the problem? Is so, given that the superblock is the only buffer that is marked XBF_FS_MANAGED now and it seems to me that xfs_wait_buftarg() should be waiting on it, maybe the fix needed is to xfs_wait_buftarg().... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Feb 4 21:40:18 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_21,J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated 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 o153eIAW108469 for ; Thu, 4 Feb 2010 21:40:18 -0600 X-ASG-Debug-ID: 1265341287-5e1602390000-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 445661CA5A70 for ; Thu, 4 Feb 2010 19:41:27 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id 03voz1jwDRmyac2I for ; Thu, 04 Feb 2010 19:41:27 -0800 (PST) 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 331B8124CF0A; Thu, 4 Feb 2010 21:41:27 -0600 (CST) Message-ID: <4B6B9366.6020600@sandeen.net> Date: Thu, 04 Feb 2010 21:41:26 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Christoph Hellwig CC: Eric Sandeen , Jim Meyering , xfs mailing list X-ASG-Orig-Subj: Re: [PATCH v2] mkfs.xfs fix detection of empty devices Subject: Re: [PATCH v2] mkfs.xfs fix detection of empty devices References: <4B6AF6FC.6030101@redhat.com> <20100204194000.GA7229@infradead.org> <20100204221822.GA26670@infradead.org> In-Reply-To: <20100204221822.GA26670@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: 1265341288 X-Barracuda-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.21689 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: > We currently fail to detect that a device does indeed not contain any > signature and we are indeed fine to proceed with it due to mishandling > the return value of blkid_do_fullprobe. Fix that up and add some > better diagnostics of the blkid detection. > > from RH bugzilla https://bugzilla.redhat.com/show_bug.cgi?id=561870 > > # dd if=/dev/zero of=k bs=1MB count=2 seek=20; mkfs.xfs k > # mkfs.xfs: probe of k failed, cannot detect existing filesystem. > # mkfs.xfs: Use the -f option to force overwrite > > Signed-off-by: Christoph Hellwig we discussed keeping the 0-size check until libblkid copes better; also the absense of ret = !ret looks more readable, thanks. Reviewed-by: Eric Sandeen > Index: xfsprogs-dev/mkfs/xfs_mkfs.c > =================================================================== > --- xfsprogs-dev.orig/mkfs/xfs_mkfs.c 2010-02-04 20:30:26.000000000 +0000 > +++ xfsprogs-dev/mkfs/xfs_mkfs.c 2010-02-04 20:43:41.000000000 +0000 > @@ -322,24 +322,40 @@ check_overwrite( > if (!pr) > goto out; > > - if (blkid_probe_enable_partitions(pr, 1)) > + ret = blkid_probe_enable_partitions(pr, 1); > + if (ret < 0) > goto out; > > - if (blkid_do_fullprobe(pr)) > + ret = blkid_do_fullprobe(pr); > + if (ret < 0) > goto out; > > - ret = 0; > + /* > + * Blkid returns 1 for nothing found and 0 when it finds a signature, > + * but we want the exact opposite, so reverse the return value here. > + * > + * In addition print some useful diagnostics about what actually is > + * on the device. > + */ > + if (ret) { > + ret = 0; > + goto out; > + } > + > if (!blkid_probe_lookup_value(pr, "TYPE", &type, NULL)) { > fprintf(stderr, > _("%s: %s appears to contain an existing " > "filesystem (%s).\n"), progname, device, type); > - ret = 1; > } else if (!blkid_probe_lookup_value(pr, "PTTYPE", &type, NULL)) { > fprintf(stderr, > _("%s: %s appears to contain a partition " > "table (%s).\n"), progname, device, type); > - ret = 1; > + } else { > + fprintf(stderr, > + _("%s: %s appears to contain something weird " > + "according to blkid\n"), progname, device); > } > + ret = 1; > > out: > if (pr) > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From BATV+cb6c268b990492087475+2357+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 5 03:21:22 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o159LKCj125074 for ; Fri, 5 Feb 2010 03:21:22 -0600 X-ASG-Debug-ID: 1265361750-67a600f20000-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 1E2B51CA0265 for ; Fri, 5 Feb 2010 01:22:31 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id HhIA1QpyNAqQXt2u for ; Fri, 05 Feb 2010 01:22:31 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NdKOT-0000ic-30; Fri, 05 Feb 2010 09:22:29 +0000 Date: Fri, 5 Feb 2010 04:22:29 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: make install in the brave new build system world Subject: make install in the brave new build system world Message-ID: <20100205092229.GA32454@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: 1265361751 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 When doing make install in xfsprogs I get a lot of spew like this: /usr/bin/make -C include install make[1]: Entering directory `/root/xfsprogs-dev/include' make[1]: Nothing to be done for `install'. make[1]: Leaving directory `/root/xfsprogs-dev/include' /usr/bin/make -C libxfs install make[1]: Entering directory `/root/xfsprogs-dev/libxfs' [DEP] gcc -MM -I. -g -O2 -DNDEBUG -DVERSION=\"3.1.1\" -DLOCALEDIR=\"/usr/share/locale\" -DPACKAGE=\"xfsprogs\" -I../include -DENABLE_GETTEXT -D_GNU_SOURCE -D_XOPEN_SOURCE=500 -D_FILE_OFFSET_BITS=64 -funsigned-char -fno-strict-aliasing -Wall cache.c init.c kmem.c logitem.c rdwr.c trans.c util.c xfs_alloc.c xfs_ialloc.c xfs_inode.c xfs_btree.c xfs_alloc_btree.c xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c xfs_mount.c xfs_rtalloc.c xfs_trans.c xfs_attr.c linux.c | /bin/sed -e 's,^\([^:]*\)\.o,\1.lo,' > .dep make[1]: Leaving directory `/root/xfsprogs-dev/libxfs' So it seems like for some reason we do a) regenerate the dependencies in the install target (we already re-did them once before as part of the all target implied by make install) b) for some reason the new silent make rules don't apply to this. Any idea why? From BATV+cb6c268b990492087475+2357+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 5 03:36:04 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o159a4Hg125947 for ; Fri, 5 Feb 2010 03:36:04 -0600 X-ASG-Debug-ID: 1265362635-3f2201090000-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 482B71B21CC for ; Fri, 5 Feb 2010 01:37:15 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 9bXkrBOBTK2JFSrN for ; Fri, 05 Feb 2010 01:37:15 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NdKck-0003q5-HV; Fri, 05 Feb 2010 09:37:14 +0000 Date: Fri, 5 Feb 2010 04:37:14 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH 1/3] xfstests: routine to create scratch of certain size Subject: Re: [PATCH 1/3] xfstests: routine to create scratch of certain size Message-ID: <20100205093714.GA14508@infradead.org> References: <4B69EC23.8040207@sandeen.net> <4B69EC89.5050400@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B69EC89.5050400@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: 1265362635 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, Feb 03, 2010 at 03:37:13PM -0600, Eric Sandeen wrote: > This is needed for later enospc tests to be generic > > We have to explicitly call the mkfs rather than > _scratch_mkfs since extN wants nr-of-blocks as > an argument -after- the device name. > > Signed-off-by: Eric Sandeen Looks good, Reviewed-by: Christoph Hellwig From BATV+cb6c268b990492087475+2357+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 5 03:36:49 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o159anBB125997 for ; Fri, 5 Feb 2010 03:36:49 -0600 X-ASG-Debug-ID: 1265362679-66ee014a0000-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 5900618302EE for ; Fri, 5 Feb 2010 01:37:59 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id D4kE2j9viQVT031Y for ; Fri, 05 Feb 2010 01:37:59 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NdKdT-0003xh-2J; Fri, 05 Feb 2010 09:37:59 +0000 Date: Fri, 5 Feb 2010 04:37:59 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH 2/3] xfstests: make 053 and 077 generic Subject: Re: [PATCH 2/3] xfstests: make 053 and 077 generic Message-ID: <20100205093759.GB14508@infradead.org> References: <4B69EC23.8040207@sandeen.net> <4B69ECDD.8050806@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B69ECDD.8050806@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: 1265362679 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, Feb 03, 2010 at 03:38:37PM -0600, Eric Sandeen wrote: > 053 and 077 can be generic w/ a little tweaking. > > Also change 077's filler to something more likely > to be on a random system under test, and add it > to the enospc group. Looks good, Reviewed-by: Christoph Hellwig From BATV+cb6c268b990492087475+2357+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 5 03:37:25 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o159bO4H126036 for ; Fri, 5 Feb 2010 03:37:24 -0600 X-ASG-Debug-ID: 1265362715-66e601440000-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 8080A1830D36 for ; Fri, 5 Feb 2010 01:38:35 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id G2ZSClIsLqZba2im for ; Fri, 05 Feb 2010 01:38:35 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NdKe3-00040a-7g; Fri, 05 Feb 2010 09:38:35 +0000 Date: Fri, 5 Feb 2010 04:38:35 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH 3/3] xfstests: rename _acl_requirements to _require_acls Subject: Re: [PATCH 3/3] xfstests: rename _acl_requirements to _require_acls Message-ID: <20100205093835.GC14508@infradead.org> References: <4B69EC23.8040207@sandeen.net> <4B69ED6D.6030902@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B69ED6D.6030902@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: 1265362715 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, Feb 03, 2010 at 03:41:01PM -0600, Eric Sandeen wrote: > Most requirement tests are named _require_foo, so just > make this more consistent. > > Also remove a few redundant tests for /usr/bin/chacl > since _require_acls covers that. Looks good, Reviewed-by: Christoph Hellwig From BATV+cb6c268b990492087475+2357+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 5 03:56:46 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o159uiST127034 for ; Fri, 5 Feb 2010 03:56:45 -0600 X-ASG-Debug-ID: 1265363875-3e7e01680000-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 AD00C1B224D for ; Fri, 5 Feb 2010 01:57:55 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id DVpoBOpPdQmnqH4W for ; Fri, 05 Feb 2010 01:57:55 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NdKwl-00083S-Cj for xfs@oss.sgi.com; Fri, 05 Feb 2010 09:57:55 +0000 Date: Fri, 5 Feb 2010 04:57:55 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: optimize log flushing in xfs_fsync Subject: [PATCH] xfs: optimize log flushing in xfs_fsync Message-ID: <20100205095755.GA30848@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: 1265363875 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 we have a pinned inode it must have a log item attached to it. Usually that log item will have ili_last_lsn already set, in which case we only need to flush the log up to that LSN instead of doing a full log force. This gives speedups of about 5% in some fsync heavy workloads. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c 2010-02-04 17:38:33.679254119 +0100 +++ xfs/fs/xfs/xfs_vnodeops.c 2010-02-04 17:38:51.606006156 +0100 @@ -626,8 +626,14 @@ xfs_fsync( * force the log. */ if (xfs_ipincount(ip)) { - error = _xfs_log_force(ip->i_mount, XFS_LOG_SYNC, - &log_flushed); + if (ip->i_itemp->ili_last_lsn) { + error = _xfs_log_force_lsn(ip->i_mount, + ip->i_itemp->ili_last_lsn, + XFS_LOG_SYNC, &log_flushed); + } else { + error = _xfs_log_force(ip->i_mount, + XFS_LOG_SYNC, &log_flushed); + } } } else { /* From SRS0+SkGd+65+fromorbit.com=david@internode.on.net Fri Feb 5 04:43:09 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o15Ah8Hh129712 for ; Fri, 5 Feb 2010 04:43:09 -0600 X-ASG-Debug-ID: 1265366656-388002390000-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 B8D1E137ED00 for ; Fri, 5 Feb 2010 02:44:17 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id yKYYcC3a8WHJ4cZJ for ; Fri, 05 Feb 2010 02:44:17 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12790495-1927428 for multiple; Fri, 05 Feb 2010 21:14:16 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NdLfa-0004cB-NL; Fri, 05 Feb 2010 21:44:14 +1100 Date: Fri, 5 Feb 2010 21:44:14 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: make install in the brave new build system world Subject: Re: make install in the brave new build system world Message-ID: <20100205104414.GC11483@discord.disaster> References: <20100205092229.GA32454@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100205092229.GA32454@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1265366658 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21714 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, Feb 05, 2010 at 04:22:29AM -0500, Christoph Hellwig wrote: > When doing make install in xfsprogs I get a lot of spew like this: > > /usr/bin/make -C include install > make[1]: Entering directory `/root/xfsprogs-dev/include' > make[1]: Nothing to be done for `install'. > make[1]: Leaving directory `/root/xfsprogs-dev/include' > /usr/bin/make -C libxfs install > make[1]: Entering directory `/root/xfsprogs-dev/libxfs' > [DEP] > gcc -MM -I. -g -O2 -DNDEBUG -DVERSION=\"3.1.1\" -DLOCALEDIR=\"/usr/share/locale\" -DPACKAGE=\"xfsprogs\" -I../include -DENABLE_GETTEXT -D_GNU_SOURCE -D_XOPEN_SOURCE=500 -D_FILE_OFFSET_BITS=64 -funsigned-char -fno-strict-aliasing -Wall cache.c init.c kmem.c logitem.c rdwr.c trans.c util.c xfs_alloc.c xfs_ialloc.c xfs_inode.c xfs_btree.c xfs_alloc_btree.c xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c xfs_mount.c xfs_rtalloc.c xfs_trans.c xfs_attr.c linux.c | /bin/sed -e 's,^\([^:]*\)\.o,\1.lo,' > .dep > make[1]: Leaving directory `/root/xfsprogs-dev/libxfs' > > > So it seems like for some reason we do > > a) regenerate the dependencies in the install target (we already re-did > them once before as part of the all target implied by make install) The dependencies are always regenerated due to the default target requiring the depend target. Rebuilding the dependencies is the only way to catch changes between builds and so ensure the correct files are rebuilt. The install target is building the dependencies because it has a dependency on the default target. > b) for some reason the new silent make rules don't apply to this. That's something I can't answer off the top of my head. I'll have a look into it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+SkGd+65+fromorbit.com=david@internode.on.net Fri Feb 5 05:16:35 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o15BGYaR131657 for ; Fri, 5 Feb 2010 05:16:35 -0600 X-ASG-Debug-ID: 1265368663-374302fb0000-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 7783F1372204 for ; Fri, 5 Feb 2010 03:17:44 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id NJBENhS7DuaYY0Ur for ; Fri, 05 Feb 2010 03:17:44 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12792998-1927428 for multiple; Fri, 05 Feb 2010 21:47:43 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NdMBx-0004e3-JI; Fri, 05 Feb 2010 22:17:41 +1100 Date: Fri, 5 Feb 2010 22:17:41 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: make install in the brave new build system world Subject: Re: make install in the brave new build system world Message-ID: <20100205111741.GD11483@discord.disaster> References: <20100205092229.GA32454@infradead.org> <20100205104414.GC11483@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100205104414.GC11483@discord.disaster> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1265368665 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0196 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21715 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, Feb 05, 2010 at 09:44:14PM +1100, Dave Chinner wrote: > On Fri, Feb 05, 2010 at 04:22:29AM -0500, Christoph Hellwig wrote: > > When doing make install in xfsprogs I get a lot of spew like this: .... > > b) for some reason the new silent make rules don't apply to this. > > That's something I can't answer off the top of my head. I'll have a > look into it. Try the patch below. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfsprogs: clean up make install build The install targets did not get the silent treatment like the normal build targets. Shut them up. Signed-off-by: Dave Chinner --- Makefile | 9 ++++++--- include/buildrules | 4 ---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 62c4258..31be846 100644 --- a/Makefile +++ b/Makefile @@ -107,13 +107,16 @@ install-dev: default $(addsuffix -install-dev,$(SUBDIRS)) install-qa: install $(addsuffix -install-qa,$(SUBDIRS)) %-install: - $(MAKE) -C $* install + @echo "Installing $@" + $(Q)$(MAKE) $(MAKEOPTS) -C $* install %-install-dev: - $(MAKE) -C $* install-dev + @echo "Installing $@" + $(Q)$(MAKE) $(MAKEOPTS) -C $* install-dev %-install-qa: - $(MAKE) -C $* install-qa + @echo "Installing $@" + $(Q)$(MAKE) $(MAKEOPTS) -C $* install-qa distclean: clean $(Q)rm -f $(DISTDIRT) diff --git a/include/buildrules b/include/buildrules index 1695e23..beb469b 100644 --- a/include/buildrules +++ b/include/buildrules @@ -101,7 +101,3 @@ ltdepend: $(CFILES) $(HFILES) depend: $(CFILES) $(HFILES) @echo " [DEP]" $(Q)$(MAKEDEP) $(CFILES) > .dep - - -# $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1,' > .dep - From BATV+cb6c268b990492087475+2357+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 5 05:26:39 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o15BQcfS132220 for ; Fri, 5 Feb 2010 05:26:39 -0600 X-ASG-Debug-ID: 1265369268-6737035b0000-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 66A8E1CA65FD for ; Fri, 5 Feb 2010 03:27:49 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id FJGS6OV48fkTHGV9 for ; Fri, 05 Feb 2010 03:27:49 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NdMLj-0002Rt-Db; Fri, 05 Feb 2010 11:27:47 +0000 Date: Fri, 5 Feb 2010 06:27:47 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: make install in the brave new build system world Subject: Re: make install in the brave new build system world Message-ID: <20100205112747.GA28701@infradead.org> References: <20100205092229.GA32454@infradead.org> <20100205104414.GC11483@discord.disaster> <20100205111741.GD11483@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100205111741.GD11483@discord.disaster> 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: 1265369269 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, Feb 05, 2010 at 10:17:41PM +1100, Dave Chinner wrote: > On Fri, Feb 05, 2010 at 09:44:14PM +1100, Dave Chinner wrote: > > On Fri, Feb 05, 2010 at 04:22:29AM -0500, Christoph Hellwig wrote: > > > When doing make install in xfsprogs I get a lot of spew like this: > .... > > > b) for some reason the new silent make rules don't apply to this. > > > > That's something I can't answer off the top of my head. I'll have a > > look into it. > > Try the patch below. That makes it a bit better, but it still prints the full INSTALL and LTINSTALL lines. From BATV+cb6c268b990492087475+2357+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 5 05:27:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o15BRdRi132283 for ; Fri, 5 Feb 2010 05:27:40 -0600 X-ASG-Debug-ID: 1265369330-66d303540000-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 C42A81CA6608 for ; Fri, 5 Feb 2010 03:28:50 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id iS1k80OMuiVbn8HK for ; Fri, 05 Feb 2010 03:28:50 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NdMMk-0002jv-ER; Fri, 05 Feb 2010 11:28:50 +0000 Date: Fri, 5 Feb 2010 06:28:50 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: make install in the brave new build system world Subject: Re: make install in the brave new build system world Message-ID: <20100205112850.GB28701@infradead.org> References: <20100205092229.GA32454@infradead.org> <20100205104414.GC11483@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100205104414.GC11483@discord.disaster> 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: 1265369330 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, Feb 05, 2010 at 09:44:14PM +1100, Dave Chinner wrote: > The dependencies are always regenerated due to the default target > requiring the depend target. Rebuilding the dependencies is the only > way to catch changes between builds and so ensure the correct files > are rebuilt. > > The install target is building the dependencies because it has a > dependency on the default target. Well, it's building the dependecies twice - once by invoking the default target, but they are also rebuilt again when the actuall install rules are called. The latter is pretty clearly superflous. From BATV+cb6c268b990492087475+2357+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 5 05:34:42 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o15BYfsZ132820 for ; Fri, 5 Feb 2010 05:34:41 -0600 X-ASG-Debug-ID: 1265369751-3e8502c50000-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 8C3A71B2557 for ; Fri, 5 Feb 2010 03:35:51 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id SEuZKHlXAe2yrfjm for ; Fri, 05 Feb 2010 03:35:51 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NdMTX-0005CY-1Z; Fri, 05 Feb 2010 11:35:51 +0000 Date: Fri, 5 Feb 2010 06:35:50 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH for-2.6.33] xfs: flush all log buffers in xlog_dealloc_log Subject: Re: [PATCH for-2.6.33] xfs: flush all log buffers in xlog_dealloc_log Message-ID: <20100205113550.GA10926@infradead.org> References: <20100201220813.GA3519@infradead.org> <20100203105545.GA1047@infradead.org> <20100204081422.GF5332@discord.disaster> <20100204161050.GB11206@infradead.org> <20100205025811.GB11483@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100205025811.GB11483@discord.disaster> 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: 1265369752 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, Feb 05, 2010 at 01:58:11PM +1100, Dave Chinner wrote: > > and there's > > also a very similar one from Ed Cashin in > > mail archives from November. > > Yeah, that's clearly IO completion after the call to > xfs_unmountfs_wait(). That does a xfs_wait_buftarg() call > which waits for all hashed buffers on the buftarg except for > those that are XBF_FS_MANAGED - the superblock. > > Looking at xfs_fs_put_super(), the superblock buffer is freed after > xfs_unmountfs() frees the log, so if the superblock was logged > and is undergoing IO then xfs_unmountfs_wait() would not have > blocked on it and it could leak past the "no more IO should > bein progress" barrier that xfs_unmountfs_wait() is supposed to > provide. > > Does this look like a plausible cause of the problem? We just did a xfs_unmountfs_writesb before the call to xfs_unmountfs_wait, so the superblock buffer should be a sync buffer at that point, so something more fishy is going on here. syncd is also stopped before that call, so that gets rid of another possible case of an async buffer pending. Independent of that I think xfs_wait_buftarg waiting for the SB buffer seems correct to me, but I fear something else is going on here. From SRS0+1LZ9+65+fromorbit.com=david@internode.on.net Fri Feb 5 05:47:51 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o15Bloiu133447 for ; Fri, 5 Feb 2010 05:47:51 -0600 X-ASG-Debug-ID: 1265370539-3f3103550000-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 C41871B2222 for ; Fri, 5 Feb 2010 03:48:59 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id hR8SjiKUiSfj7eSX for ; Fri, 05 Feb 2010 03:48:59 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12677688-1927428 for multiple; Fri, 05 Feb 2010 22:18:58 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NdMgC-0004fl-Mz; Fri, 05 Feb 2010 22:48:56 +1100 Date: Fri, 5 Feb 2010 22:48:56 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: make install in the brave new build system world Subject: Re: make install in the brave new build system world Message-ID: <20100205114856.GE11483@discord.disaster> References: <20100205092229.GA32454@infradead.org> <20100205104414.GC11483@discord.disaster> <20100205112850.GB28701@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100205112850.GB28701@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1265370540 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21716 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, Feb 05, 2010 at 06:28:50AM -0500, Christoph Hellwig wrote: > On Fri, Feb 05, 2010 at 09:44:14PM +1100, Dave Chinner wrote: > > The dependencies are always regenerated due to the default target > > requiring the depend target. Rebuilding the dependencies is the only > > way to catch changes between builds and so ensure the correct files > > are rebuilt. > > > > The install target is building the dependencies because it has a > > dependency on the default target. > > Well, it's building the dependecies twice - once by invoking the > default target, but they are also rebuilt again when the actuall > install rules are called. The latter is pretty clearly superflous. Ah, there's a double depenency chain. The top level make file has: install: default Which causes "make install" to run the top level default target, which runs the default target in all the target subdirs. Then, in each subdir, the makefile has: install: default Which when then install target is actually run, does another dependency check because it's got a local dependency on the depend target via the default target. Replace the previous patch with the one below and try again. Now the "make install" will rebuild targets out of the local dependencies rather than a separate run of the top level default target (i.e. only traverse directories once). Cheers, Dave. -- Dave Chinner david@fromorbit.com xfsprogs: clean up make install build V2 The install targets did not get the silent treatment like the normal build targets. Shut them up. Also, remove the top level install target dependency on the default target. Each sub-directory already defines the correct dependencies for the install targets and so all the rebuilds can be done in one traversal of the subdirectories via the install rules. Signed-off-by: Dave Chinner --- Makefile | 13 ++++++++----- include/buildrules | 4 ---- man/Makefile | 4 ++-- mdrestore/Makefile | 2 +- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 62c4258..1905261 100644 --- a/Makefile +++ b/Makefile @@ -98,22 +98,25 @@ include/platform_defs.h: include/builddefs $(MAKE) $(MAKEOPTS) $(AM_MAKEFLAGS) include/builddefs; \ fi -install: default $(addsuffix -install,$(SUBDIRS)) +install: $(addsuffix -install,$(SUBDIRS)) $(INSTALL) -m 755 -d $(PKG_DOC_DIR) $(INSTALL) -m 644 README $(PKG_DOC_DIR) -install-dev: default $(addsuffix -install-dev,$(SUBDIRS)) +install-dev: $(addsuffix -install-dev,$(SUBDIRS)) install-qa: install $(addsuffix -install-qa,$(SUBDIRS)) %-install: - $(MAKE) -C $* install + @echo "Installing $@" + $(Q)$(MAKE) $(MAKEOPTS) -C $* install %-install-dev: - $(MAKE) -C $* install-dev + @echo "Installing $@" + $(Q)$(MAKE) $(MAKEOPTS) -C $* install-dev %-install-qa: - $(MAKE) -C $* install-qa + @echo "Installing $@" + $(Q)$(MAKE) $(MAKEOPTS) -C $* install-qa distclean: clean $(Q)rm -f $(DISTDIRT) diff --git a/include/buildrules b/include/buildrules index 1695e23..beb469b 100644 --- a/include/buildrules +++ b/include/buildrules @@ -101,7 +101,3 @@ ltdepend: $(CFILES) $(HFILES) depend: $(CFILES) $(HFILES) @echo " [DEP]" $(Q)$(MAKEDEP) $(CFILES) > .dep - - -# $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1,' > .dep - diff --git a/man/Makefile b/man/Makefile index 2b5e89c..863284c 100644 --- a/man/Makefile +++ b/man/Makefile @@ -14,9 +14,9 @@ install : $(addsuffix -install,$(SUBDIRS)) install-dev : $(addsuffix -install-dev,$(SUBDIRS)) %-install: - $(MAKE) -C $* install + $(Q)$(MAKE) $(MAKEOPTS) -C $* install %-install-dev: - $(MAKE) -C $* install-dev + $(Q)$(MAKE) $(MAKEOPTS) -C $* install-dev include $(BUILDRULES) diff --git a/mdrestore/Makefile b/mdrestore/Makefile index fd35d80..ca2d1a0 100644 --- a/mdrestore/Makefile +++ b/mdrestore/Makefile @@ -16,7 +16,7 @@ default: depend $(LTCOMMAND) include $(BUILDRULES) -install: +install: default $(INSTALL) -m 755 -d $(PKG_SBIN_DIR) $(LTINSTALL) -m 755 $(LTCOMMAND) $(PKG_SBIN_DIR) install-dev: From sandeen@sandeen.net Fri Feb 5 10:58:37 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_75,J_CHICKENPOX_93 autolearn=no version=3.3.0-rupdated 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 o15GwbcF149741 for ; Fri, 5 Feb 2010 10:58:37 -0600 X-ASG-Debug-ID: 1265389186-651a00b70000-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 84F381B362F for ; Fri, 5 Feb 2010 08:59:46 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id uMLCSLTs42ANFRsO for ; Fri, 05 Feb 2010 08:59:46 -0800 (PST) Received: from Liberator.local (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 1A1DB124CF18; Fri, 5 Feb 2010 10:59:46 -0600 (CST) Message-ID: <4B6C4E81.6060201@sandeen.net> Date: Fri, 05 Feb 2010 10:59:45 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: xfs-oss CC: Theodore Tso X-ASG-Orig-Subj: [PATCH] xfstests: fix up fs_perms test used by 126 Subject: [PATCH] xfstests: fix up fs_perms test used by 126 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: 1265389187 X-Barracuda-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.21735 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 Test 126 was failing intermittently for Ted & I; it seems that this is because we were passing an unterminated string to fopen for the mode; I'm not certain why this made it fail, but it's pretty clearly not a good thing to do, and fixing it fixes the test. Rather than passing around characters, do things string-wise, since that is what is ultimately used in fopen(). Also make it at least possible to pass in the 2-character modes fopen can take (r+, w+, etc), I suppose testcases could be added for this later. Reported-by: Theodore Tso Signed-off-by: Eric Sandeen --- diff --git a/src/fs_perms.c b/src/fs_perms.c index 2c5e3fa..f34c4f4 100644 --- a/src/fs_perms.c +++ b/src/fs_perms.c @@ -42,7 +42,7 @@ int testsetup(mode_t mode, int cuserId, int cgroupId); int testfperm(int userId, int groupId, char* fperm); int main( int argc, char *argv[]) { - char fperm[1]; + char fperm[3]; int result, exresult=0, cuserId=0, cgroupId=0, userId=0, groupId=0; mode_t mode; @@ -53,7 +53,8 @@ int main( int argc, char *argv[]) { cgroupId = atoi(argv[3]); userId = atoi(argv[4]); groupId = atoi(argv[5]); - fperm[0] = *argv[6]; + strncpy(fperm, argv[6], 3); + fperm[2] = '\0'; exresult = atoi(argv[7]); break; default: @@ -64,7 +65,7 @@ int main( int argc, char *argv[]) { testsetup(mode,cuserId,cgroupId); result=testfperm(userId,groupId,fperm); system("rm test.file"); - printf("%c a %03o file owned by (%d/%d) as user/group(%d/%d) ",fperm[0],mode,cuserId,cgroupId,userId,groupId); + printf("%s a %03o file owned by (%d/%d) as user/group(%d/%d) ",fperm,mode,cuserId,cgroupId,userId,groupId); if (result == exresult) { printf("PASS\n"); exit(0); @@ -102,8 +103,7 @@ int testfperm(int userId, int groupId, char* fperm) { return(-1); } - switch(tolower(fperm[0])) { - case 'x': + if (!strcmp("x", fperm)) { PID = fork(); if (PID == 0) { execlp("./test.file","test.file",NULL); @@ -114,8 +114,7 @@ int testfperm(int userId, int groupId, char* fperm) { seteuid(0); setegid(0); return(nuthertmpi); - - default: + } else { if((testfile=fopen("test.file",fperm))){ fclose(testfile); seteuid(0); From aelder@sgi.com Fri Feb 5 13:05:21 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o15J5KXS155937 for ; Fri, 5 Feb 2010 13:05:20 -0600 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 2A0B93040DB; Fri, 5 Feb 2010 11:06:28 -0800 (PST) Received: from [128.162.232.188] ([128.162.232.188]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 5 Feb 2010 13:06:21 -0600 Subject: Re: [PATCH 01/10] xfs: Make inode reclaim states explicit From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1265153104-29680-2-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Fri, 05 Feb 2010 13:06:20 -0600 Message-ID: <1265396780.2714.23.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Feb 2010 19:06:21.0157 (UTC) FILETIME=[4DA6E950:01CAA696] 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-02-03 at 10:24 +1100, Dave Chinner wrote: > A.K.A.: don't rely on xfs_iflush() return value in reclaim > > We have gradually been moving checks out of the reclaim code because > they are duplicated in xfs_iflush(). We've had a history of problems > in this area, and many of them stem from the overloading of the > return values from xfs_iflush() and interaction with inode flush > locking to determine if the inode is safe to reclaim. > > With the desire to move to delayed write flushing of inodes and > non-blocking inode tree reclaim walks, the overloading of the > return value of xfs_iflush makes it very difficult to determine > the correct thing to do next. > > This patch explicitly re-adds the checks to the inode reclaim code, > removing the reliance on the return value of xfs_iflush() to > determine what to do next. It also means that we can clearly > document all the inode states that reclaim must handle and hence > we can easily see that we handled all the necessary cases. > > This also removes the need for the xfs_inode_clean() check in > xfs_iflush() as all callers now check this first (safely). I have a few comments, below. One is a real bug. At this point I'm trusting that your enumeration of all the possible inode states is correct. Other than what I indicate below, this change looks good. > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig > --- > fs/xfs/linux-2.6/xfs_sync.c | 80 ++++++++++++++++++++++++++++++++---------- > fs/xfs/xfs_inode.c | 11 +----- > fs/xfs/xfs_inode.h | 1 + > 3 files changed, 63 insertions(+), 29 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c > index c9b863e..98b8937 100644 > --- a/fs/xfs/linux-2.6/xfs_sync.c > +++ b/fs/xfs/linux-2.6/xfs_sync.c > @@ -706,12 +706,43 @@ __xfs_inode_clear_reclaim_tag( > XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); > } > > +/* > + * Inodes in different states need to be treated differently, and the return > + * value of xfs_iflush is not sufficient to get this right. The following table > + * lists the inode states and the reclaim actions necessary for non-blocking > + * reclaim: > + * > + * > + * inode state iflush ret required action > + * --------------- ---------- --------------- > + * bad - reclaim > + * shutdown EIO unpin and reclaim > + * clean, unpinned 0 reclaim > + * stale, unpinned 0 reclaim > + * clean, pinned(*) 0 unpin and reclaim > + * stale, pinned 0 unpin and reclaim > + * dirty, async 0 block on flush lock, reclaim > + * dirty, sync flush 0 block on flush lock, reclaim > + * > + * (*) dgc: I don't think the clean, pinned state is possible but it gets > + * handled anyway given the order of checks implemented. > + * > + * Hence the order of actions after gaining the locks should be: > + * bad => reclaim > + * shutdown => unpin and reclaim > + * pinned => unpin > + * stale => reclaim > + * clean => reclaim > + * dirty => flush, wait and reclaim > + */ > STATIC int > xfs_reclaim_inode( > struct xfs_inode *ip, > struct xfs_perag *pag, > int sync_mode) > { > + int error; > + > /* > * The radix tree lock here protects a thread in xfs_iget from racing > * with us starting reclaim on the inode. Once we have the > @@ -729,30 +760,41 @@ xfs_reclaim_inode( > spin_unlock(&ip->i_flags_lock); > write_unlock(&pag->pag_ici_lock); > > - /* > - * If the inode is still dirty, then flush it out. If the inode > - * is not in the AIL, then it will be OK to flush it delwri as > - * long as xfs_iflush() does not keep any references to the inode. > - * We leave that decision up to xfs_iflush() since it has the > - * knowledge of whether it's OK to simply do a delwri flush of > - * the inode or whether we need to wait until the inode is > - * pulled from the AIL. > - * We get the flush lock regardless, though, just to make sure > - * we don't free it while it is being flushed. > - */ > xfs_ilock(ip, XFS_ILOCK_EXCL); > xfs_iflock(ip); > > - /* > - * In the case of a forced shutdown we rely on xfs_iflush() to > - * wait for the inode to be unpinned before returning an error. > - */ > - if (!is_bad_inode(VFS_I(ip)) && xfs_iflush(ip, sync_mode) == 0) { > - /* synchronize with xfs_iflush_done */ > - xfs_iflock(ip); > - xfs_ifunlock(ip); > + if (is_bad_inode(VFS_I(ip))) > + goto reclaim; It looks to me like your code adds a call to xfs_ifunlock(ip) in the bad inode case that was not there before. My guess is that your way is correct, but I'd like to know whether you agree this differs. Is this intentional? Regardless, is the new xfs_ifunlock() call correct? > + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) { > + xfs_iunpin_wait(ip); > + goto reclaim; > + } > + if (xfs_ipincount(ip)) > + xfs_iunpin_wait(ip); I notice you avoid an unneeded xfs_iunpin_wait() call in the case where it's not pinned already. (Still there in xfs_iflush() when *not* non-blocking.) Effect is the same though, but a minor improvement. > + if (xfs_iflags_test(ip, XFS_ISTALE)) > + goto reclaim; > + if (xfs_inode_clean(ip)) > + goto reclaim; > + > + /* Now we have an inode that needs flushing */ > + error = xfs_iflush(ip, sync_mode); > + if (!error) { > + switch(sync_mode) { > + case XFS_IFLUSH_DELWRI_ELSE_ASYNC: > + case XFS_IFLUSH_DELWRI: > + case XFS_IFLUSH_ASYNC: > + case XFS_IFLUSH_DELWRI_ELSE_SYNC: > + case XFS_IFLUSH_SYNC: > + /* IO issued, synchronise with IO completion */ > + xfs_iflock(ip); You must not have run this with DEBUG enabled. You need a "break;" here. > + default: > + ASSERT(0); > + break; > + } > } > > +reclaim: > + xfs_ifunlock(ip); > xfs_iunlock(ip, XFS_ILOCK_EXCL); > xfs_ireclaim(ip); > return 0; > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index d0d1b5a..8d0666d 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -2493,7 +2493,7 @@ __xfs_iunpin_wait( > wait_event(ip->i_ipin_wait, (atomic_read(&ip->i_pincount) == 0)); > } > > -static inline void > +void > xfs_iunpin_wait( > xfs_inode_t *ip) > { > @@ -2849,15 +2849,6 @@ xfs_iflush( > mp = ip->i_mount; > > /* > - * If the inode isn't dirty, then just release the inode flush lock and > - * do nothing. > - */ > - if (xfs_inode_clean(ip)) { > - xfs_ifunlock(ip); > - return 0; > - } > - > - /* > * We can't flush the inode until it is unpinned, so wait for it if we > * are allowed to block. We know noone new can pin it, because we are > * holding the inode lock shared and you need to hold it exclusively to > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index ec1f28c..8b618ea 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -483,6 +483,7 @@ int xfs_iunlink(struct xfs_trans *, xfs_inode_t *); > void xfs_iext_realloc(xfs_inode_t *, int, int); > void xfs_ipin(xfs_inode_t *); > void xfs_iunpin(xfs_inode_t *); > +void xfs_iunpin_wait(xfs_inode_t *); > int xfs_iflush(xfs_inode_t *, uint); > void xfs_ichgtime(xfs_inode_t *, int); > void xfs_lock_inodes(xfs_inode_t **, int, uint); From sandeen@sandeen.net Fri Feb 5 15:13:48 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o15LDlAT161896 for ; Fri, 5 Feb 2010 15:13:47 -0600 X-ASG-Debug-ID: 1265404497-133402180000-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 870891C8D607 for ; Fri, 5 Feb 2010 13:14:57 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id 0VBlrhgJjtOsyToy for ; Fri, 05 Feb 2010 13:14:57 -0800 (PST) Received: from Liberator.local (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 50679124CF07; Fri, 5 Feb 2010 15:14:57 -0600 (CST) Message-ID: <4B6C8A50.6090108@sandeen.net> Date: Fri, 05 Feb 2010 15:14:56 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Dave Chinner CC: xfs mailing list X-ASG-Orig-Subj: Re: xfsprogs: to -DDEBUG or not to -DDEBUG? Subject: Re: xfsprogs: to -DDEBUG or not to -DDEBUG? References: <4B6AFB83.1070309@sandeen.net> <20100205023134.GA11483@discord.disaster> In-Reply-To: <20100205023134.GA11483@discord.disaster> 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: 1265404498 X-Barracuda-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.21750 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: > On Thu, Feb 04, 2010 at 10:53:23AM -0600, Eric Sandeen wrote: >> Fedora, long ago, disabled debug in the xfsprogs specfile: >> >> http://cvs.fedoraproject.org/viewvc/F-12/xfsprogs/xfsprogs.spec?r1=1.5&r2=1.6 >> >> * Wed Apr 20 2005 Dave Jones >> - Disable debug. (#151438) >> >> per this bug: https://bugzilla.redhat.com/show_bug.cgi?id=151438 >> >> referencing this email thread: >> >> http://oss.sgi.com/archives/linux-xfs/2005-03/msg00038.html >> which no longer exists (grrrr) but is probably now here: >> >> http://oss.sgi.com/archives/xfs/2005-03/msg00416.html >> >> Fedora still builds with -DNDEBUG, but the upstream tarball has >> it on by default. I have seen several occasions where other >> distros had failing xfs_repairs which were "fixed" by disabling >> debug. I'd like to make a decision on whether DEBUG should be >> on or off by default for upstream releases. Any thoughts? > > Personally I'd prefer the repair process to stop if it comes across > inconsistencies it can't handle. Ignoring them is as likely to "fix" > the crash as it is to corrupt the filesystem more. > > On top of that we get bug reports when those problems are hit so > we can look into what caused the problem. We don't really have a > repair test suite that covers all the possible corruptions that > can occur, so we are kind of reliant on users reporting conditions > we've never had to handle before so we can fix them... > > Cheers, > > Dave. Hrm. Well, that makes sense. OTOH, Debian turns it off too: $ grep DEBUG debian/rules options = export DEBUG=-DNDEBUG DISTRIBUTION=debian \ and for some reason when I take this out of the Fedora specfile, it fails to build because: xfs_bmap.c:23: warning: 'xfs_bmap_check_leaf_extents' used but never defined and indeed there is a forward declaration: #ifdef DEBUG STATIC void xfs_bmap_check_leaf_extents(xfs_btree_cur_t *cur, xfs_inode_t *ip, int whichfork); #endif but no definition that I can find .... Something must be odd w/ the way this flag works though because a simple "make" in the git tree, w/o any -DNDEBUG, works fine for me ... Meanwhile I'm leaving DEBUG=-DNDEBUG on in Fedora just for now :) -Eric From aelder@sgi.com Fri Feb 5 15:41:09 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o15Lf9sP164056 for ; Fri, 5 Feb 2010 15:41:09 -0600 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 A4CEB8F80BF; Fri, 5 Feb 2010 13:42:17 -0800 (PST) Received: from [128.162.232.188] ([128.162.232.188]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 5 Feb 2010 15:38:45 -0600 Subject: Re: [PATCH 02/10] xfs: Use delayed write for inodes rather than async V2 From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1265153104-29680-3-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Fri, 05 Feb 2010 15:38:44 -0600 Message-ID: <1265405924.2714.117.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Feb 2010 21:38:45.0497 (UTC) FILETIME=[981A7690:01CAA6AB] 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-02-03 at 10:24 +1100, Dave Chinner wrote: > We currently do background inode flush asynchronously, resulting in > inodes being written in whatever order the background writeback > issues them. Not only that, there are also blocking and non-blocking > asynchronous inode flushes, depending on where the flush comes from. > > This patch completely removes asynchronous inode writeback. It > removes all the strange writeback modes and replaces them with > either a synchronous flush or a non-blocking delayed write flush. > That is, inode flushes will only issue IO directly if they are > synchronous, and background flushing may do nothing if the operation > would block (e.g. on a pinned inode or buffer lock). > > Delayed write flushes will now result in the inode buffer sitting in > the delwri queue of the buffer cache to be flushed by either an AIL > push or by the xfsbufd timing out the buffer. This will allow > accumulation of dirty inode buffers in memory and allow optimisation > of inode cluster writeback at the xfsbufd level where we have much > greater queue depths than the block layer elevators. We will also > get adjacent inode cluster buffer IO merging for free when a later > patch in the series allows sorting of the delayed write buffers > before dispatch. > > This effectively means that any inode that is written back by > background writeback will be seen as flush locked during AIL > pushing, and will result in the buffers being pushed from there. > This writeback path is currently non-optimal, but the next patch > in the series will fix that problem. > > A side effect of this delayed write mechanism is that background > inode reclaim will no longer directly flush inodes, nor can it wait > on the flush lock. The result is that inode reclaim must leave the > inode in the reclaimable state until it is clean. Hence attempts to > reclaim a dirty inode in the background will simply skip the inode > until it is clean and this allows other mechanisms (i.e. xfsbufd) to > do more optimal writeback of the dirty buffers. As a result, the > inode reclaim code has been rewritten so that it no longer relies on > the ambiguous return values of xfs_iflush() to determine whether it > is safe to reclaim an inode. > > Portions of this patch are derived from patches by Christoph > Hellwig. > > Version 2: > - cleanup reclaim code as suggested by Christoph > - log background reclaim inode flush errors > - just pass sync flags to xfs_iflush I now see that the missing "break;" in the previous patch doesn't matter as long as this patch is also applied... This change looks right to me, and it's pretty cool to see where you're headed with it. I wasn't quite following a few weeks back when you and Christoph were discussing this. I have a few comments on the comments, below. Maybe you could either confirm or correct what I say below. > Signed-off-by: Dave Chinner Reviewed-by: Alex Elder > --- > fs/xfs/linux-2.6/xfs_super.c | 4 +- > fs/xfs/linux-2.6/xfs_sync.c | 104 ++++++++++++++++++++++++++++++----------- > fs/xfs/xfs_inode.c | 75 ++---------------------------- > fs/xfs/xfs_inode.h | 10 ---- > fs/xfs/xfs_inode_item.c | 10 +++- > fs/xfs/xfs_mount.c | 13 +++++- > 6 files changed, 102 insertions(+), 114 deletions(-) > . . . > diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c > index 98b8937..a9f6d20 100644 > --- a/fs/xfs/linux-2.6/xfs_sync.c > +++ b/fs/xfs/linux-2.6/xfs_sync.c . . . > @@ -719,21 +720,42 @@ __xfs_inode_clear_reclaim_tag( Regardless of the state, if the inode has a flush underway we requeue. > * shutdown EIO unpin and reclaim > * clean, unpinned 0 reclaim > * stale, unpinned 0 reclaim > - * clean, pinned(*) 0 unpin and reclaim > - * stale, pinned 0 unpin and reclaim > - * dirty, async 0 block on flush lock, reclaim > - * dirty, sync flush 0 block on flush lock, reclaim > + * clean, pinned(*) 0 requeue > + * stale, pinned EAGAIN requeue Actually, if it's pinned (clean or stale) then we either unpin and reclaim (if synchronous) or requeue (otherwise), i.e.: * clean, pinned, async(*) N/A requeue * stale, pinned, async(*) N/A requeue * clean, pinned, sync flush 0 unpin and reclaim * stale, pinned, sync flush EAGAIN unpin and reclaim > + * dirty, delwri ok 0 requeue > + * dirty, delwri blocked EAGAIN requeue > + * dirty, sync flush 0 reclaim > * > * (*) dgc: I don't think the clean, pinned state is possible but it gets > * handled anyway given the order of checks implemented. > * > + * As can be seen from the table, the return value of xfs_iflush() is not > + * sufficient to correctly decide the reclaim action here. The checks in > + * xfs_iflush() might look like duplicates, but they are not. > + * > + * Also, because we get the flush lock first, we know that any inode that has > + * been flushed delwri has had the flush completed by the time we check that > + * the inode is clean. The clean inode check needs to be done before flushing > + * the inode delwri otherwise we would loop forever requeuing clean inodes as > + * we cannot tell apart a successful delwri flush and a clean inode from the > + * return value of xfs_iflush(). > + * > + * Note that because the inode is flushed delayed write by background > + * writeback, the flush lock may already be held here and waiting on it can > + * result in very long latencies. Hence for sync reclaims, where we wait on the > + * flush lock, the caller should push out delayed write inodes first before > + * trying to reclaim them to minimise the amount of time spent waiting. For > + * background relaim, we just requeue the inode for the next pass. > + * > * Hence the order of actions after gaining the locks should be: > * bad => reclaim > * shutdown => unpin and reclaim > - * pinned => unpin > + * pinned, delwri => requeue > + * pinned, sync => unpin > * stale => reclaim > * clean => reclaim > - * dirty => flush, wait and reclaim > + * dirty, delwri => flush and requeue > + * dirty, sync => flush, wait and reclaim > */ > STATIC int > xfs_reclaim_inode( . . . From aelder@sgi.com Fri Feb 5 16:52:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.2 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o15MqVYo167912 for ; Fri, 5 Feb 2010 16:52:31 -0600 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 67EE7AC016; Fri, 5 Feb 2010 14:53:39 -0800 (PST) Received: from [128.162.232.188] ([128.162.232.188]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 5 Feb 2010 16:51:29 -0600 Subject: Re: [PATCH 03/10] xfs: Don't issue buffer IO direct from AIL push V2 From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1265153104-29680-4-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-4-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Fri, 05 Feb 2010 16:51:29 -0600 Message-ID: <1265410289.2714.153.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Feb 2010 22:51:29.0978 (UTC) FILETIME=[C18969A0:01CAA6B5] 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-02-03 at 10:24 +1100, Dave Chinner wrote: > All buffers logged into the AIL are marked as delayed write. > When the AIL needs to push the buffer out, it issues an async write of the > buffer. This means that IO patterns are dependent on the order of > buffers in the AIL. > > Instead of flushing the buffer, promote the buffer in the delayed > write list so that the next time the xfsbufd is run the buffer will > be flushed by the xfsbufd. Return the state to the xfsaild that the > buffer was promoted so that the xfsaild knows that it needs to cause > the xfsbufd to run to flush the buffers that were promoted. > > Using the xfsbufd for issuing the IO allows us to dispatch all > buffer IO from the one queue. This means that we can make much more > enlightened decisions on what order to flush buffers to disk as > we don't have multiple places issuing IO. Optimisations to xfsbufd > will be in a future patch. > > Version 2 > - kill XFS_ITEM_FLUSHING as it is now unused. Looks good. > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder > --- > fs/xfs/linux-2.6/xfs_buf.c | 29 ++++++++++++ > fs/xfs/linux-2.6/xfs_buf.h | 2 + > fs/xfs/linux-2.6/xfs_trace.h | 1 + > fs/xfs/quota/xfs_dquot_item.c | 85 +++++------------------------------ > fs/xfs/quota/xfs_dquot_item.h | 4 -- > fs/xfs/xfs_buf_item.c | 64 +++++++++++++++------------ > fs/xfs/xfs_inode_item.c | 98 ++++++---------------------------------- > fs/xfs/xfs_inode_item.h | 6 --- > fs/xfs/xfs_trans.h | 3 +- > fs/xfs/xfs_trans_ail.c | 13 +++--- > 10 files changed, 102 insertions(+), 203 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c > index 44e20e5..b306265 100644 > --- a/fs/xfs/linux-2.6/xfs_buf.c > +++ b/fs/xfs/linux-2.6/xfs_buf.c > @@ -1778,6 +1778,35 @@ xfs_buf_delwri_dequeue( > trace_xfs_buf_delwri_dequeue(bp, _RET_IP_); > } > > +/* > + * If a delwri buffer needs to be pushed before it has aged out, then promote > + * it to the head of the delwri queue so that it will be flushed on the next > + * xfsbufd run. We do this by resetting the queuetime of the buffer to be older > + * than the age currently needed to flush the buffer. Hence the next time the > + * xfsbufd sees it is guaranteed to be considered old enough to flush. > + */ > +void > +xfs_buf_delwri_promote( > + struct xfs_buf *bp) > +{ > + struct xfs_buftarg *btp = bp->b_target; > + long age = xfs_buf_age_centisecs * msecs_to_jiffies(10) + 1; > + > + ASSERT(bp->b_flags & XBF_DELWRI); > + ASSERT(bp->b_flags & _XBF_DELWRI_Q); > + > + /* > + * Check the buffer age before locking the delayed write queue as we > + * don't need to promote buffers that are already past the flush age. > + */ > + if (bp->b_queuetime < jiffies - age) > + return; > + bp->b_queuetime = jiffies - age; > + spin_lock(&btp->bt_delwrite_lock); > + list_move(&bp->b_list, &btp->bt_delwrite_queue); > + spin_unlock(&btp->bt_delwrite_lock); > +} > + > STATIC void > xfs_buf_runall_queues( > struct workqueue_struct *queue) > diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h > index ea8c198..be45e8c 100644 > --- a/fs/xfs/linux-2.6/xfs_buf.h > +++ b/fs/xfs/linux-2.6/xfs_buf.h > @@ -266,6 +266,7 @@ 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 *); > > /* Buffer Daemon Setup Routines */ > extern int xfs_buf_init(void); > @@ -395,6 +396,7 @@ extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *); > extern void xfs_wait_buftarg(xfs_buftarg_t *); > extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int); > extern int xfs_flush_buftarg(xfs_buftarg_t *, int); > + > #ifdef CONFIG_KDB_MODULES > extern struct list_head *xfs_get_buftarg_list(void); > #endif > diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h > index 1bb09e7..a4574dc 100644 > --- a/fs/xfs/linux-2.6/xfs_trace.h > +++ b/fs/xfs/linux-2.6/xfs_trace.h > @@ -483,6 +483,7 @@ DEFINE_BUF_ITEM_EVENT(xfs_buf_item_unlock); > DEFINE_BUF_ITEM_EVENT(xfs_buf_item_unlock_stale); > DEFINE_BUF_ITEM_EVENT(xfs_buf_item_committed); > DEFINE_BUF_ITEM_EVENT(xfs_buf_item_push); > +DEFINE_BUF_ITEM_EVENT(xfs_buf_item_pushbuf); > DEFINE_BUF_ITEM_EVENT(xfs_trans_get_buf); > DEFINE_BUF_ITEM_EVENT(xfs_trans_get_buf_recur); > DEFINE_BUF_ITEM_EVENT(xfs_trans_getsb); > diff --git a/fs/xfs/quota/xfs_dquot_item.c b/fs/xfs/quota/xfs_dquot_item.c > index 1b56437..dda0fb0 100644 > --- a/fs/xfs/quota/xfs_dquot_item.c > +++ b/fs/xfs/quota/xfs_dquot_item.c > @@ -212,66 +212,31 @@ xfs_qm_dquot_logitem_pushbuf( > xfs_dquot_t *dqp; > xfs_mount_t *mp; > xfs_buf_t *bp; > - uint dopush; > > dqp = qip->qli_dquot; > ASSERT(XFS_DQ_IS_LOCKED(dqp)); > > /* > - * The qli_pushbuf_flag keeps others from > - * trying to duplicate our effort. > - */ > - ASSERT(qip->qli_pushbuf_flag != 0); > - ASSERT(qip->qli_push_owner == current_pid()); > - > - /* > * If flushlock isn't locked anymore, chances are that the > * 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)) { > - qip->qli_pushbuf_flag = 0; > xfs_dqunlock(dqp); > return; > } > mp = dqp->q_mount; > bp = xfs_incore(mp->m_ddev_targp, qip->qli_format.qlf_blkno, > XFS_QI_DQCHUNKLEN(mp), XBF_TRYLOCK); > - if (bp != NULL) { > - if (XFS_BUF_ISDELAYWRITE(bp)) { > - dopush = ((qip->qli_item.li_flags & XFS_LI_IN_AIL) && > - !completion_done(&dqp->q_flush)); > - qip->qli_pushbuf_flag = 0; > - xfs_dqunlock(dqp); > - > - if (XFS_BUF_ISPINNED(bp)) > - xfs_log_force(mp, 0); > - > - if (dopush) { > - int error; > -#ifdef XFSRACEDEBUG > - delay_for_intr(); > - delay(300); > -#endif > - error = xfs_bawrite(mp, bp); > - if (error) > - xfs_fs_cmn_err(CE_WARN, mp, > - "xfs_qm_dquot_logitem_pushbuf: pushbuf error %d on qip %p, bp %p", > - error, qip, bp); > - } else { > - xfs_buf_relse(bp); > - } > - } else { > - qip->qli_pushbuf_flag = 0; > - xfs_dqunlock(dqp); > - xfs_buf_relse(bp); > - } > + xfs_dqunlock(dqp); > + if (!bp) > return; > - } > + if (XFS_BUF_ISDELAYWRITE(bp)) > + xfs_buf_delwri_promote(bp); > + xfs_buf_relse(bp); > + return; > > - qip->qli_pushbuf_flag = 0; > - xfs_dqunlock(dqp); > } > > /* > @@ -289,50 +254,24 @@ xfs_qm_dquot_logitem_trylock( > xfs_dq_logitem_t *qip) > { > xfs_dquot_t *dqp; > - uint retval; > > dqp = qip->qli_dquot; > if (atomic_read(&dqp->q_pincount) > 0) > - return (XFS_ITEM_PINNED); > + return XFS_ITEM_PINNED; > > if (! xfs_qm_dqlock_nowait(dqp)) > - return (XFS_ITEM_LOCKED); > + return XFS_ITEM_LOCKED; > > - retval = XFS_ITEM_SUCCESS; > if (!xfs_dqflock_nowait(dqp)) { > /* > - * The dquot is already being flushed. It may have been > - * flushed delayed write, however, and we don't want to > - * get stuck waiting for that to complete. So, we want to check > - * to see if we can lock the dquot's buffer without sleeping. > - * If we can and it is marked for delayed write, then we > - * hold it and send it out from the push routine. We don't > - * want to do that now since we might sleep in the device > - * strategy routine. We also don't want to grab the buffer lock > - * here because we'd like not to call into the buffer cache > - * while holding the AIL lock. > - * Make sure to only return PUSHBUF if we set pushbuf_flag > - * ourselves. If someone else is doing it then we don't > - * want to go to the push routine and duplicate their efforts. > + * dquot has already been flushed to the backing buffer, > + * leave it locked, pushbuf routine will unlock it. > */ > - if (qip->qli_pushbuf_flag == 0) { > - qip->qli_pushbuf_flag = 1; > - ASSERT(qip->qli_format.qlf_blkno == dqp->q_blkno); > -#ifdef DEBUG > - qip->qli_push_owner = current_pid(); > -#endif > - /* > - * The dquot is left locked. > - */ > - retval = XFS_ITEM_PUSHBUF; > - } else { > - retval = XFS_ITEM_FLUSHING; > - xfs_dqunlock_nonotify(dqp); > - } > + return XFS_ITEM_PUSHBUF; > } > > ASSERT(qip->qli_item.li_flags & XFS_LI_IN_AIL); > - return (retval); > + return XFS_ITEM_SUCCESS; > } > > > diff --git a/fs/xfs/quota/xfs_dquot_item.h b/fs/xfs/quota/xfs_dquot_item.h > index 5a63253..5acae2a 100644 > --- a/fs/xfs/quota/xfs_dquot_item.h > +++ b/fs/xfs/quota/xfs_dquot_item.h > @@ -27,10 +27,6 @@ typedef struct xfs_dq_logitem { > xfs_log_item_t qli_item; /* common portion */ > struct xfs_dquot *qli_dquot; /* dquot ptr */ > xfs_lsn_t qli_flush_lsn; /* lsn at last flush */ > - unsigned short qli_pushbuf_flag; /* 1 bit used in push_ail */ > -#ifdef DEBUG > - uint64_t qli_push_owner; > -#endif > xfs_dq_logformat_t qli_format; /* logged structure */ > } xfs_dq_logitem_t; > > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index e0a1158..f3c49e6 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -467,8 +467,10 @@ xfs_buf_item_unpin_remove( > /* > * 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, pull the > - * buffer from the free list, mark it busy, and return 1. > + * the lock right away, return 0. If we can get the lock, take a > + * reference to the buffer. If this is a delayed write buffer that > + * needs AIL help to be written back, invoke the pushbuf routine > + * rather than the normal success path. > */ > STATIC uint > xfs_buf_item_trylock( > @@ -477,24 +479,18 @@ xfs_buf_item_trylock( > xfs_buf_t *bp; > > bp = bip->bli_buf; > - > - if (XFS_BUF_ISPINNED(bp)) { > + if (XFS_BUF_ISPINNED(bp)) > return XFS_ITEM_PINNED; > - } > - > - if (!XFS_BUF_CPSEMA(bp)) { > + if (!XFS_BUF_CPSEMA(bp)) > return XFS_ITEM_LOCKED; > - } > > - /* > - * Remove the buffer from the free list. Only do this > - * if it's on the free list. Private buffers like the > - * superblock buffer are not. > - */ > + /* take a reference to the buffer. */ > XFS_BUF_HOLD(bp); > > ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); > trace_xfs_buf_item_trylock(bip); > + if (XFS_BUF_ISDELAYWRITE(bp)) > + return XFS_ITEM_PUSHBUF; > return XFS_ITEM_SUCCESS; > } > > @@ -626,11 +622,9 @@ xfs_buf_item_committed( > } > > /* > - * This is called to asynchronously write the buffer associated with this > - * buf log item out to disk. The buffer will already have been locked by > - * a successful call to xfs_buf_item_trylock(). If the buffer still has > - * B_DELWRI set, then get it going out to disk with a call to bawrite(). > - * If not, then just release the buffer. > + * The buffer is locked, but is not a delayed write buffer. This happens > + * if we race with IO completion and hence we don't want to try to write it > + * again. Just release the buffer. > */ > STATIC void > xfs_buf_item_push( > @@ -642,17 +636,29 @@ xfs_buf_item_push( > trace_xfs_buf_item_push(bip); > > bp = bip->bli_buf; > + ASSERT(!XFS_BUF_ISDELAYWRITE(bp)); > + xfs_buf_relse(bp); > +} > > - if (XFS_BUF_ISDELAYWRITE(bp)) { > - int error; > - error = xfs_bawrite(bip->bli_item.li_mountp, bp); > - if (error) > - xfs_fs_cmn_err(CE_WARN, bip->bli_item.li_mountp, > - "xfs_buf_item_push: pushbuf error %d on bip %p, bp %p", > - error, bip, bp); > - } else { > - xfs_buf_relse(bp); > - } > +/* > + * The buffer is locked and is a delayed write buffer. Promote the buffer > + * in the delayed write queue as the caller knows that they must invoke > + * the xfsbufd to get this buffer written. We have to unlock the buffer > + * to allow the xfsbufd to write it, too. > + */ > +STATIC void > +xfs_buf_item_pushbuf( > + xfs_buf_log_item_t *bip) > +{ > + xfs_buf_t *bp; > + > + ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); > + 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 */ > @@ -677,7 +683,7 @@ static struct xfs_item_ops xfs_buf_item_ops = { > .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 = NULL, > + .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 > }; > diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c > index 207553e..d4dc063 100644 > --- a/fs/xfs/xfs_inode_item.c > +++ b/fs/xfs/xfs_inode_item.c > @@ -602,33 +602,20 @@ xfs_inode_item_trylock( > > if (!xfs_iflock_nowait(ip)) { > /* > - * If someone else isn't already trying to push the inode > - * buffer, we get to do it. > + * inode has already been flushed to the backing buffer, > + * leave it locked in shared mode, pushbuf routine will > + * unlock it. > */ > - if (iip->ili_pushbuf_flag == 0) { > - iip->ili_pushbuf_flag = 1; > -#ifdef DEBUG > - iip->ili_push_owner = current_pid(); > -#endif > - /* > - * Inode is left locked in shared mode. > - * Pushbuf routine gets to unlock it. > - */ > - return XFS_ITEM_PUSHBUF; > - } else { > - /* > - * We hold the AIL lock, so we must specify the > - * NONOTIFY flag so that we won't double trip. > - */ > - xfs_iunlock(ip, XFS_ILOCK_SHARED|XFS_IUNLOCK_NONOTIFY); > - return XFS_ITEM_FLUSHING; > - } > - /* NOTREACHED */ > + return XFS_ITEM_PUSHBUF; > } > > /* Stale items should force out the iclog */ > if (ip->i_flags & XFS_ISTALE) { > xfs_ifunlock(ip); > + /* > + * we hold the AIL lock - notify the unlock routine of this > + * so it doesn't try to get the lock again. > + */ > xfs_iunlock(ip, XFS_ILOCK_SHARED|XFS_IUNLOCK_NONOTIFY); > return XFS_ITEM_PINNED; > } > @@ -746,11 +733,8 @@ xfs_inode_item_committed( > * This gets called by xfs_trans_push_ail(), when IOP_TRYLOCK > * failed to get the inode flush lock but did get the inode locked SHARED. > * Here we're trying to see if the inode buffer is incore, and if so whether it's > - * marked delayed write. If that's the case, we'll initiate a bawrite on that > - * buffer to expedite the process. > - * > - * We aren't holding the AIL lock (or the flush lock) when this gets called, > - * so it is inherently race-y. > + * marked delayed write. If that's the case, we'll promote it and that will > + * allow the caller to write the buffer by triggering the xfsbufd to run. > */ > STATIC void > xfs_inode_item_pushbuf( > @@ -759,26 +743,16 @@ xfs_inode_item_pushbuf( > xfs_inode_t *ip; > xfs_mount_t *mp; > xfs_buf_t *bp; > - uint dopush; > > ip = iip->ili_inode; > - > ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED)); > > /* > - * The ili_pushbuf_flag keeps others from > - * trying to duplicate our effort. > - */ > - ASSERT(iip->ili_pushbuf_flag != 0); > - ASSERT(iip->ili_push_owner == current_pid()); > - > - /* > * If a flush is not in progress anymore, chances are that the > * 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)) { > - iip->ili_pushbuf_flag = 0; > xfs_iunlock(ip, XFS_ILOCK_SHARED); > return; > } > @@ -787,53 +761,12 @@ xfs_inode_item_pushbuf( > bp = xfs_incore(mp->m_ddev_targp, iip->ili_format.ilf_blkno, > iip->ili_format.ilf_len, XBF_TRYLOCK); > > - if (bp != NULL) { > - if (XFS_BUF_ISDELAYWRITE(bp)) { > - /* > - * We were racing with iflush because we don't hold > - * the AIL lock or the flush lock. However, at this point, > - * we have the buffer, and we know that it's dirty. > - * So, it's possible that iflush raced with us, and > - * this item is already taken off the AIL. > - * If not, we can flush it async. > - */ > - dopush = ((iip->ili_item.li_flags & XFS_LI_IN_AIL) && > - !completion_done(&ip->i_flush)); > - iip->ili_pushbuf_flag = 0; > - xfs_iunlock(ip, XFS_ILOCK_SHARED); > - > - trace_xfs_inode_item_push(bp, _RET_IP_); > - > - if (XFS_BUF_ISPINNED(bp)) > - xfs_log_force(mp, 0); > - > - if (dopush) { > - int error; > - error = xfs_bawrite(mp, bp); > - if (error) > - xfs_fs_cmn_err(CE_WARN, mp, > - "xfs_inode_item_pushbuf: pushbuf error %d on iip %p, bp %p", > - error, iip, bp); > - } else { > - xfs_buf_relse(bp); > - } > - } else { > - iip->ili_pushbuf_flag = 0; > - xfs_iunlock(ip, XFS_ILOCK_SHARED); > - xfs_buf_relse(bp); > - } > - return; > - } > - /* > - * We have to be careful about resetting pushbuf flag too early (above). > - * Even though in theory we can do it as soon as we have the buflock, > - * we don't want others to be doing work needlessly. They'll come to > - * this function thinking that pushing the buffer is their > - * responsibility only to find that the buffer is still locked by > - * another doing the same thing > - */ > - iip->ili_pushbuf_flag = 0; > xfs_iunlock(ip, XFS_ILOCK_SHARED); > + if (!bp) > + return; > + if (XFS_BUF_ISDELAYWRITE(bp)) > + xfs_buf_delwri_promote(bp); > + xfs_buf_relse(bp); > return; > } > > @@ -937,7 +870,6 @@ xfs_inode_item_init( > /* > We have zeroed memory. No need ... > iip->ili_extents_buf = NULL; > - iip->ili_pushbuf_flag = 0; > */ > > iip->ili_format.ilf_type = XFS_LI_INODE; > diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h > index cc8df1a..9a46795 100644 > --- a/fs/xfs/xfs_inode_item.h > +++ b/fs/xfs/xfs_inode_item.h > @@ -144,12 +144,6 @@ typedef struct xfs_inode_log_item { > data exts */ > struct xfs_bmbt_rec *ili_aextents_buf; /* array of logged > attr exts */ > - unsigned int ili_pushbuf_flag; /* one bit used in push_ail */ > - > -#ifdef DEBUG > - uint64_t ili_push_owner; /* one who sets pushbuf_flag > - above gets to push the buf */ > -#endif > #ifdef XFS_TRANS_DEBUG > int ili_root_size; > char *ili_orig_root; > diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h > index ca64f33..c93e3a1 100644 > --- a/fs/xfs/xfs_trans.h > +++ b/fs/xfs/xfs_trans.h > @@ -861,8 +861,7 @@ typedef struct xfs_item_ops { > #define XFS_ITEM_SUCCESS 0 > #define XFS_ITEM_PINNED 1 > #define XFS_ITEM_LOCKED 2 > -#define XFS_ITEM_FLUSHING 3 > -#define XFS_ITEM_PUSHBUF 4 > +#define XFS_ITEM_PUSHBUF 3 > > /* > * This structure is used to maintain a list of block ranges that have been > diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c > index d7b1af8..e799824 100644 > --- a/fs/xfs/xfs_trans_ail.c > +++ b/fs/xfs/xfs_trans_ail.c > @@ -253,6 +253,7 @@ xfsaild_push( > int flush_log, count, stuck; > xfs_mount_t *mp = ailp->xa_mount; > struct xfs_ail_cursor *cur = &ailp->xa_cursors; > + int push_xfsbufd = 0; > > spin_lock(&ailp->xa_lock); > xfs_trans_ail_cursor_init(ailp, cur); > @@ -308,6 +309,7 @@ xfsaild_push( > XFS_STATS_INC(xs_push_ail_pushbuf); > IOP_PUSHBUF(lip); > last_pushed_lsn = lsn; > + push_xfsbufd = 1; > break; > > case XFS_ITEM_PINNED: > @@ -322,12 +324,6 @@ xfsaild_push( > stuck++; > break; > > - case XFS_ITEM_FLUSHING: > - XFS_STATS_INC(xs_push_ail_flushing); > - last_pushed_lsn = lsn; > - stuck++; > - break; > - > default: > ASSERT(0); > break; > @@ -374,6 +370,11 @@ xfsaild_push( > xfs_log_force(mp, 0); > } > > + if (push_xfsbufd) { > + /* we've got delayed write buffers to flush */ > + wake_up_process(mp->m_ddev_targp->bt_task); > + } > + > if (!count) { > /* We're past our target or empty, so idle */ > last_pushed_lsn = 0; From sandeen@sandeen.net Fri Feb 5 16:58:46 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o15MwjJn168246 for ; Fri, 5 Feb 2010 16:58:45 -0600 X-ASG-Debug-ID: 1265410794-2d2700350000-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 E84361382293 for ; Fri, 5 Feb 2010 14:59:54 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id wVYW4gmAk2NO1Ux7 for ; Fri, 05 Feb 2010 14:59:54 -0800 (PST) Received: from Liberator.local (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 2120F97FB47 for ; Fri, 5 Feb 2010 16:59:54 -0600 (CST) Message-ID: <4B6CA2E9.7020803@sandeen.net> Date: Fri, 05 Feb 2010 16:59:53 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: PATCH V2] more reserved blocks fixups Subject: PATCH V2] more reserved blocks fixups References: <4B60C8EE.5080700@sandeen.net> In-Reply-To: <4B60C8EE.5080700@sandeen.net> 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: 1265410795 X-Barracuda-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.21757 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 This mangles the reserved blocks counts a little more. 1) add a helper function for the default reserved count 2) add helper functions to save/restore counts on ro/rw 3) save/restore reserved blocks on freeze/thaw 4) disallow changing reserved count while readonly Signed-off-by: Eric Sandeen --- V2: changed field name to match Dave's changes diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index a034cf6..883929b 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -1431,6 +1431,9 @@ xfs_file_ioctl( if (!capable(CAP_SYS_ADMIN)) return -EPERM; + if (mp->m_flags & XFS_MOUNT_RDONLY) + return -XFS_ERROR(EROFS); + if (copy_from_user(&inout, arg, sizeof(inout))) return -XFS_ERROR(EFAULT); diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 8884f26..97c0f5a 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1257,6 +1257,29 @@ xfs_fs_statfs( return 0; } +STATIC void +xfs_save_resvblks(struct xfs_mount *mp) +{ + __uint64_t resblks = 0; + + mp->m_resblks_save = mp->m_resblks; + xfs_reserve_blocks(mp, &resblks, NULL); +} + +STATIC void +xfs_restore_resvblks(struct xfs_mount *mp) +{ + __uint64_t resblks; + + if (mp->m_resblks_save) { + resblks = mp->m_resblks_save; + mp->m_resblks_save = 0; + } else + resblks = xfs_default_resblks(mp); + + xfs_reserve_blocks(mp, &resblks, NULL); +} + STATIC int xfs_fs_remount( struct super_block *sb, @@ -1319,8 +1342,6 @@ xfs_fs_remount( /* ro -> rw */ if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(*flags & MS_RDONLY)) { - __uint64_t resblks; - mp->m_flags &= ~XFS_MOUNT_RDONLY; if (mp->m_flags & XFS_MOUNT_BARRIER) xfs_mountfs_check_barriers(mp); @@ -1343,15 +1364,7 @@ xfs_fs_remount( * Fill out the reserve pool if it is empty. Use the stashed * value if it is non-zero, otherwise go with the default. */ - if (mp->m_resblks_save) { - resblks = mp->m_resblks_save; - mp->m_resblks_save = 0; - } else { - resblks = mp->m_sb.sb_dblocks; - do_div(resblks, 20); - resblks = min_t(__uint64_t, resblks, 1024); - } - xfs_reserve_blocks(mp, &resblks, NULL); + xfs_restore_resvblks(mp); } /* rw -> ro */ @@ -1364,11 +1377,9 @@ xfs_fs_remount( * so that if we get remounted rw, we can return it to the same * size. */ - __uint64_t resblks = 0; xfs_quiesce_data(mp); - mp->m_resblks_save = mp->m_resblks; - xfs_reserve_blocks(mp, &resblks, NULL); + xfs_save_resvblks(mp); xfs_quiesce_attr(mp); mp->m_flags |= XFS_MOUNT_RDONLY; } @@ -1387,11 +1398,22 @@ xfs_fs_freeze( { struct xfs_mount *mp = XFS_M(sb); + xfs_save_resvblks(mp); xfs_quiesce_attr(mp); return -xfs_fs_log_dummy(mp); } STATIC int +xfs_fs_unfreeze( + struct super_block *sb) +{ + struct xfs_mount *mp = XFS_M(sb); + + xfs_restore_resvblks(mp); + return 0; +} + +STATIC int xfs_fs_show_options( struct seq_file *m, struct vfsmount *mnt) @@ -1613,6 +1635,7 @@ static const struct super_operations xfs_super_operations = { .put_super = xfs_fs_put_super, .sync_fs = xfs_fs_sync_fs, .freeze_fs = xfs_fs_freeze, + .unfreeze_fs = xfs_fs_unfreeze, .statfs = xfs_fs_statfs, .remount_fs = xfs_fs_remount, .show_options = xfs_fs_show_options, diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index eb403b4..48e1ee7 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1008,6 +1008,22 @@ xfs_mount_reset_sbqflags( return xfs_trans_commit(tp, 0); } +__uint64_t +xfs_default_resblks(xfs_mount_t *mp) +{ + __uint64_t resblks; + + /* + * We default to 5% or 1024 fsbs of space reserved, whichever is smaller. + * This may drive us straight to ENOSPC on mount, but that implies + * we were already there on the last unmount. Warn if this occurs. + */ + resblks = mp->m_sb.sb_dblocks; + do_div(resblks, 20); + resblks = min_t(__uint64_t, resblks, 1024); + return resblks; +} + /* * This function does the following on an initial mount of a file system: * - reads the superblock from disk and init the mount struct @@ -1318,18 +1334,14 @@ xfs_mountfs( * when at ENOSPC. This is needed for operations like create with * attr, unwritten extent conversion at ENOSPC, etc. Data allocations * are not allowed to use this reserved space. - * - * We default to 5% or 1024 fsbs of space reserved, whichever is smaller. - * This may drive us straight to ENOSPC on mount, but that implies - * we were already there on the last unmount. Warn if this occurs. */ - resblks = mp->m_sb.sb_dblocks; - do_div(resblks, 20); - resblks = min_t(__uint64_t, resblks, 1024); - error = xfs_reserve_blocks(mp, &resblks, NULL); - if (error) - cmn_err(CE_WARN, "XFS: Unable to allocate reserve blocks. " - "Continuing without a reserve pool."); + if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { + resblks = xfs_default_resblks(mp); + error = xfs_reserve_blocks(mp, &resblks, NULL); + if (error) + cmn_err(CE_WARN, "XFS: Unable to allocate reserve " + "blocks. Continuing without a reserve pool."); + } return 0; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 996273d..c8f880d 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -429,6 +429,7 @@ typedef struct xfs_mod_sb { } xfs_mod_sb_t; extern int xfs_log_sbcount(xfs_mount_t *, uint); +extern __uint64_t xfs_default_resblks(xfs_mount_t *mp); extern int xfs_mountfs(xfs_mount_t *mp); extern void xfs_unmountfs(xfs_mount_t *); From aelder@sgi.com Fri Feb 5 17:52:34 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_66 autolearn=no version=3.3.0-rupdated 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 o15NqYld172299 for ; Fri, 5 Feb 2010 17:52:34 -0600 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 F1CBD8F80C0; Fri, 5 Feb 2010 15:53:42 -0800 (PST) Received: from [128.162.232.188] ([128.162.232.188]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 5 Feb 2010 17:53:34 -0600 Subject: Re: [PATCH 04/10] xfs: Sort delayed write buffers before dispatch From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1265153104-29680-5-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-5-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Fri, 05 Feb 2010 17:53:34 -0600 Message-ID: <1265414014.2714.154.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: quoted-printable X-OriginalArrivalTime: 05 Feb 2010 23:53:34.0857 (UTC) FILETIME=[6DBCD790:01CAA6BE] 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-02-03 at 10:24 +1100, Dave Chinner wrote: > Currently when the xfsbufd writes delayed write buffers, it pushes > them to disk in the order they come off the delayed write list. If > there are lots of buffers =D1=95pread widely over the disk, this results > in overwhelming the elevator sort queues in the block layer and we > end up losing the posibility of merging adjacent buffers to minimise > the number of IOs. >=20 > Use the new generic list_sort function to sort the delwri dispatch > queue before issue to ensure that the buffers are pushed in the most > friendly order possible to the lower layers. Looks good. > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder > --- > fs/xfs/linux-2.6/xfs_buf.c | 87 ++++++++++++++++++++++++++++++--------= ------ > 1 files changed, 60 insertions(+), 27 deletions(-) >=20 > diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c > index b306265..4556a4c 100644 > --- a/fs/xfs/linux-2.6/xfs_buf.c > +++ b/fs/xfs/linux-2.6/xfs_buf.c > @@ -33,6 +33,7 @@ > #include > #include > #include > +#include > =20 > #include "xfs_sb.h" > #include "xfs_inum.h" > @@ -1877,14 +1878,42 @@ xfs_buf_delwri_split( > =20 > } > =20 > +/* > + * Compare function is more complex than it needs to be because > + * the return value is only 32 bits and we are doing comparisons > + * on 64 bit values > + */ > +static int > +xfs_buf_cmp( > + void *priv, > + struct list_head *a, > + struct list_head *b) > +{ > + struct xfs_buf *ap =3D container_of(a, struct xfs_buf, b_list); > + struct xfs_buf *bp =3D container_of(b, struct xfs_buf, b_list); > + xfs_daddr_t diff; > + > + diff =3D ap->b_bn - bp->b_bn; > + if (diff < 0) > + return -1; > + if (diff > 0) > + return 1; > + return 0; > +} > + > +void > +xfs_buf_delwri_sort( > + xfs_buftarg_t *target, > + struct list_head *list) > +{ > + list_sort(NULL, list, xfs_buf_cmp); > +} > + > STATIC int > xfsbufd( > void *data) > { > - struct list_head tmp; > - xfs_buftarg_t *target =3D (xfs_buftarg_t *)data; > - int count; > - xfs_buf_t *bp; > + xfs_buftarg_t *target =3D (xfs_buftarg_t *)data; > =20 > current->flags |=3D PF_MEMALLOC; > =20 > @@ -1893,6 +1922,8 @@ xfsbufd( > do { > long age =3D xfs_buf_age_centisecs * msecs_to_jiffies(10); > long tout =3D xfs_buf_timer_centisecs * msecs_to_jiffies(10); > + int count =3D 0; > + struct list_head tmp; > =20 > if (unlikely(freezing(current))) { > set_bit(XBT_FORCE_SLEEP, &target->bt_flags); > @@ -1907,11 +1938,10 @@ xfsbufd( > schedule_timeout_interruptible(tout); > =20 > xfs_buf_delwri_split(target, &tmp, age); > - count =3D 0; > + list_sort(NULL, &tmp, xfs_buf_cmp); > while (!list_empty(&tmp)) { > - bp =3D list_entry(tmp.next, xfs_buf_t, b_list); > - ASSERT(target =3D=3D bp->b_target); > - > + struct xfs_buf *bp; > + bp =3D list_first_entry(&tmp, struct xfs_buf, b_list); > list_del_init(&bp->b_list); > xfs_buf_iostrategy(bp); > count++; > @@ -1937,42 +1967,45 @@ xfs_flush_buftarg( > xfs_buftarg_t *target, > int wait) > { > - struct list_head tmp; > - xfs_buf_t *bp, *n; > + xfs_buf_t *bp; > int pincount =3D 0; > + LIST_HEAD(tmp_list); > + LIST_HEAD(wait_list); > =20 > xfs_buf_runall_queues(xfsconvertd_workqueue); > xfs_buf_runall_queues(xfsdatad_workqueue); > xfs_buf_runall_queues(xfslogd_workqueue); > =20 > set_bit(XBT_FORCE_FLUSH, &target->bt_flags); > - pincount =3D xfs_buf_delwri_split(target, &tmp, 0); > + pincount =3D xfs_buf_delwri_split(target, &tmp_list, 0); > =20 > /* > - * Dropped the delayed write list lock, now walk the temporary list > + * Dropped the delayed write list lock, now walk the temporary list. > + * All I/O is issued async and then if we need to wait for completion > + * we do that after issuing all the IO. > */ > - list_for_each_entry_safe(bp, n, &tmp, b_list) { > + list_sort(NULL, &tmp_list, xfs_buf_cmp); > + while (!list_empty(&tmp_list)) { > + bp =3D list_first_entry(&tmp_list, struct xfs_buf, b_list); > ASSERT(target =3D=3D bp->b_target); > - if (wait) > + list_del_init(&bp->b_list); > + if (wait) { > bp->b_flags &=3D ~XBF_ASYNC; > - else > - list_del_init(&bp->b_list); > - > + list_add(&bp->b_list, &wait_list); > + } > xfs_buf_iostrategy(bp); > } > =20 > - if (wait) > + if (wait) { > + /* Expedite and wait for IO to complete. */ > blk_run_address_space(target->bt_mapping); > + while (!list_empty(&wait_list)) { > + bp =3D list_first_entry(&wait_list, struct xfs_buf, b_list); > =20 > - /* > - * Remaining list items must be flushed before returning > - */ > - while (!list_empty(&tmp)) { > - bp =3D list_entry(tmp.next, xfs_buf_t, b_list); > - > - list_del_init(&bp->b_list); > - xfs_iowait(bp); > - xfs_buf_relse(bp); > + list_del_init(&bp->b_list); > + xfs_iowait(bp); > + xfs_buf_relse(bp); > + } > } > =20 > return pincount; From aelder@sgi.com Fri Feb 5 17:56:18 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o15NuHWf172455 for ; Fri, 5 Feb 2010 17:56:17 -0600 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 17D378F80C1; Fri, 5 Feb 2010 15:57:29 -0800 (PST) Received: from [128.162.232.188] ([128.162.232.188]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 5 Feb 2010 17:55:56 -0600 Subject: Re: [PATCH 05/10] xfs: Use delay write promotion for dquot flushing From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1265153104-29680-6-git-send-email-david@fromorbit.com> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-6-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Fri, 05 Feb 2010 17:55:55 -0600 Message-ID: <1265414155.2714.155.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Feb 2010 23:55:56.0077 (UTC) FILETIME=[C1E94DD0:01CAA6BE] 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-02-03 at 10:24 +1100, Dave Chinner wrote: > xfs_qm_dqflock_pushbuf_wait() does a very similar trick to item > pushing used to do to flush out delayed write dquot buffers. Change > it to use the new promotion method rather than an async flush. > > Also, xfs_qm_dqflock_pushbuf_wait() can return without the flush lock > held, yet the callers make the assumption that after this call the > flush lock is held. Always return with the flush lock held. Looks good. > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder > --- > fs/xfs/quota/xfs_dquot.c | 25 ++++++++++--------------- > 1 files changed, 10 insertions(+), 15 deletions(-) > > diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c > index f9baeed..1620a56 100644 > --- a/fs/xfs/quota/xfs_dquot.c > +++ b/fs/xfs/quota/xfs_dquot.c > @@ -1528,21 +1528,16 @@ xfs_qm_dqflock_pushbuf_wait( > */ > bp = xfs_incore(dqp->q_mount->m_ddev_targp, dqp->q_blkno, > XFS_QI_DQCHUNKLEN(dqp->q_mount), XBF_TRYLOCK); > - if (bp != NULL) { > - if (XFS_BUF_ISDELAYWRITE(bp)) { > - int error; > - > - if (XFS_BUF_ISPINNED(bp)) > - xfs_log_force(dqp->q_mount, 0); > - error = xfs_bawrite(dqp->q_mount, bp); > - if (error) > - xfs_fs_cmn_err(CE_WARN, dqp->q_mount, > - "xfs_qm_dqflock_pushbuf_wait: " > - "pushbuf error %d on dqp %p, bp %p", > - error, dqp, bp); > - } else { > - xfs_buf_relse(bp); > - } > + if (!bp) > + goto out_lock; > + > + if (XFS_BUF_ISDELAYWRITE(bp)) { > + if (XFS_BUF_ISPINNED(bp)) > + xfs_log_force(dqp->q_mount, 0); > + xfs_buf_delwri_promote(bp); > + wake_up_process(bp->b_target->bt_task); > } > + xfs_buf_relse(bp); > +out_lock: > xfs_dqflock(dqp); > } From SRS0+69A6+66+fromorbit.com=david@internode.on.net Fri Feb 5 18:06:47 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1606lrs173131 for ; Fri, 5 Feb 2010 18:06:47 -0600 X-ASG-Debug-ID: 1265414875-39f801490000-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 C55E41B4C37 for ; Fri, 5 Feb 2010 16:07:56 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id u2wMpEjSyPOE0suS for ; Fri, 05 Feb 2010 16:07:56 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12597344-1927428 for multiple; Sat, 06 Feb 2010 10:37:54 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NdYDI-0005MW-S2; Sat, 06 Feb 2010 11:07:52 +1100 Date: Sat, 6 Feb 2010 11:07:52 +1100 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 01/10] xfs: Make inode reclaim states explicit Subject: Re: [PATCH 01/10] xfs: Make inode reclaim states explicit Message-ID: <20100206000752.GF11483@discord.disaster> References: <1265153104-29680-1-git-send-email-david@fromorbit.com> <1265153104-29680-2-git-send-email-david@fromorbit.com> <1265396780.2714.23.camel@doink1> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1265396780.2714.23.camel@doink1> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265414877 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21762 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, Feb 05, 2010 at 01:06:20PM -0600, Alex Elder wrote: > On Wed, 2010-02-03 at 10:24 +1100, Dave Chinner wrote: > > A.K.A.: don't rely on xfs_iflush() return value in reclaim > > > > We have gradually been moving checks out of the reclaim code because > > they are duplicated in xfs_iflush(). We've had a history of problems > > in this area, and many of them stem from the overloading of the > > return values from xfs_iflush() and interaction with inode flush > > locking to determine if the inode is safe to reclaim. > > > > With the desire to move to delayed write flushing of inodes and > > non-blocking inode tree reclaim walks, the overloading of the > > return value of xfs_iflush makes it very difficult to determine > > the correct thing to do next. > > > > This patch explicitly re-adds the checks to the inode reclaim code, > > removing the reliance on the return value of xfs_iflush() to > > determine what to do next. It also means that we can clearly > > document all the inode states that reclaim must handle and hence > > we can easily see that we handled all the necessary cases. > > > > This also removes the need for the xfs_inode_clean() check in > > xfs_iflush() as all callers now check this first (safely). > > I have a few comments, below. One is a real bug. At this > point I'm trusting that your enumeration of all the possible > inode states is correct. Other than what I indicate below, > this change looks good. ... > It looks to me like your code adds a call to xfs_ifunlock(ip) > in the bad inode case that was not there before. My guess is > that your way is correct, but I'd like to know whether you > agree this differs. Is this intentional? Regardless, is > the new xfs_ifunlock() call correct? Yes, it is correct - the code before was broken. > > + if (xfs_iflags_test(ip, XFS_ISTALE)) > > + goto reclaim; > > + if (xfs_inode_clean(ip)) > > + goto reclaim; > > + > > + /* Now we have an inode that needs flushing */ > > + error = xfs_iflush(ip, sync_mode); > > + if (!error) { > > + switch(sync_mode) { > > + case XFS_IFLUSH_DELWRI_ELSE_ASYNC: > > + case XFS_IFLUSH_DELWRI: > > + case XFS_IFLUSH_ASYNC: > > + case XFS_IFLUSH_DELWRI_ELSE_SYNC: > > + case XFS_IFLUSH_SYNC: > > + /* IO issued, synchronise with IO completion */ > > + xfs_iflock(ip); > > You must not have run this with DEBUG enabled. > You need a "break;" here. I always run with DEBUG enabled, but I probably didn't test this patch by iteself in the last iteration because i don't have unlimited test cycles. This code gets removed by the next patch, so the fact that it was broken would not have been picked up by testing. I'll update it and re-push it to the for-2.6.34 branch. Cheers, -- Dave Chinner david@fromorbit.com From aelder@sgi.com Fri Feb 5 19:40:56 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o161euPR178328 for ; Fri, 5 Feb 2010 19:40:56 -0600 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 6AFDA8F80BE; Fri, 5 Feb 2010 17:42:03 -0800 (PST) Received: from [128.162.232.188] ([128.162.232.188]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 5 Feb 2010 19:41:15 -0600 Subject: Re: PATCH V2] more reserved blocks fixups From: Alex Elder Reply-To: aelder@sgi.com To: Eric Sandeen Cc: xfs mailing list In-Reply-To: <4B6CA2E9.7020803@sandeen.net> References: <4B60C8EE.5080700@sandeen.net> <4B6CA2E9.7020803@sandeen.net> Content-Type: text/plain; charset="UTF-8" Date: Fri, 05 Feb 2010 19:41:15 -0600 Message-ID: <1265420475.2714.162.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 06 Feb 2010 01:41:15.0914 (UTC) FILETIME=[78D3E6A0:01CAA6CD] 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-02-05 at 16:59 -0600, Eric Sandeen wrote: > This mangles the reserved blocks counts a little more. > > 1) add a helper function for the default reserved count > 2) add helper functions to save/restore counts on ro/rw > 3) save/restore reserved blocks on freeze/thaw > 4) disallow changing reserved count while readonly Looks good. Thanks for updating it. > Signed-off-by: Eric Sandeen Reviewed-by: Alex Elder > --- > > V2: changed field name to match Dave's changes > > diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c > index a034cf6..883929b 100644 > --- a/fs/xfs/linux-2.6/xfs_ioctl.c > +++ b/fs/xfs/linux-2.6/xfs_ioctl.c > @@ -1431,6 +1431,9 @@ xfs_file_ioctl( > if (!capable(CAP_SYS_ADMIN)) > return -EPERM; > > + if (mp->m_flags & XFS_MOUNT_RDONLY) > + return -XFS_ERROR(EROFS); > + > if (copy_from_user(&inout, arg, sizeof(inout))) > return -XFS_ERROR(EFAULT); > > diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c > index 8884f26..97c0f5a 100644 > --- a/fs/xfs/linux-2.6/xfs_super.c > +++ b/fs/xfs/linux-2.6/xfs_super.c > @@ -1257,6 +1257,29 @@ xfs_fs_statfs( > return 0; > } > > +STATIC void > +xfs_save_resvblks(struct xfs_mount *mp) > +{ > + __uint64_t resblks = 0; > + > + mp->m_resblks_save = mp->m_resblks; > + xfs_reserve_blocks(mp, &resblks, NULL); > +} > + > +STATIC void > +xfs_restore_resvblks(struct xfs_mount *mp) > +{ > + __uint64_t resblks; > + > + if (mp->m_resblks_save) { > + resblks = mp->m_resblks_save; > + mp->m_resblks_save = 0; > + } else > + resblks = xfs_default_resblks(mp); > + > + xfs_reserve_blocks(mp, &resblks, NULL); > +} > + > STATIC int > xfs_fs_remount( > struct super_block *sb, > @@ -1319,8 +1342,6 @@ xfs_fs_remount( > > /* ro -> rw */ > if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(*flags & MS_RDONLY)) { > - __uint64_t resblks; > - > mp->m_flags &= ~XFS_MOUNT_RDONLY; > if (mp->m_flags & XFS_MOUNT_BARRIER) > xfs_mountfs_check_barriers(mp); > @@ -1343,15 +1364,7 @@ xfs_fs_remount( > * Fill out the reserve pool if it is empty. Use the stashed > * value if it is non-zero, otherwise go with the default. > */ > - if (mp->m_resblks_save) { > - resblks = mp->m_resblks_save; > - mp->m_resblks_save = 0; > - } else { > - resblks = mp->m_sb.sb_dblocks; > - do_div(resblks, 20); > - resblks = min_t(__uint64_t, resblks, 1024); > - } > - xfs_reserve_blocks(mp, &resblks, NULL); > + xfs_restore_resvblks(mp); > } > > /* rw -> ro */ > @@ -1364,11 +1377,9 @@ xfs_fs_remount( > * so that if we get remounted rw, we can return it to the same > * size. > */ > - __uint64_t resblks = 0; > > xfs_quiesce_data(mp); > - mp->m_resblks_save = mp->m_resblks; > - xfs_reserve_blocks(mp, &resblks, NULL); > + xfs_save_resvblks(mp); > xfs_quiesce_attr(mp); > mp->m_flags |= XFS_MOUNT_RDONLY; > } > @@ -1387,11 +1398,22 @@ xfs_fs_freeze( > { > struct xfs_mount *mp = XFS_M(sb); > > + xfs_save_resvblks(mp); > xfs_quiesce_attr(mp); > return -xfs_fs_log_dummy(mp); > } > > STATIC int > +xfs_fs_unfreeze( > + struct super_block *sb) > +{ > + struct xfs_mount *mp = XFS_M(sb); > + > + xfs_restore_resvblks(mp); > + return 0; > +} > + > +STATIC int > xfs_fs_show_options( > struct seq_file *m, > struct vfsmount *mnt) > @@ -1613,6 +1635,7 @@ static const struct super_operations xfs_super_operations = { > .put_super = xfs_fs_put_super, > .sync_fs = xfs_fs_sync_fs, > .freeze_fs = xfs_fs_freeze, > + .unfreeze_fs = xfs_fs_unfreeze, > .statfs = xfs_fs_statfs, > .remount_fs = xfs_fs_remount, > .show_options = xfs_fs_show_options, > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index eb403b4..48e1ee7 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -1008,6 +1008,22 @@ xfs_mount_reset_sbqflags( > return xfs_trans_commit(tp, 0); > } > > +__uint64_t > +xfs_default_resblks(xfs_mount_t *mp) > +{ > + __uint64_t resblks; > + > + /* > + * We default to 5% or 1024 fsbs of space reserved, whichever is smaller. > + * This may drive us straight to ENOSPC on mount, but that implies > + * we were already there on the last unmount. Warn if this occurs. > + */ > + resblks = mp->m_sb.sb_dblocks; > + do_div(resblks, 20); > + resblks = min_t(__uint64_t, resblks, 1024); > + return resblks; > +} > + > /* > * This function does the following on an initial mount of a file system: > * - reads the superblock from disk and init the mount struct > @@ -1318,18 +1334,14 @@ xfs_mountfs( > * when at ENOSPC. This is needed for operations like create with > * attr, unwritten extent conversion at ENOSPC, etc. Data allocations > * are not allowed to use this reserved space. > - * > - * We default to 5% or 1024 fsbs of space reserved, whichever is smaller. > - * This may drive us straight to ENOSPC on mount, but that implies > - * we were already there on the last unmount. Warn if this occurs. > */ > - resblks = mp->m_sb.sb_dblocks; > - do_div(resblks, 20); > - resblks = min_t(__uint64_t, resblks, 1024); > - error = xfs_reserve_blocks(mp, &resblks, NULL); > - if (error) > - cmn_err(CE_WARN, "XFS: Unable to allocate reserve blocks. " > - "Continuing without a reserve pool."); > + if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { > + resblks = xfs_default_resblks(mp); > + error = xfs_reserve_blocks(mp, &resblks, NULL); > + if (error) > + cmn_err(CE_WARN, "XFS: Unable to allocate reserve " > + "blocks. Continuing without a reserve pool."); > + } > > return 0; > > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 996273d..c8f880d 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -429,6 +429,7 @@ typedef struct xfs_mod_sb { > } xfs_mod_sb_t; > > extern int xfs_log_sbcount(xfs_mount_t *, uint); > +extern __uint64_t xfs_default_resblks(xfs_mount_t *mp); > extern int xfs_mountfs(xfs_mount_t *mp); > > extern void xfs_unmountfs(xfs_mount_t *); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From julia@diku.dk Sat Feb 6 02:44:09 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o168i8tg204495 for ; Sat, 6 Feb 2010 02:44:09 -0600 X-ASG-Debug-ID: 1265445918-5440013f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mgw2.diku.dk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 351E41CA7BD5; Sat, 6 Feb 2010 00:45:18 -0800 (PST) Received: from mgw2.diku.dk (mgw2.diku.dk [130.225.96.92]) by cuda.sgi.com with ESMTP id 9JUXhSuG2GLuNFqk; Sat, 06 Feb 2010 00:45:18 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by mgw2.diku.dk (Postfix) with ESMTP id 74B3C19BBF8; Sat, 6 Feb 2010 09:45:16 +0100 (CET) Received: from mgw2.diku.dk ([127.0.0.1]) by localhost (mgw2.diku.dk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 06564-17; Sat, 6 Feb 2010 09:45:15 +0100 (CET) Received: from nhugin.diku.dk (nhugin.diku.dk [130.225.96.140]) by mgw2.diku.dk (Postfix) with ESMTP id 53FEF19BBA2; Sat, 6 Feb 2010 09:45:15 +0100 (CET) Received: from ask.diku.dk (ask.diku.dk [130.225.96.225]) by nhugin.diku.dk (Postfix) with ESMTP id 7F8916DF8B9; Sat, 6 Feb 2010 09:40:12 +0100 (CET) Received: by ask.diku.dk (Postfix, from userid 3767) id 3CE58200AA; Sat, 6 Feb 2010 09:45:15 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by ask.diku.dk (Postfix) with ESMTP id 326A0200A9; Sat, 6 Feb 2010 09:45:15 +0100 (CET) Date: Sat, 6 Feb 2010 09:45:15 +0100 (CET) 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/11] fs/xfs: Correct NULL test Subject: [PATCH 11/11] fs/xfs: Correct NULL test Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at diku.dk X-Barracuda-Connect: mgw2.diku.dk[130.225.96.92] X-Barracuda-Start-Time: 1265445919 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21793 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean From: Julia Lawall Test the value that was just allocated rather than the previously tested one. A simplified version of the semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // @r@ expression *x; expression e; identifier l; @@ if (x == NULL || ...) { ... when forall return ...; } ... when != goto l; when != x = e when != &x *x == NULL // Signed-off-by: Julia Lawall --- fs/xfs/quota/xfs_qm.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 11cfd82..4318cd5 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -123,7 +123,7 @@ xfs_Gqm_init(void) goto out; gdqhash = kmem_zalloc_large(hsize); - if (!udqhash) + if (!gdqhash) goto out_free_udqhash; hsize /= sizeof(xfs_dqhash_t); From t.landschoff@gmx.net Sat Feb 6 14:36:41 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o16KaeQ1243429 for ; Sat, 6 Feb 2010 14:36:41 -0600 X-ASG-Debug-ID: 1265488669-105f022a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.gmx.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id D54841383C07 for ; Sat, 6 Feb 2010 12:37:50 -0800 (PST) Received: from mail.gmx.net (mail.gmx.net [213.165.64.20]) by cuda.sgi.com with SMTP id 0wkvDxkFew9OBkpe for ; Sat, 06 Feb 2010 12:37:50 -0800 (PST) Received: (qmail invoked by alias); 06 Feb 2010 20:37:49 -0000 Received: from p5DDAAA53.dip.t-dialin.net (EHLO [192.168.2.115]) [93.218.170.83] by mail.gmx.net (mp012) with SMTP; 06 Feb 2010 21:37:49 +0100 X-Authenticated: #597135 X-Provags-ID: V01U2FsdGVkX1/cBz0YYLfcN45ST6MZJaXd4okGUPQAtMc01smLrd JW+ecaEdxcBmOf X-ASG-Orig-Subj: Abysmal performance with XFS on LVM on md (raid1) Subject: Abysmal performance with XFS on LVM on md (raid1) From: Torsten Landschoff To: xfs@oss.sgi.com Cc: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Date: Sat, 06 Feb 2010 21:37:43 +0100 Message-ID: <1265488663.2739.24.camel@sharokan.intern> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-Y-GMX-Trusted: 0 X-FuHaFi: 0.51000000000000001 X-Barracuda-Connect: mail.gmx.net[213.165.64.20] X-Barracuda-Start-Time: 1265488671 X-Barracuda-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.21839 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 List, A few days before I went to do a few test builds of wxWidgets on my home system which I recently upgraded. I was quite surprised when it performed much worse than my old notebook. Turns out that this is related to barriers support: $ time tar xzf wxwidgets2.8_2.8.10.1.orig.tar.gz real 1m10.899s user 0m2.996s sys 0m2.088s $ time rm -rf wxwidgets2.8-2.8.10.1.orig real 3m9.067s user 0m0.036s sys 0m1.352s $ sudo mount -o remount,nobarrier /dev/vgsys/home /home $ time tar xzf wxwidgets2.8_2.8.10.1.orig.tar.gz real 0m1.640s user 0m1.264s sys 0m1.200s $ time rm -rf wxwidgets2.8-2.8.10.1.orig real 0m2.783s user 0m0.024s sys 0m0.796s I knew that barriers could cause some slowdowns but this is above my worst estimations. Truth to be told, I did not notice that barriers are enabled in my setup now and found the commit that affected xfs performance the hard way (using git bisect). Here is the bisect log: git bisect start # bad: [b4bdd73ce865213a5653dc424873e8da37e858cc] Linux 2.6.32.7 git bisect bad b4bdd73ce865213a5653dc424873e8da37e858cc # good: [07a2039b8eb0af4ff464efd3dfd95de5c02648c6] Linux 2.6.30 git bisect good 07a2039b8eb0af4ff464efd3dfd95de5c02648c6 # bad: [19720737187aaee006afb20e63be5e9eddc505a8] sky2: hold RTNL when doing suspend/shutdown operations git bisect bad 19720737187aaee006afb20e63be5e9eddc505a8 # good: [49809d6a511960e5ccfb85b780894f45ac119065] V4L/DVB (11970): gspca - ov519: Add support for the ov518 bridge. git bisect good 49809d6a511960e5ccfb85b780894f45ac119065 # bad: [5a4f13fad1ab5bd08dea78fc55321e429d83cddf] Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide-2.6 git bisect bad 5a4f13fad1ab5bd08dea78fc55321e429d83cddf # good: [e6423407d01168f7760cdee7270d9f51d1240301] Merge branch 'for-2.6.31' of git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6 git bisect good e6423407d01168f7760cdee7270d9f51d1240301 # good: [a200ad22bb15fe01cf222fa631687876baad5e01] Blackfin: update anomaly lists git bisect good a200ad22bb15fe01cf222fa631687876baad5e01 # skip: [0c26d7cc31cd81a82be3b9d7687217d49fe9c47e] Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 git bisect skip 0c26d7cc31cd81a82be3b9d7687217d49fe9c47e # bad: [71f9dacd2e4d233029e9e956ca3f79531f411827] inet: Call skb_orphan before tproxy activates git bisect bad 71f9dacd2e4d233029e9e956ca3f79531f411827 # good: [01c031945f2755c7afaaf456088543312f2b72ea] cleanup __writeback_single_inode git bisect good 01c031945f2755c7afaaf456088543312f2b72ea # good: [b81c087f6deb049023e41ce00717202a953f3939] uwb: allow WLP to be used with IPv6. git bisect good b81c087f6deb049023e41ce00717202a953f3939 # good: [1962f39abbb2d5643a7d59169422661a2d58793d] ocfs2: Update atime in splice read if necessary. git bisect good 1962f39abbb2d5643a7d59169422661a2d58793d # good: [caf420c68afe01acd7c458ce40b85b3db5330ff5] ACPI: pci_root: use driver data rather than list lookup git bisect good caf420c68afe01acd7c458ce40b85b3db5330ff5 # skip: [ba52270d18fb17ce2cf176b35419dab1e43fe4a3] SLUB: Don't pass __GFP_FAIL for the initial allocation git bisect skip ba52270d18fb17ce2cf176b35419dab1e43fe4a3 # good: [871043bc463e7d191e7b5b00436a8852921dd833] hp-wmi: Add support for reporting tablet state git bisect good 871043bc463e7d191e7b5b00436a8852921dd833 # good: [d7880f10c5d42ba182a97c1fd41d41d0b8837097] thinkpad-acpi: forbid the use of HBRV on Lenovo ThinkPads git bisect good d7880f10c5d42ba182a97c1fd41d41d0b8837097 # good: [0c526d96a5bd86c70507b7d9372e6a26a1e3ea43] ACPI: clean up whitespace in drivers/acpi/scan.c git bisect good 0c526d96a5bd86c70507b7d9372e6a26a1e3ea43 # good: [281eede0328c84a8f20e0e85b807d5b51c3de4f2] switch reiserfs to inode->i_acl git bisect good 281eede0328c84a8f20e0e85b807d5b51c3de4f2 # skip: [9937ac0cc087b03d6d73f46a5d6b38c43626e60e] MAINTAINERS: Change mailing list info for CRIS git bisect skip 9937ac0cc087b03d6d73f46a5d6b38c43626e60e # good: [0b47b5703b1cc6c3aa89663ac70e28dadedf6ccc] w1: ds2760: add support for EEPROM read and write git bisect good 0b47b5703b1cc6c3aa89663ac70e28dadedf6ccc # good: [8d8890b7751387f58ce0a6428773de2fbc0fd596] netfilter: nf_conntrack: fix conntrack lookup race git bisect good 8d8890b7751387f58ce0a6428773de2fbc0fd596 # skip: [c82e6d450fda56cb2d4f68534173d3cd11b32f9f] Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus git bisect skip c82e6d450fda56cb2d4f68534173d3cd11b32f9f # bad: [1f2ccd00f224a4e2d6d26f590f3e6851f3deef99] ipv6: Use rcu_barrier() on module unload. git bisect bad 1f2ccd00f224a4e2d6d26f590f3e6851f3deef99 # bad: [a1faa69810b2af562b70b2a71c116c7d03575dd3] ipv6: avoid wraparound for expired preferred lifetime git bisect bad a1faa69810b2af562b70b2a71c116c7d03575dd3 # good: [8cbeb67ad50f7d68e5e83be2cb2284de8f9c03b5] dm: avoid unsupported spanning of md stripe boundaries git bisect good 8cbeb67ad50f7d68e5e83be2cb2284de8f9c03b5 # good: [b6280b47a7a42970d098a3059f4ebe7e55e90d8d] ipv4 routing: Ensure that route cache entries are usable and reclaimable with caching is off git bisect good b6280b47a7a42970d098a3059f4ebe7e55e90d8d # good: [c4658b4e777bebf69884f4884a9bfb2f84dd71d9] Intel-IOMMU, intr-remap: set the whole 128bits of irte when modify/free it git bisect good c4658b4e777bebf69884f4884a9bfb2f84dd71d9 # good: [48fe112744d1ff2e899a6491633ac58a3229aabf] ACPI: ac: use .notify method instead of installing handler directly git bisect good 48fe112744d1ff2e899a6491633ac58a3229aabf # skip: [0705495d9010048e293013d9d129cf723363a0a8] ACPI: pci_root: remove unused dev/fn information git bisect skip 0705495d9010048e293013d9d129cf723363a0a8 # bad: [60935eb21d3c5bac79618000f38f92c249d153c4] dm ioctl: support cookies for udev git bisect bad 60935eb21d3c5bac79618000f38f92c249d153c4 # bad: [374bf7e7f6cc38b0483351a2029a97910eadde1b] dm: stripe support flush git bisect bad 374bf7e7f6cc38b0483351a2029a97910eadde1b # good: [5aa2781d964e9835c441932110484bc454b5c207] dm: store only first barrier error git bisect good 5aa2781d964e9835c441932110484bc454b5c207 # good: [9015df24a8008d7bea2bd3df881783ebe0dcb9af] dm: initialise tio in alloc_tio git bisect good 9015df24a8008d7bea2bd3df881783ebe0dcb9af # bad: [433bcac5645508b71eab2710b6817c3ef937eba8] dm: linear support flush git bisect bad 433bcac5645508b71eab2710b6817c3ef937eba8 I am actually glad that barrier support is now working, but this performance drop is just more than I had expected. Especially, since a single barrier would suffice here - write out all the file content and ensure the meta data is only written after the first is completed. Any hints how to improve on this? Greetings and thanks in advance, Torsten From patrick@news-service.com Mon Feb 8 04:15:11 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o18AF9FZ123766 for ; Mon, 8 Feb 2010 04:15:10 -0600 X-ASG-Debug-ID: 1265624180-51c703050000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from pu01.news-service.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E39A21CADBD3 for ; Mon, 8 Feb 2010 02:16:20 -0800 (PST) Received: from pu01.news-service.com (ns1.news-service.com [195.114.240.3]) by cuda.sgi.com with ESMTP id YJpdCase28lZYDp5 for ; Mon, 08 Feb 2010 02:16:20 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by pu01.news-service.com (Postfix) with ESMTP id A8B3F13E25; Mon, 8 Feb 2010 11:16:19 +0100 (CET) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: Debian amavisd-new at pu01.news-service.com Received: from pu01.news-service.com ([127.0.0.1]) by localhost (pu01.nse [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Nhjuh7ZfPvdu; Mon, 8 Feb 2010 11:16:17 +0100 (CET) Received: from [172.25.0.47] (nse01.nse [172.25.0.47]) by pu01.news-service.com (Postfix) with ESMTP id 73EB513E23; Mon, 8 Feb 2010 11:16:17 +0100 (CET) Message-ID: <4B6FE47A.7070208@news-service.com> Date: Mon, 08 Feb 2010 11:16:26 +0100 From: Patrick Schreurs User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.7) Gecko/20100111 Thunderbird/3.0.1 MIME-Version: 1.0 To: Dave Chinner CC: Christoph Hellwig , Tommy van Leeuwen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Subject: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) References: <89c4f90c0910270341r7833f490g60810f2817eb0950@mail.gmail.com> <89c4f90c0910280519k759230c1r7b1586932ac792f7@mail.gmail.com> <20091030101601.GA11142@infradead.org> <4AF0422D.1070104@news-service.com> <20091114162126.GB17658@infradead.org> <4B0A8075.8080008@news-service.com> <20091211115932.GA20632@infradead.org> <4B3F9F88.9030307@news-service.com> <20100107110446.GA13802@discord.disaster> <4B45CFAC.4000607@news-service.com> <20100108113114.GA8654@discord.disaster> <4B504B03.7050604@news-service.com> <4B6706CE.1020207@news-service.com> In-Reply-To: <4B6706CE.1020207@news-service.com> Content-Type: multipart/mixed; boundary="------------020806050006070405000203" X-Barracuda-Connect: ns1.news-service.com[195.114.240.3] X-Barracuda-Start-Time: 1265624181 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21978 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean This is a multi-part message in MIME format. --------------020806050006070405000203 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit We had another crash on the same server last weekend. Looks the same to me. Thanks for looking into this. -Patrick On 1-2-2010 17:52, Patrick Schreurs wrote: > Hello Dave, > > I'm afraid we had another crash a few days ago. Have a look at the > screenshot. Can you make anything out of it? This server is running > 2.6.32.3 with your inode-reclaim patch applied and XFS_DEBUG still enabled. > > Thanks for looking into this. > > -Patrick > > On 15-1-2010 12:01, Patrick Schreurs wrote: >> Hi Dave, >> >> I think it's save to consider this issue fixed. We have currently 9 >> servers operational with these patches and they have been stable so far. >> For a 100% certainty we'll have to test/wait a little bit longer, but >> considering the frequency of crashes we saw earlier i think it's save to >> come to a conclusion. >> >> I hope these patches will be included in 2.6.33 and will be back ported >> to at least 2.6.32. >> >> Many thanks to Dave and to Christoph for fixing this apparently rare and >> seldom triggered condition. >> >> -Patrick >> >> Dave Chinner wrote: >>> Hi Patrick, >>> >>> I've attached two compendium patches that will hopefully fix >>> the inode reclaim problems you've been seeing - one is for 2.6.31, >>> the other is for 2.6.32. I've cc'd this to the XFS list ѕo that >>> anyone else who has been seeing crashes, assert failures and >>> general nastiness around inode reclaim can test them as well. >>> >>> These are not final patches - there's a few changes that Christoph >>> has picked up on during review - so there'll be another round of >>> patches before checkins and -stable backports can be requested. >>> >>> I'm hoping that these patches fix your problem, because with them >>> I can't make my machines fall over anymore.... >>> >>> Cheers, >>> >>> Dave. >>> >>> >>> ------------------------------------------------------------------------ >>> >>> _______________________________________________ >>> 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 > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs --------------020806050006070405000203-- From BATV+6409d81330fd2592ba7a+2360+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 8 04:28:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o18ASUAo124504 for ; Mon, 8 Feb 2010 04:28:32 -0600 X-ASG-Debug-ID: 1265624983-0fa700050000-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 53F431CADCAA for ; Mon, 8 Feb 2010 02:29:43 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ncwwOLB85m030Gzo for ; Mon, 08 Feb 2010 02:29:43 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NeQsA-0008I8-QJ; Mon, 08 Feb 2010 10:29:42 +0000 Date: Mon, 8 Feb 2010 05:29:42 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: make install in the brave new build system world Subject: Re: make install in the brave new build system world Message-ID: <20100208102942.GA25395@infradead.org> References: <20100205092229.GA32454@infradead.org> <20100205104414.GC11483@discord.disaster> <20100205112850.GB28701@infradead.org> <20100205114856.GE11483@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100205114856.GE11483@discord.disaster> 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: 1265624983 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, Feb 05, 2010 at 10:48:56PM +1100, Dave Chinner wrote: > Ah, there's a double depenency chain. > > The top level make file has: > > install: default > > Which causes "make install" to run the top level default target, > which runs the default target in all the target subdirs. > > Then, in each subdir, the makefile has: > > install: default > > Which when then install target is actually run, does another > dependency check because it's got a local dependency on the depend > target via the default target. > > Replace the previous patch with the one below and try again. > Now the "make install" will rebuild targets out of the local > dependencies rather than a separate run of the top level default > target (i.e. only traverse directories once). Thanks, this looks much better. We still don't implement the quite behaviour for most install targets, but that should be relatively simple to fix. Maybe we can even replace all those handcode install rules with generic one - I'll look into that once I get a bit time. So Reviewed-by: Christoph Hellwig for this patch for now. From ccoager@gmail.com Mon Feb 8 08:39:38 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated 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 o18EdcZO138762 for ; Mon, 8 Feb 2010 08:39:38 -0600 X-ASG-Debug-ID: 1265640050-0d7200ab0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from cdptpa-omtalb.mail.rr.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CC9611B92BA for ; Mon, 8 Feb 2010 06:40:50 -0800 (PST) Received: from cdptpa-omtalb.mail.rr.com (cdptpa-omtalb.mail.rr.com [75.180.132.121]) by cuda.sgi.com with ESMTP id purgZyHZ1iOKCD2g for ; Mon, 08 Feb 2010 06:40:50 -0800 (PST) X-Authority-Analysis: v=1.0 c=1 a=11pvPlEd5bsG_rgWPRIA:9 a=nlBqkPCv-f2NXtOSUh9Wdb2vAcEA:4 X-Cloudmark-Score: 0 X-Originating-IP: 72.224.58.127 Received: from [72.224.58.127] ([72.224.58.127:52906] helo=erebus.underworld.local) by cdptpa-oedge01.mail.rr.com (envelope-from ) (ecelerity 2.2.2.39 r()) with ESMTP id 6D/F4-28731-272207B4; Mon, 08 Feb 2010 14:40:50 +0000 Received: from localhost (localhost [127.0.0.1]) by erebus.underworld.local (Postfix) with ESMTP id 522AD1FD58 for ; Mon, 8 Feb 2010 09:40:48 -0500 (EST) Received: from erebus.underworld.local ([127.0.0.1]) by localhost (erebus.underworld.local [127.0.0.1]) (amavisd-maia, port 10024) with ESMTP id 12634-04 for ; Mon, 8 Feb 2010 09:40:38 -0500 (EST) Received: from erebus.underworld.local (erebus.underworld.local [192.168.0.4]) by erebus.underworld.local (Postfix) with ESMTPS id B161D1FD43 for ; Mon, 8 Feb 2010 09:40:37 -0500 (EST) Date: Mon, 8 Feb 2010 09:40:35 -0500 From: Cory Coager To: xfs@oss.sgi.com X-ASG-Orig-Subj: format and xfs_info don't match Subject: format and xfs_info don't match Message-ID: <20100208144035.GA12922@erebus.underworld.local> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Organization: Fachschaft Informatik X-OS: Linux erebus 2.6.28-hardened-r9 x86_64 User-Agent: Mutt/1.5.20 (2009-06-14) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: Maia Mailguard 1.0.2a X-Barracuda-Connect: cdptpa-omtalb.mail.rr.com[75.180.132.121] X-Barracuda-Start-Time: 1265640050 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.21994 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean For some reason the format attributes don't match the mounted attributes. If you look below, lazy-count and attr aren't getting set. Why is this happening? # mkfs.xfs -f -i size=1024,attr=2 -l version=2,size=128m,lazy-count=1 /dev/mapper/360a9800050334c59543455596d625a77 meta-data=/dev/mapper/360a9800050334c59543455596d625a77 isize=1024 agcount=32, agsize=8388744 blks = sectsz=512 attr=2 data = bsize=4096 blocks=268439808, imaxpct=25 = sunit=0 swidth=0 blks, unwritten=1 naming =version 2 bsize=4096 log =internal log bsize=4096 blocks=32768, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # mount -t xfs -o noatime,nodiratime,nobarrier /dev/mapper/360a9800050334c59543455596d625a77 /mnt/new-homes/ # xfs_info /mnt/new-homes/ meta-data=/dev/mapper/360a9800050334c59543455596d625a77 isize=1024 agcount=32, agsize=8388744 blks = sectsz=512 attr=0 data = bsize=4096 blocks=268439808, imaxpct=25 = sunit=0 swidth=0 blks, unwritten=1 naming =version 2 bsize=4096 log =internal bsize=4096 blocks=32768, version=2 = sectsz=512 sunit=0 blks, lazy-count=0 realtime =none extsz=4096 blocks=0, rtextents=0 From eparis@parisplace.org Mon Feb 8 12:00:36 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o18I0ZEn150687 for ; Mon, 8 Feb 2010 12:00:35 -0600 X-ASG-Debug-ID: 1265652107-1b9202330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-vw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 46E3C1CB1484 for ; Mon, 8 Feb 2010 10:01:47 -0800 (PST) Received: from mail-vw0-f53.google.com (mail-vw0-f53.google.com [209.85.212.53]) by cuda.sgi.com with ESMTP id LfUuInnnulTtWEvc for ; Mon, 08 Feb 2010 10:01:47 -0800 (PST) Received: by vws10 with SMTP id 10so1569798vws.26 for ; Mon, 08 Feb 2010 10:01:47 -0800 (PST) MIME-Version: 1.0 Received: by 10.220.122.24 with SMTP id j24mr11053629vcr.88.1265652106462; Mon, 08 Feb 2010 10:01:46 -0800 (PST) In-Reply-To: <20100125042925.GM25842@discord.disaster> References: <20100125150456.c796f0b0.sfr@canb.auug.org.au> <20100125042925.GM25842@discord.disaster> Date: Mon, 8 Feb 2010 13:01:46 -0500 Message-ID: <7e0fb38c1002081001y111bd0a2p40a8a896b0668d13@mail.gmail.com> X-ASG-Orig-Subj: Re: linux-next: vfs/fsnotify trees build warning Subject: Re: linux-next: vfs/fsnotify trees build warning From: Eric Paris To: Dave Chinner Cc: Stephen Rothwell , Eric Paris , Al Viro , linux-next@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-vw0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1265652108 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22008 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, Jan 24, 2010 at 11:29 PM, Dave Chinner wrote: > On Mon, Jan 25, 2010 at 03:04:56PM +1100, Stephen Rothwell wrote: >> Hi Eric, Al, >> >> Today's linux-next build (x86_64 allmodconfig) produced these warnings: I just switched fsnotify to use const unsigned char * so hopefully they will shut up tomorrow.... -Eric From sandeen@sandeen.net Mon Feb 8 13:17:22 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated 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 o18JHLlp154663 for ; Mon, 8 Feb 2010 13:17:21 -0600 X-ASG-Debug-ID: 1265656713-374502900000-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 08EAF138886F for ; Mon, 8 Feb 2010 11:18:33 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id H0MyYQpQGDHOJQKB for ; Mon, 08 Feb 2010 11:18:33 -0800 (PST) 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 D051812AEC1E; Mon, 8 Feb 2010 13:18:32 -0600 (CST) Message-ID: <4B706388.7080309@sandeen.net> Date: Mon, 08 Feb 2010 13:18:32 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Cory Coager CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: format and xfs_info don't match Subject: Re: format and xfs_info don't match References: <20100208144035.GA12922@erebus.underworld.local> In-Reply-To: <20100208144035.GA12922@erebus.underworld.local> 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: 1265656714 X-Barracuda-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.22013 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 Cory Coager wrote: > For some reason the format attributes don't match the mounted > attributes. If you look below, lazy-count and attr aren't getting set. > Why is this happening? which xfsprogs version? # /sbin/mkfs.xfs -f -i size=1024,attr=2 -l version=2,size=128m,lazy-count=1 -bsize=4096 -dsize=268439808b,file,name=testfile meta-data=testfile isize=1024 agcount=4, agsize=67109952 blks = sectsz=512 attr=2 data = bsize=4096 blocks=268439808, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=32768, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # mount -o loop testfile mnt/ # xfs_info mnt/ meta-data=/dev/loop0 isize=1024 agcount=4, agsize=67109952 blks = sectsz=512 attr=2 data = bsize=4096 blocks=268439808, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=32768, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # mkfs.xfs -V mkfs.xfs version 3.0.1 -Eric > # mkfs.xfs -f -i size=1024,attr=2 -l version=2,size=128m,lazy-count=1 /dev/mapper/360a9800050334c59543455596d625a77 > meta-data=/dev/mapper/360a9800050334c59543455596d625a77 isize=1024 > agcount=32, agsize=8388744 blks > = sectsz=512 attr=2 > data = bsize=4096 blocks=268439808, imaxpct=25 > = sunit=0 swidth=0 blks, unwritten=1 > naming =version 2 bsize=4096 > log =internal log bsize=4096 blocks=32768, version=2 > = sectsz=512 sunit=0 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > > # mount -t xfs -o noatime,nodiratime,nobarrier > /dev/mapper/360a9800050334c59543455596d625a77 /mnt/new-homes/ > > # xfs_info /mnt/new-homes/ > meta-data=/dev/mapper/360a9800050334c59543455596d625a77 isize=1024 > agcount=32, agsize=8388744 blks > = sectsz=512 attr=0 > data = bsize=4096 blocks=268439808, imaxpct=25 > = sunit=0 swidth=0 blks, unwritten=1 > naming =version 2 bsize=4096 > log =internal bsize=4096 blocks=32768, version=2 > = sectsz=512 sunit=0 blks, lazy-count=0 > realtime =none extsz=4096 blocks=0, rtextents=0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From BATV+6409d81330fd2592ba7a+2360+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 8 13:36:03 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o18Ja1FJ155626 for ; Mon, 8 Feb 2010 13:36:02 -0600 X-ASG-Debug-ID: 1265657834-1c1000460000-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 9412E1CB1932 for ; Mon, 8 Feb 2010 11:37:14 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id KR08t0C6XKyARgeN for ; Mon, 08 Feb 2010 11:37:14 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NeZPm-0002n2-EN; Mon, 08 Feb 2010 19:36:58 +0000 Date: Mon, 8 Feb 2010 14:36:58 -0500 From: Christoph Hellwig To: Eric Paris Cc: Dave Chinner , Stephen Rothwell , linux-kernel@vger.kernel.org, Eric Paris , xfs@oss.sgi.com, linux-next@vger.kernel.org, Al Viro X-ASG-Orig-Subj: Re: linux-next: vfs/fsnotify trees build warning Subject: Re: linux-next: vfs/fsnotify trees build warning Message-ID: <20100208193658.GA9527@infradead.org> References: <20100125150456.c796f0b0.sfr@canb.auug.org.au> <20100125042925.GM25842@discord.disaster> <7e0fb38c1002081001y111bd0a2p40a8a896b0668d13@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <7e0fb38c1002081001y111bd0a2p40a8a896b0668d13@mail.gmail.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: 1265657834 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, Feb 08, 2010 at 01:01:46PM -0500, Eric Paris wrote: > On Sun, Jan 24, 2010 at 11:29 PM, Dave Chinner wrote: > > On Mon, Jan 25, 2010 at 03:04:56PM +1100, Stephen Rothwell wrote: > >> Hi Eric, Al, > >> > >> Today's linux-next build (x86_64 allmodconfig) produced these warnings: > > I just switched fsnotify to use const unsigned char * so hopefully > they will shut up tomorrow.... The xfs tree is also about to get a patch to turn off -Wpointer-sign again. If it was up to me we should turn it on for the whole build, we'll just need good way to deal with static initializers and strlen, but some simple wrappers might do it for those. From BATV+6409d81330fd2592ba7a+2360+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 8 13:36:16 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o18JaG59155680 for ; Mon, 8 Feb 2010 13:36:16 -0600 X-ASG-Debug-ID: 1265657848-0a20005e0000-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 7149F1BA617; Mon, 8 Feb 2010 11:37:28 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id MoML3tJiCyUiLoFT; Mon, 08 Feb 2010 11:37:28 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NeZQE-0002tA-Hx; Mon, 08 Feb 2010 19:37:26 +0000 Date: Mon, 8 Feb 2010 14:37:26 -0500 From: Christoph Hellwig To: Julia Lawall Cc: 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: Re: [PATCH 11/11] fs/xfs: Correct NULL test Subject: Re: [PATCH 11/11] fs/xfs: Correct NULL test Message-ID: <20100208193726.GB9527@infradead.org> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.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: 1265657849 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, Feb 06, 2010 at 09:45:15AM +0100, Julia Lawall wrote: > diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c > index 11cfd82..4318cd5 100644 > --- a/fs/xfs/quota/xfs_qm.c > +++ b/fs/xfs/quota/xfs_qm.c > @@ -123,7 +123,7 @@ xfs_Gqm_init(void) > goto out; > > gdqhash = kmem_zalloc_large(hsize); > - if (!udqhash) > + if (!gdqhash) > goto out_free_udqhash; Thanks, this looks correct, Reviewed-by: Christoph Hellwig From BATV+6409d81330fd2592ba7a+2360+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 8 13:39:47 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_75 autolearn=no version=3.3.0-rupdated 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 o18Jdkp0155840 for ; Mon, 8 Feb 2010 13:39:47 -0600 X-ASG-Debug-ID: 1265658059-0d4700550000-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 76A271BA84B for ; Mon, 8 Feb 2010 11:40:59 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id H0t8Q6mX9vj2YEDc for ; Mon, 08 Feb 2010 11:40:59 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NeZTf-0003hs-0L; Mon, 08 Feb 2010 19:40:59 +0000 Date: Mon, 8 Feb 2010 14:40:58 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss , Theodore Tso X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix up fs_perms test used by 126 Subject: Re: [PATCH] xfstests: fix up fs_perms test used by 126 Message-ID: <20100208194058.GC9527@infradead.org> References: <4B6C4E81.6060201@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B6C4E81.6060201@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: 1265658059 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, Feb 05, 2010 at 10:59:45AM -0600, Eric Sandeen wrote: > @@ -53,7 +53,8 @@ int main( int argc, char *argv[]) { > cgroupId = atoi(argv[3]); > userId = atoi(argv[4]); > groupId = atoi(argv[5]); > - fperm[0] = *argv[6]; > + strncpy(fperm, argv[6], 3); > + fperm[2] = '\0'; This still looks rather weird to me. What's the reason for copying the string into a fixed length buffer? Why not leave fperm as a pointer to the original argument? The rest of the patch looks fine, but a clean up pass on the whole file wouldn't hurt either, it's a grotty mess.. From BATV+6409d81330fd2592ba7a+2360+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 8 13:41:15 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o18JfF31155939 for ; Mon, 8 Feb 2010 13:41:15 -0600 X-ASG-Debug-ID: 1265658147-630800a00000-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 E9E9D1388AA2 for ; Mon, 8 Feb 2010 11:42:27 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Uu0wuNsPLFp9FWca for ; Mon, 08 Feb 2010 11:42:27 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NeZV4-0003tb-1U; Mon, 08 Feb 2010 19:42:26 +0000 Date: Mon, 8 Feb 2010 14:42:26 -0500 From: Christoph Hellwig To: Patrick Schreurs Cc: Dave Chinner , Christoph Hellwig , Tommy van Leeuwen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Subject: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Message-ID: <20100208194226.GD9527@infradead.org> References: <4AF0422D.1070104@news-service.com> <20091114162126.GB17658@infradead.org> <4B0A8075.8080008@news-service.com> <20091211115932.GA20632@infradead.org> <4B3F9F88.9030307@news-service.com> <20100107110446.GA13802@discord.disaster> <4B45CFAC.4000607@news-service.com> <20100108113114.GA8654@discord.disaster> <4B504B03.7050604@news-service.com> <4B6706CE.1020207@news-service.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B6706CE.1020207@news-service.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: 1265658147 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, Feb 01, 2010 at 05:52:30PM +0100, Patrick Schreurs wrote: > Hello Dave, > > I'm afraid we had another crash a few days ago. Have a look at the > screenshot. Can you make anything out of it? This server is running > 2.6.32.3 with your inode-reclaim patch applied and XFS_DEBUG still > enabled. Just wondering, which set of patches is this exactly? From sandeen@sandeen.net Mon Feb 8 13:46:05 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_75 autolearn=no version=3.3.0-rupdated 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 o18Jk4XN156158 for ; Mon, 8 Feb 2010 13:46:04 -0600 X-ASG-Debug-ID: 1265658436-1c0e00c00000-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 513CF1CB1F60 for ; Mon, 8 Feb 2010 11:47:17 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id GuW9fyaRImZsJRMb for ; Mon, 08 Feb 2010 11:47:17 -0800 (PST) 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 BF6DE12AEBE1; Mon, 8 Feb 2010 13:47:16 -0600 (CST) Message-ID: <4B706A44.4000804@sandeen.net> Date: Mon, 08 Feb 2010 13:47:16 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss , Theodore Tso X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix up fs_perms test used by 126 Subject: Re: [PATCH] xfstests: fix up fs_perms test used by 126 References: <4B6C4E81.6060201@sandeen.net> <20100208194058.GC9527@infradead.org> In-Reply-To: <20100208194058.GC9527@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: 1265658437 X-Barracuda-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.22014 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: > On Fri, Feb 05, 2010 at 10:59:45AM -0600, Eric Sandeen wrote: >> @@ -53,7 +53,8 @@ int main( int argc, char *argv[]) { >> cgroupId = atoi(argv[3]); >> userId = atoi(argv[4]); >> groupId = atoi(argv[5]); >> - fperm[0] = *argv[6]; >> + strncpy(fperm, argv[6], 3); >> + fperm[2] = '\0'; > > This still looks rather weird to me. What's the reason for copying > the string into a fixed length buffer? Why not leave fperm as a pointer > to the original argument? eh that's probably better, I guess I was just thinking copy based on how it was before. (which copied the char, right, it didn't assign a pointer, unless I'm short on coffee today...) OTOH fopen only takes 2 chars anyway. But probably no reason to truncate what was given, just fail if it's something that's wrong... -Eric > The rest of the patch looks fine, but a clean up pass on the whole > file wouldn't hurt either, it's a grotty mess.. > From aelder@oss.sgi.com Mon Feb 8 14:43:09 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_72 autolearn=no version=3.3.0-rupdated 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 o18Kh9fH159780 for ; Mon, 8 Feb 2010 14:43:09 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o18Kh9Wd159746; Mon, 8 Feb 2010 14:43:09 -0600 Date: Mon, 8 Feb 2010 14:43:09 -0600 Message-Id: <201002082043.o18Kh9Wd159746@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-rc4-46-g388f1f0 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 9b00f30762fe9f914eb6e03057a616ed63a4e8ca X-Git-Newrev: 388f1f0c346b533b06d8bc792f7204ebc3e4b7da 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 388f1f0 xfs: turn off sign warnings cbe132a xfs: don't hold onto reserved blocks on remount,ro from 9b00f30762fe9f914eb6e03057a616ed63a4e8ca (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 388f1f0c346b533b06d8bc792f7204ebc3e4b7da Author: Dave Chinner Date: Tue Jan 26 15:10:15 2010 +1100 xfs: turn off sign warnings Because they cause warnings in static inline functions conditionally compiled into XFS from the VFS (e.g. fsnotify). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit cbe132a8bdcff0f9afd9060948fb50597c7400b8 Author: Dave Chinner Date: Tue Jan 26 15:08:49 2010 +1100 xfs: don't hold onto reserved blocks on remount,ro If we hold onto reserved blocks when doing a remount,ro we end up writing the blocks used count to disk that includes the reserved blocks. Reserved blocks are not actually used, so this results in the values in the superblock being incorrect. Hence if we run xfs_check or xfs_repair -n while the filesystem is mounted remount,ro we end up with an inconsistent filesystem being reported. Also, running xfs_copy on the remount,ro filesystem will result in an inconsistent image being generated. To fix this, unreserve the blocks when doing the remount,ro, and reserved them again on remount,rw. This way a remount,ro filesystem will appear consistent on disk to all utilities. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig ----------------------------------------------------------------------- Summary of changes: fs/xfs/Makefile | 2 +- fs/xfs/linux-2.6/xfs_super.c | 28 ++++++++++++++++++++++++++++ fs/xfs/xfs_mount.h | 1 + 3 files changed, 30 insertions(+), 1 deletions(-) hooks/post-receive -- XFS development tree From stevecs@chaven.com Mon Feb 8 17:44:12 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=AWL,BAYES_20,FH_DATE_PAST_20XX, HTML_MESSAGE,J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated 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 o18NiBcf170140 for ; Mon, 8 Feb 2010 17:44:12 -0600 X-ASG-Debug-ID: 1265672723-211101e00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from omr10.networksolutionsemail.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 40F481BB5D0 for ; Mon, 8 Feb 2010 15:45:23 -0800 (PST) Received: from omr10.networksolutionsemail.com (omr10.networksolutionsemail.com [205.178.146.60]) by cuda.sgi.com with ESMTP id IqtmNexhuo6u5D9e for ; Mon, 08 Feb 2010 15:45:23 -0800 (PST) Received: from mail.networksolutionsemail.com (mail.networksolutionsemail.com [205.178.146.50]) by omr10.networksolutionsemail.com (8.13.6/8.13.6) with SMTP id o18NjNIU017440 for ; Mon, 8 Feb 2010 18:45:23 -0500 Received: (qmail 9029 invoked by uid 78); 8 Feb 2010 23:45:23 -0000 Received: from unknown (HELO ?127.0.0.1?) (stevecs@chaven.com@75.26.225.171) by ns-omr3.lb.hosting.dc2.netsol.com with SMTP; 8 Feb 2010 23:45:23 -0000 Message-ID: <4B70A213.1020002@chaven.com> Date: Mon, 08 Feb 2010 17:45:23 -0600 From: Steve Costaras User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.7) Gecko/20100111 Thunderbird/3.0.1 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: format and xfs_info don't match Subject: Re: format and xfs_info don't match References: <20100208144035.GA12922@erebus.underworld.local> In-Reply-To: <20100208144035.GA12922@erebus.underworld.local> Content-Type: multipart/alternative; boundary="------------080700030001050308060402" X-Barracuda-Connect: omr10.networksolutionsemail.com[205.178.146.60] X-Barracuda-Start-Time: 1265672724 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.22030 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. --------------080700030001050308060402 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit I've seen this as well under ubuntu 8.04.3LTS (xfsprogs for that distro is 2.9.4). I grabbed 3.1.0 and use that now which agree. Steve On 02/08/2010 08:40, Cory Coager wrote: > For some reason the format attributes don't match the mounted > attributes. If you look below, lazy-count and attr aren't getting set. > Why is this happening? > > # mkfs.xfs -f -i size=1024,attr=2 -l version=2,size=128m,lazy-count=1 /dev/mapper/360a9800050334c59543455596d625a77 > meta-data=/dev/mapper/360a9800050334c59543455596d625a77 isize=1024 > agcount=32, agsize=8388744 blks > = sectsz=512 attr=2 > data = bsize=4096 blocks=268439808, imaxpct=25 > = sunit=0 swidth=0 blks, unwritten=1 > naming =version 2 bsize=4096 > log =internal log bsize=4096 blocks=32768, version=2 > = sectsz=512 sunit=0 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > > # mount -t xfs -o noatime,nodiratime,nobarrier > /dev/mapper/360a9800050334c59543455596d625a77 /mnt/new-homes/ > > # xfs_info /mnt/new-homes/ > meta-data=/dev/mapper/360a9800050334c59543455596d625a77 isize=1024 > agcount=32, agsize=8388744 blks > = sectsz=512 attr=0 > data = bsize=4096 blocks=268439808, imaxpct=25 > = sunit=0 swidth=0 blks, unwritten=1 > naming =version 2 bsize=4096 > log =internal bsize=4096 blocks=32768, version=2 > = sectsz=512 sunit=0 blks, lazy-count=0 > realtime =none extsz=4096 blocks=0, rtextents=0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > > > --------------080700030001050308060402 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit
I've seen this as well under ubuntu 8.04.3LTS (xfsprogs for that distro is 2.9.4).   I grabbed 3.1.0 and use that now which agree.

Steve


On 02/08/2010 08:40, Cory Coager wrote:
For some reason the format attributes don't match the mounted 
attributes.  If you look below, lazy-count and attr aren't getting set.  
Why is this happening?

# mkfs.xfs -f -i size=1024,attr=2 -l version=2,size=128m,lazy-count=1 /dev/mapper/360a9800050334c59543455596d625a77
meta-data=/dev/mapper/360a9800050334c59543455596d625a77 isize=1024   
agcount=32, agsize=8388744 blks
        =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=268439808, imaxpct=25
        =                       sunit=0      swidth=0 blks, unwritten=1
naming   =version 2              bsize=4096  
log      =internal log           bsize=4096   blocks=32768, version=2
        =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

# mount -t xfs -o noatime,nodiratime,nobarrier 
/dev/mapper/360a9800050334c59543455596d625a77 /mnt/new-homes/

# xfs_info /mnt/new-homes/
meta-data=/dev/mapper/360a9800050334c59543455596d625a77 isize=1024   
agcount=32, agsize=8388744 blks
        =                       sectsz=512   attr=0
data     =                       bsize=4096   blocks=268439808, imaxpct=25
        =                       sunit=0      swidth=0 blks, unwritten=1
naming   =version 2              bsize=4096  
log      =internal               bsize=4096   blocks=32768, version=2
        =                       sectsz=512   sunit=0 blks, lazy-count=0
realtime =none                   extsz=4096   blocks=0, rtextents=0

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs


  
--------------080700030001050308060402-- From aelder@oss.sgi.com Mon Feb 8 18:56:35 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o190uZxf174108 for ; Mon, 8 Feb 2010 18:56:35 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o190uXHC174076; Mon, 8 Feb 2010 18:56:33 -0600 Date: Mon, 8 Feb 2010 18:56:33 -0600 Message-Id: <201002090056.o190uXHC174076@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-rc4-47-gd5db0f9 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 388f1f0c346b533b06d8bc792f7204ebc3e4b7da X-Git-Newrev: d5db0f97fbbeff11c88dec1aaf1536a975afbaeb 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 d5db0f9 xfs: more reserved blocks fixups from 388f1f0c346b533b06d8bc792f7204ebc3e4b7da (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 d5db0f97fbbeff11c88dec1aaf1536a975afbaeb Author: Eric Sandeen Date: Fri Feb 5 22:59:53 2010 +0000 xfs: more reserved blocks fixups This mangles the reserved blocks counts a little more. 1) add a helper function for the default reserved count 2) add helper functions to save/restore counts on ro/rw 3) save/restore reserved blocks on freeze/thaw 4) disallow changing reserved count while readonly V2: changed field name to match Dave's changes Signed-off-by: Eric Sandeen Signed-off-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_ioctl.c | 3 ++ fs/xfs/linux-2.6/xfs_super.c | 51 ++++++++++++++++++++++++++++++----------- fs/xfs/xfs_mount.c | 34 +++++++++++++++++++--------- fs/xfs/xfs_mount.h | 1 + 4 files changed, 64 insertions(+), 25 deletions(-) hooks/post-receive -- XFS development tree From SRS0+WGMz+69+fromorbit.com=dave@internode.on.net Mon Feb 8 21:55:38 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o193tbBr182487 for ; Mon, 8 Feb 2010 21:55:38 -0600 X-ASG-Debug-ID: 1265687808-287d003e0000-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 9BC031BBE08 for ; Mon, 8 Feb 2010 19:56:48 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id VG0UqxVfbKfaousX for ; Mon, 08 Feb 2010 19:56:48 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13236044-1927428 for ; Tue, 09 Feb 2010 14:26:47 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NehDS-0000O6-7P for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:46 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NehDR-0002SQ-H5 for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:45 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 5/9] xfs: Use delay write promotion for dquot flushing Subject: [PATCH 5/9] xfs: Use delay write promotion for dquot flushing Date: Tue, 9 Feb 2010 14:56:38 +1100 Message-Id: <1265687802-23043-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265687802-23043-1-git-send-email-david@fromorbit.com> References: <1265687802-23043-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1265687810 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22048 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 xfs_qm_dqflock_pushbuf_wait() does a very similar trick to item pushing used to do to flush out delayed write dquot buffers. Change it to use the new promotion method rather than an async flush. Also, xfs_qm_dqflock_pushbuf_wait() can return without the flush lock held, yet the callers make the assumption that after this call the flush lock is held. Always return with the flush lock held. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/quota/xfs_dquot.c | 25 ++++++++++--------------- 1 files changed, 10 insertions(+), 15 deletions(-) diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index f9baeed..1620a56 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -1528,21 +1528,16 @@ xfs_qm_dqflock_pushbuf_wait( */ bp = xfs_incore(dqp->q_mount->m_ddev_targp, dqp->q_blkno, XFS_QI_DQCHUNKLEN(dqp->q_mount), XBF_TRYLOCK); - if (bp != NULL) { - if (XFS_BUF_ISDELAYWRITE(bp)) { - int error; - - if (XFS_BUF_ISPINNED(bp)) - xfs_log_force(dqp->q_mount, 0); - error = xfs_bawrite(dqp->q_mount, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, dqp->q_mount, - "xfs_qm_dqflock_pushbuf_wait: " - "pushbuf error %d on dqp %p, bp %p", - error, dqp, bp); - } else { - xfs_buf_relse(bp); - } + if (!bp) + goto out_lock; + + if (XFS_BUF_ISDELAYWRITE(bp)) { + if (XFS_BUF_ISPINNED(bp)) + xfs_log_force(dqp->q_mount, 0); + xfs_buf_delwri_promote(bp); + wake_up_process(bp->b_target->bt_task); } + xfs_buf_relse(bp); +out_lock: xfs_dqflock(dqp); } -- 1.6.5 From SRS0+8Wp3+69+fromorbit.com=dave@internode.on.net Mon Feb 8 21:55:38 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o193tbMJ182485 for ; Mon, 8 Feb 2010 21:55:37 -0600 X-ASG-Debug-ID: 1265687808-14ef03060000-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 6248A1CB5F52 for ; Mon, 8 Feb 2010 19:56:48 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id Td93y6E8GVye24vs for ; Mon, 08 Feb 2010 19:56:48 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12912035-1927428 for ; Tue, 09 Feb 2010 14:26:47 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NehDS-0000O0-0t for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:46 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NehDR-0002SC-9K for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:45 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/9] xfs: Make inode reclaim states explicit Subject: [PATCH 1/9] xfs: Make inode reclaim states explicit Date: Tue, 9 Feb 2010 14:56:34 +1100 Message-Id: <1265687802-23043-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265687802-23043-1-git-send-email-david@fromorbit.com> References: <1265687802-23043-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265687810 X-Barracuda-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.22048 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 A.K.A.: don't rely on xfs_iflush() return value in reclaim We have gradually been moving checks out of the reclaim code because they are duplicated in xfs_iflush(). We've had a history of problems in this area, and many of them stem from the overloading of the return values from xfs_iflush() and interaction with inode flush locking to determine if the inode is safe to reclaim. With the desire to move to delayed write flushing of inodes and non-blocking inode tree reclaim walks, the overloading of the return value of xfs_iflush makes it very difficult to determine the correct thing to do next. This patch explicitly re-adds the checks to the inode reclaim code, removing the reliance on the return value of xfs_iflush() to determine what to do next. It also means that we can clearly document all the inode states that reclaim must handle and hence we can easily see that we handled all the necessary cases. This also removes the need for the xfs_inode_clean() check in xfs_iflush() as all callers now check this first (safely). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_sync.c | 81 +++++++++++++++++++++++++++++++++---------- fs/xfs/xfs_inode.c | 11 +----- fs/xfs/xfs_inode.h | 1 + 3 files changed, 64 insertions(+), 29 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index c9b863e..525260c 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -706,12 +706,43 @@ __xfs_inode_clear_reclaim_tag( XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); } +/* + * Inodes in different states need to be treated differently, and the return + * value of xfs_iflush is not sufficient to get this right. The following table + * lists the inode states and the reclaim actions necessary for non-blocking + * reclaim: + * + * + * inode state iflush ret required action + * --------------- ---------- --------------- + * bad - reclaim + * shutdown EIO unpin and reclaim + * clean, unpinned 0 reclaim + * stale, unpinned 0 reclaim + * clean, pinned(*) 0 unpin and reclaim + * stale, pinned 0 unpin and reclaim + * dirty, async 0 block on flush lock, reclaim + * dirty, sync flush 0 block on flush lock, reclaim + * + * (*) dgc: I don't think the clean, pinned state is possible but it gets + * handled anyway given the order of checks implemented. + * + * Hence the order of actions after gaining the locks should be: + * bad => reclaim + * shutdown => unpin and reclaim + * pinned => unpin + * stale => reclaim + * clean => reclaim + * dirty => flush, wait and reclaim + */ STATIC int xfs_reclaim_inode( struct xfs_inode *ip, struct xfs_perag *pag, int sync_mode) { + int error; + /* * The radix tree lock here protects a thread in xfs_iget from racing * with us starting reclaim on the inode. Once we have the @@ -729,30 +760,42 @@ xfs_reclaim_inode( spin_unlock(&ip->i_flags_lock); write_unlock(&pag->pag_ici_lock); - /* - * If the inode is still dirty, then flush it out. If the inode - * is not in the AIL, then it will be OK to flush it delwri as - * long as xfs_iflush() does not keep any references to the inode. - * We leave that decision up to xfs_iflush() since it has the - * knowledge of whether it's OK to simply do a delwri flush of - * the inode or whether we need to wait until the inode is - * pulled from the AIL. - * We get the flush lock regardless, though, just to make sure - * we don't free it while it is being flushed. - */ xfs_ilock(ip, XFS_ILOCK_EXCL); xfs_iflock(ip); - /* - * In the case of a forced shutdown we rely on xfs_iflush() to - * wait for the inode to be unpinned before returning an error. - */ - if (!is_bad_inode(VFS_I(ip)) && xfs_iflush(ip, sync_mode) == 0) { - /* synchronize with xfs_iflush_done */ - xfs_iflock(ip); - xfs_ifunlock(ip); + if (is_bad_inode(VFS_I(ip))) + goto reclaim; + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) { + xfs_iunpin_wait(ip); + goto reclaim; + } + if (xfs_ipincount(ip)) + xfs_iunpin_wait(ip); + if (xfs_iflags_test(ip, XFS_ISTALE)) + goto reclaim; + if (xfs_inode_clean(ip)) + goto reclaim; + + /* Now we have an inode that needs flushing */ + error = xfs_iflush(ip, sync_mode); + if (!error) { + switch(sync_mode) { + case XFS_IFLUSH_DELWRI_ELSE_ASYNC: + case XFS_IFLUSH_DELWRI: + case XFS_IFLUSH_ASYNC: + case XFS_IFLUSH_DELWRI_ELSE_SYNC: + case XFS_IFLUSH_SYNC: + /* IO issued, synchronise with IO completion */ + xfs_iflock(ip); + break; + default: + ASSERT(0); + break; + } } +reclaim: + xfs_ifunlock(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); xfs_ireclaim(ip); return 0; diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index d0d1b5a..8d0666d 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2493,7 +2493,7 @@ __xfs_iunpin_wait( wait_event(ip->i_ipin_wait, (atomic_read(&ip->i_pincount) == 0)); } -static inline void +void xfs_iunpin_wait( xfs_inode_t *ip) { @@ -2849,15 +2849,6 @@ xfs_iflush( mp = ip->i_mount; /* - * If the inode isn't dirty, then just release the inode flush lock and - * do nothing. - */ - if (xfs_inode_clean(ip)) { - xfs_ifunlock(ip); - return 0; - } - - /* * We can't flush the inode until it is unpinned, so wait for it if we * are allowed to block. We know noone new can pin it, because we are * holding the inode lock shared and you need to hold it exclusively to diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index ec1f28c..8b618ea 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -483,6 +483,7 @@ int xfs_iunlink(struct xfs_trans *, xfs_inode_t *); void xfs_iext_realloc(xfs_inode_t *, int, int); void xfs_ipin(xfs_inode_t *); void xfs_iunpin(xfs_inode_t *); +void xfs_iunpin_wait(xfs_inode_t *); int xfs_iflush(xfs_inode_t *, uint); void xfs_ichgtime(xfs_inode_t *, int); void xfs_lock_inodes(xfs_inode_t **, int, uint); -- 1.6.5 From SRS0+8Wp3+69+fromorbit.com=dave@internode.on.net Mon Feb 8 21:55:38 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_66 autolearn=no version=3.3.0-rupdated 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 o193tcH6182489 for ; Mon, 8 Feb 2010 21:55:38 -0600 X-ASG-Debug-ID: 1265687808-608001690000-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 EEF01138A717 for ; Mon, 8 Feb 2010 19:56:49 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id WkMEdYDE1bcw4UOG for ; Mon, 08 Feb 2010 19:56:49 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12912039-1927428 for ; Tue, 09 Feb 2010 14:26:48 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NehDS-0000O3-5b for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:46 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NehDR-0002SL-FI for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:45 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/9] xfs: Sort delayed write buffers before dispatch Subject: [PATCH 4/9] xfs: Sort delayed write buffers before dispatch Date: Tue, 9 Feb 2010 14:56:37 +1100 Message-Id: <1265687802-23043-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265687802-23043-1-git-send-email-david@fromorbit.com> References: <1265687802-23043-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: 1265687810 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22047 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 Currently when the xfsbufd writes delayed write buffers, it pushes them to disk in the order they come off the delayed write list. If there are lots of buffers ѕpread widely over the disk, this results in overwhelming the elevator sort queues in the block layer and we end up losing the posibility of merging adjacent buffers to minimise the number of IOs. Use the new generic list_sort function to sort the delwri dispatch queue before issue to ensure that the buffers are pushed in the most friendly order possible to the lower layers. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_buf.c | 87 ++++++++++++++++++++++++++++++-------------- 1 files changed, 60 insertions(+), 27 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index b306265..4556a4c 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "xfs_sb.h" #include "xfs_inum.h" @@ -1877,14 +1878,42 @@ xfs_buf_delwri_split( } +/* + * Compare function is more complex than it needs to be because + * the return value is only 32 bits and we are doing comparisons + * on 64 bit values + */ +static int +xfs_buf_cmp( + void *priv, + struct list_head *a, + struct list_head *b) +{ + struct xfs_buf *ap = container_of(a, struct xfs_buf, b_list); + struct xfs_buf *bp = container_of(b, struct xfs_buf, b_list); + xfs_daddr_t diff; + + diff = ap->b_bn - bp->b_bn; + if (diff < 0) + return -1; + if (diff > 0) + return 1; + return 0; +} + +void +xfs_buf_delwri_sort( + xfs_buftarg_t *target, + struct list_head *list) +{ + list_sort(NULL, list, xfs_buf_cmp); +} + STATIC int xfsbufd( void *data) { - struct list_head tmp; - xfs_buftarg_t *target = (xfs_buftarg_t *)data; - int count; - xfs_buf_t *bp; + xfs_buftarg_t *target = (xfs_buftarg_t *)data; current->flags |= PF_MEMALLOC; @@ -1893,6 +1922,8 @@ xfsbufd( do { long age = xfs_buf_age_centisecs * msecs_to_jiffies(10); long tout = xfs_buf_timer_centisecs * msecs_to_jiffies(10); + int count = 0; + struct list_head tmp; if (unlikely(freezing(current))) { set_bit(XBT_FORCE_SLEEP, &target->bt_flags); @@ -1907,11 +1938,10 @@ xfsbufd( schedule_timeout_interruptible(tout); xfs_buf_delwri_split(target, &tmp, age); - count = 0; + list_sort(NULL, &tmp, xfs_buf_cmp); while (!list_empty(&tmp)) { - bp = list_entry(tmp.next, xfs_buf_t, b_list); - ASSERT(target == bp->b_target); - + struct xfs_buf *bp; + bp = list_first_entry(&tmp, struct xfs_buf, b_list); list_del_init(&bp->b_list); xfs_buf_iostrategy(bp); count++; @@ -1937,42 +1967,45 @@ xfs_flush_buftarg( xfs_buftarg_t *target, int wait) { - struct list_head tmp; - xfs_buf_t *bp, *n; + xfs_buf_t *bp; int pincount = 0; + LIST_HEAD(tmp_list); + LIST_HEAD(wait_list); xfs_buf_runall_queues(xfsconvertd_workqueue); xfs_buf_runall_queues(xfsdatad_workqueue); xfs_buf_runall_queues(xfslogd_workqueue); set_bit(XBT_FORCE_FLUSH, &target->bt_flags); - pincount = xfs_buf_delwri_split(target, &tmp, 0); + pincount = xfs_buf_delwri_split(target, &tmp_list, 0); /* - * Dropped the delayed write list lock, now walk the temporary list + * Dropped the delayed write list lock, now walk the temporary list. + * All I/O is issued async and then if we need to wait for completion + * we do that after issuing all the IO. */ - list_for_each_entry_safe(bp, n, &tmp, b_list) { + list_sort(NULL, &tmp_list, xfs_buf_cmp); + while (!list_empty(&tmp_list)) { + bp = list_first_entry(&tmp_list, struct xfs_buf, b_list); ASSERT(target == bp->b_target); - if (wait) + list_del_init(&bp->b_list); + if (wait) { bp->b_flags &= ~XBF_ASYNC; - else - list_del_init(&bp->b_list); - + list_add(&bp->b_list, &wait_list); + } xfs_buf_iostrategy(bp); } - if (wait) + if (wait) { + /* Expedite and wait for IO to complete. */ blk_run_address_space(target->bt_mapping); + while (!list_empty(&wait_list)) { + bp = list_first_entry(&wait_list, struct xfs_buf, b_list); - /* - * Remaining list items must be flushed before returning - */ - while (!list_empty(&tmp)) { - bp = list_entry(tmp.next, xfs_buf_t, b_list); - - list_del_init(&bp->b_list); - xfs_iowait(bp); - xfs_buf_relse(bp); + list_del_init(&bp->b_list); + xfs_iowait(bp); + xfs_buf_relse(bp); + } } return pincount; -- 1.6.5 From SRS0+Ag99+69+fromorbit.com=dave@internode.on.net Mon Feb 8 21:55:43 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o193thNK182530 for ; Mon, 8 Feb 2010 21:55:43 -0600 X-ASG-Debug-ID: 1265687813-2f1001670000-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 85B851CB5F56 for ; Mon, 8 Feb 2010 19:56:54 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id 1l8JYxSBGdWAbbVR for ; Mon, 08 Feb 2010 19:56:54 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13074385-1927428 for ; Tue, 09 Feb 2010 14:26:52 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NehDX-0000O2-4f for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:51 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NehDR-0002SI-DT for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:45 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/9] xfs: Don't issue buffer IO direct from AIL push V2 Subject: [PATCH 3/9] xfs: Don't issue buffer IO direct from AIL push V2 Date: Tue, 9 Feb 2010 14:56:36 +1100 Message-Id: <1265687802-23043-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265687802-23043-1-git-send-email-david@fromorbit.com> References: <1265687802-23043-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1265687815 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22048 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 All buffers logged into the AIL are marked as delayed write. When the AIL needs to push the buffer out, it issues an async write of the buffer. This means that IO patterns are dependent on the order of buffers in the AIL. Instead of flushing the buffer, promote the buffer in the delayed write list so that the next time the xfsbufd is run the buffer will be flushed by the xfsbufd. Return the state to the xfsaild that the buffer was promoted so that the xfsaild knows that it needs to cause the xfsbufd to run to flush the buffers that were promoted. Using the xfsbufd for issuing the IO allows us to dispatch all buffer IO from the one queue. This means that we can make much more enlightened decisions on what order to flush buffers to disk as we don't have multiple places issuing IO. Optimisations to xfsbufd will be in a future patch. Version 2 - kill XFS_ITEM_FLUSHING as it is now unused. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_buf.c | 29 ++++++++++++ fs/xfs/linux-2.6/xfs_buf.h | 2 + fs/xfs/linux-2.6/xfs_trace.h | 1 + fs/xfs/quota/xfs_dquot_item.c | 85 +++++------------------------------ fs/xfs/quota/xfs_dquot_item.h | 4 -- fs/xfs/xfs_buf_item.c | 64 +++++++++++++++------------ fs/xfs/xfs_inode_item.c | 98 ++++++---------------------------------- fs/xfs/xfs_inode_item.h | 6 --- fs/xfs/xfs_trans.h | 3 +- fs/xfs/xfs_trans_ail.c | 13 +++--- 10 files changed, 102 insertions(+), 203 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 44e20e5..b306265 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -1778,6 +1778,35 @@ xfs_buf_delwri_dequeue( trace_xfs_buf_delwri_dequeue(bp, _RET_IP_); } +/* + * If a delwri buffer needs to be pushed before it has aged out, then promote + * it to the head of the delwri queue so that it will be flushed on the next + * xfsbufd run. We do this by resetting the queuetime of the buffer to be older + * than the age currently needed to flush the buffer. Hence the next time the + * xfsbufd sees it is guaranteed to be considered old enough to flush. + */ +void +xfs_buf_delwri_promote( + struct xfs_buf *bp) +{ + struct xfs_buftarg *btp = bp->b_target; + long age = xfs_buf_age_centisecs * msecs_to_jiffies(10) + 1; + + ASSERT(bp->b_flags & XBF_DELWRI); + ASSERT(bp->b_flags & _XBF_DELWRI_Q); + + /* + * Check the buffer age before locking the delayed write queue as we + * don't need to promote buffers that are already past the flush age. + */ + if (bp->b_queuetime < jiffies - age) + return; + bp->b_queuetime = jiffies - age; + spin_lock(&btp->bt_delwrite_lock); + list_move(&bp->b_list, &btp->bt_delwrite_queue); + spin_unlock(&btp->bt_delwrite_lock); +} + STATIC void xfs_buf_runall_queues( struct workqueue_struct *queue) diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index ea8c198..be45e8c 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h @@ -266,6 +266,7 @@ 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 *); /* Buffer Daemon Setup Routines */ extern int xfs_buf_init(void); @@ -395,6 +396,7 @@ extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *); extern void xfs_wait_buftarg(xfs_buftarg_t *); extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int); extern int xfs_flush_buftarg(xfs_buftarg_t *, int); + #ifdef CONFIG_KDB_MODULES extern struct list_head *xfs_get_buftarg_list(void); #endif diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 1bb09e7..a4574dc 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -483,6 +483,7 @@ DEFINE_BUF_ITEM_EVENT(xfs_buf_item_unlock); DEFINE_BUF_ITEM_EVENT(xfs_buf_item_unlock_stale); DEFINE_BUF_ITEM_EVENT(xfs_buf_item_committed); DEFINE_BUF_ITEM_EVENT(xfs_buf_item_push); +DEFINE_BUF_ITEM_EVENT(xfs_buf_item_pushbuf); DEFINE_BUF_ITEM_EVENT(xfs_trans_get_buf); DEFINE_BUF_ITEM_EVENT(xfs_trans_get_buf_recur); DEFINE_BUF_ITEM_EVENT(xfs_trans_getsb); diff --git a/fs/xfs/quota/xfs_dquot_item.c b/fs/xfs/quota/xfs_dquot_item.c index 1b56437..dda0fb0 100644 --- a/fs/xfs/quota/xfs_dquot_item.c +++ b/fs/xfs/quota/xfs_dquot_item.c @@ -212,66 +212,31 @@ xfs_qm_dquot_logitem_pushbuf( xfs_dquot_t *dqp; xfs_mount_t *mp; xfs_buf_t *bp; - uint dopush; dqp = qip->qli_dquot; ASSERT(XFS_DQ_IS_LOCKED(dqp)); /* - * The qli_pushbuf_flag keeps others from - * trying to duplicate our effort. - */ - ASSERT(qip->qli_pushbuf_flag != 0); - ASSERT(qip->qli_push_owner == current_pid()); - - /* * If flushlock isn't locked anymore, chances are that the * 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)) { - qip->qli_pushbuf_flag = 0; xfs_dqunlock(dqp); return; } mp = dqp->q_mount; bp = xfs_incore(mp->m_ddev_targp, qip->qli_format.qlf_blkno, XFS_QI_DQCHUNKLEN(mp), XBF_TRYLOCK); - if (bp != NULL) { - if (XFS_BUF_ISDELAYWRITE(bp)) { - dopush = ((qip->qli_item.li_flags & XFS_LI_IN_AIL) && - !completion_done(&dqp->q_flush)); - qip->qli_pushbuf_flag = 0; - xfs_dqunlock(dqp); - - if (XFS_BUF_ISPINNED(bp)) - xfs_log_force(mp, 0); - - if (dopush) { - int error; -#ifdef XFSRACEDEBUG - delay_for_intr(); - delay(300); -#endif - error = xfs_bawrite(mp, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, mp, - "xfs_qm_dquot_logitem_pushbuf: pushbuf error %d on qip %p, bp %p", - error, qip, bp); - } else { - xfs_buf_relse(bp); - } - } else { - qip->qli_pushbuf_flag = 0; - xfs_dqunlock(dqp); - xfs_buf_relse(bp); - } + xfs_dqunlock(dqp); + if (!bp) return; - } + if (XFS_BUF_ISDELAYWRITE(bp)) + xfs_buf_delwri_promote(bp); + xfs_buf_relse(bp); + return; - qip->qli_pushbuf_flag = 0; - xfs_dqunlock(dqp); } /* @@ -289,50 +254,24 @@ xfs_qm_dquot_logitem_trylock( xfs_dq_logitem_t *qip) { xfs_dquot_t *dqp; - uint retval; dqp = qip->qli_dquot; if (atomic_read(&dqp->q_pincount) > 0) - return (XFS_ITEM_PINNED); + return XFS_ITEM_PINNED; if (! xfs_qm_dqlock_nowait(dqp)) - return (XFS_ITEM_LOCKED); + return XFS_ITEM_LOCKED; - retval = XFS_ITEM_SUCCESS; if (!xfs_dqflock_nowait(dqp)) { /* - * The dquot is already being flushed. It may have been - * flushed delayed write, however, and we don't want to - * get stuck waiting for that to complete. So, we want to check - * to see if we can lock the dquot's buffer without sleeping. - * If we can and it is marked for delayed write, then we - * hold it and send it out from the push routine. We don't - * want to do that now since we might sleep in the device - * strategy routine. We also don't want to grab the buffer lock - * here because we'd like not to call into the buffer cache - * while holding the AIL lock. - * Make sure to only return PUSHBUF if we set pushbuf_flag - * ourselves. If someone else is doing it then we don't - * want to go to the push routine and duplicate their efforts. + * dquot has already been flushed to the backing buffer, + * leave it locked, pushbuf routine will unlock it. */ - if (qip->qli_pushbuf_flag == 0) { - qip->qli_pushbuf_flag = 1; - ASSERT(qip->qli_format.qlf_blkno == dqp->q_blkno); -#ifdef DEBUG - qip->qli_push_owner = current_pid(); -#endif - /* - * The dquot is left locked. - */ - retval = XFS_ITEM_PUSHBUF; - } else { - retval = XFS_ITEM_FLUSHING; - xfs_dqunlock_nonotify(dqp); - } + return XFS_ITEM_PUSHBUF; } ASSERT(qip->qli_item.li_flags & XFS_LI_IN_AIL); - return (retval); + return XFS_ITEM_SUCCESS; } diff --git a/fs/xfs/quota/xfs_dquot_item.h b/fs/xfs/quota/xfs_dquot_item.h index 5a63253..5acae2a 100644 --- a/fs/xfs/quota/xfs_dquot_item.h +++ b/fs/xfs/quota/xfs_dquot_item.h @@ -27,10 +27,6 @@ typedef struct xfs_dq_logitem { xfs_log_item_t qli_item; /* common portion */ struct xfs_dquot *qli_dquot; /* dquot ptr */ xfs_lsn_t qli_flush_lsn; /* lsn at last flush */ - unsigned short qli_pushbuf_flag; /* 1 bit used in push_ail */ -#ifdef DEBUG - uint64_t qli_push_owner; -#endif xfs_dq_logformat_t qli_format; /* logged structure */ } xfs_dq_logitem_t; diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index e0a1158..f3c49e6 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -467,8 +467,10 @@ xfs_buf_item_unpin_remove( /* * 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, pull the - * buffer from the free list, mark it busy, and return 1. + * the lock right away, return 0. If we can get the lock, take a + * reference to the buffer. If this is a delayed write buffer that + * needs AIL help to be written back, invoke the pushbuf routine + * rather than the normal success path. */ STATIC uint xfs_buf_item_trylock( @@ -477,24 +479,18 @@ xfs_buf_item_trylock( xfs_buf_t *bp; bp = bip->bli_buf; - - if (XFS_BUF_ISPINNED(bp)) { + if (XFS_BUF_ISPINNED(bp)) return XFS_ITEM_PINNED; - } - - if (!XFS_BUF_CPSEMA(bp)) { + if (!XFS_BUF_CPSEMA(bp)) return XFS_ITEM_LOCKED; - } - /* - * Remove the buffer from the free list. Only do this - * if it's on the free list. Private buffers like the - * superblock buffer are not. - */ + /* take a reference to the buffer. */ XFS_BUF_HOLD(bp); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); trace_xfs_buf_item_trylock(bip); + if (XFS_BUF_ISDELAYWRITE(bp)) + return XFS_ITEM_PUSHBUF; return XFS_ITEM_SUCCESS; } @@ -626,11 +622,9 @@ xfs_buf_item_committed( } /* - * This is called to asynchronously write the buffer associated with this - * buf log item out to disk. The buffer will already have been locked by - * a successful call to xfs_buf_item_trylock(). If the buffer still has - * B_DELWRI set, then get it going out to disk with a call to bawrite(). - * If not, then just release the buffer. + * The buffer is locked, but is not a delayed write buffer. This happens + * if we race with IO completion and hence we don't want to try to write it + * again. Just release the buffer. */ STATIC void xfs_buf_item_push( @@ -642,17 +636,29 @@ xfs_buf_item_push( trace_xfs_buf_item_push(bip); bp = bip->bli_buf; + ASSERT(!XFS_BUF_ISDELAYWRITE(bp)); + xfs_buf_relse(bp); +} - if (XFS_BUF_ISDELAYWRITE(bp)) { - int error; - error = xfs_bawrite(bip->bli_item.li_mountp, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, bip->bli_item.li_mountp, - "xfs_buf_item_push: pushbuf error %d on bip %p, bp %p", - error, bip, bp); - } else { - xfs_buf_relse(bp); - } +/* + * The buffer is locked and is a delayed write buffer. Promote the buffer + * in the delayed write queue as the caller knows that they must invoke + * the xfsbufd to get this buffer written. We have to unlock the buffer + * to allow the xfsbufd to write it, too. + */ +STATIC void +xfs_buf_item_pushbuf( + xfs_buf_log_item_t *bip) +{ + xfs_buf_t *bp; + + ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); + 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 */ @@ -677,7 +683,7 @@ static struct xfs_item_ops xfs_buf_item_ops = { .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 = NULL, + .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 }; diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 207553e..d4dc063 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -602,33 +602,20 @@ xfs_inode_item_trylock( if (!xfs_iflock_nowait(ip)) { /* - * If someone else isn't already trying to push the inode - * buffer, we get to do it. + * inode has already been flushed to the backing buffer, + * leave it locked in shared mode, pushbuf routine will + * unlock it. */ - if (iip->ili_pushbuf_flag == 0) { - iip->ili_pushbuf_flag = 1; -#ifdef DEBUG - iip->ili_push_owner = current_pid(); -#endif - /* - * Inode is left locked in shared mode. - * Pushbuf routine gets to unlock it. - */ - return XFS_ITEM_PUSHBUF; - } else { - /* - * We hold the AIL lock, so we must specify the - * NONOTIFY flag so that we won't double trip. - */ - xfs_iunlock(ip, XFS_ILOCK_SHARED|XFS_IUNLOCK_NONOTIFY); - return XFS_ITEM_FLUSHING; - } - /* NOTREACHED */ + return XFS_ITEM_PUSHBUF; } /* Stale items should force out the iclog */ if (ip->i_flags & XFS_ISTALE) { xfs_ifunlock(ip); + /* + * we hold the AIL lock - notify the unlock routine of this + * so it doesn't try to get the lock again. + */ xfs_iunlock(ip, XFS_ILOCK_SHARED|XFS_IUNLOCK_NONOTIFY); return XFS_ITEM_PINNED; } @@ -746,11 +733,8 @@ xfs_inode_item_committed( * This gets called by xfs_trans_push_ail(), when IOP_TRYLOCK * failed to get the inode flush lock but did get the inode locked SHARED. * Here we're trying to see if the inode buffer is incore, and if so whether it's - * marked delayed write. If that's the case, we'll initiate a bawrite on that - * buffer to expedite the process. - * - * We aren't holding the AIL lock (or the flush lock) when this gets called, - * so it is inherently race-y. + * marked delayed write. If that's the case, we'll promote it and that will + * allow the caller to write the buffer by triggering the xfsbufd to run. */ STATIC void xfs_inode_item_pushbuf( @@ -759,26 +743,16 @@ xfs_inode_item_pushbuf( xfs_inode_t *ip; xfs_mount_t *mp; xfs_buf_t *bp; - uint dopush; ip = iip->ili_inode; - ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED)); /* - * The ili_pushbuf_flag keeps others from - * trying to duplicate our effort. - */ - ASSERT(iip->ili_pushbuf_flag != 0); - ASSERT(iip->ili_push_owner == current_pid()); - - /* * If a flush is not in progress anymore, chances are that the * 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)) { - iip->ili_pushbuf_flag = 0; xfs_iunlock(ip, XFS_ILOCK_SHARED); return; } @@ -787,53 +761,12 @@ xfs_inode_item_pushbuf( bp = xfs_incore(mp->m_ddev_targp, iip->ili_format.ilf_blkno, iip->ili_format.ilf_len, XBF_TRYLOCK); - if (bp != NULL) { - if (XFS_BUF_ISDELAYWRITE(bp)) { - /* - * We were racing with iflush because we don't hold - * the AIL lock or the flush lock. However, at this point, - * we have the buffer, and we know that it's dirty. - * So, it's possible that iflush raced with us, and - * this item is already taken off the AIL. - * If not, we can flush it async. - */ - dopush = ((iip->ili_item.li_flags & XFS_LI_IN_AIL) && - !completion_done(&ip->i_flush)); - iip->ili_pushbuf_flag = 0; - xfs_iunlock(ip, XFS_ILOCK_SHARED); - - trace_xfs_inode_item_push(bp, _RET_IP_); - - if (XFS_BUF_ISPINNED(bp)) - xfs_log_force(mp, 0); - - if (dopush) { - int error; - error = xfs_bawrite(mp, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, mp, - "xfs_inode_item_pushbuf: pushbuf error %d on iip %p, bp %p", - error, iip, bp); - } else { - xfs_buf_relse(bp); - } - } else { - iip->ili_pushbuf_flag = 0; - xfs_iunlock(ip, XFS_ILOCK_SHARED); - xfs_buf_relse(bp); - } - return; - } - /* - * We have to be careful about resetting pushbuf flag too early (above). - * Even though in theory we can do it as soon as we have the buflock, - * we don't want others to be doing work needlessly. They'll come to - * this function thinking that pushing the buffer is their - * responsibility only to find that the buffer is still locked by - * another doing the same thing - */ - iip->ili_pushbuf_flag = 0; xfs_iunlock(ip, XFS_ILOCK_SHARED); + if (!bp) + return; + if (XFS_BUF_ISDELAYWRITE(bp)) + xfs_buf_delwri_promote(bp); + xfs_buf_relse(bp); return; } @@ -937,7 +870,6 @@ xfs_inode_item_init( /* We have zeroed memory. No need ... iip->ili_extents_buf = NULL; - iip->ili_pushbuf_flag = 0; */ iip->ili_format.ilf_type = XFS_LI_INODE; diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h index cc8df1a..9a46795 100644 --- a/fs/xfs/xfs_inode_item.h +++ b/fs/xfs/xfs_inode_item.h @@ -144,12 +144,6 @@ typedef struct xfs_inode_log_item { data exts */ struct xfs_bmbt_rec *ili_aextents_buf; /* array of logged attr exts */ - unsigned int ili_pushbuf_flag; /* one bit used in push_ail */ - -#ifdef DEBUG - uint64_t ili_push_owner; /* one who sets pushbuf_flag - above gets to push the buf */ -#endif #ifdef XFS_TRANS_DEBUG int ili_root_size; char *ili_orig_root; diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index ca64f33..c93e3a1 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -861,8 +861,7 @@ typedef struct xfs_item_ops { #define XFS_ITEM_SUCCESS 0 #define XFS_ITEM_PINNED 1 #define XFS_ITEM_LOCKED 2 -#define XFS_ITEM_FLUSHING 3 -#define XFS_ITEM_PUSHBUF 4 +#define XFS_ITEM_PUSHBUF 3 /* * This structure is used to maintain a list of block ranges that have been diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index d7b1af8..e799824 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -253,6 +253,7 @@ xfsaild_push( int flush_log, count, stuck; xfs_mount_t *mp = ailp->xa_mount; struct xfs_ail_cursor *cur = &ailp->xa_cursors; + int push_xfsbufd = 0; spin_lock(&ailp->xa_lock); xfs_trans_ail_cursor_init(ailp, cur); @@ -308,6 +309,7 @@ xfsaild_push( XFS_STATS_INC(xs_push_ail_pushbuf); IOP_PUSHBUF(lip); last_pushed_lsn = lsn; + push_xfsbufd = 1; break; case XFS_ITEM_PINNED: @@ -322,12 +324,6 @@ xfsaild_push( stuck++; break; - case XFS_ITEM_FLUSHING: - XFS_STATS_INC(xs_push_ail_flushing); - last_pushed_lsn = lsn; - stuck++; - break; - default: ASSERT(0); break; @@ -374,6 +370,11 @@ xfsaild_push( xfs_log_force(mp, 0); } + if (push_xfsbufd) { + /* we've got delayed write buffers to flush */ + wake_up_process(mp->m_ddev_targp->bt_task); + } + if (!count) { /* We're past our target or empty, so idle */ last_pushed_lsn = 0; -- 1.6.5 From SRS0+Ag99+69+fromorbit.com=dave@internode.on.net Mon Feb 8 21:55:48 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o193tlmq182551 for ; Mon, 8 Feb 2010 21:55:47 -0600 X-ASG-Debug-ID: 1265687818-608c01670000-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 33C77138A720 for ; Mon, 8 Feb 2010 19:56:58 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id tJy2r5H0OjyOXaht for ; Mon, 08 Feb 2010 19:56:58 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13074392-1927428 for ; Tue, 09 Feb 2010 14:26:57 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NehDb-0000Nz-Tk for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:55 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NehDR-0002S9-7Q for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:45 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/9] Delayed write metadata writeback V5 Subject: [PATCH 0/9] Delayed write metadata writeback V5 Date: Tue, 9 Feb 2010 14:56:33 +1100 Message-Id: <1265687802-23043-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1265687820 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22047 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 While I started with killing async inode writeback, the series has grown. It's not really limited to inode writeback - it touches dquot flushing, changes the way the AIL pushes on buffers, adds xfsbufd sorting for delayed write buffers, adds a real non-blocking mode to inode reclaim and avoids physical inode writeback from the VFS while fixing bugs in handling delayed write inodes. Hence this is more about enabling efficient delayed write metadata than it is able killing async inode writeback. The idea behind this series is to make metadata buffers get written from xfsbufd via the delayed write queue rather than being issued asynchronously from all over the place. To do this, async buffer writeback is almost entirely removed from XFS, replaced instead by delayed writes and a method to expedite flushing of delayed write buffers when required. The result of funnelling all the buffer IO into a single place is that we can more tightly control and therefore optimise the submission of metadata IO. Aggregating the buffers before dispatch allows much better sort efficiency of the buffers as the sort window is not limited to the size of the elevator congestion hysteresis limit. Hence we can approach 100% merge effeciency on large numbers of buffers when dispatched for IO and greatly reduce the amount of seeking metadata writeback causes. The major change is to the inode flushing and reclaim code. Delayed write inodes hold the flush lock for much longer than for async writeback, and hence blocking on the flush lock can cause extremely long latencies without other mechanisms to expedite the release of the flush locks. To prevent needing to flush inodes immediately, all operations are done non-blocking unless synchronous. This required a significant rework of the inode reclaim code, but it greatly simplified other pieces of code (e.g. log item pushing). Version 5 - drop the fsync changes to xfs_fs_write_inode() and the associated locking changes, replace them with a targeted inode logging function from Christoph Hellwig to fix a performance regression on fs_mark -S4 workloads on an SSD. Version 4 - rework inode reclaim checks for better legibility - add warning to reclaim code when delwri flush errors occur - kill XFS_ITEM_FLUSHING now it is not used - clean up sync_mode flags being pushed into xfs_iflush() - kill the now unused xfs_bawrite() function - include Christoph's fsync cache flush fix - rework the inode locking and call to xfs_fsync() when doing synchronous inode writes to close races between the fsync and the background delwri flush afterwards. Version 3 - rework inode reclaim to: - separate it from xfs_iflush return values - provide a non-blocking mode for background operation - apply delwri buffer promotion tricks to dquot flushing - kill unneeded dquot flushing flags, similar to inode flushing flag removal - fix sync inode flush bug when trying to flush delwri inodes Version 2: - use generic list sort function - when unmounting, push the delwri buffers first, then do sync inode reclaim so that reclaim doesn't block for 15 seconds waiting for delwri inode buffers to be aged and written before the inodes can be reclaimed. Alex, the patch series is available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/dgc/xfs for-2.6.34 Christoph Hellwig (2): xfs: remove invalid barrier optimization from xfs_fsync xfs: log changed inodes instead of writing them synchronously Dave Chinner (7): xfs: Make inode reclaim states explicit xfs: Use delayed write for inodes rather than async V2 xfs: Don't issue buffer IO direct from AIL push V2 xfs: Sort delayed write buffers before dispatch xfs: Use delay write promotion for dquot flushing xfs: kill the unused XFS_QMOPT_* flush flags V2 xfs: kill xfs_bawrite fs/xfs/linux-2.6/xfs_buf.c | 135 ++++++++++++++++++++++++++-------------- fs/xfs/linux-2.6/xfs_buf.h | 3 +- fs/xfs/linux-2.6/xfs_super.c | 111 ++++++++++++++++++++++++--------- fs/xfs/linux-2.6/xfs_sync.c | 138 +++++++++++++++++++++++++++++++++------- fs/xfs/linux-2.6/xfs_trace.h | 1 + fs/xfs/quota/xfs_dquot.c | 38 +++++------- fs/xfs/quota/xfs_dquot_item.c | 87 ++++---------------------- fs/xfs/quota/xfs_dquot_item.h | 4 - fs/xfs/quota/xfs_qm.c | 14 ++--- fs/xfs/xfs_buf_item.c | 64 ++++++++++--------- fs/xfs/xfs_inode.c | 86 ++------------------------ fs/xfs/xfs_inode.h | 11 +--- fs/xfs/xfs_inode_item.c | 108 +++++++------------------------- fs/xfs/xfs_inode_item.h | 6 -- fs/xfs/xfs_mount.c | 13 ++++- fs/xfs/xfs_quota.h | 8 +-- fs/xfs/xfs_trans.h | 3 +- fs/xfs/xfs_trans_ail.c | 13 ++-- fs/xfs/xfs_vnodeops.c | 12 +--- 19 files changed, 410 insertions(+), 445 deletions(-) From SRS0+8Wp3+69+fromorbit.com=dave@internode.on.net Mon Feb 8 21:55:48 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o193tl8u182553 for ; Mon, 8 Feb 2010 21:55:47 -0600 X-ASG-Debug-ID: 1265687818-608101510000-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 45453138A722 for ; Mon, 8 Feb 2010 19:56:59 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id nmBmX06F98tJjEB0 for ; Mon, 08 Feb 2010 19:56:59 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12912059-1927428 for ; Tue, 09 Feb 2010 14:26:58 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NehDc-0000OQ-9N for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:56 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NehDb-0002ST-Hv for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 6/9] xfs: kill the unused XFS_QMOPT_* flush flags V2 Subject: [PATCH 6/9] xfs: kill the unused XFS_QMOPT_* flush flags V2 Date: Tue, 9 Feb 2010 14:56:39 +1100 Message-Id: <1265687802-23043-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265687802-23043-1-git-send-email-david@fromorbit.com> References: <1265687802-23043-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1265687820 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22047 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 dquots are never flushed asynchronously. Remove the flag and the async write support from the flush function. Make the default flush a delwri flush to make the inode flush code, which leaves the XFS_QMOPT_SYNC the only flag remaining. Convert that to use SYNC_WAIT instead, just like the inode flush code. V2: - just pass flush flags straight through Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/quota/xfs_dquot.c | 13 ++++++------- fs/xfs/quota/xfs_dquot_item.c | 2 +- fs/xfs/quota/xfs_qm.c | 14 ++++++-------- fs/xfs/xfs_quota.h | 8 +------- 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index 1620a56..5f79dd7 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -1187,7 +1187,7 @@ xfs_qm_dqflush( * block, nada. */ if (!XFS_DQ_IS_DIRTY(dqp) || - (!(flags & XFS_QMOPT_SYNC) && atomic_read(&dqp->q_pincount) > 0)) { + (!(flags & SYNC_WAIT) && atomic_read(&dqp->q_pincount) > 0)) { xfs_dqfunlock(dqp); return 0; } @@ -1251,18 +1251,17 @@ xfs_qm_dqflush( xfs_log_force(mp, 0); } - if (flags & XFS_QMOPT_DELWRI) { - xfs_bdwrite(mp, bp); - } else { + if (flags & SYNC_WAIT) error = xfs_bwrite(mp, bp); - } + else + xfs_bdwrite(mp, bp); trace_xfs_dqflush_done(dqp); /* * dqp is still locked, but caller is free to unlock it now. */ - return (error); + return error; } @@ -1443,7 +1442,7 @@ xfs_qm_dqpurge( * We don't care about getting disk errors here. We need * to purge this dquot anyway, so we go ahead regardless. */ - error = xfs_qm_dqflush(dqp, XFS_QMOPT_SYNC); + error = xfs_qm_dqflush(dqp, SYNC_WAIT); if (error) xfs_fs_cmn_err(CE_WARN, mp, "xfs_qm_dqpurge: dquot %p flush failed", dqp); diff --git a/fs/xfs/quota/xfs_dquot_item.c b/fs/xfs/quota/xfs_dquot_item.c index dda0fb0..4e4ee9a 100644 --- a/fs/xfs/quota/xfs_dquot_item.c +++ b/fs/xfs/quota/xfs_dquot_item.c @@ -153,7 +153,7 @@ xfs_qm_dquot_logitem_push( * lock without sleeping, then there must not have been * anyone in the process of flushing the dquot. */ - error = xfs_qm_dqflush(dqp, XFS_QMOPT_DELWRI); + error = xfs_qm_dqflush(dqp, 0); if (error) xfs_fs_cmn_err(CE_WARN, dqp->q_mount, "xfs_qm_dquot_logitem_push: push error %d on dqp %p", diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 11cfd82..8699e51 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -450,7 +450,7 @@ xfs_qm_unmount_quotas( STATIC int xfs_qm_dqflush_all( xfs_mount_t *mp, - int flags) + int sync_mode) { int recl; xfs_dquot_t *dqp; @@ -486,7 +486,7 @@ again: * across a disk write. */ xfs_qm_mplist_unlock(mp); - error = xfs_qm_dqflush(dqp, flags); + error = xfs_qm_dqflush(dqp, sync_mode); xfs_dqunlock(dqp); if (error) return error; @@ -926,13 +926,11 @@ xfs_qm_sync( { int recl, restarts; xfs_dquot_t *dqp; - uint flush_flags; int error; if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp)) return 0; - flush_flags = (flags & SYNC_WAIT) ? XFS_QMOPT_SYNC : XFS_QMOPT_DELWRI; restarts = 0; again: @@ -992,7 +990,7 @@ xfs_qm_sync( * across a disk write */ xfs_qm_mplist_unlock(mp); - error = xfs_qm_dqflush(dqp, flush_flags); + error = xfs_qm_dqflush(dqp, flags); xfs_dqunlock(dqp); if (error && XFS_FORCED_SHUTDOWN(mp)) return 0; /* Need to prevent umount failure */ @@ -1796,7 +1794,7 @@ xfs_qm_quotacheck( * successfully. */ if (!error) - error = xfs_qm_dqflush_all(mp, XFS_QMOPT_DELWRI); + error = xfs_qm_dqflush_all(mp, 0); /* * We can get this error if we couldn't do a dquot allocation inside @@ -2018,7 +2016,7 @@ xfs_qm_shake_freelist( * We flush it delayed write, so don't bother * releasing the mplock. */ - error = xfs_qm_dqflush(dqp, XFS_QMOPT_DELWRI); + error = xfs_qm_dqflush(dqp, 0); if (error) { xfs_fs_cmn_err(CE_WARN, dqp->q_mount, "xfs_qm_dqflush_all: dquot %p flush failed", dqp); @@ -2201,7 +2199,7 @@ xfs_qm_dqreclaim_one(void) * We flush it delayed write, so don't bother * releasing the freelist lock. */ - error = xfs_qm_dqflush(dqp, XFS_QMOPT_DELWRI); + error = xfs_qm_dqflush(dqp, 0); if (error) { xfs_fs_cmn_err(CE_WARN, dqp->q_mount, "xfs_qm_dqreclaim: dquot %p flush failed", dqp); diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index 21d11d9..fdcab3f 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h @@ -223,15 +223,9 @@ typedef struct xfs_qoff_logformat { #define XFS_QMOPT_RES_INOS 0x0800000 /* - * flags for dqflush and dqflush_all. - */ -#define XFS_QMOPT_SYNC 0x1000000 -#define XFS_QMOPT_DELWRI 0x4000000 - -/* * flags for dqalloc. */ -#define XFS_QMOPT_INHERIT 0x8000000 +#define XFS_QMOPT_INHERIT 0x1000000 /* * flags to xfs_trans_mod_dquot. -- 1.6.5 From SRS0+ev3T+69+fromorbit.com=dave@internode.on.net Mon Feb 8 21:55:48 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,LOCAL_GNU_PATCH autolearn=no version=3.3.0-rupdated 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 o193tlZj182555 for ; Mon, 8 Feb 2010 21:55:47 -0600 X-ASG-Debug-ID: 1265687818-245400950000-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 6209F1BBE09 for ; Mon, 8 Feb 2010 19:56:59 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id PmukB8oDooE2SVnD for ; Mon, 08 Feb 2010 19:56:59 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 12946199-1927428 for ; Tue, 09 Feb 2010 14:26:57 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NehDS-0000O1-1z for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:46 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NehDR-0002SF-Bc for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:45 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/9] xfs: Use delayed write for inodes rather than async V2 Subject: [PATCH 2/9] xfs: Use delayed write for inodes rather than async V2 Date: Tue, 9 Feb 2010 14:56:35 +1100 Message-Id: <1265687802-23043-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265687802-23043-1-git-send-email-david@fromorbit.com> References: <1265687802-23043-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1265687820 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22048 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 currently do background inode flush asynchronously, resulting in inodes being written in whatever order the background writeback issues them. Not only that, there are also blocking and non-blocking asynchronous inode flushes, depending on where the flush comes from. This patch completely removes asynchronous inode writeback. It removes all the strange writeback modes and replaces them with either a synchronous flush or a non-blocking delayed write flush. That is, inode flushes will only issue IO directly if they are synchronous, and background flushing may do nothing if the operation would block (e.g. on a pinned inode or buffer lock). Delayed write flushes will now result in the inode buffer sitting in the delwri queue of the buffer cache to be flushed by either an AIL push or by the xfsbufd timing out the buffer. This will allow accumulation of dirty inode buffers in memory and allow optimisation of inode cluster writeback at the xfsbufd level where we have much greater queue depths than the block layer elevators. We will also get adjacent inode cluster buffer IO merging for free when a later patch in the series allows sorting of the delayed write buffers before dispatch. This effectively means that any inode that is written back by background writeback will be seen as flush locked during AIL pushing, and will result in the buffers being pushed from there. This writeback path is currently non-optimal, but the next patch in the series will fix that problem. A side effect of this delayed write mechanism is that background inode reclaim will no longer directly flush inodes, nor can it wait on the flush lock. The result is that inode reclaim must leave the inode in the reclaimable state until it is clean. Hence attempts to reclaim a dirty inode in the background will simply skip the inode until it is clean and this allows other mechanisms (i.e. xfsbufd) to do more optimal writeback of the dirty buffers. As a result, the inode reclaim code has been rewritten so that it no longer relies on the ambiguous return values of xfs_iflush() to determine whether it is safe to reclaim an inode. Portions of this patch are derived from patches by Christoph Hellwig. Version 2: - cleanup reclaim code as suggested by Christoph - log background reclaim inode flush errors - just pass sync flags to xfs_iflush Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_super.c | 4 +- fs/xfs/linux-2.6/xfs_sync.c | 105 ++++++++++++++++++++++++++++++------------ fs/xfs/xfs_inode.c | 75 ++---------------------------- fs/xfs/xfs_inode.h | 10 ---- fs/xfs/xfs_inode_item.c | 10 +++- fs/xfs/xfs_mount.c | 13 +++++- 6 files changed, 102 insertions(+), 115 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 6ce828e..3b5b46b 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1064,7 +1064,7 @@ xfs_fs_write_inode( xfs_ilock(ip, XFS_ILOCK_SHARED); xfs_iflock(ip); - error = xfs_iflush(ip, XFS_IFLUSH_SYNC); + error = xfs_iflush(ip, SYNC_WAIT); } else { error = EAGAIN; if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) @@ -1072,7 +1072,7 @@ xfs_fs_write_inode( if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) goto out_unlock; - error = xfs_iflush(ip, XFS_IFLUSH_ASYNC_NOBLOCK); + error = xfs_iflush(ip, 0); } out_unlock: diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 525260c..a9f6d20 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -270,8 +270,7 @@ xfs_sync_inode_attr( goto out_unlock; } - error = xfs_iflush(ip, (flags & SYNC_WAIT) ? - XFS_IFLUSH_SYNC : XFS_IFLUSH_DELWRI); + error = xfs_iflush(ip, flags); out_unlock: xfs_iunlock(ip, XFS_ILOCK_SHARED); @@ -460,16 +459,18 @@ xfs_quiesce_fs( { int count = 0, pincount; + xfs_reclaim_inodes(mp, 0); xfs_flush_buftarg(mp->m_ddev_targp, 0); - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI_ELSE_ASYNC); /* * This loop must run at least twice. The first instance of the loop * will flush most meta data but that will generate more meta data * (typically directory updates). Which then must be flushed and - * logged before we can write the unmount record. + * logged before we can write the unmount record. We also so sync + * reclaim of inodes to catch any that the above delwri flush skipped. */ do { + xfs_reclaim_inodes(mp, SYNC_WAIT); xfs_sync_attr(mp, SYNC_WAIT); pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1); if (!pincount) { @@ -585,7 +586,7 @@ xfs_sync_worker( if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { xfs_log_force(mp, 0); - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI_ELSE_ASYNC); + xfs_reclaim_inodes(mp, 0); /* dgc: errors ignored here */ error = xfs_qm_sync(mp, SYNC_TRYLOCK); error = xfs_sync_fsdata(mp, SYNC_TRYLOCK); @@ -719,21 +720,42 @@ __xfs_inode_clear_reclaim_tag( * shutdown EIO unpin and reclaim * clean, unpinned 0 reclaim * stale, unpinned 0 reclaim - * clean, pinned(*) 0 unpin and reclaim - * stale, pinned 0 unpin and reclaim - * dirty, async 0 block on flush lock, reclaim - * dirty, sync flush 0 block on flush lock, reclaim + * clean, pinned(*) 0 requeue + * stale, pinned EAGAIN requeue + * dirty, delwri ok 0 requeue + * dirty, delwri blocked EAGAIN requeue + * dirty, sync flush 0 reclaim * * (*) dgc: I don't think the clean, pinned state is possible but it gets * handled anyway given the order of checks implemented. * + * As can be seen from the table, the return value of xfs_iflush() is not + * sufficient to correctly decide the reclaim action here. The checks in + * xfs_iflush() might look like duplicates, but they are not. + * + * Also, because we get the flush lock first, we know that any inode that has + * been flushed delwri has had the flush completed by the time we check that + * the inode is clean. The clean inode check needs to be done before flushing + * the inode delwri otherwise we would loop forever requeuing clean inodes as + * we cannot tell apart a successful delwri flush and a clean inode from the + * return value of xfs_iflush(). + * + * Note that because the inode is flushed delayed write by background + * writeback, the flush lock may already be held here and waiting on it can + * result in very long latencies. Hence for sync reclaims, where we wait on the + * flush lock, the caller should push out delayed write inodes first before + * trying to reclaim them to minimise the amount of time spent waiting. For + * background relaim, we just requeue the inode for the next pass. + * * Hence the order of actions after gaining the locks should be: * bad => reclaim * shutdown => unpin and reclaim - * pinned => unpin + * pinned, delwri => requeue + * pinned, sync => unpin * stale => reclaim * clean => reclaim - * dirty => flush, wait and reclaim + * dirty, delwri => flush and requeue + * dirty, sync => flush, wait and reclaim */ STATIC int xfs_reclaim_inode( @@ -741,7 +763,7 @@ xfs_reclaim_inode( struct xfs_perag *pag, int sync_mode) { - int error; + int error = 0; /* * The radix tree lock here protects a thread in xfs_iget from racing @@ -761,7 +783,11 @@ xfs_reclaim_inode( write_unlock(&pag->pag_ici_lock); xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_iflock(ip); + if (!xfs_iflock_nowait(ip)) { + if (!(sync_mode & SYNC_WAIT)) + goto out; + xfs_iflock(ip); + } if (is_bad_inode(VFS_I(ip))) goto reclaim; @@ -769,8 +795,13 @@ xfs_reclaim_inode( xfs_iunpin_wait(ip); goto reclaim; } - if (xfs_ipincount(ip)) + if (xfs_ipincount(ip)) { + if (!(sync_mode & SYNC_WAIT)) { + xfs_ifunlock(ip); + goto out; + } xfs_iunpin_wait(ip); + } if (xfs_iflags_test(ip, XFS_ISTALE)) goto reclaim; if (xfs_inode_clean(ip)) @@ -778,27 +809,43 @@ xfs_reclaim_inode( /* Now we have an inode that needs flushing */ error = xfs_iflush(ip, sync_mode); - if (!error) { - switch(sync_mode) { - case XFS_IFLUSH_DELWRI_ELSE_ASYNC: - case XFS_IFLUSH_DELWRI: - case XFS_IFLUSH_ASYNC: - case XFS_IFLUSH_DELWRI_ELSE_SYNC: - case XFS_IFLUSH_SYNC: - /* IO issued, synchronise with IO completion */ - xfs_iflock(ip); - break; - default: - ASSERT(0); - break; - } + if (sync_mode & SYNC_WAIT) { + xfs_iflock(ip); + goto reclaim; } + /* + * When we have to flush an inode but don't have SYNC_WAIT set, we + * flush the inode out using a delwri buffer and wait for the next + * call into reclaim to find it in a clean state instead of waiting for + * it now. We also don't return errors here - if the error is transient + * then the next reclaim pass will flush the inode, and if the error + * is permanent then the next sync reclaim will relcaim the inode and + * pass on the error. + */ + if (error && !XFS_FORCED_SHUTDOWN(ip->i_mount)) { + xfs_fs_cmn_err(CE_WARN, ip->i_mount, + "inode 0x%llx background reclaim flush failed with %d", + (long long)ip->i_ino, error); + } +out: + xfs_iflags_clear(ip, XFS_IRECLAIM); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + /* + * We could return EAGAIN here to make reclaim rescan the inode tree in + * a short while. However, this just burns CPU time scanning the tree + * waiting for IO to complete and xfssyncd never goes back to the idle + * state. Instead, return 0 to let the next scheduled background reclaim + * attempt to reclaim the inode again. + */ + return 0; + reclaim: xfs_ifunlock(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); xfs_ireclaim(ip); - return 0; + return error; + } int diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8d0666d..fa31360 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2835,8 +2835,6 @@ xfs_iflush( xfs_dinode_t *dip; xfs_mount_t *mp; int error; - int noblock = (flags == XFS_IFLUSH_ASYNC_NOBLOCK); - enum { INT_DELWRI = (1 << 0), INT_ASYNC = (1 << 1) }; XFS_STATS_INC(xs_iflush_count); @@ -2859,7 +2857,7 @@ xfs_iflush( * in the same cluster are dirty, they will probably write the inode * out for us if they occur after the log force completes. */ - if (noblock && xfs_ipincount(ip)) { + if (!(flags & SYNC_WAIT) && xfs_ipincount(ip)) { xfs_iunpin_nowait(ip); xfs_ifunlock(ip); return EAGAIN; @@ -2893,60 +2891,10 @@ xfs_iflush( } /* - * Decide how buffer will be flushed out. This is done before - * the call to xfs_iflush_int because this field is zeroed by it. - */ - if (iip != NULL && iip->ili_format.ilf_fields != 0) { - /* - * Flush out the inode buffer according to the directions - * of the caller. In the cases where the caller has given - * us a choice choose the non-delwri case. This is because - * the inode is in the AIL and we need to get it out soon. - */ - switch (flags) { - case XFS_IFLUSH_SYNC: - case XFS_IFLUSH_DELWRI_ELSE_SYNC: - flags = 0; - break; - case XFS_IFLUSH_ASYNC_NOBLOCK: - case XFS_IFLUSH_ASYNC: - case XFS_IFLUSH_DELWRI_ELSE_ASYNC: - flags = INT_ASYNC; - break; - case XFS_IFLUSH_DELWRI: - flags = INT_DELWRI; - break; - default: - ASSERT(0); - flags = 0; - break; - } - } else { - switch (flags) { - case XFS_IFLUSH_DELWRI_ELSE_SYNC: - case XFS_IFLUSH_DELWRI_ELSE_ASYNC: - case XFS_IFLUSH_DELWRI: - flags = INT_DELWRI; - break; - case XFS_IFLUSH_ASYNC_NOBLOCK: - case XFS_IFLUSH_ASYNC: - flags = INT_ASYNC; - break; - case XFS_IFLUSH_SYNC: - flags = 0; - break; - default: - ASSERT(0); - flags = 0; - break; - } - } - - /* * Get the buffer containing the on-disk inode. */ error = xfs_itobp(mp, NULL, ip, &dip, &bp, - noblock ? XBF_TRYLOCK : XBF_LOCK); + (flags & SYNC_WAIT) ? XBF_LOCK : XBF_TRYLOCK); if (error || !bp) { xfs_ifunlock(ip); return error; @@ -2974,13 +2922,10 @@ xfs_iflush( if (error) goto cluster_corrupt_out; - if (flags & INT_DELWRI) { - xfs_bdwrite(mp, bp); - } else if (flags & INT_ASYNC) { - error = xfs_bawrite(mp, bp); - } else { + if (flags & SYNC_WAIT) error = xfs_bwrite(mp, bp); - } + else + xfs_bdwrite(mp, bp); return error; corrupt_out: @@ -3015,16 +2960,6 @@ xfs_iflush_int( iip = ip->i_itemp; mp = ip->i_mount; - - /* - * If the inode isn't dirty, then just release the inode - * flush lock and do nothing. - */ - if (xfs_inode_clean(ip)) { - xfs_ifunlock(ip); - return 0; - } - /* set *dip = inode's place in the buffer */ dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 8b618ea..6c912b0 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -420,16 +420,6 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) #define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_SHIFT) /* - * Flags for xfs_iflush() - */ -#define XFS_IFLUSH_DELWRI_ELSE_SYNC 1 -#define XFS_IFLUSH_DELWRI_ELSE_ASYNC 2 -#define XFS_IFLUSH_SYNC 3 -#define XFS_IFLUSH_ASYNC 4 -#define XFS_IFLUSH_DELWRI 5 -#define XFS_IFLUSH_ASYNC_NOBLOCK 6 - -/* * Flags for xfs_itruncate_start(). */ #define XFS_ITRUNC_DEFINITE 0x1 diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 48ec1c0..207553e 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -866,10 +866,14 @@ xfs_inode_item_push( iip->ili_format.ilf_fields != 0); /* - * Write out the inode. The completion routine ('iflush_done') will - * pull it from the AIL, mark it clean, unlock the flush lock. + * Push the inode to it's backing buffer. This will not remove the + * inode from the AIL - a further push will be required to trigger a + * buffer push. However, this allows all the dirty inodes to be pushed + * to the buffer before it is pushed to disk. THe buffer IO completion + * will pull th einode from the AIL, mark it clean and unlock the flush + * lock. */ - (void) xfs_iflush(ip, XFS_IFLUSH_ASYNC); + (void) xfs_iflush(ip, 0); xfs_iunlock(ip, XFS_ILOCK_SHARED); return; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 5061149..6afaaeb 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1468,7 +1468,18 @@ xfs_unmountfs( * need to force the log first. */ xfs_log_force(mp, XFS_LOG_SYNC); - xfs_reclaim_inodes(mp, XFS_IFLUSH_ASYNC); + + /* + * Do a delwri reclaim pass first so that as many dirty inodes are + * queued up for IO as possible. Then flush the buffers before making + * a synchronous path to catch all the remaining inodes are reclaimed. + * This makes the reclaim process as quick as possible by avoiding + * synchronous writeout and blocking on inodes already in the delwri + * state as much as possible. + */ + xfs_reclaim_inodes(mp, 0); + XFS_bflush(mp->m_ddev_targp); + xfs_reclaim_inodes(mp, SYNC_WAIT); xfs_qm_unmount(mp); -- 1.6.5 From SRS0+Ag99+69+fromorbit.com=dave@internode.on.net Mon Feb 8 21:55:54 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o193trbf182599 for ; Mon, 8 Feb 2010 21:55:53 -0600 X-ASG-Debug-ID: 1265687825-287700400000-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 DC44E1BBE0F for ; Mon, 8 Feb 2010 19:57:05 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id wegbsKG9MbXMmiZy for ; Mon, 08 Feb 2010 19:57:05 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13074394-1927428 for multiple; Tue, 09 Feb 2010 14:26:58 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NehDc-0000OR-CA; Tue, 09 Feb 2010 14:56:56 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NehDb-0002Xr-Jn; Tue, 09 Feb 2010 14:56:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: Christoph Hellwig X-ASG-Orig-Subj: [PATCH 7/9] xfs: remove invalid barrier optimization from xfs_fsync Subject: [PATCH 7/9] xfs: remove invalid barrier optimization from xfs_fsync Date: Tue, 9 Feb 2010 14:56:40 +1100 Message-Id: <1265687802-23043-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265687802-23043-1-git-send-email-david@fromorbit.com> References: <1265687802-23043-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1265687826 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22048 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 We always need to flush the disk write cache and can't skip it just because the no inode attributes have changed. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/xfs_vnodeops.c | 12 ++---------- 1 files changed, 2 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index fd108b7..43241e2 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -597,7 +597,7 @@ xfs_fsync( { xfs_trans_t *tp; int error = 0; - int log_flushed = 0, changed = 1; + int log_flushed = 0; xfs_itrace_entry(ip); @@ -627,18 +627,10 @@ xfs_fsync( * disk yet, the inode will be still be pinned. If it is, * force the log. */ - xfs_iunlock(ip, XFS_ILOCK_SHARED); - if (xfs_ipincount(ip)) { error = _xfs_log_force(ip->i_mount, XFS_LOG_SYNC, &log_flushed); - } else { - /* - * If the inode is not pinned and nothing has changed - * we don't need to flush the cache. - */ - changed = 0; } } else { /* @@ -673,7 +665,7 @@ xfs_fsync( xfs_iunlock(ip, XFS_ILOCK_EXCL); } - if ((ip->i_mount->m_flags & XFS_MOUNT_BARRIER) && changed) { + if (ip->i_mount->m_flags & XFS_MOUNT_BARRIER) { /* * If the log write didn't issue an ordered tag we need * to flush the disk cache for the data device now. -- 1.6.5 From SRS0+WGMz+69+fromorbit.com=dave@internode.on.net Mon Feb 8 21:55:57 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o193tuQf182615 for ; Mon, 8 Feb 2010 21:55:57 -0600 X-ASG-Debug-ID: 1265687828-14e502bd0000-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 D97591CB5F5D for ; Mon, 8 Feb 2010 19:57:08 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id qjCiCZHM4Ec9doRV for ; Mon, 08 Feb 2010 19:57:08 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13236073-1927428 for ; Tue, 09 Feb 2010 14:27:07 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NehDm-0000Og-E6 for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:57:06 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NehDb-0002Xx-Ns for xfs@oss.sgi.com; Tue, 09 Feb 2010 14:56:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 9/9] xfs: kill xfs_bawrite Subject: [PATCH 9/9] xfs: kill xfs_bawrite Date: Tue, 9 Feb 2010 14:56:42 +1100 Message-Id: <1265687802-23043-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265687802-23043-1-git-send-email-david@fromorbit.com> References: <1265687802-23043-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1265687829 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22048 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 There are no more users of this function left in the XFS code now that we've switched everything to delayed write flushing. Remove it. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_buf.c | 19 ------------------- fs/xfs/linux-2.6/xfs_buf.h | 1 - 2 files changed, 0 insertions(+), 20 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 4556a4c..d50df3a 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -1078,25 +1078,6 @@ xfs_bwrite( return error; } -int -xfs_bawrite( - void *mp, - struct xfs_buf *bp) -{ - trace_xfs_buf_bawrite(bp, _RET_IP_); - - ASSERT(bp->b_bn != XFS_BUF_DADDR_NULL); - - xfs_buf_delwri_dequeue(bp); - - bp->b_flags &= ~(XBF_READ | XBF_DELWRI | XBF_READ_AHEAD); - bp->b_flags |= (XBF_WRITE | XBF_ASYNC | _XBF_RUN_QUEUES); - - bp->b_mount = mp; - bp->b_strat = xfs_bdstrat_cb; - return xfs_bdstrat_cb(bp); -} - void xfs_bdwrite( void *mp, diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index be45e8c..386e736 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h @@ -233,7 +233,6 @@ extern void xfs_buf_unlock(xfs_buf_t *); /* Buffer Read and Write Routines */ extern int xfs_bwrite(struct xfs_mount *mp, struct xfs_buf *bp); -extern int xfs_bawrite(void *mp, xfs_buf_t *bp); extern void xfs_bdwrite(void *mp, xfs_buf_t *bp); extern void xfsbdstrat(struct xfs_mount *, struct xfs_buf *); -- 1.6.5 From SRS0+WGMz+69+fromorbit.com=dave@internode.on.net Mon Feb 8 21:55:59 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o193twYm182630 for ; Mon, 8 Feb 2010 21:55:58 -0600 X-ASG-Debug-ID: 1265687829-2453009e0000-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 8C8E41BBE11 for ; Mon, 8 Feb 2010 19:57:10 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id 5Z5DTc6nIOq6v5rl for ; Mon, 08 Feb 2010 19:57:10 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 1461910-1927428 for multiple; Tue, 09 Feb 2010 14:26:58 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NehDc-0000OT-Ds; Tue, 09 Feb 2010 14:56:56 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NehDb-0002Xt-MC; Tue, 09 Feb 2010 14:56:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: Christoph Hellwig X-ASG-Orig-Subj: [PATCH 8/9] xfs: log changed inodes instead of writing them synchronously Subject: [PATCH 8/9] xfs: log changed inodes instead of writing them synchronously Date: Tue, 9 Feb 2010 14:56:41 +1100 Message-Id: <1265687802-23043-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1265687802-23043-1-git-send-email-david@fromorbit.com> References: <1265687802-23043-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1265687831 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22048 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 When an inode has already be flushed delayed write, xfs_inode_clean() returns true and hence xfs_fs_write_inode() can return on a synchronous inode write without having written the inode. Currently these sycnhronous writes only come sync(1), unmount, a sycnhronous NFS export and cachefiles so should be relatively rare and out of common performance paths. Realistically, a synchronous inode write is not necessary here; we can avoid writing the inode by logging any non-transactional changes that are pending. This needs to be done with synchronous transactions, but it avoids seeking between the log and inode clusters as we do now. We don't force the log if the inode is pinned, though, so this differs from the fsync case. For normal sys_sync and unmount behaviour this is fine because we do a synchronous log force in xfs_sync_data which is called from the ->sync_fs code. It does however break the NFS synchronous export guarantees for now, but work is under way to fix this at a higher level or for the higher level to provide an additional flag in the writeback control to tell us that a log force is needed. Portions of this patch are based on work from Dave Chinner. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Alex Elder Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 111 +++++++++++++++++++++++++++++++----------- 1 files changed, 82 insertions(+), 29 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 3b5b46b..25ea240 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1021,12 +1021,45 @@ xfs_fs_dirty_inode( XFS_I(inode)->i_update_core = 1; } -/* - * Attempt to flush the inode, this will actually fail - * if the inode is pinned, but we dirty the inode again - * at the point when it is unpinned after a log write, - * since this is when the inode itself becomes flushable. - */ +STATIC int +xfs_log_inode( + struct xfs_inode *ip) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + int error; + + xfs_iunlock(ip, XFS_ILOCK_SHARED); + tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS); + error = xfs_trans_reserve(tp, 0, XFS_FSYNC_TS_LOG_RES(mp), 0, 0, 0); + + if (error) { + xfs_trans_cancel(tp, 0); + /* we need to return with the lock hold shared */ + xfs_ilock(ip, XFS_ILOCK_SHARED); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + + /* + * Note - it's possible that we might have pushed ourselves out of the + * way during trans_reserve which would flush the inode. But there's + * no guarantee that the inode buffer has actually gone out yet (it's + * delwri). Plus the buffer could be pinned anyway if it's part of + * an inode in another recent transaction. So we play it safe and + * fire off the transaction anyway. + */ + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + xfs_trans_ihold(tp, ip); + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + xfs_trans_set_sync(tp); + error = xfs_trans_commit(tp, 0); + xfs_ilock_demote(ip, XFS_ILOCK_EXCL); + + return error; +} + STATIC int xfs_fs_write_inode( struct inode *inode, @@ -1034,7 +1067,7 @@ xfs_fs_write_inode( { struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; - int error = 0; + int error = EAGAIN; xfs_itrace_entry(ip); @@ -1045,35 +1078,55 @@ xfs_fs_write_inode( error = xfs_wait_on_pages(ip, 0, -1); if (error) goto out; - } - - /* - * Bypass inodes which have already been cleaned by - * the inode flush clustering code inside xfs_iflush - */ - if (xfs_inode_clean(ip)) - goto out; - /* - * We make this non-blocking if the inode is contended, return - * EAGAIN to indicate to the caller that they did not succeed. - * This prevents the flush path from blocking on inodes inside - * another operation right now, they get caught later by xfs_sync. - */ - if (sync) { + /* + * Make sure the inode has hit stable storage. By using the + * log and the fsync transactions we reduce the IOs we have + * to do here from two (log and inode) to just the log. + * + * Note: We still need to do a delwri write of the inode after + * this to flush it to the backing buffer so that bulkstat + * works properly if this is the first time the inode has been + * written. Because we hold the ilock atomically over the + * transaction commit and the inode flush we are guaranteed + * that the inode is not pinned when it returns. If the flush + * lock is already held, then the inode has already been + * flushed once and we don't need to flush it again. Hence + * the code will only flush the inode if it isn't already + * being flushed. + */ xfs_ilock(ip, XFS_ILOCK_SHARED); - xfs_iflock(ip); - - error = xfs_iflush(ip, SYNC_WAIT); + if (ip->i_update_core) { + error = xfs_log_inode(ip); + if (error) + goto out_unlock; + } } else { - error = EAGAIN; + /* + * We make this non-blocking if the inode is contended, return + * EAGAIN to indicate to the caller that they did not succeed. + * This prevents the flush path from blocking on inodes inside + * another operation right now, they get caught later by xfs_sync. + */ if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) goto out; - if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) - goto out_unlock; + } + + if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) + goto out_unlock; - error = xfs_iflush(ip, 0); + /* + * Now we have the flush lock and the inode is not pinned, we can check + * if the inode is really clean as we know that there are no pending + * transaction completions, it is not waiting on the delayed write + * queue and there is no IO in progress. + */ + if (xfs_inode_clean(ip)) { + xfs_ifunlock(ip); + error = 0; + goto out_unlock; } + error = xfs_iflush(ip, 0); out_unlock: xfs_iunlock(ip, XFS_ILOCK_SHARED); -- 1.6.5 From patrick@news-service.com Tue Feb 9 02:47:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o198lVEP202585 for ; Tue, 9 Feb 2010 02:47:32 -0600 X-ASG-Debug-ID: 1265705322-2f34020f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from pu01.news-service.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 62A00138B50C for ; Tue, 9 Feb 2010 00:48:42 -0800 (PST) Received: from pu01.news-service.com (ns1.news-service.com [195.114.240.3]) by cuda.sgi.com with ESMTP id qkyP3e4f78DIrjyB for ; Tue, 09 Feb 2010 00:48:42 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by pu01.news-service.com (Postfix) with ESMTP id BF8C213E29; Tue, 9 Feb 2010 09:48:41 +0100 (CET) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: Debian amavisd-new at pu01.news-service.com Received: from pu01.news-service.com ([127.0.0.1]) by localhost (pu01.nse [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id UiG+Mt-WX8qX; Tue, 9 Feb 2010 09:48:39 +0100 (CET) Received: from [172.25.4.14] (fw01.nse [172.25.8.1]) by pu01.news-service.com (Postfix) with ESMTP id 03F1013E24; Tue, 9 Feb 2010 09:48:38 +0100 (CET) Message-ID: <4B712166.9010701@news-service.com> Date: Tue, 09 Feb 2010 09:48:38 +0100 From: Patrick Schreurs User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.7) Gecko/20100111 Thunderbird/3.0.1 MIME-Version: 1.0 To: Christoph Hellwig CC: Dave Chinner , Tommy van Leeuwen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Subject: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) References: <4AF0422D.1070104@news-service.com> <20091114162126.GB17658@infradead.org> <4B0A8075.8080008@news-service.com> <20091211115932.GA20632@infradead.org> <4B3F9F88.9030307@news-service.com> <20100107110446.GA13802@discord.disaster> <4B45CFAC.4000607@news-service.com> <20100108113114.GA8654@discord.disaster> <4B504B03.7050604@news-service.com> <4B6706CE.1020207@news-service.com> <20100208194226.GD9527@infradead.org> In-Reply-To: <20100208194226.GD9527@infradead.org> Content-Type: multipart/mixed; boundary="------------090506040001040402060507" X-Barracuda-Connect: ns1.news-service.com[195.114.240.3] X-Barracuda-Start-Time: 1265705323 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22065 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean This is a multi-part message in MIME format. --------------090506040001040402060507 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 8-2-2010 20:42, Christoph Hellwig wrote: > On Mon, Feb 01, 2010 at 05:52:30PM +0100, Patrick Schreurs wrote: >> Hello Dave, >> >> I'm afraid we had another crash a few days ago. Have a look at the >> screenshot. Can you make anything out of it? This server is running >> 2.6.32.3 with your inode-reclaim patch applied and XFS_DEBUG still >> enabled. > > Just wondering, which set of patches is this exactly? This is a clean 2.6.32.3 with the xfs-inode-reclaim-2.6.32 patch i received from Dave on January 8th (see attachment). Thanks, -Patrick --------------090506040001040402060507 Content-Type: text/plain; name="xfs-inode-reclaim-2.6.32" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xfs-inode-reclaim-2.6.32" diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 18a4b8e..f3c622a 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -930,13 +930,37 @@ xfs_fs_alloc_inode( */ STATIC void xfs_fs_destroy_inode( - struct inode *inode) + struct inode *inode) { - xfs_inode_t *ip = XFS_I(inode); + struct xfs_inode *ip = XFS_I(inode); + + xfs_itrace_entry(ip); XFS_STATS_INC(vn_reclaim); - if (xfs_reclaim(ip)) - panic("%s: cannot reclaim 0x%p\n", __func__, inode); + + /* bad inode, get out here ASAP */ + if (is_bad_inode(inode)) + goto out_reclaim; + + xfs_ioend_wait(ip); + + ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); + + /* + * We should never get here with one of the reclaim flags already set. + */ + ASSERT_ALWAYS(!xfs_iflags_test(ip, XFS_IRECLAIMABLE)); + ASSERT_ALWAYS(!xfs_iflags_test(ip, XFS_IRECLAIM)); + + /* + * 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. + */ +out_reclaim: + xfs_inode_set_reclaim_tag(ip); } /* diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 961df0a..897fcb5 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -54,7 +54,8 @@ xfs_inode_ag_lookup( struct xfs_mount *mp, struct xfs_perag *pag, uint32_t *first_index, - int tag) + int tag, + int write_lock) { int nr_found; struct xfs_inode *ip; @@ -64,7 +65,10 @@ xfs_inode_ag_lookup( * as the tree is sparse and a gang lookup walks to find * the number of objects requested. */ - read_lock(&pag->pag_ici_lock); + if (write_lock) + write_lock(&pag->pag_ici_lock); + else + read_lock(&pag->pag_ici_lock); if (tag == XFS_ICI_NO_TAG) { nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void **)&ip, *first_index, 1); @@ -88,7 +92,10 @@ xfs_inode_ag_lookup( return ip; unlock: - read_unlock(&pag->pag_ici_lock); + if (write_lock) + write_unlock(&pag->pag_ici_lock); + else + read_unlock(&pag->pag_ici_lock); return NULL; } @@ -99,7 +106,8 @@ xfs_inode_ag_walk( int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), int flags, - int tag) + int tag, + int write_lock) { struct xfs_perag *pag = &mp->m_perag[ag]; uint32_t first_index; @@ -113,7 +121,8 @@ restart: int error = 0; xfs_inode_t *ip; - ip = xfs_inode_ag_lookup(mp, pag, &first_index, tag); + ip = xfs_inode_ag_lookup(mp, pag, &first_index, tag, + write_lock); if (!ip) break; @@ -147,7 +156,8 @@ xfs_inode_ag_iterator( int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), int flags, - int tag) + int tag, + int write_lock) { int error = 0; int last_error = 0; @@ -156,7 +166,8 @@ xfs_inode_ag_iterator( 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); + error = xfs_inode_ag_walk(mp, ag, execute, flags, tag, + write_lock); if (error) { last_error = error; if (error == EFSCORRUPTED) @@ -180,18 +191,20 @@ xfs_sync_inode_valid( return EFSCORRUPTED; } - /* - * If we can't get a reference on the inode, it must be in reclaim. - * Leave it for the reclaim code to flush. Also avoid inodes that - * haven't been fully initialised. - */ + /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ + if (xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) { + read_unlock(&pag->pag_ici_lock); + return ENOENT; + } + + /* If we can't get a reference on the inode, it must be in reclaim. */ if (!igrab(inode)) { read_unlock(&pag->pag_ici_lock); return ENOENT; } read_unlock(&pag->pag_ici_lock); - if (is_bad_inode(inode) || xfs_iflags_test(ip, XFS_INEW)) { + if (is_bad_inode(inode)) { IRELE(ip); return ENOENT; } @@ -281,7 +294,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); + XFS_ICI_NO_TAG, 0); if (error) return XFS_ERROR(error); @@ -303,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); + XFS_ICI_NO_TAG, 0); } STATIC int @@ -663,36 +676,11 @@ xfs_syncd_stop( kthread_stop(mp->m_sync_task); } -int +STATIC int xfs_reclaim_inode( xfs_inode_t *ip, - int locked, int sync_mode) { - xfs_perag_t *pag = xfs_get_perag(ip->i_mount, ip->i_ino); - - /* The hash lock here protects a thread in xfs_iget_core from - * racing with us on linking the inode back with a vnode. - * Once we have the XFS_IRECLAIM flag set it will not touch - * us. - */ - write_lock(&pag->pag_ici_lock); - spin_lock(&ip->i_flags_lock); - if (__xfs_iflags_test(ip, XFS_IRECLAIM) || - !__xfs_iflags_test(ip, XFS_IRECLAIMABLE)) { - spin_unlock(&ip->i_flags_lock); - write_unlock(&pag->pag_ici_lock); - if (locked) { - xfs_ifunlock(ip); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - } - return -EAGAIN; - } - __xfs_iflags_set(ip, XFS_IRECLAIM); - spin_unlock(&ip->i_flags_lock); - write_unlock(&pag->pag_ici_lock); - xfs_put_perag(ip->i_mount, pag); - /* * If the inode is still dirty, then flush it out. If the inode * is not in the AIL, then it will be OK to flush it delwri as @@ -704,14 +692,14 @@ xfs_reclaim_inode( * We get the flush lock regardless, though, just to make sure * we don't free it while it is being flushed. */ - if (!locked) { - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_iflock(ip); - } + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_iflock(ip); /* * In the case of a forced shutdown we rely on xfs_iflush() to * wait for the inode to be unpinned before returning an error. + * Because we hold the flush lock, we know that the inode cannot + * be under IO, so if it reports clean it can be reclaimed. */ if (!is_bad_inode(VFS_I(ip)) && xfs_iflush(ip, sync_mode) == 0) { /* synchronize with xfs_iflush_done */ @@ -771,14 +759,24 @@ xfs_reclaim_inode_now( struct xfs_perag *pag, int flags) { - /* ignore if already under reclaim */ - if (xfs_iflags_test(ip, XFS_IRECLAIM)) { - read_unlock(&pag->pag_ici_lock); + /* + * The radix tree lock here protects a thread in xfs_iget from racing + * with us starting reclaim on the inode. Once we have the + * XFS_IRECLAIM flag set it will not touch us. + */ + spin_lock(&ip->i_flags_lock); + ASSERT_ALWAYS(__xfs_iflags_test(ip, XFS_IRECLAIMABLE)); + if (__xfs_iflags_test(ip, XFS_IRECLAIM)) { + /* ignore as it is already under reclaim */ + spin_unlock(&ip->i_flags_lock); + write_unlock(&pag->pag_ici_lock); return 0; } - read_unlock(&pag->pag_ici_lock); + __xfs_iflags_set(ip, XFS_IRECLAIM); + spin_unlock(&ip->i_flags_lock); + write_unlock(&pag->pag_ici_lock); - return xfs_reclaim_inode(ip, 0, flags); + return xfs_reclaim_inode(ip, flags); } int @@ -787,5 +785,5 @@ xfs_reclaim_inodes( int mode) { return xfs_inode_ag_iterator(mp, xfs_reclaim_inode_now, mode, - XFS_ICI_RECLAIM_TAG); + XFS_ICI_RECLAIM_TAG, 1); } diff --git a/fs/xfs/linux-2.6/xfs_sync.h b/fs/xfs/linux-2.6/xfs_sync.h index 27920eb..ea932b4 100644 --- a/fs/xfs/linux-2.6/xfs_sync.h +++ b/fs/xfs/linux-2.6/xfs_sync.h @@ -44,7 +44,6 @@ void xfs_quiesce_attr(struct xfs_mount *mp); void xfs_flush_inodes(struct xfs_inode *ip); -int xfs_reclaim_inode(struct xfs_inode *ip, int locked, int sync_mode); int xfs_reclaim_inodes(struct xfs_mount *mp, int mode); void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); @@ -55,6 +54,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 flags, int tag, int write_lock); #endif diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 5d1a3b9..f99cfa4 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -893,7 +893,7 @@ xfs_qm_dqrele_all_inodes( uint flags) { ASSERT(mp->m_quotainfo); - xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG); + xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG, 0); } /*------------------------------------------------------------------------*/ diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 80e5264..40e8775 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -511,17 +511,21 @@ xfs_ireclaim( { struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; + xfs_agino_t agino = XFS_INO_TO_AGINO(mp, ip->i_ino); XFS_STATS_INC(xs_ig_reclaims); /* - * Remove the inode from the per-AG radix tree. It doesn't matter - * if it was never added to it because radix_tree_delete can deal - * with that case just fine. + * Remove the inode from the per-AG radix tree. + * + * Because radix_tree_delete won't complain even if the item was never + * added to the tree assert that it's been there before to catch + * problems with the inode life time early on. */ pag = xfs_get_perag(mp, ip->i_ino); write_lock(&pag->pag_ici_lock); - radix_tree_delete(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino)); + if (!radix_tree_delete(&pag->pag_ici_root, agino)) + ASSERT(0); write_unlock(&pag->pag_ici_lock); xfs_put_perag(mp, pag); diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index b92a4fa..13d7d21 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2877,10 +2877,14 @@ xfs_iflush( mp = ip->i_mount; /* - * If the inode isn't dirty, then just release the inode - * flush lock and do nothing. + * If the inode isn't dirty, then just release the inode flush lock and + * do nothing. Treat stale inodes the same; we cannot rely on the + * backing buffer remaining stale in cache for the remaining life of + * the stale inode and so xfs_itobp() below may give us a buffer that + * no longer contains inodes below. Doing this stale check here also + * avoids forcing the log on pinned, stale inodes. */ - if (xfs_inode_clean(ip)) { + if (xfs_inode_clean(ip) || xfs_iflags_test(ip, XFS_ISTALE)) { xfs_ifunlock(ip); return 0; } diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index b572f7e..3fac146 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -2456,46 +2456,6 @@ xfs_set_dmattrs( return error; } -int -xfs_reclaim( - xfs_inode_t *ip) -{ - - xfs_itrace_entry(ip); - - ASSERT(!VN_MAPPED(VFS_I(ip))); - - /* bad inode, get out here ASAP */ - if (is_bad_inode(VFS_I(ip))) { - xfs_ireclaim(ip); - return 0; - } - - xfs_ioend_wait(ip); - - ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); - - /* - * If we have nothing to flush with this inode then complete the - * teardown now, otherwise break the link between the xfs inode and the - * linux inode and clean up the xfs inode later. This avoids flushing - * the inode to disk during the delete operation itself. - * - * When breaking the link, we need to set the XFS_IRECLAIMABLE flag - * first to ensure that xfs_iunpin() will never see an xfs inode - * that has a linux inode being reclaimed. Synchronisation is provided - * by the i_flags_lock. - */ - if (!ip->i_update_core && (ip->i_itemp == NULL)) { - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_iflock(ip); - xfs_iflags_set(ip, XFS_IRECLAIMABLE); - return xfs_reclaim_inode(ip, 1, XFS_IFLUSH_DELWRI_ELSE_SYNC); - } - xfs_inode_set_reclaim_tag(ip); - return 0; -} - /* * xfs_alloc_file_space() * This routine allocates disk space for the given file. diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h index a9e102d..167a467 100644 --- a/fs/xfs/xfs_vnodeops.h +++ b/fs/xfs/xfs_vnodeops.h @@ -38,7 +38,6 @@ int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, const char *target_path, mode_t mode, struct xfs_inode **ipp, cred_t *credp); int xfs_set_dmattrs(struct xfs_inode *ip, u_int evmask, u_int16_t state); -int xfs_reclaim(struct xfs_inode *ip); int xfs_change_file_space(struct xfs_inode *ip, int cmd, xfs_flock64_t *bf, xfs_off_t offset, int attr_flags); int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, --------------090506040001040402060507-- From BATV+f4938f14c6ec46ffcbb1+2361+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 9 04:30:51 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,LOCAL_GNU_PATCH autolearn=no version=3.3.0-rupdated 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 o19AUm5m208889 for ; Tue, 9 Feb 2010 04:30:50 -0600 X-ASG-Debug-ID: 1265711521-3c2f00770000-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 B26441BC9F4 for ; Tue, 9 Feb 2010 02:32:01 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id OqFIXf5ZqnsuQGjV for ; Tue, 09 Feb 2010 02:32:01 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NenNu-0002aR-1T; Tue, 09 Feb 2010 10:31:58 +0000 Date: Tue, 9 Feb 2010 05:31:57 -0500 From: Christoph Hellwig To: Patrick Schreurs Cc: Christoph Hellwig , Dave Chinner , Tommy van Leeuwen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Subject: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Message-ID: <20100209103157.GA5197@infradead.org> References: <4B0A8075.8080008@news-service.com> <20091211115932.GA20632@infradead.org> <4B3F9F88.9030307@news-service.com> <20100107110446.GA13802@discord.disaster> <4B45CFAC.4000607@news-service.com> <20100108113114.GA8654@discord.disaster> <4B504B03.7050604@news-service.com> <4B6706CE.1020207@news-service.com> <20100208194226.GD9527@infradead.org> <4B712166.9010701@news-service.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B712166.9010701@news-service.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: 1265711521 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, Feb 09, 2010 at 09:48:38AM +0100, Patrick Schreurs wrote: > This is a clean 2.6.32.3 with the xfs-inode-reclaim-2.6.32 patch i > received from Dave on January 8th (see attachment). I can't find anything interesting regarding I_RECLAIMABLE manipulation in there. The only thing I could think off going wrong is i_flags and i_update_core sitting in the same word and the compiler causing some read-modify-write cycles for it. Can you test the patch below? It fixes the abose issue up, and to make sure sure the assert you hit isn't as lethal changes it into a WARN_ON, which will still print the backtrace, but not crash the machine. Index: linux-2.6/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_super.c 2010-02-09 10:38:51.771004413 +0100 +++ linux-2.6/fs/xfs/linux-2.6/xfs_super.c 2010-02-09 10:42:02.102254796 +0100 @@ -1004,13 +1004,13 @@ xfs_fs_inode_init_once( * Dirty the XFS inode when mark_inode_dirty_sync() is called so that * we catch unlogged VFS level updates to the inode. Care must be taken * here - the transaction code calls mark_inode_dirty_sync() to mark the - * VFS inode dirty in a transaction and clears the i_update_core field; + * VFS inode dirty in a transaction and clears the XFS_IDIRTY_CORE flag; * it must clear the field after calling mark_inode_dirty_sync() to * correctly indicate that the dirty state has been propagated into the * inode log item. * * We need the barrier() to maintain correct ordering between unlogged - * updates and the transaction commit code that clears the i_update_core + * updates and the transaction commit code that clears the XFS_IDIRTY_CORE * field. This requires all updates to be completed before marking the * inode dirty. */ @@ -1018,8 +1018,7 @@ STATIC void xfs_fs_dirty_inode( struct inode *inode) { - barrier(); - XFS_I(inode)->i_update_core = 1; + xfs_iflags_set(XFS_I(inode), XFS_IDIRTY_CORE); } /* Index: linux-2.6/fs/xfs/xfs_iget.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_iget.c 2010-02-09 10:38:41.343004133 +0100 +++ linux-2.6/fs/xfs/xfs_iget.c 2010-02-09 10:38:47.069003783 +0100 @@ -81,7 +81,6 @@ xfs_inode_alloc( ip->i_afp = NULL; memset(&ip->i_df, 0, sizeof(xfs_ifork_t)); ip->i_flags = 0; - ip->i_update_core = 0; ip->i_delayed_blks = 0; memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); ip->i_size = 0; Index: linux-2.6/fs/xfs/xfs_inode.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_inode.c 2010-02-09 10:37:28.821254796 +0100 +++ linux-2.6/fs/xfs/xfs_inode.c 2010-02-09 10:38:33.537253468 +0100 @@ -2098,7 +2098,7 @@ xfs_ifree_cluster( iip = ip->i_itemp; if (!iip) { - ip->i_update_core = 0; + xfs_iflags_clear(ip, XFS_IDIRTY_CORE); xfs_ifunlock(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); continue; @@ -2913,7 +2913,7 @@ xfs_iflush( * to disk, because the log record didn't make it to disk! */ if (XFS_FORCED_SHUTDOWN(mp)) { - ip->i_update_core = 0; + xfs_iflags_clear(ip, XFS_IDIRTY_CORE); if (iip) iip->ili_format.ilf_fields = 0; xfs_ifunlock(ip); @@ -3057,19 +3057,18 @@ xfs_iflush_int( dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); /* - * Clear i_update_core before copying out the data. + * Clear XFS_IDIRTY_CORE before copying out the data. * This is for coordination with our timestamp updates * that don't hold the inode lock. They will always - * update the timestamps BEFORE setting i_update_core, - * so if we clear i_update_core after they set it we + * update the timestamps BEFORE setting XFS_IDIRTY_CORE, + * so if we clear XFS_IDIRTY_CORE after they set it we * are guaranteed to see their updates to the timestamps. * I believe that this depends on strongly ordered memory * semantics, but we have that. We use the SYNCHRONIZE * macro to make sure that the compiler does not reorder - * the i_update_core access below the data copy below. + * the XFS_IDIRTY_CORE access below the data copy below. */ - ip->i_update_core = 0; - SYNCHRONIZE(); + xfs_iflags_clear(ip, XFS_IDIRTY_CORE); /* * Make sure to get the latest timestamps from the Linux inode. @@ -3235,7 +3234,7 @@ xfs_iflush_int( } else { /* * We're flushing an inode which is not in the AIL and has - * not been logged but has i_update_core set. For this + * not been logged but has XFS_IDIRTY_CORE set. For this * case we can use a B_DELWRI flush and immediately drop * the inode flush lock because we can avoid the whole * AIL state thing. It's OK to drop the flush lock now, Index: linux-2.6/fs/xfs/xfs_inode.h =================================================================== --- linux-2.6.orig/fs/xfs/xfs_inode.h 2010-02-09 10:36:31.621003922 +0100 +++ linux-2.6/fs/xfs/xfs_inode.h 2010-02-09 10:37:23.518004062 +0100 @@ -259,8 +259,7 @@ typedef struct xfs_inode { wait_queue_head_t i_ipin_wait; /* inode pinning wait queue */ spinlock_t i_flags_lock; /* inode i_flags lock */ /* Miscellaneous state. */ - unsigned short i_flags; /* see defined flags below */ - unsigned char i_update_core; /* timestamps/size is dirty */ + unsigned int i_flags; /* see defined flags below */ unsigned int i_delayed_blks; /* count of delay alloc blks */ xfs_icdinode_t i_d; /* most of ondisk inode */ @@ -391,6 +390,7 @@ static inline void xfs_ifunlock(xfs_inod #define XFS_INEW 0x0008 /* inode has just been allocated */ #define XFS_IFILESTREAM 0x0010 /* inode is in a filestream directory */ #define XFS_ITRUNCATED 0x0020 /* truncated down so flush-on-close */ +#define XFS_IDIRTY_CORE 0x0040 /* non-transaction updates pending */ /* * Flags for inode locking. Index: linux-2.6/fs/xfs/xfs_inode_item.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_inode_item.c 2010-02-09 10:40:38.194253398 +0100 +++ linux-2.6/fs/xfs/xfs_inode_item.c 2010-02-09 10:41:44.883256052 +0100 @@ -233,15 +233,15 @@ xfs_inode_item_format( /* * Make sure the linux inode is dirty. We do this before - * clearing i_update_core as the VFS will call back into - * XFS here and set i_update_core, so we need to dirty the - * inode first so that the ordering of i_update_core and + * clearing XFS_IDIRTY_CORE as the VFS will call back into + * XFS here and set XFS_IDIRTY_CORE, so we need to dirty the + * inode first so that the ordering of XFS_IDIRTY_CORE and * unlogged modifications still works as described below. */ xfs_mark_inode_dirty_sync(ip); /* - * Clear i_update_core if the timestamps (or any other + * Clear XFS_IDIRTY_CORE if the timestamps (or any other * non-transactional modification) need flushing/logging * and we're about to log them with the rest of the core. * @@ -252,11 +252,11 @@ xfs_inode_item_format( * for the timestamps if both routines were to grab the * timestamps or not. That would be ok. * - * We clear i_update_core before copying out the data. + * We clear XFS_IDIRTY_CORE before copying out the data. * This is for coordination with our timestamp updates * that don't hold the inode lock. They will always - * update the timestamps BEFORE setting i_update_core, - * so if we clear i_update_core after they set it we + * update the timestamps BEFORE setting XFS_IDIRTY_CORE, + * so if we clear XFS_IDIRTY_CORE after they set it we * are guaranteed to see their updates to the timestamps * either here. Likewise, if they set it after we clear it * here, we'll see it either on the next commit of this @@ -264,12 +264,9 @@ xfs_inode_item_format( * xfs_iflush(). This depends on strongly ordered memory * semantics, but we have that. We use the SYNCHRONIZE * macro to make sure that the compiler does not reorder - * the i_update_core access below the data copy below. + * the XFS_IDIRTY_CORE access below the data copy below. */ - if (ip->i_update_core) { - ip->i_update_core = 0; - SYNCHRONIZE(); - } + xfs_iflags_clear(ip, XFS_IDIRTY_CORE); /* * Make sure to get the latest timestamps from the Linux inode. Index: linux-2.6/fs/xfs/xfs_inode_item.h =================================================================== --- linux-2.6.orig/fs/xfs/xfs_inode_item.h 2010-02-09 10:40:24.678024386 +0100 +++ linux-2.6/fs/xfs/xfs_inode_item.h 2010-02-09 10:40:35.674015377 +0100 @@ -162,7 +162,7 @@ static inline int xfs_inode_clean(xfs_in { return (!ip->i_itemp || !(ip->i_itemp->ili_format.ilf_fields & XFS_ILOG_ALL)) && - !ip->i_update_core; + !xfs_iflags_test(ip, XFS_IDIRTY_CORE); } extern void xfs_inode_item_init(struct xfs_inode *, struct xfs_mount *); Index: linux-2.6/fs/xfs/xfs_vnodeops.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_vnodeops.c 2010-02-09 10:39:37.171274212 +0100 +++ linux-2.6/fs/xfs/xfs_vnodeops.c 2010-02-09 10:40:13.425004481 +0100 @@ -405,7 +405,7 @@ xfs_setattr( inode->i_atime = iattr->ia_atime; ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec; ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec; - ip->i_update_core = 1; + xfs_iflags_set(ip, XFS_IDIRTY_CORE); } if (mask & ATTR_MTIME) { inode->i_mtime = iattr->ia_mtime; @@ -427,7 +427,7 @@ xfs_setattr( inode->i_ctime = iattr->ia_ctime; ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec; ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec; - ip->i_update_core = 1; + xfs_iflags_set(ip, XFS_IDIRTY_CORE); timeflags &= ~XFS_ICHGTIME_CHG; } @@ -633,7 +633,7 @@ xfs_fsync( */ xfs_ilock(ip, XFS_ILOCK_SHARED); - if (!ip->i_update_core) { + if (!xfs_iflags_test(ip, XFS_IDIRTY_CORE)) { /* * Timestamps/size haven't changed since last inode flush or * inode transaction commit. That means either nothing got Index: linux-2.6/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_sync.c 2010-02-09 10:43:25.201003853 +0100 +++ linux-2.6/fs/xfs/linux-2.6/xfs_sync.c 2010-02-09 10:44:00.886284060 +0100 @@ -765,8 +765,8 @@ xfs_reclaim_inode_now( * XFS_IRECLAIM flag set it will not touch us. */ spin_lock(&ip->i_flags_lock); - ASSERT_ALWAYS(__xfs_iflags_test(ip, XFS_IRECLAIMABLE)); - if (__xfs_iflags_test(ip, XFS_IRECLAIM)) { + if (WARN_ON(__xfs_iflags_test(ip, XFS_IRECLAIMABLE)) || + __xfs_iflags_test(ip, XFS_IRECLAIM)) { /* ignore as it is already under reclaim */ spin_unlock(&ip->i_flags_lock); write_unlock(&pag->pag_ici_lock); From aluno3@poczta.onet.pl Tue Feb 9 09:23:57 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.4 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, KB_DATE_CONTAINS_TAB,RCVD_IN_BRBL autolearn=no version=3.3.0-rupdated 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 o19FNu6S226873 for ; Tue, 9 Feb 2010 09:23:56 -0600 X-ASG-Debug-ID: 1265729105-0ddf01b50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtpout5.poczta.onet.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E50FB138D586 for ; Tue, 9 Feb 2010 07:25:05 -0800 (PST) Received: from smtpout5.poczta.onet.pl (smtpout5.poczta.onet.pl [213.180.147.165]) by cuda.sgi.com with ESMTP id LGWsWH1P1OnCUa41 for ; Tue, 09 Feb 2010 07:25:05 -0800 (PST) Received: from ip-83-238-22-2.netia.com.pl ([83.238.22.2]:53060 "EHLO [192.168.242.3]" rhost-flags-OK-FAIL-OK-FAIL) by ps1.m5r2.onet with ESMTPA id S50343186Ab0BIPS419vuR (ORCPT ); Tue, 9 Feb 2010 16:18:56 +0100 Message-ID: <4B717CCD.3040008@poczta.onet.pl> Date: Tue, 09 Feb 2010 16:18:37 +0100 From: "aluno3@poczta.onet.pl" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20100111 Lightning/1.0b1 Thunderbird/3.0.1 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: XFS problems with 2.6.27 Subject: XFS problems with 2.6.27 X-Enigmail-Version: 1.0.1 Content-Type: multipart/mixed; boundary="------------090005010608050509040804" X-Barracuda-Connect: smtpout5.poczta.onet.pl[213.180.147.165] X-Barracuda-Start-Time: 1265729107 X-Barracuda-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.22091 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 This is a multi-part message in MIME format. --------------090005010608050509040804 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hello! We"ve got two different systems running with XFS, one of them is publishing shares via NFS, the other via Samba. We've recently encountered filesystem issues on both servers, and received the following call traces. They look very much alike. Are these something you are familiar with? We'd like to at least establish that the problem really is with XFS... We don't really have the possibility to update the kernels (2.6.27.10) on those machines, but we can possibly apply patches etc. These systems are usually under a fairly high load and host a large number of files. Filesystem "dm-16": Disabling barriers, trial barrier write failed XFS mounting filesystem dm-16 Starting XFS recovery on filesystem: dm-16 (logdev: internal) XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1590 of file fs/xfs/xfs_alloc.c. Caller 0xffffffff80398ca7 Pid: 15745, comm: mount Not tainted 2.6.27.10 #24 Call Trace: [] xfs_free_ag_extent+0x378/0x740 [] xfs_free_extent+0xc7/0x110 [] xlog_recover_process_efi+0x122/0x1a0 [] xlog_recover_process_efis+0x67/0x90 [] xlog_recover_finish+0x1c/0xd0 [] xfs_log_mount_finish+0x20/0x30 [] xfs_mountfs+0x2bd/0x640 [] xfs_fstrm_free_func+0x0/0x90 [] xfs_mru_cache_create+0x15a/0x1c0 [] xfs_fs_fill_super+0x214/0x450 [] set_bdev_super+0x0/0x10 [] get_sb_bdev+0x13f/0x180 [] xfs_fs_fill_super+0x0/0x450 [] vfs_kern_mount+0x81/0x160 [] do_kern_mount+0x4d/0x110 [] do_new_mount+0x9b/0xe0 [] do_mount+0x209/0x220 [] __alloc_pages_internal+0x92/0x430 [] __get_free_pages+0x17/0x80 [] compat_sys_mount+0xa4/0x270 [] ia32_sysret+0x0/0xa Failed to recover EFIs on filesystem: dm-16 XFS: log mount finish failed NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory NFSD: starting 90-second grace period bootsplash: status on console 0 changed to off usb 3-2: USB disconnect, address 2 00000000: 00 00 00 00 00 28 00 e0 00 00 00 00 00 00 00 00 .....(.......... Filesystem "dm-20": XFS internal error xfs_da_do_buf(2) at line 2112 of file fs/xfs/xfs_da_btree.c. Caller 0xffffffff803b34b4 Pid: 23023, comm: smbd Not tainted 2.6.27.10 #24 Call Trace: [] xfs_da_do_buf+0x626/0x6b0 [] xfs_da_read_buf+0x24/0x30 [] try_to_del_timer_sync+0x4f/0x60 [] xfs_da_read_buf+0x24/0x30 [] xfs_dir2_block_lookup_int+0x45/0x1a0 [] xfs_dir2_block_lookup_int+0x45/0x1a0 [] xfs_dir2_block_lookup+0x18/0xc0 [] xfs_dir2_isblock+0x1f/0x60 [] xfs_dir_lookup+0x19d/0x1c0 [] xfs_lookup+0x57/0xd0 [] _spin_lock_bh+0x9/0x20 [] xfs_vn_lookup+0x64/0xc0 [] d_alloc+0x125/0x1b0 [] do_lookup+0x175/0x220 [] generic_permission+0x69/0x130 [] __link_path_walk+0x801/0xdb0 [] sock_aio_read+0x163/0x170 [] path_walk+0x57/0xb0 [] do_path_lookup+0x123/0x1b0 [] user_path_at+0x44/0x80 [] autoremove_wake_function+0x0/0x30 [] mntput_no_expire+0x21/0x120 [] vfs_stat_fd+0x23/0x80 [] sys32_stat64+0x1f/0x70 [] ia32_sysret+0x0/0xa 00000000: 00 00 00 00 00 28 00 e0 00 00 00 00 00 00 00 00 .....(.......... Filesystem "dm-20": XFS internal error xfs_da_do_buf(2) at line 2112 of file fs/xfs/xfs_da_btree.c. Caller 0xffffffff803b34b4 Pid: 23023, comm: smbd Not tainted 2.6.27.10 #24 Call Trace: [] xfs_da_do_buf+0x626/0x6b0 [] xfs_da_read_buf+0x24/0x30 [] try_to_del_timer_sync+0x4f/0x60 [] xfs_da_read_buf+0x24/0x30 [] xfs_dir2_block_lookup_int+0x45/0x1a0 [] xfs_dir2_block_lookup_int+0x45/0x1a0 [] xfs_dir2_block_lookup+0x18/0xc0 [] xfs_dir2_isblock+0x1f/0x60 [] xfs_dir_lookup+0x19d/0x1c0 [] xfs_lookup+0x57/0xd0 [] _spin_lock_bh+0x9/0x20 [] xfs_vn_lookup+0x64/0xc0 [] d_alloc+0x125/0x1b0 [] do_lookup+0x175/0x220 [] generic_permission+0x69/0x130 [] __link_path_walk+0x801/0xdb0 [] sock_aio_read+0x163/0x170 [] path_walk+0x57/0xb0 [] do_path_lookup+0x123/0x1b0 [] user_path_at+0x44/0x80 [] autoremove_wake_function+0x0/0x30 [] mntput_no_expire+0x21/0x120 [] vfs_stat_fd+0x23/0x80 [] sys32_stat64+0x1f/0x70 [] ia32_sysret+0x0/0xa >From the other system we only have these logs: 2010/01/27 00:22:07|Pid: 17209, comm: nfsd Not tainted 2.6.27.10 #12 2010/01/27 00:22:07| 2010/01/27 00:22:07|Call Trace: 2010/01/27 00:22:07|[] xfs_da_do_buf+0x626/0x6b0 2010/01/27 00:22:07|[] xfs_da_read_buf+0x24/0x30 2010/01/27 00:22:07|[] xfs_buf_read_flags+0x67/0x90 2010/01/27 00:22:07|[] xfs_trans_read_buf+0x147/0x310 2010/01/27 00:22:07|[] xfs_da_read_buf+0x24/0x30 2010/01/27 00:22:07|[] xfs_da_node_lookup_int+0x88/0x2a0 2010/01/27 00:22:07|[] xfs_da_node_lookup_int+0x88/0x2a0 2010/01/27 00:22:07|[] xfs_dir2_node_lookup+0x48/0x120 2010/01/27 00:22:07|[] xfs_dir_lookup+0x1aa/0x1c0 2010/01/27 00:22:07|[] xfs_lookup+0x57/0xd0 2010/01/27 00:22:07|[] nfsd_permission+0x7e/0x130 2010/01/27 00:22:07|[] xfs_vn_lookup+0x64/0xc0 2010/01/27 00:22:07|[] d_alloc+0x125/0x1b0 2010/01/27 00:22:07|[] __lookup_hash+0xec/0x180 2010/01/27 00:22:07|[] lookup_one_len+0x59/0x60 2010/01/27 00:22:07|[] nfsd_lookup_dentry+0x12c/0x4d0 2010/01/27 00:22:07|[] nfsd_lookup+0x30/0x100 2010/01/27 00:22:07|[] nfsd3_proc_lookup+0xa7/0x100 2010/01/27 00:22:07|[] nfsd_dispatch+0xae/0x260 2010/01/27 00:22:07|[] svc_process+0x307/0x740 2010/01/27 00:22:07|[] nfsd+0x172/0x2a0 2010/01/27 00:22:07|[] nfsd+0x0/0x2a0 2010/01/27 00:22:07|[] kthread+0x6c/0xa0 2010/01/27 00:22:07|[] child_rip+0xa/0x11 2010/01/27 00:22:07|[] kthread+0x0/0xa0 2010/01/27 00:22:07|[] child_rip+0x0/0x11 2010/01/27 00:22:07| 2010/01/27 00:22:09|Pid: 17189, comm: nfsd Not tainted 2.6.27.10 #12 2010/01/27 00:22:09| 2010/01/27 00:22:09|Call Trace: 2010/01/27 00:22:09|[] xfs_da_do_buf+0x626/0x6b0 2010/01/27 00:22:09|[] xfs_da_read_buf+0x24/0x30 2010/01/27 00:22:09|[] xfs_da_buf_make+0x13d/0x150 2010/01/27 00:22:09|[] xfs_trans_read_buf+0x147/0x310 2010/01/27 00:22:09|[] xfs_da_read_buf+0x24/0x30 2010/01/27 00:22:09|[] xfs_dir2_leafn_lookup_for_entry+0x16b/0x350 2010/01/27 00:22:09|[] xfs_dir2_leafn_lookup_for_entry+0x16b/0x350 2010/01/27 00:22:09|[] xfs_da_node_lookup_int+0x237/0x2a0 2010/01/27 00:22:09|[] xfs_dir2_node_lookup+0x48/0x120 2010/01/27 00:22:09|[] xfs_dir_lookup+0x1aa/0x1c0 2010/01/27 00:22:09|[] xfs_lookup+0x57/0xd0 2010/01/27 00:22:09|[] nfsd_permission+0x7e/0x130 2010/01/27 00:22:09|[] xfs_vn_lookup+0x64/0xc0 2010/01/27 00:22:09|[] d_alloc+0x125/0x1b0 2010/01/27 00:22:09|[] __lookup_hash+0xec/0x180 2010/01/27 00:22:09|[] lookup_one_len+0x59/0x60 2010/01/27 00:22:09|[] nfsd_lookup_dentry+0x12c/0x4d0 2010/01/27 00:22:09|[] nfsd_lookup+0x30/0x100 2010/01/27 00:22:09|[] nfsd3_proc_lookup+0xa7/0x100 2010/01/27 00:22:09|[] nfsd_dispatch+0xae/0x260 2010/01/27 00:22:09|[] svc_process+0x307/0x740 2010/01/27 00:22:09|[] nfsd+0x172/0x2a0 2010/01/27 00:22:09|[] nfsd+0x0/0x2a0 2010/01/27 00:22:09|[] kthread+0x6c/0xa0 2010/01/27 00:22:09|[] child_rip+0xa/0x11 2010/01/27 00:22:09|[] kthread+0x0/0xa0 2010/01/27 00:22:09|[] child_rip+0x0/0x11 --------------090005010608050509040804 Content-Type: text/plain; name="dmesg1" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="dmesg1" RVhUMyBGUyBvbiByYW0xNSwgaW50ZXJuYWwgam91cm5hbApFWFQzLWZzOiBtb3VudGVkIGZp bGVzeXN0ZW0gd2l0aCBvcmRlcmVkIGRhdGEgbW9kZS4Ka2pvdXJuYWxkIHN0YXJ0aW5nLiAg Q29tbWl0IGludGVydmFsIDUgc2Vjb25kcwpFWFQzLWZzIHdhcm5pbmc6IG1heGltYWwgbW91 bnQgY291bnQgcmVhY2hlZCwgcnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQKRVhUMyBG UyBvbiBkbS0xNywgaW50ZXJuYWwgam91cm5hbApFWFQzLWZzOiBtb3VudGVkIGZpbGVzeXN0 ZW0gd2l0aCBvcmRlcmVkIGRhdGEgbW9kZS4KRmlsZXN5c3RlbSAiZG0tMjAiOiBEaXNhYmxp bmcgYmFycmllcnMsIHRyaWFsIGJhcnJpZXIgd3JpdGUgZmFpbGVkClhGUyBtb3VudGluZyBm aWxlc3lzdGVtIGRtLTIwCkVuZGluZyBjbGVhbiBYRlMgbW91bnQgZm9yIGZpbGVzeXN0ZW06 IGRtLTIwCmtqb3VybmFsZCBzdGFydGluZy4gIENvbW1pdCBpbnRlcnZhbCA1IHNlY29uZHMK RVhUMy1mcyB3YXJuaW5nOiBtYXhpbWFsIG1vdW50IGNvdW50IHJlYWNoZWQsIHJ1bm5pbmcg ZTJmc2NrIGlzIHJlY29tbWVuZGVkCkVYVDMgRlMgb24gZG0tMTMsIGludGVybmFsIGpvdXJu YWwKRVhUMy1mczogbW91bnRlZCBmaWxlc3lzdGVtIHdpdGggb3JkZXJlZCBkYXRhIG1vZGUu CkZpbGVzeXN0ZW0gImRtLTE2IjogRGlzYWJsaW5nIGJhcnJpZXJzLCB0cmlhbCBiYXJyaWVy IHdyaXRlIGZhaWxlZApYRlMgbW91bnRpbmcgZmlsZXN5c3RlbSBkbS0xNgpTdGFydGluZyBY RlMgcmVjb3Zlcnkgb24gZmlsZXN5c3RlbTogZG0tMTYgKGxvZ2RldjogaW50ZXJuYWwpClhG UyBpbnRlcm5hbCBlcnJvciBYRlNfV0FOVF9DT1JSVVBURURfR09UTyBhdCBsaW5lIDE1OTAg b2YgZmlsZSBmcy94ZnMveGZzX2FsbG9jLmMuICBDYWxsZXIgMHhmZmZmZmZmZjgwMzk4Y2E3 ClBpZDogMTU3NDUsIGNvbW06IG1vdW50IE5vdCB0YWludGVkIDIuNi4yNy4xMCAjMjQKCkNh bGwgVHJhY2U6CiBbPGZmZmZmZmZmODAzOTZmYjg+XSB4ZnNfZnJlZV9hZ19leHRlbnQrMHgz NzgvMHg3NDAKIFs8ZmZmZmZmZmY4MDM5OGNhNz5dIHhmc19mcmVlX2V4dGVudCsweGM3LzB4 MTEwCiBbPGZmZmZmZmZmODAzZDc2NDI+XSB4bG9nX3JlY292ZXJfcHJvY2Vzc19lZmkrMHgx MjIvMHgxYTAKIFs8ZmZmZmZmZmY4MDNkNzcyNz5dIHhsb2dfcmVjb3Zlcl9wcm9jZXNzX2Vm aXMrMHg2Ny8weDkwCiBbPGZmZmZmZmZmODAzZDg3ZGM+XSB4bG9nX3JlY292ZXJfZmluaXNo KzB4MWMvMHhkMAogWzxmZmZmZmZmZjgwM2QwNzkwPl0geGZzX2xvZ19tb3VudF9maW5pc2gr MHgyMC8weDMwCiBbPGZmZmZmZmZmODAzZGFjM2Q+XSB4ZnNfbW91bnRmcysweDJiZC8weDY0 MAogWzxmZmZmZmZmZjgwM2MwNDQwPl0geGZzX2ZzdHJtX2ZyZWVfZnVuYysweDAvMHg5MAog WzxmZmZmZmZmZjgwM2RiYWNhPl0geGZzX21ydV9jYWNoZV9jcmVhdGUrMHgxNWEvMHgxYzAK IFs8ZmZmZmZmZmY4MDNmMmMwND5dIHhmc19mc19maWxsX3N1cGVyKzB4MjE0LzB4NDUwCiBb PGZmZmZmZmZmODAyOTkxMDA+XSBzZXRfYmRldl9zdXBlcisweDAvMHgxMAogWzxmZmZmZmZm ZjgwMjk5MjVmPl0gZ2V0X3NiX2JkZXYrMHgxM2YvMHgxODAKIFs8ZmZmZmZmZmY4MDNmMjlm MD5dIHhmc19mc19maWxsX3N1cGVyKzB4MC8weDQ1MAogWzxmZmZmZmZmZjgwMjk5NGYxPl0g dmZzX2tlcm5fbW91bnQrMHg4MS8weDE2MAogWzxmZmZmZmZmZjgwMjk5NjFkPl0gZG9fa2Vy bl9tb3VudCsweDRkLzB4MTEwCiBbPGZmZmZmZmZmODAyYjBmYmI+XSBkb19uZXdfbW91bnQr MHg5Yi8weGUwCiBbPGZmZmZmZmZmODAyYjE4NDk+XSBkb19tb3VudCsweDIwOS8weDIyMAog WzxmZmZmZmZmZjgwMjc0ZWEyPl0gX19hbGxvY19wYWdlc19pbnRlcm5hbCsweDkyLzB4NDMw CiBbPGZmZmZmZmZmODAyNzUyZDc+XSBfX2dldF9mcmVlX3BhZ2VzKzB4MTcvMHg4MAogWzxm ZmZmZmZmZjgwMmNiZGY0Pl0gY29tcGF0X3N5c19tb3VudCsweGE0LzB4MjcwCiBbPGZmZmZm ZmZmODAyMjgyODI+XSBpYTMyX3N5c3JldCsweDAvMHhhCgpGYWlsZWQgdG8gcmVjb3ZlciBF RklzIG9uIGZpbGVzeXN0ZW06IGRtLTE2ClhGUzogbG9nIG1vdW50IGZpbmlzaCBmYWlsZWQK TkZTRDogVXNpbmcgL3Zhci9saWIvbmZzL3Y0cmVjb3ZlcnkgYXMgdGhlIE5GU3Y0IHN0YXRl IHJlY292ZXJ5IGRpcmVjdG9yeQpORlNEOiBzdGFydGluZyA5MC1zZWNvbmQgZ3JhY2UgcGVy aW9kCmJvb3RzcGxhc2g6IHN0YXR1cyBvbiBjb25zb2xlIDAgY2hhbmdlZCB0byBvZmYKdXNi IDMtMjogVVNCIGRpc2Nvbm5lY3QsIGFkZHJlc3MgMgowMDAwMDAwMDogMDAgMDAgMDAgMDAg MDAgMjggMDAgZTAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIC4uLi4uKC4uLi4uLi4uLi4K RmlsZXN5c3RlbSAiZG0tMjAiOiBYRlMgaW50ZXJuYWwgZXJyb3IgeGZzX2RhX2RvX2J1Zigy KSBhdCBsaW5lIDIxMTIgb2YgZmlsZSBmcy94ZnMveGZzX2RhX2J0cmVlLmMuICBDYWxsZXIg MHhmZmZmZmZmZjgwM2IzNGI0ClBpZDogMjMwMjMsIGNvbW06IHNtYmQgTm90IHRhaW50ZWQg Mi42LjI3LjEwICMyNAoKQ2FsbCBUcmFjZToKIFs8ZmZmZmZmZmY4MDNiMzNiNj5dIHhmc19k YV9kb19idWYrMHg2MjYvMHg2YjAKIFs8ZmZmZmZmZmY4MDNiMzRiND5dIHhmc19kYV9yZWFk X2J1ZisweDI0LzB4MzAKIFs8ZmZmZmZmZmY4MDIzZWUwZj5dIHRyeV90b19kZWxfdGltZXJf c3luYysweDRmLzB4NjAKIFs8ZmZmZmZmZmY4MDNiMzRiND5dIHhmc19kYV9yZWFkX2J1Zisw eDI0LzB4MzAKIFs8ZmZmZmZmZmY4MDNiNzdlNT5dIHhmc19kaXIyX2Jsb2NrX2xvb2t1cF9p bnQrMHg0NS8weDFhMAogWzxmZmZmZmZmZjgwM2I3N2U1Pl0geGZzX2RpcjJfYmxvY2tfbG9v a3VwX2ludCsweDQ1LzB4MWEwCiBbPGZmZmZmZmZmODAzYjc5NTg+XSB4ZnNfZGlyMl9ibG9j a19sb29rdXArMHgxOC8weGMwCiBbPGZmZmZmZmZmODAzYjYyNGY+XSB4ZnNfZGlyMl9pc2Js b2NrKzB4MWYvMHg2MAogWzxmZmZmZmZmZjgwM2I2OTZkPl0geGZzX2Rpcl9sb29rdXArMHgx OWQvMHgxYzAKIFs8ZmZmZmZmZmY4MDNlMzI2Nz5dIHhmc19sb29rdXArMHg1Ny8weGQwCiBb PGZmZmZmZmZmODA2OWRmZDk+XSBfc3Bpbl9sb2NrX2JoKzB4OS8weDIwCiBbPGZmZmZmZmZm ODAzZWU2ZTQ+XSB4ZnNfdm5fbG9va3VwKzB4NjQvMHhjMAogWzxmZmZmZmZmZjgwMmE5Zjk1 Pl0gZF9hbGxvYysweDEyNS8weDFiMAogWzxmZmZmZmZmZjgwMjlmMTU1Pl0gZG9fbG9va3Vw KzB4MTc1LzB4MjIwCiBbPGZmZmZmZmZmODAyOWVhNzk+XSBnZW5lcmljX3Blcm1pc3Npb24r MHg2OS8weDEzMAogWzxmZmZmZmZmZjgwMjlmYTAxPl0gX19saW5rX3BhdGhfd2FsaysweDgw MS8weGRiMAogWzxmZmZmZmZmZjgwNWRlNjYzPl0gc29ja19haW9fcmVhZCsweDE2My8weDE3 MAogWzxmZmZmZmZmZjgwMmEwMDA3Pl0gcGF0aF93YWxrKzB4NTcvMHhiMAogWzxmZmZmZmZm ZjgwMmEwMTgzPl0gZG9fcGF0aF9sb29rdXArMHgxMjMvMHgxYjAKIFs8ZmZmZmZmZmY4MDJh MDZmND5dIHVzZXJfcGF0aF9hdCsweDQ0LzB4ODAKIFs8ZmZmZmZmZmY4MDI0YTQ1MD5dIGF1 dG9yZW1vdmVfd2FrZV9mdW5jdGlvbisweDAvMHgzMAogWzxmZmZmZmZmZjgwMmFmNWMxPl0g bW50cHV0X25vX2V4cGlyZSsweDIxLzB4MTIwCiBbPGZmZmZmZmZmODAyOWExZjM+XSB2ZnNf c3RhdF9mZCsweDIzLzB4ODAKIFs8ZmZmZmZmZmY4MDIyODc5Zj5dIHN5czMyX3N0YXQ2NCsw eDFmLzB4NzAKIFs8ZmZmZmZmZmY4MDIyODI4Mj5dIGlhMzJfc3lzcmV0KzB4MC8weGEKCjAw MDAwMDAwOiAwMCAwMCAwMCAwMCAwMCAyOCAwMCBlMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAgLi4uLi4oLi4uLi4uLi4uLgpGaWxlc3lzdGVtICJkbS0yMCI6IFhGUyBpbnRlcm5hbCBl cnJvciB4ZnNfZGFfZG9fYnVmKDIpIGF0IGxpbmUgMjExMiBvZiBmaWxlIGZzL3hmcy94ZnNf ZGFfYnRyZWUuYy4gIENhbGxlciAweGZmZmZmZmZmODAzYjM0YjQKUGlkOiAyMzAyMywgY29t bTogc21iZCBOb3QgdGFpbnRlZCAyLjYuMjcuMTAgIzI0CgpDYWxsIFRyYWNlOgogWzxmZmZm ZmZmZjgwM2IzM2I2Pl0geGZzX2RhX2RvX2J1ZisweDYyNi8weDZiMAogWzxmZmZmZmZmZjgw M2IzNGI0Pl0geGZzX2RhX3JlYWRfYnVmKzB4MjQvMHgzMAogWzxmZmZmZmZmZjgwMjNlZTBm Pl0gdHJ5X3RvX2RlbF90aW1lcl9zeW5jKzB4NGYvMHg2MAogWzxmZmZmZmZmZjgwM2IzNGI0 Pl0geGZzX2RhX3JlYWRfYnVmKzB4MjQvMHgzMAogWzxmZmZmZmZmZjgwM2I3N2U1Pl0geGZz X2RpcjJfYmxvY2tfbG9va3VwX2ludCsweDQ1LzB4MWEwCiBbPGZmZmZmZmZmODAzYjc3ZTU+ XSB4ZnNfZGlyMl9ibG9ja19sb29rdXBfaW50KzB4NDUvMHgxYTAKIFs8ZmZmZmZmZmY4MDNi Nzk1OD5dIHhmc19kaXIyX2Jsb2NrX2xvb2t1cCsweDE4LzB4YzAKIFs8ZmZmZmZmZmY4MDNi NjI0Zj5dIHhmc19kaXIyX2lzYmxvY2srMHgxZi8weDYwCiBbPGZmZmZmZmZmODAzYjY5NmQ+ XSB4ZnNfZGlyX2xvb2t1cCsweDE5ZC8weDFjMAogWzxmZmZmZmZmZjgwM2UzMjY3Pl0geGZz X2xvb2t1cCsweDU3LzB4ZDAKIFs8ZmZmZmZmZmY4MDY5ZGZkOT5dIF9zcGluX2xvY2tfYmgr MHg5LzB4MjAKIFs8ZmZmZmZmZmY4MDNlZTZlND5dIHhmc192bl9sb29rdXArMHg2NC8weGMw CiBbPGZmZmZmZmZmODAyYTlmOTU+XSBkX2FsbG9jKzB4MTI1LzB4MWIwCiBbPGZmZmZmZmZm ODAyOWYxNTU+XSBkb19sb29rdXArMHgxNzUvMHgyMjAKIFs8ZmZmZmZmZmY4MDI5ZWE3OT5d IGdlbmVyaWNfcGVybWlzc2lvbisweDY5LzB4MTMwCiBbPGZmZmZmZmZmODAyOWZhMDE+XSBf X2xpbmtfcGF0aF93YWxrKzB4ODAxLzB4ZGIwCiBbPGZmZmZmZmZmODA1ZGU2NjM+XSBzb2Nr X2Fpb19yZWFkKzB4MTYzLzB4MTcwCiBbPGZmZmZmZmZmODAyYTAwMDc+XSBwYXRoX3dhbGsr MHg1Ny8weGIwCiBbPGZmZmZmZmZmODAyYTAxODM+XSBkb19wYXRoX2xvb2t1cCsweDEyMy8w eDFiMAogWzxmZmZmZmZmZjgwMmEwNmY0Pl0gdXNlcl9wYXRoX2F0KzB4NDQvMHg4MAogWzxm ZmZmZmZmZjgwMjRhNDUwPl0gYXV0b3JlbW92ZV93YWtlX2Z1bmN0aW9uKzB4MC8weDMwCiBb PGZmZmZmZmZmODAyYWY1YzE+XSBtbnRwdXRfbm9fZXhwaXJlKzB4MjEvMHgxMjAKIFs8ZmZm ZmZmZmY4MDI5YTFmMz5dIHZmc19zdGF0X2ZkKzB4MjMvMHg4MAogWzxmZmZmZmZmZjgwMjI4 NzlmPl0gc3lzMzJfc3RhdDY0KzB4MWYvMHg3MAogWzxmZmZmZmZmZjgwMjI4MjgyPl0gaWEz Ml9zeXNyZXQrMHgwLzB4YQoKMDAwMDAwMDA6IDAwIDAwIDAwIDAwIDAwIDI4IDAwIGUwIDAw IDAwIDAwIDAwIDAwIDAwIDAwIDAwICAuLi4uLiguLi4uLi4uLi4uCkZpbGVzeXN0ZW0gImRt LTIwIjogWEZTIGludGVybmFsIGVycm9yIHhmc19kYV9kb19idWYoMikgYXQgbGluZSAyMTEy IG9mIGZpbGUgZnMveGZzL3hmc19kYV9idHJlZS5jLiAgQ2FsbGVyIDB4ZmZmZmZmZmY4MDNi MzRiNApQaWQ6IDIzMDIzLCBjb21tOiBzbWJkIE5vdCB0YWludGVkIDIuNi4yNy4xMCAjMjQK CkNhbGwgVHJhY2U6CiBbPGZmZmZmZmZmODAzYjMzYjY+XSB4ZnNfZGFfZG9fYnVmKzB4NjI2 LzB4NmIwCiBbPGZmZmZmZmZmODAzYjM0YjQ+XSB4ZnNfZGFfcmVhZF9idWYrMHgyNC8weDMw CiBbPGZmZmZmZmZmODAyYTAwMTY+XSBwYXRoX3dhbGsrMHg2Ni8weGIwCiBbPGZmZmZmZmZm ODAzYjM0YjQ+XSB4ZnNfZGFfcmVhZF9idWYrMHgyNC8weDMwCiBbPGZmZmZmZmZmODAzYjZk NTk+XSB4ZnNfZGlyMl9ibG9ja19nZXRkZW50cysweDk5LzB4MjAwCiBbPGZmZmZmZmZmODAz YjZkNTk+XSB4ZnNfZGlyMl9ibG9ja19nZXRkZW50cysweDk5LzB4MjAwCiBbPGZmZmZmZmZm ODAzZWI4YTA+XSB4ZnNfaGFja19maWxsZGlyKzB4MC8weDYwCiBbPGZmZmZmZmZmODAzZWI4 YTA+XSB4ZnNfaGFja19maWxsZGlyKzB4MC8weDYwCiBbPGZmZmZmZmZmODAzYjY2MGI+XSB4 ZnNfcmVhZGRpcisweGJiLzB4ZjAKIFs8ZmZmZmZmZmY4MDJjYzMwMD5dIGNvbXBhdF9maWxs ZGlyNjQrMHgwLzB4ZTAKIFs8ZmZmZmZmZmY4MDNlYjliZT5dIHhmc19maWxlX3JlYWRkaXIr MHhiZS8weDE3MAogWzxmZmZmZmZmZjgwMmNjMzAwPl0gY29tcGF0X2ZpbGxkaXI2NCsweDAv MHhlMAogWzxmZmZmZmZmZjgwMmE0ODgwPl0gdmZzX3JlYWRkaXIrMHhjMC8weGUwCiBbPGZm ZmZmZmZmODAyY2M0NmE+XSBjb21wYXRfc3lzX2dldGRlbnRzNjQrMHg4YS8weGYwCiBbPGZm ZmZmZmZmODAyMjgyODI+XSBpYTMyX3N5c3JldCsweDAvMHhhCgowMDAwMDAwMDogMDAgMDAg MDAgMDAgMDAgMjggMDAgZTAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIC4uLi4uKC4uLi4u Li4uLi4KRmlsZXN5c3RlbSAiZG0tMjAiOiBYRlMgaW50ZXJuYWwgZXJyb3IgeGZzX2RhX2Rv X2J1ZigyKSBhdCBsaW5lIDIxMTIgb2YgZmlsZSBmcy94ZnMveGZzX2RhX2J0cmVlLmMuICBD YWxsZXIgMHhmZmZmZmZmZjgwM2IzNGI0ClBpZDogMjMwMjMsIGNvbW06IHNtYmQgTm90IHRh aW50ZWQgMi42LjI3LjEwICMyNAoKQ2FsbCBUcmFjZToKIFs8ZmZmZmZmZmY4MDNiMzNiNj5d IHhmc19kYV9kb19idWYrMHg2MjYvMHg2YjAKIFs8ZmZmZmZmZmY4MDNiMzRiND5dIHhmc19k YV9yZWFkX2J1ZisweDI0LzB4MzAKIFs8ZmZmZmZmZmY4MDI0ZTRhNj5dIHVwKzB4MTYvMHg1 MAogWzxmZmZmZmZmZjgwMjM2MWM3Pl0gcmVsZWFzZV9jb25zb2xlX3NlbSsweDFhNy8weDFk MAogWzxmZmZmZmZmZjgwM2IzNGI0Pl0geGZzX2RhX3JlYWRfYnVmKzB4MjQvMHgzMAogWzxm ZmZmZmZmZjgwM2I3N2U1Pl0geGZzX2RpcjJfYmxvY2tfbG9va3VwX2ludCsweDQ1LzB4MWEw CiBbPGZmZmZmZmZmODAzYjc3ZTU+XSB4ZnNfZGlyMl9ibG9ja19sb29rdXBfaW50KzB4NDUv MHgxYTAKIFs8ZmZmZmZmZmY4MDQyNTcwMT5dIF9fdXBfcmVhZCsweDIxLzB4YjAKIFs8ZmZm ZmZmZmY4MDNiNzk1OD5dIHhmc19kaXIyX2Jsb2NrX2xvb2t1cCsweDE4LzB4YzAKIFs8ZmZm ZmZmZmY4MDNiNjI0Zj5dIHhmc19kaXIyX2lzYmxvY2srMHgxZi8weDYwCiBbPGZmZmZmZmZm ODAzYjY5NmQ+XSB4ZnNfZGlyX2xvb2t1cCsweDE5ZC8weDFjMAogWzxmZmZmZmZmZjgwM2Uz MjY3Pl0geGZzX2xvb2t1cCsweDU3LzB4ZDAKIFs8ZmZmZmZmZmY4MDNlZTZlND5dIHhmc192 bl9sb29rdXArMHg2NC8weGMwCiBbPGZmZmZmZmZmODAyYTlmOTU+XSBkX2FsbG9jKzB4MTI1 LzB4MWIwCiBbPGZmZmZmZmZmODAyOWYxNTU+XSBkb19sb29rdXArMHgxNzUvMHgyMjAKIFs8 ZmZmZmZmZmY4MDI5ZmEwMT5dIF9fbGlua19wYXRoX3dhbGsrMHg4MDEvMHhkYjAKIFs8ZmZm ZmZmZmY4MDJhMDAwNz5dIHBhdGhfd2FsaysweDU3LzB4YjAKIFs8ZmZmZmZmZmY4MDJhMDE4 Mz5dIGRvX3BhdGhfbG9va3VwKzB4MTIzLzB4MWIwCiBbPGZmZmZmZmZmODAyYTA2ZjQ+XSB1 c2VyX3BhdGhfYXQrMHg0NC8weDgwCiBbPGZmZmZmZmZmODAyYWY1YzE+XSBtbnRwdXRfbm9f ZXhwaXJlKzB4MjEvMHgxMjAKIFs8ZmZmZmZmZmY4MDI5YTI4MD5dIHZmc19sc3RhdF9mZCsw eDIwLzB4ODAKIFs8ZmZmZmZmZmY4MDIyODgwZj5dIHN5czMyX2xzdGF0NjQrMHgxZi8weDcw CiBbPGZmZmZmZmZmODAyMjgyODI+XSBpYTMyX3N5c3JldCsweDAvMHhhCgowMDAwMDAwMDog MDAgMDAgYzAgNDkgMDAgMzAgMDAgYzMgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIC4uLkku MC4uLi4uLi4uLi4KRmlsZXN5c3RlbSAiZG0tMjAiOiBYRlMgaW50ZXJuYWwgZXJyb3IgeGZz X2RhX2RvX2J1ZigyKSBhdCBsaW5lIDIxMTIgb2YgZmlsZSBmcy94ZnMveGZzX2RhX2J0cmVl LmMuICBDYWxsZXIgMHhmZmZmZmZmZjgwM2IzNGI0ClBpZDogMjMwNDEsIGNvbW06IHNtYmQg Tm90IHRhaW50ZWQgMi42LjI3LjEwICMyNAoKQ2FsbCBUcmFjZToKIFs8ZmZmZmZmZmY4MDNi MzNiNj5dIHhmc19kYV9kb19idWYrMHg2MjYvMHg2YjAKIFs8ZmZmZmZmZmY4MDNiMzRiND5d IHhmc19kYV9yZWFkX2J1ZisweDI0LzB4MzAKIFs8ZmZmZmZmZmY4MDIzZWUwZj5dIHRyeV90 b19kZWxfdGltZXJfc3luYysweDRmLzB4NjAKIFs8ZmZmZmZmZmY4MDNiMzRiND5dIHhmc19k YV9yZWFkX2J1ZisweDI0LzB4MzAKIFs8ZmZmZmZmZmY4MDNiNzdlNT5dIHhmc19kaXIyX2Js b2NrX2xvb2t1cF9pbnQrMHg0NS8weDFhMAogWzxmZmZmZmZmZjgwM2I3N2U1Pl0geGZzX2Rp cjJfYmxvY2tfbG9va3VwX2ludCsweDQ1LzB4MWEwCiBbPGZmZmZmZmZmODAzYjc5NTg+XSB4 ZnNfZGlyMl9ibG9ja19sb29rdXArMHgxOC8weGMwCiBbPGZmZmZmZmZmODAzYjYyNGY+XSB4 ZnNfZGlyMl9pc2Jsb2NrKzB4MWYvMHg2MAogWzxmZmZmZmZmZjgwM2I2OTZkPl0geGZzX2Rp cl9sb29rdXArMHgxOWQvMHgxYzAKIFs8ZmZmZmZmZmY4MDNlMzI2Nz5dIHhmc19sb29rdXAr MHg1Ny8weGQwCiBbPGZmZmZmZmZmODA2OWRmZDk+XSBfc3Bpbl9sb2NrX2JoKzB4OS8weDIw CiBbPGZmZmZmZmZmODAzZWU2ZTQ+XSB4ZnNfdm5fbG9va3VwKzB4NjQvMHhjMAogWzxmZmZm ZmZmZjgwMmE5Zjk1Pl0gZF9hbGxvYysweDEyNS8weDFiMAogWzxmZmZmZmZmZjgwMjlmMTU1 Pl0gZG9fbG9va3VwKzB4MTc1LzB4MjIwCiBbPGZmZmZmZmZmODAyOWVhNzk+XSBnZW5lcmlj X3Blcm1pc3Npb24rMHg2OS8weDEzMAogWzxmZmZmZmZmZjgwMjlmYTAxPl0gX19saW5rX3Bh dGhfd2FsaysweDgwMS8weGRiMAogWzxmZmZmZmZmZjgwNWRlNjYzPl0gc29ja19haW9fcmVh ZCsweDE2My8weDE3MAogWzxmZmZmZmZmZjgwMmEwMDA3Pl0gcGF0aF93YWxrKzB4NTcvMHhi MAogWzxmZmZmZmZmZjgwMmEwMTgzPl0gZG9fcGF0aF9sb29rdXArMHgxMjMvMHgxYjAKIFs8 ZmZmZmZmZmY4MDJhMDZmND5dIHVzZXJfcGF0aF9hdCsweDQ0LzB4ODAKIFs8ZmZmZmZmZmY4 MDI0YTQ1MD5dIGF1dG9yZW1vdmVfd2FrZV9mdW5jdGlvbisweDAvMHgzMAogWzxmZmZmZmZm ZjgwMmFmNWMxPl0gbW50cHV0X25vX2V4cGlyZSsweDIxLzB4MTIwCiBbPGZmZmZmZmZmODAy OWExZjM+XSB2ZnNfc3RhdF9mZCsweDIzLzB4ODAKIFs8ZmZmZmZmZmY4MDIyODc5Zj5dIHN5 czMyX3N0YXQ2NCsweDFmLzB4NzAKIFs8ZmZmZmZmZmY4MDIyODI4Mj5dIGlhMzJfc3lzcmV0 KzB4MC8weGEKCjAwMDAwMDAwOiAwMCAwMCBjMCA0OSAwMCAzMCAwMCBjMyAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAgLi4uSS4wLi4uLi4uLi4uLgpGaWxlc3lzdGVtICJkbS0yMCI6IFhG UyBpbnRlcm5hbCBlcnJvciB4ZnNfZGFfZG9fYnVmKDIpIGF0IGxpbmUgMjExMiBvZiBmaWxl IGZzL3hmcy94ZnNfZGFfYnRyZWUuYy4gIENhbGxlciAweGZmZmZmZmZmODAzYjM0YjQKUGlk OiAyMzA0MSwgY29tbTogc21iZCBOb3QgdGFpbnRlZCAyLjYuMjcuMTAgIzI0CgpDYWxsIFRy YWNlOgogWzxmZmZmZmZmZjgwM2IzM2I2Pl0geGZzX2RhX2RvX2J1ZisweDYyNi8weDZiMAog WzxmZmZmZmZmZjgwM2IzNGI0Pl0geGZzX2RhX3JlYWRfYnVmKzB4MjQvMHgzMAogWzxmZmZm ZmZmZjgwMjNlZTBmPl0gdHJ5X3RvX2RlbF90aW1lcl9zeW5jKzB4NGYvMHg2MAogWzxmZmZm ZmZmZjgwM2IzNGI0Pl0geGZzX2RhX3JlYWRfYnVmKzB4MjQvMHgzMAogWzxmZmZmZmZmZjgw M2I3N2U1Pl0geGZzX2RpcjJfYmxvY2tfbG9va3VwX2ludCsweDQ1LzB4MWEwCiBbPGZmZmZm ZmZmODAzYjc3ZTU+XSB4ZnNfZGlyMl9ibG9ja19sb29rdXBfaW50KzB4NDUvMHgxYTAKIFs8 ZmZmZmZmZmY4MDNiNzk1OD5dIHhmc19kaXIyX2Jsb2NrX2xvb2t1cCsweDE4LzB4YzAKIFs8 ZmZmZmZmZmY4MDNiNjI0Zj5dIHhmc19kaXIyX2lzYmxvY2srMHgxZi8weDYwCiBbPGZmZmZm ZmZmODAzYjY5NmQ+XSB4ZnNfZGlyX2xvb2t1cCsweDE5ZC8weDFjMAogWzxmZmZmZmZmZjgw M2UzMjY3Pl0geGZzX2xvb2t1cCsweDU3LzB4ZDAKIFs8ZmZmZmZmZmY4MDY5ZGZkOT5dIF9z cGluX2xvY2tfYmgrMHg5LzB4MjAKIFs8ZmZmZmZmZmY4MDNlZTZlND5dIHhmc192bl9sb29r dXArMHg2NC8weGMwCiBbPGZmZmZmZmZmODAyYTlmOTU+XSBkX2FsbG9jKzB4MTI1LzB4MWIw CiBbPGZmZmZmZmZmODAyOWYxNTU+XSBkb19sb29rdXArMHgxNzUvMHgyMjAKIFs8ZmZmZmZm ZmY4MDI5ZWE3OT5dIGdlbmVyaWNfcGVybWlzc2lvbisweDY5LzB4MTMwCiBbPGZmZmZmZmZm ODAyOWZhMDE+XSBfX2xpbmtfcGF0aF93YWxrKzB4ODAxLzB4ZGIwCiBbPGZmZmZmZmZmODA1 ZGU2NjM+XSBzb2NrX2Fpb19yZWFkKzB4MTYzLzB4MTcwCiBbPGZmZmZmZmZmODAyYTAwMDc+ XSBwYXRoX3dhbGsrMHg1Ny8weGIwCiBbPGZmZmZmZmZmODAyYTAxODM+XSBkb19wYXRoX2xv b2t1cCsweDEyMy8weDFiMAogWzxmZmZmZmZmZjgwMmEwNmY0Pl0gdXNlcl9wYXRoX2F0KzB4 NDQvMHg4MAogWzxmZmZmZmZmZjgwMjRhNDUwPl0gYXV0b3JlbW92ZV93YWtlX2Z1bmN0aW9u KzB4MC8weDMwCiBbPGZmZmZmZmZmODAyYWY1YzE+XSBtbnRwdXRfbm9fZXhwaXJlKzB4MjEv MHgxMjAKIFs8ZmZmZmZmZmY4MDI5YTFmMz5dIHZmc19zdGF0X2ZkKzB4MjMvMHg4MAogWzxm ZmZmZmZmZjgwMjI4NzlmPl0gc3lzMzJfc3RhdDY0KzB4MWYvMHg3MAogWzxmZmZmZmZmZjgw MjI4MjgyPl0gaWEzMl9zeXNyZXQrMHgwLzB4YQoKMDAwMDAwMDA6IDAwIDAwIGMwIDQ5IDAw IDMwIDAwIGMzIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAuLi5JLjAuLi4uLi4uLi4uCkZp bGVzeXN0ZW0gImRtLTIwIjogWEZTIGludGVybmFsIGVycm9yIHhmc19kYV9kb19idWYoMikg YXQgbGluZSAyMTEyIG9mIGZpbGUgZnMveGZzL3hmc19kYV9idHJlZS5jLiAgQ2FsbGVyIDB4 ZmZmZmZmZmY4MDNiMzRiNApQaWQ6IDIzMDQxLCBjb21tOiBzbWJkIE5vdCB0YWludGVkIDIu Ni4yNy4xMCAjMjQKCkNhbGwgVHJhY2U6CiBbPGZmZmZmZmZmODAzYjMzYjY+XSB4ZnNfZGFf ZG9fYnVmKzB4NjI2LzB4NmIwCiBbPGZmZmZmZmZmODAzYjM0YjQ+XSB4ZnNfZGFfcmVhZF9i dWYrMHgyNC8weDMwCiBbPGZmZmZmZmZmODAyYTAwMTY+XSBwYXRoX3dhbGsrMHg2Ni8weGIw CiBbPGZmZmZmZmZmODAzYjM0YjQ+XSB4ZnNfZGFfcmVhZF9idWYrMHgyNC8weDMwCiBbPGZm ZmZmZmZmODAzYjZkNTk+XSB4ZnNfZGlyMl9ibG9ja19nZXRkZW50cysweDk5LzB4MjAwCiBb PGZmZmZmZmZmODAzYjZkNTk+XSB4ZnNfZGlyMl9ibG9ja19nZXRkZW50cysweDk5LzB4MjAw CiBbPGZmZmZmZmZmODAzZWI4YTA+XSB4ZnNfaGFja19maWxsZGlyKzB4MC8weDYwCiBbPGZm ZmZmZmZmODAzZWI4YTA+XSB4ZnNfaGFja19maWxsZGlyKzB4MC8weDYwCiBbPGZmZmZmZmZm ODAzYjY2MGI+XSB4ZnNfcmVhZGRpcisweGJiLzB4ZjAKIFs8ZmZmZmZmZmY4MDJjYzMwMD5d IGNvbXBhdF9maWxsZGlyNjQrMHgwLzB4ZTAKIFs8ZmZmZmZmZmY4MDNlYjliZT5dIHhmc19m aWxlX3JlYWRkaXIrMHhiZS8weDE3MAogWzxmZmZmZmZmZjgwMmNjMzAwPl0gY29tcGF0X2Zp bGxkaXI2NCsweDAvMHhlMAogWzxmZmZmZmZmZjgwMmE0ODgwPl0gdmZzX3JlYWRkaXIrMHhj MC8weGUwCiBbPGZmZmZmZmZmODAyY2M0NmE+XSBjb21wYXRfc3lzX2dldGRlbnRzNjQrMHg4 YS8weGYwCiBbPGZmZmZmZmZmODAyMjgyODI+XSBpYTMyX3N5c3JldCsweDAvMHhhCgowMDAw MDAwMDogMDAgMDAgYzAgNDkgMDAgMzAgMDAgYzMgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAg IC4uLkkuMC4uLi4uLi4uLi4KRmlsZXN5c3RlbSAiZG0tMjAiOiBYRlMgaW50ZXJuYWwgZXJy b3IgeGZzX2RhX2RvX2J1ZigyKSBhdCBsaW5lIDIxMTIgb2YgZmlsZSBmcy94ZnMveGZzX2Rh X2J0cmVlLmMuICBDYWxsZXIgMHhmZmZmZmZmZjgwM2IzNGI0ClBpZDogMjMwNDEsIGNvbW06 IHNtYmQgTm90IHRhaW50ZWQgMi42LjI3LjEwICMyNAoKQ2FsbCBUcmFjZToKIFs8ZmZmZmZm ZmY4MDNiMzNiNj5dIHhmc19kYV9kb19idWYrMHg2MjYvMHg2YjAKIFs8ZmZmZmZmZmY4MDNi MzRiND5dIHhmc19kYV9yZWFkX2J1ZisweDI0LzB4MzAKIFs8ZmZmZmZmZmY4MDI0ZTRhNj5d IHVwKzB4MTYvMHg1MAogWzxmZmZmZmZmZjgwMjM2MWM3Pl0gcmVsZWFzZV9jb25zb2xlX3Nl bSsweDFhNy8weDFkMAogWzxmZmZmZmZmZjgwM2IzNGI0Pl0geGZzX2RhX3JlYWRfYnVmKzB4 MjQvMHgzMAogWzxmZmZmZmZmZjgwM2I3N2U1Pl0geGZzX2RpcjJfYmxvY2tfbG9va3VwX2lu dCsweDQ1LzB4MWEwCiBbPGZmZmZmZmZmODAzYjc3ZTU+XSB4ZnNfZGlyMl9ibG9ja19sb29r dXBfaW50KzB4NDUvMHgxYTAKIFs8ZmZmZmZmZmY4MDQyNTcwMT5dIF9fdXBfcmVhZCsweDIx LzB4YjAKIFs8ZmZmZmZmZmY4MDNiNzk1OD5dIHhmc19kaXIyX2Jsb2NrX2xvb2t1cCsweDE4 LzB4YzAKIFs8ZmZmZmZmZmY4MDNiNjI0Zj5dIHhmc19kaXIyX2lzYmxvY2srMHgxZi8weDYw CiBbPGZmZmZmZmZmODAzYjY5NmQ+XSB4ZnNfZGlyX2xvb2t1cCsweDE5ZC8weDFjMAogWzxm ZmZmZmZmZjgwM2UzMjY3Pl0geGZzX2xvb2t1cCsweDU3LzB4ZDAKIFs8ZmZmZmZmZmY4MDNl ZTZlND5dIHhmc192bl9sb29rdXArMHg2NC8weGMwCiBbPGZmZmZmZmZmODAyYTlmOTU+XSBk X2FsbG9jKzB4MTI1LzB4MWIwCiBbPGZmZmZmZmZmODAyOWYxNTU+XSBkb19sb29rdXArMHgx NzUvMHgyMjAKIFs8ZmZmZmZmZmY4MDI5ZWE3OT5dIGdlbmVyaWNfcGVybWlzc2lvbisweDY5 LzB4MTMwCiBbPGZmZmZmZmZmODAyOWZhMDE+XSBfX2xpbmtfcGF0aF93YWxrKzB4ODAxLzB4 ZGIwCiBbPGZmZmZmZmZmODAyYTAwMDc+XSBwYXRoX3dhbGsrMHg1Ny8weGIwCiBbPGZmZmZm ZmZmODAyYTAxODM+XSBkb19wYXRoX2xvb2t1cCsweDEyMy8weDFiMAogWzxmZmZmZmZmZjgw MmEwNmY0Pl0gdXNlcl9wYXRoX2F0KzB4NDQvMHg4MAogWzxmZmZmZmZmZjgwMmFmNWMxPl0g bW50cHV0X25vX2V4cGlyZSsweDIxLzB4MTIwCiBbPGZmZmZmZmZmODAyOWEyODA+XSB2ZnNf bHN0YXRfZmQrMHgyMC8weDgwCiBbPGZmZmZmZmZmODAyMjg4MGY+XSBzeXMzMl9sc3RhdDY0 KzB4MWYvMHg3MAogWzxmZmZmZmZmZjgwMjI4MjgyPl0gaWEzMl9zeXNyZXQrMHgwLzB4YQoK MDAwMDAwMDA6IDExIDBhIDczIGJiIDBmIGM5IDAxIGMyIDAwIDAwIGZmIGZmIDAwIDAwIGZm IGZmICAuLnMuLi4uLi4uLi4uLi4uCkZpbGVzeXN0ZW0gImRtLTIwIjogWEZTIGludGVybmFs IGVycm9yIHhmc19kYV9kb19idWYoMikgYXQgbGluZSAyMTEyIG9mIGZpbGUgZnMveGZzL3hm c19kYV9idHJlZS5jLiAgQ2FsbGVyIDB4ZmZmZmZmZmY4MDNiMzRiNApQaWQ6IDI3OTA5LCBj b21tOiBzbWJkIE5vdCB0YWludGVkIDIuNi4yNy4xMCAjMjQKCkNhbGwgVHJhY2U6CiBbPGZm ZmZmZmZmODAzYjMzYjY+XSB4ZnNfZGFfZG9fYnVmKzB4NjI2LzB4NmIwCiBbPGZmZmZmZmZm ODAzYjM0YjQ+XSB4ZnNfZGFfcmVhZF9idWYrMHgyNC8weDMwCiBbPGZmZmZmZmZmODAyM2Vl MGY+XSB0cnlfdG9fZGVsX3RpbWVyX3N5bmMrMHg0Zi8weDYwCiBbPGZmZmZmZmZmODAzYjM0 YjQ+XSB4ZnNfZGFfcmVhZF9idWYrMHgyNC8weDMwCiBbPGZmZmZmZmZmODAzYjc3ZTU+XSB4 ZnNfZGlyMl9ibG9ja19sb29rdXBfaW50KzB4NDUvMHgxYTAKIFs8ZmZmZmZmZmY4MDNiNzdl NT5dIHhmc19kaXIyX2Jsb2NrX2xvb2t1cF9pbnQrMHg0NS8weDFhMAogWzxmZmZmZmZmZjgw M2I3OTU4Pl0geGZzX2RpcjJfYmxvY2tfbG9va3VwKzB4MTgvMHhjMAogWzxmZmZmZmZmZjgw M2I2MjRmPl0geGZzX2RpcjJfaXNibG9jaysweDFmLzB4NjAKIFs8ZmZmZmZmZmY4MDNiNjk2 ZD5dIHhmc19kaXJfbG9va3VwKzB4MTlkLzB4MWMwCiBbPGZmZmZmZmZmODAzZTMyNjc+XSB4 ZnNfbG9va3VwKzB4NTcvMHhkMAogWzxmZmZmZmZmZjgwNjlkZmQ5Pl0gX3NwaW5fbG9ja19i aCsweDkvMHgyMAogWzxmZmZmZmZmZjgwM2VlNmU0Pl0geGZzX3ZuX2xvb2t1cCsweDY0LzB4 YzAKIFs8ZmZmZmZmZmY4MDJhOWY5NT5dIGRfYWxsb2MrMHgxMjUvMHgxYjAKIFs8ZmZmZmZm ZmY4MDI5ZjE1NT5dIGRvX2xvb2t1cCsweDE3NS8weDIyMAogWzxmZmZmZmZmZjgwMjllYTc5 Pl0gZ2VuZXJpY19wZXJtaXNzaW9uKzB4NjkvMHgxMzAKIFs8ZmZmZmZmZmY4MDI5ZmEwMT5d IF9fbGlua19wYXRoX3dhbGsrMHg4MDEvMHhkYjAKIFs8ZmZmZmZmZmY4MDVkZTY2Mz5dIHNv Y2tfYWlvX3JlYWQrMHgxNjMvMHgxNzAKIFs8ZmZmZmZmZmY4MDJhMDAwNz5dIHBhdGhfd2Fs aysweDU3LzB4YjAKIFs8ZmZmZmZmZmY4MDJhMDE4Mz5dIGRvX3BhdGhfbG9va3VwKzB4MTIz LzB4MWIwCiBbPGZmZmZmZmZmODAyYTA2ZjQ+XSB1c2VyX3BhdGhfYXQrMHg0NC8weDgwCiBb PGZmZmZmZmZmODAyNGE0NTA+XSBhdXRvcmVtb3ZlX3dha2VfZnVuY3Rpb24rMHgwLzB4MzAK IFs8ZmZmZmZmZmY4MDJhZjVjMT5dIG1udHB1dF9ub19leHBpcmUrMHgyMS8weDEyMAogWzxm ZmZmZmZmZjgwMjlhMWYzPl0gdmZzX3N0YXRfZmQrMHgyMy8weDgwCiBbPGZmZmZmZmZmODAy Mjg3OWY+XSBzeXMzMl9zdGF0NjQrMHgxZi8weDcwCiBbPGZmZmZmZmZmODAyMjgyODI+XSBp YTMyX3N5c3JldCsweDAvMHhhCgowMDAwMDAwMDogMTEgMGEgNzMgYmIgMGYgYzkgMDEgYzIg MDAgMDAgZmYgZmYgMDAgMDAgZmYgZmYgIC4ucy4uLi4uLi4uLi4uLi4KRmlsZXN5c3RlbSAi ZG0tMjAiOiBYRlMgaW50ZXJuYWwgZXJyb3IgeGZzX2RhX2RvX2J1ZigyKSBhdCBsaW5lIDIx MTIgb2YgZmlsZSBmcy94ZnMveGZzX2RhX2J0cmVlLmMuICBDYWxsZXIgMHhmZmZmZmZmZjgw M2IzNGI0ClBpZDogMjc5MDksIGNvbW06IHNtYmQgTm90IHRhaW50ZWQgMi42LjI3LjEwICMy NAoKQ2FsbCBUcmFjZToKIFs8ZmZmZmZmZmY4MDNiMzNiNj5dIHhmc19kYV9kb19idWYrMHg2 MjYvMHg2YjAKIFs8ZmZmZmZmZmY4MDNiMzRiND5dIHhmc19kYV9yZWFkX2J1ZisweDI0LzB4 MzAKIFs8ZmZmZmZmZmY4MDIzZWUwZj5dIHRyeV90b19kZWxfdGltZXJfc3luYysweDRmLzB4 NjAKIFs8ZmZmZmZmZmY4MDNiMzRiND5dIHhmc19kYV9yZWFkX2J1ZisweDI0LzB4MzAKIFs8 ZmZmZmZmZmY4MDNiNzdlNT5dIHhmc19kaXIyX2Jsb2NrX2xvb2t1cF9pbnQrMHg0NS8weDFh MAogWzxmZmZmZmZmZjgwM2I3N2U1Pl0geGZzX2RpcjJfYmxvY2tfbG9va3VwX2ludCsweDQ1 LzB4MWEwCiBbPGZmZmZmZmZmODAzYjc5NTg+XSB4ZnNfZGlyMl9ibG9ja19sb29rdXArMHgx OC8weGMwCiBbPGZmZmZmZmZmODAzYjYyNGY+XSB4ZnNfZGlyMl9pc2Jsb2NrKzB4MWYvMHg2 MAogWzxmZmZmZmZmZjgwM2I2OTZkPl0geGZzX2Rpcl9sb29rdXArMHgxOWQvMHgxYzAKIFs8 ZmZmZmZmZmY4MDNlMzI2Nz5dIHhmc19sb29rdXArMHg1Ny8weGQwCiBbPGZmZmZmZmZmODA2 OWRmZDk+XSBfc3Bpbl9sb2NrX2JoKzB4OS8weDIwCiBbPGZmZmZmZmZmODAzZWU2ZTQ+XSB4 ZnNfdm5fbG9va3VwKzB4NjQvMHhjMAogWzxmZmZmZmZmZjgwMmE5Zjk1Pl0gZF9hbGxvYysw eDEyNS8weDFiMAogWzxmZmZmZmZmZjgwMjlmMTU1Pl0gZG9fbG9va3VwKzB4MTc1LzB4MjIw CiBbPGZmZmZmZmZmODAyOWVhNzk+XSBnZW5lcmljX3Blcm1pc3Npb24rMHg2OS8weDEzMAog WzxmZmZmZmZmZjgwMjlmYTAxPl0gX19saW5rX3BhdGhfd2FsaysweDgwMS8weGRiMAogWzxm ZmZmZmZmZjgwNWRlNjYzPl0gc29ja19haW9fcmVhZCsweDE2My8weDE3MAogWzxmZmZmZmZm ZjgwMmEwMDA3Pl0gcGF0aF93YWxrKzB4NTcvMHhiMAogWzxmZmZmZmZmZjgwMmEwMTgzPl0g ZG9fcGF0aF9sb29rdXArMHgxMjMvMHgxYjAKIFs8ZmZmZmZmZmY4MDJhMDZmND5dIHVzZXJf cGF0aF9hdCsweDQ0LzB4ODAKIFs8ZmZmZmZmZmY4MDI0YTQ1MD5dIGF1dG9yZW1vdmVfd2Fr ZV9mdW5jdGlvbisweDAvMHgzMAogWzxmZmZmZmZmZjgwMmFmNWMxPl0gbW50cHV0X25vX2V4 cGlyZSsweDIxLzB4MTIwCiBbPGZmZmZmZmZmODAyOWExZjM+XSB2ZnNfc3RhdF9mZCsweDIz LzB4ODAKIFs8ZmZmZmZmZmY4MDIyODc5Zj5dIHN5czMyX3N0YXQ2NCsweDFmLzB4NzAKIFs8 ZmZmZmZmZmY4MDIyODI4Mj5dIGlhMzJfc3lzcmV0KzB4MC8weGEKCjAwMDAwMDAwOiAxMSAw YSA3MyBiYiAwZiBjOSAwMSBjMiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAgLi5zLi4uLi4u Li4uLi4uLgpGaWxlc3lzdGVtICJkbS0yMCI6IFhGUyBpbnRlcm5hbCBlcnJvciB4ZnNfZGFf ZG9fYnVmKDIpIGF0IGxpbmUgMjExMiBvZiBmaWxlIGZzL3hmcy94ZnNfZGFfYnRyZWUuYy4g IENhbGxlciAweGZmZmZmZmZmODAzYjM0YjQKUGlkOiAyNzkwOSwgY29tbTogc21iZCBOb3Qg dGFpbnRlZCAyLjYuMjcuMTAgIzI0CgpDYWxsIFRyYWNlOgogWzxmZmZmZmZmZjgwM2IzM2I2 Pl0geGZzX2RhX2RvX2J1ZisweDYyNi8weDZiMAogWzxmZmZmZmZmZjgwM2IzNGI0Pl0geGZz X2RhX3JlYWRfYnVmKzB4MjQvMHgzMAogWzxmZmZmZmZmZjgwMmEwMDE2Pl0gcGF0aF93YWxr KzB4NjYvMHhiMAogWzxmZmZmZmZmZjgwM2IzNGI0Pl0geGZzX2RhX3JlYWRfYnVmKzB4MjQv MHgzMAogWzxmZmZmZmZmZjgwM2I2ZDU5Pl0geGZzX2RpcjJfYmxvY2tfZ2V0ZGVudHMrMHg5 OS8weDIwMAogWzxmZmZmZmZmZjgwM2I2ZDU5Pl0geGZzX2RpcjJfYmxvY2tfZ2V0ZGVudHMr MHg5OS8weDIwMAogWzxmZmZmZmZmZjgwM2ViOGEwPl0geGZzX2hhY2tfZmlsbGRpcisweDAv MHg2MAogWzxmZmZmZmZmZjgwM2ViOGEwPl0geGZzX2hhY2tfZmlsbGRpcisweDAvMHg2MAog WzxmZmZmZmZmZjgwM2I2NjBiPl0geGZzX3JlYWRkaXIrMHhiYi8weGYwCiBbPGZmZmZmZmZm ODAyY2MzMDA+XSBjb21wYXRfZmlsbGRpcjY0KzB4MC8weGUwCiBbPGZmZmZmZmZmODAzZWI5 YmU+XSB4ZnNfZmlsZV9yZWFkZGlyKzB4YmUvMHgxNzAKIFs8ZmZmZmZmZmY4MDJjYzMwMD5d IGNvbXBhdF9maWxsZGlyNjQrMHgwLzB4ZTAKIFs8ZmZmZmZmZmY4MDJhNDg4MD5dIHZmc19y ZWFkZGlyKzB4YzAvMHhlMAogWzxmZmZmZmZmZjgwMmNjNDZhPl0gY29tcGF0X3N5c19nZXRk ZW50czY0KzB4OGEvMHhmMAogWzxmZmZmZmZmZjgwMjI4MjgyPl0gaWEzMl9zeXNyZXQrMHgw LzB4YQoKMDAwMDAwMDA6IDExIDBhIDczIGJiIDBmIGM5IDAxIGMyIDAwIDAwIGZmIGZmIDAw IDAwIGZmIGZmICAuLnMuLi4uLi4uLi4uLi4uCkZpbGVzeXN0ZW0gImRtLTIwIjogWEZTIGlu dGVybmFsIGVycm9yIHhmc19kYV9kb19idWYoMikgYXQgbGluZSAyMTEyIG9mIGZpbGUgZnMv eGZzL3hmc19kYV9idHJlZS5jLiAgQ2FsbGVyIDB4ZmZmZmZmZmY4MDNiMzRiNApQaWQ6IDI3 OTA5LCBjb21tOiBzbWJkIE5vdCB0YWludGVkIDIuNi4yNy4xMCAjMjQKCkNhbGwgVHJhY2U6 CiBbPGZmZmZmZmZmODAzYjMzYjY+XSB4ZnNfZGFfZG9fYnVmKzB4NjI2LzB4NmIwCiBbPGZm ZmZmZmZmODAzYjM0YjQ+XSB4ZnNfZGFfcmVhZF9idWYrMHgyNC8weDMwCiBbPGZmZmZmZmZm ODAyNGU0YTY+XSB1cCsweDE2LzB4NTAKIFs8ZmZmZmZmZmY4MDIzNjFjNz5dIHJlbGVhc2Vf Y29uc29sZV9zZW0rMHgxYTcvMHgxZDAKIFs8ZmZmZmZmZmY4MDNiMzRiND5dIHhmc19kYV9y ZWFkX2J1ZisweDI0LzB4MzAKIFs8ZmZmZmZmZmY4MDNiNzdlNT5dIHhmc19kaXIyX2Jsb2Nr X2xvb2t1cF9pbnQrMHg0NS8weDFhMAogWzxmZmZmZmZmZjgwM2I3N2U1Pl0geGZzX2RpcjJf YmxvY2tfbG9va3VwX2ludCsweDQ1LzB4MWEwCiBbPGZmZmZmZmZmODA0MjU3MDE+XSBfX3Vw X3JlYWQrMHgyMS8weGIwCiBbPGZmZmZmZmZmODAzYjc5NTg+XSB4ZnNfZGlyMl9ibG9ja19s b29rdXArMHgxOC8weGMwCiBbPGZmZmZmZmZmODAzYjYyNGY+XSB4ZnNfZGlyMl9pc2Jsb2Nr KzB4MWYvMHg2MAogWzxmZmZmZmZmZjgwM2I2OTZkPl0geGZzX2Rpcl9sb29rdXArMHgxOWQv MHgxYzAKIFs8ZmZmZmZmZmY4MDNlMzI2Nz5dIHhmc19sb29rdXArMHg1Ny8weGQwCiBbPGZm ZmZmZmZmODAzZWU2ZTQ+XSB4ZnNfdm5fbG9va3VwKzB4NjQvMHhjMAogWzxmZmZmZmZmZjgw MmE5Zjk1Pl0gZF9hbGxvYysweDEyNS8weDFiMAogWzxmZmZmZmZmZjgwMjlmMTU1Pl0gZG9f bG9va3VwKzB4MTc1LzB4MjIwCiBbPGZmZmZmZmZmODAyOWVhNzk+XSBnZW5lcmljX3Blcm1p c3Npb24rMHg2OS8weDEzMAogWzxmZmZmZmZmZjgwMjlmYTAxPl0gX19saW5rX3BhdGhfd2Fs aysweDgwMS8weGRiMAogWzxmZmZmZmZmZjgwMmEwMDA3Pl0gcGF0aF93YWxrKzB4NTcvMHhi MAogWzxmZmZmZmZmZjgwMmEwMTgzPl0gZG9fcGF0aF9sb29rdXArMHgxMjMvMHgxYjAKIFs8 ZmZmZmZmZmY4MDJhMDZmND5dIHVzZXJfcGF0aF9hdCsweDQ0LzB4ODAKIFs8ZmZmZmZmZmY4 MDJhZjVjMT5dIG1udHB1dF9ub19leHBpcmUrMHgyMS8weDEyMAogWzxmZmZmZmZmZjgwMjlh MjgwPl0gdmZzX2xzdGF0X2ZkKzB4MjAvMHg4MAogWzxmZmZmZmZmZjgwMjI4ODBmPl0gc3lz MzJfbHN0YXQ2NCsweDFmLzB4NzAKIFs8ZmZmZmZmZmY4MDIyODI4Mj5dIGlhMzJfc3lzcmV0 KzB4MC8weGEKCjAwMDAwMDAwOiAwMCAwMCBjMCA0OSAwMCAwMyAwMCAwMyAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAgLi4uSS4uLi4uLi4uLi4uLgpGaWxlc3lzdGVtICJkbS0yMCI6IFhG UyBpbnRlcm5hbCBlcnJvciB4ZnNfZGFfZG9fYnVmKDIpIGF0IGxpbmUgMjExMiBvZiBmaWxl IGZzL3hmcy94ZnNfZGFfYnRyZWUuYy4gIENhbGxlciAweGZmZmZmZmZmODAzYjM0YjQKUGlk OiAzMTMzMywgY29tbTogc21iZCBOb3QgdGFpbnRlZCAyLjYuMjcuMTAgIzI0CgpDYWxsIFRy YWNlOgogWzxmZmZmZmZmZjgwM2IzM2I2Pl0geGZzX2RhX2RvX2J1ZisweDYyNi8weDZiMAog WzxmZmZmZmZmZjgwM2IzNGI0Pl0geGZzX2RhX3JlYWRfYnVmKzB4MjQvMHgzMAogWzxmZmZm ZmZmZjgwMjNlZTBmPl0gdHJ5X3RvX2RlbF90aW1lcl9zeW5jKzB4NGYvMHg2MAogWzxmZmZm ZmZmZjgwM2IzNGI0Pl0geGZzX2RhX3JlYWRfYnVmKzB4MjQvMHgzMAogWzxmZmZmZmZmZjgw M2I3N2U1Pl0geGZzX2RpcjJfYmxvY2tfbG9va3VwX2ludCsweDQ1LzB4MWEwCiBbPGZmZmZm ZmZmODAzYjc3ZTU+XSB4ZnNfZGlyMl9ibG9ja19sb29rdXBfaW50KzB4NDUvMHgxYTAKIFs8 ZmZmZmZmZmY4MDNiNzk1OD5dIHhmc19kaXIyX2Jsb2NrX2xvb2t1cCsweDE4LzB4YzAKIFs8 ZmZmZmZmZmY4MDNiNjI0Zj5dIHhmc19kaXIyX2lzYmxvY2srMHgxZi8weDYwCiBbPGZmZmZm ZmZmODAzYjY5NmQ+XSB4ZnNfZGlyX2xvb2t1cCsweDE5ZC8weDFjMAogWzxmZmZmZmZmZjgw M2UzMjY3Pl0geGZzX2xvb2t1cCsweDU3LzB4ZDAKIFs8ZmZmZmZmZmY4MDY5ZGZkOT5dIF9z cGluX2xvY2tfYmgrMHg5LzB4MjAKIFs8ZmZmZmZmZmY4MDNlZTZlND5dIHhmc192bl9sb29r dXArMHg2NC8weGMwCiBbPGZmZmZmZmZmODAyYTlmOTU+XSBkX2FsbG9jKzB4MTI1LzB4MWIw CiBbPGZmZmZmZmZmODAyOWYxNTU+XSBkb19sb29rdXArMHgxNzUvMHgyMjAKIFs8ZmZmZmZm ZmY4MDI5ZWE3OT5dIGdlbmVyaWNfcGVybWlzc2lvbisweDY5LzB4MTMwCiBbPGZmZmZmZmZm ODAyOWZhMDE+XSBfX2xpbmtfcGF0aF93YWxrKzB4ODAxLzB4ZGIwCiBbPGZmZmZmZmZmODA1 ZGU2NjM+XSBzb2NrX2Fpb19yZWFkKzB4MTYzLzB4MTcwCiBbPGZmZmZmZmZmODAyYTAwMDc+ XSBwYXRoX3dhbGsrMHg1Ny8weGIwCiBbPGZmZmZmZmZmODAyYTAxODM+XSBkb19wYXRoX2xv b2t1cCsweDEyMy8weDFiMAogWzxmZmZmZmZmZjgwMmEwNmY0Pl0gdXNlcl9wYXRoX2F0KzB4 NDQvMHg4MAogWzxmZmZmZmZmZjgwMjRhNDUwPl0gYXV0b3JlbW92ZV93YWtlX2Z1bmN0aW9u KzB4MC8weDMwCiBbPGZmZmZmZmZmODAyYWY1YzE+XSBtbnRwdXRfbm9fZXhwaXJlKzB4MjEv MHgxMjAKIFs8ZmZmZmZmZmY4MDI5YTFmMz5dIHZmc19zdGF0X2ZkKzB4MjMvMHg4MAogWzxm ZmZmZmZmZjgwMjI4NzlmPl0gc3lzMzJfc3RhdDY0KzB4MWYvMHg3MAogWzxmZmZmZmZmZjgw MjI4MjgyPl0gaWEzMl9zeXNyZXQrMHgwLzB4YQoKMDAwMDAwMDA6IDAwIDAwIGMwIDQ5IDAw IDAzIDAwIDAzIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAuLi5JLi4uLi4uLi4uLi4uCkZp bGVzeXN0ZW0gImRtLTIwIjogWEZTIGludGVybmFsIGVycm9yIHhmc19kYV9kb19idWYoMikg YXQgbGluZSAyMTEyIG9mIGZpbGUgZnMveGZzL3hmc19kYV9idHJlZS5jLiAgQ2FsbGVyIDB4 ZmZmZmZmZmY4MDNiMzRiNApQaWQ6IDMxMzMzLCBjb21tOiBzbWJkIE5vdCB0YWludGVkIDIu Ni4yNy4xMCAjMjQKCkNhbGwgVHJhY2U6CiBbPGZmZmZmZmZmODAzYjMzYjY+XSB4ZnNfZGFf ZG9fYnVmKzB4NjI2LzB4NmIwCiBbPGZmZmZmZmZmODAzYjM0YjQ+XSB4ZnNfZGFfcmVhZF9i dWYrMHgyNC8weDMwCiBbPGZmZmZmZmZmODAyM2VlMGY+XSB0cnlfdG9fZGVsX3RpbWVyX3N5 bmMrMHg0Zi8weDYwCiBbPGZmZmZmZmZmODAzYjM0YjQ+XSB4ZnNfZGFfcmVhZF9idWYrMHgy NC8weDMwCiBbPGZmZmZmZmZmODAzYjc3ZTU+XSB4ZnNfZGlyMl9ibG9ja19sb29rdXBfaW50 KzB4NDUvMHgxYTAKIFs8ZmZmZmZmZmY4MDNiNzdlNT5dIHhmc19kaXIyX2Jsb2NrX2xvb2t1 cF9pbnQrMHg0NS8weDFhMAogWzxmZmZmZmZmZjgwM2I3OTU4Pl0geGZzX2RpcjJfYmxvY2tf bG9va3VwKzB4MTgvMHhjMAogWzxmZmZmZmZmZjgwM2I2MjRmPl0geGZzX2RpcjJfaXNibG9j aysweDFmLzB4NjAKIFs8ZmZmZmZmZmY4MDNiNjk2ZD5dIHhmc19kaXJfbG9va3VwKzB4MTlk LzB4MWMwCiBbPGZmZmZmZmZmODAzZTMyNjc+XSB4ZnNfbG9va3VwKzB4NTcvMHhkMAogWzxm ZmZmZmZmZjgwNjlkZmQ5Pl0gX3NwaW5fbG9ja19iaCsweDkvMHgyMAogWzxmZmZmZmZmZjgw M2VlNmU0Pl0geGZzX3ZuX2xvb2t1cCsweDY0LzB4YzAKIFs8ZmZmZmZmZmY4MDJhOWY5NT5d IGRfYWxsb2MrMHgxMjUvMHgxYjAKIFs8ZmZmZmZmZmY4MDI5ZjE1NT5dIGRvX2xvb2t1cCsw eDE3NS8weDIyMAogWzxmZmZmZmZmZjgwMjllYTc5Pl0gZ2VuZXJpY19wZXJtaXNzaW9uKzB4 NjkvMHgxMzAKIFs8ZmZmZmZmZmY4MDI5ZmEwMT5dIF9fbGlua19wYXRoX3dhbGsrMHg4MDEv MHhkYjAKIFs8ZmZmZmZmZmY4MDVkZTY2Mz5dIHNvY2tfYWlvX3JlYWQrMHgxNjMvMHgxNzAK IFs8ZmZmZmZmZmY4MDJhMDAwNz5dIHBhdGhfd2FsaysweDU3LzB4YjAKIFs8ZmZmZmZmZmY4 MDJhMDE4Mz5dIGRvX3BhdGhfbG9va3VwKzB4MTIzLzB4MWIwCiBbPGZmZmZmZmZmODAyYTA2 ZjQ+XSB1c2VyX3BhdGhfYXQrMHg0NC8weDgwCiBbPGZmZmZmZmZmODAyMmIwNmM+XSBfX2Rl cXVldWVfZW50aXR5KzB4NmMvMHhhMAogWzxmZmZmZmZmZjgwMjBiMWE1Pl0gX19zd2l0Y2hf dG8rMHgzMTUvMHgzODAKIFs8ZmZmZmZmZmY4MDI5YTFmMz5dIHZmc19zdGF0X2ZkKzB4MjMv MHg4MAogWzxmZmZmZmZmZjgwMjI4NzlmPl0gc3lzMzJfc3RhdDY0KzB4MWYvMHg3MAogWzxm ZmZmZmZmZjgwMjI4MjgyPl0gaWEzMl9zeXNyZXQrMHgwLzB4YQoKMDAwMDAwMDA6IDAwIDAw IGMwIDQ5IDAwIDAzIDAwIDAzIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAuLi5JLi4uLi4u Li4uLi4uCkZpbGVzeXN0ZW0gImRtLTIwIjogWEZTIGludGVybmFsIGVycm9yIHhmc19kYV9k b19idWYoMikgYXQgbGluZSAyMTEyIG9mIGZpbGUgZnMveGZzL3hmc19kYV9idHJlZS5jLiAg Q2FsbGVyIDB4ZmZmZmZmZmY4MDNiMzRiNApQaWQ6IDMxMzMzLCBjb21tOiBzbWJkIE5vdCB0 YWludGVkIDIuNi4yNy4xMCAjMjQKCkNhbGwgVHJhY2U6CiBbPGZmZmZmZmZmODAzYjMzYjY+ XSB4ZnNfZGFfZG9fYnVmKzB4NjI2LzB4NmIwCiBbPGZmZmZmZmZmODAzYjM0YjQ+XSB4ZnNf ZGFfcmVhZF9idWYrMHgyNC8weDMwCiBbPGZmZmZmZmZmODAyYTAwMTY+XSBwYXRoX3dhbGsr MHg2Ni8weGIwCiBbPGZmZmZmZmZmODAzYjM0YjQ+XSB4ZnNfZGFfcmVhZF9idWYrMHgyNC8w eDMwCiBbPGZmZmZmZmZmODAzYjZkNTk+XSB4ZnNfZGlyMl9ibG9ja19nZXRkZW50cysweDk5 LzB4MjAwCiBbPGZmZmZmZmZmODAzYjZkNTk+XSB4ZnNfZGlyMl9ibG9ja19nZXRkZW50cysw eDk5LzB4MjAwCiBbPGZmZmZmZmZmODAzZWI4YTA+XSB4ZnNfaGFja19maWxsZGlyKzB4MC8w eDYwCiBbPGZmZmZmZmZmODAzZWI4YTA+XSB4ZnNfaGFja19maWxsZGlyKzB4MC8weDYwCiBb PGZmZmZmZmZmODAzYjY2MGI+XSB4ZnNfcmVhZGRpcisweGJiLzB4ZjAKIFs8ZmZmZmZmZmY4 MDJjYzMwMD5dIGNvbXBhdF9maWxsZGlyNjQrMHgwLzB4ZTAKIFs8ZmZmZmZmZmY4MDNlYjli ZT5dIHhmc19maWxlX3JlYWRkaXIrMHhiZS8weDE3MAogWzxmZmZmZmZmZjgwMmNjMzAwPl0g Y29tcGF0X2ZpbGxkaXI2NCsweDAvMHhlMAogWzxmZmZmZmZmZjgwMmE0ODgwPl0gdmZzX3Jl YWRkaXIrMHhjMC8weGUwCiBbPGZmZmZmZmZmODAyY2M0NmE+XSBjb21wYXRfc3lzX2dldGRl bnRzNjQrMHg4YS8weGYwCiBbPGZmZmZmZmZmODAyMjgyODI+XSBpYTMyX3N5c3JldCsweDAv MHhhCgowMDAwMDAwMDogMDAgMDAgYzAgNDkgMDAgMDMgMDAgMDMgMDAgMDAgMDAgMDAgMDAg MDAgMDAgMDAgIC4uLkkuLi4uLi4uLi4uLi4KRmlsZXN5c3RlbSAiZG0tMjAiOiBYRlMgaW50 ZXJuYWwgZXJyb3IgeGZzX2RhX2RvX2J1ZigyKSBhdCBsaW5lIDIxMTIgb2YgZmlsZSBmcy94 ZnMveGZzX2RhX2J0cmVlLmMuICBDYWxsZXIgMHhmZmZmZmZmZjgwM2IzNGI0ClBpZDogMzEz MzMsIGNvbW06IHNtYmQgTm90IHRhaW50ZWQgMi42LjI3LjEwICMyNAoKQ2FsbCBUcmFjZToK IFs8ZmZmZmZmZmY4MDNiMzNiNj5dIHhmc19kYV9kb19idWYrMHg2MjYvMHg2YjAKIFs8ZmZm ZmZmZmY4MDNiMzRiND5dIHhmc19kYV9yZWFkX2J1ZisweDI0LzB4MzAKIFs8ZmZmZmZmZmY4 MDI0ZTRhNj5dIHVwKzB4MTYvMHg1MAogWzxmZmZmZmZmZjgwMjM2MWM3Pl0gcmVsZWFzZV9j b25zb2xlX3NlbSsweDFhNy8weDFkMAogWzxmZmZmZmZmZjgwM2IzNGI0Pl0geGZzX2RhX3Jl YWRfYnVmKzB4MjQvMHgzMAogWzxmZmZmZmZmZjgwM2I3N2U1Pl0geGZzX2RpcjJfYmxvY2tf bG9va3VwX2ludCsweDQ1LzB4MWEwCiBbPGZmZmZmZmZmODAzYjc3ZTU+XSB4ZnNfZGlyMl9i bG9ja19sb29rdXBfaW50KzB4NDUvMHgxYTAKIFs8ZmZmZmZmZmY4MDQyNTcwMT5dIF9fdXBf cmVhZCsweDIxLzB4YjAKIFs8ZmZmZmZmZmY4MDNiNzk1OD5dIHhmc19kaXIyX2Jsb2NrX2xv b2t1cCsweDE4LzB4YzAKIFs8ZmZmZmZmZmY4MDNiNjI0Zj5dIHhmc19kaXIyX2lzYmxvY2sr MHgxZi8weDYwCiBbPGZmZmZmZmZmODAzYjY5NmQ+XSB4ZnNfZGlyX2xvb2t1cCsweDE5ZC8w eDFjMAogWzxmZmZmZmZmZjgwM2UzMjY3Pl0geGZzX2xvb2t1cCsweDU3LzB4ZDAKIFs8ZmZm ZmZmZmY4MDNlZTZlND5dIHhmc192bl9sb29rdXArMHg2NC8weGMwCiBbPGZmZmZmZmZmODAy YTlmOTU+XSBkX2FsbG9jKzB4MTI1LzB4MWIwCiBbPGZmZmZmZmZmODAyOWYxNTU+XSBkb19s b29rdXArMHgxNzUvMHgyMjAKIFs8ZmZmZmZmZmY4MDI5ZWE3OT5dIGdlbmVyaWNfcGVybWlz c2lvbisweDY5LzB4MTMwCiBbPGZmZmZmZmZmODAyOWZhMDE+XSBfX2xpbmtfcGF0aF93YWxr KzB4ODAxLzB4ZGIwCiBbPGZmZmZmZmZmODAyYTAwMDc+XSBwYXRoX3dhbGsrMHg1Ny8weGIw CiBbPGZmZmZmZmZmODAyYTAxODM+XSBkb19wYXRoX2xvb2t1cCsweDEyMy8weDFiMAogWzxm ZmZmZmZmZjgwMmEwNmY0Pl0gdXNlcl9wYXRoX2F0KzB4NDQvMHg4MAogWzxmZmZmZmZmZjgw MmFmNWMxPl0gbW50cHV0X25vX2V4cGlyZSsweDIxLzB4MTIwCiBbPGZmZmZmZmZmODAyOWEy ODA+XSB2ZnNfbHN0YXRfZmQrMHgyMC8weDgwCiBbPGZmZmZmZmZmODAyMjg4MGY+XSBzeXMz Ml9sc3RhdDY0KzB4MWYvMHg3MAogWzxmZmZmZmZmZjgwMjI4MjgyPl0gaWEzMl9zeXNyZXQr MHgwLzB4YQoK --------------090005010608050509040804-- From sandeen@sandeen.net Tue Feb 9 10:53:52 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_93 autolearn=no version=3.3.0-rupdated 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 o19GrgkE234523 for ; Tue, 9 Feb 2010 10:53:47 -0600 X-ASG-Debug-ID: 1265734494-13bf013b0000-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 A635F1CB906F for ; Tue, 9 Feb 2010 08:54:54 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id BEdKDz0mtnvksb2d for ; Tue, 09 Feb 2010 08:54:54 -0800 (PST) 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 839388F4FF6; Tue, 9 Feb 2010 10:54:54 -0600 (CST) Message-ID: <4B71935E.7090907@sandeen.net> Date: Tue, 09 Feb 2010 10:54:54 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Christoph Hellwig CC: Theodore Tso , xfs-oss X-ASG-Orig-Subj: [PATCH V2] xfstests: fix up fs_perms test used by 126 Subject: [PATCH V2] xfstests: fix up fs_perms test used by 126 References: <4B6C4E81.6060201@sandeen.net> <20100208194058.GC9527@infradead.org> In-Reply-To: <20100208194058.GC9527@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: 1265734495 X-Barracuda-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.22098 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 Test 126 was failing intermittently for Ted & I; it seems that this is because we were passing an unterminated string to fopen for the mode; I'm not certain why this made it fail, but it's pretty clearly not a good thing to do, and fixing it fixes the test. Rather than passing around characters, do things string-wise, since that is what is ultimately used in fopen(). Reported-by: Theodore Tso Signed-off-by: Eric Sandeen --- V2: Just pass around pointer to passed-in mode argument diff --git a/src/fs_perms.c b/src/fs_perms.c index 2c5e3fa..ea188c4 100644 --- a/src/fs_perms.c +++ b/src/fs_perms.c @@ -42,7 +42,7 @@ int testsetup(mode_t mode, int cuserId, int cgroupId); int testfperm(int userId, int groupId, char* fperm); int main( int argc, char *argv[]) { - char fperm[1]; + char *fperm; int result, exresult=0, cuserId=0, cgroupId=0, userId=0, groupId=0; mode_t mode; @@ -53,7 +53,7 @@ int main( int argc, char *argv[]) { cgroupId = atoi(argv[3]); userId = atoi(argv[4]); groupId = atoi(argv[5]); - fperm[0] = *argv[6]; + fperm = argv[6]; exresult = atoi(argv[7]); break; default: @@ -64,7 +64,7 @@ int main( int argc, char *argv[]) { testsetup(mode,cuserId,cgroupId); result=testfperm(userId,groupId,fperm); system("rm test.file"); - printf("%c a %03o file owned by (%d/%d) as user/group(%d/%d) ",fperm[0],mode,cuserId,cgroupId,userId,groupId); + printf("%s a %03o file owned by (%d/%d) as user/group(%d/%d) ",fperm,mode,cuserId,cgroupId,userId,groupId); if (result == exresult) { printf("PASS\n"); exit(0); @@ -102,8 +102,7 @@ int testfperm(int userId, int groupId, char* fperm) { return(-1); } - switch(tolower(fperm[0])) { - case 'x': + if (!strcmp("x", fperm)) { PID = fork(); if (PID == 0) { execlp("./test.file","test.file",NULL); @@ -114,8 +113,7 @@ int testfperm(int userId, int groupId, char* fperm) { seteuid(0); setegid(0); return(nuthertmpi); - - default: + } else { if((testfile=fopen("test.file",fperm))){ fclose(testfile); seteuid(0); From BATV+f4938f14c6ec46ffcbb1+2361+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 9 11:51:54 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o19Hpr3u238557 for ; Tue, 9 Feb 2010 11:51:54 -0600 X-ASG-Debug-ID: 1265737986-561702210000-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 5AC2E1BE0B1 for ; Tue, 9 Feb 2010 09:53:07 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 1qvGhlM5Y1zF4JvW for ; Tue, 09 Feb 2010 09:53:07 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NeuGn-0002zk-R2; Tue, 09 Feb 2010 17:53:05 +0000 Date: Tue, 9 Feb 2010 12:53:05 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: Christoph Hellwig , Theodore Tso , xfs-oss X-ASG-Orig-Subj: Re: [PATCH V2] xfstests: fix up fs_perms test used by 126 Subject: Re: [PATCH V2] xfstests: fix up fs_perms test used by 126 Message-ID: <20100209175305.GA10833@infradead.org> References: <4B6C4E81.6060201@sandeen.net> <20100208194058.GC9527@infradead.org> <4B71935E.7090907@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B71935E.7090907@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: 1265737987 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, Feb 09, 2010 at 10:54:54AM -0600, Eric Sandeen wrote: > Test 126 was failing intermittently for Ted & I; it seems that > this is because we were passing an unterminated string to > fopen for the mode; I'm not certain why this made it fail, > but it's pretty clearly not a good thing to do, and fixing > it fixes the test. > > Rather than passing around characters, do things string-wise, > since that is what is ultimately used in fopen(). > > Reported-by: Theodore Tso > Signed-off-by: Eric Sandeen Looks good, Reviewed-by: Christoph Hellwig From aelder@sgi.com Tue Feb 9 13:08:54 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o19J8sMr243495 for ; Tue, 9 Feb 2010 13:08:54 -0600 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 686F530408B; Tue, 9 Feb 2010 11:10:05 -0800 (PST) Received: from [128.162.232.155] ([128.162.232.155]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 9 Feb 2010 13:10:05 -0600 Subject: Re: [PATCH 0/9] Delayed write metadata writeback V5 From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1265687802-23043-1-git-send-email-david@fromorbit.com> References: <1265687802-23043-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 09 Feb 2010 13:10:04 -0600 Message-ID: <1265742604.26394.1.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 09 Feb 2010 19:10:05.0018 (UTC) FILETIME=[7CBC63A0:01CAA9BB] 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-02-09 at 14:56 +1100, Dave Chinner wrote: > While I started with killing async inode writeback, the series has > grown. It's not really limited to inode writeback - it touches dquot > flushing, changes the way the AIL pushes on buffers, adds xfsbufd > sorting for delayed write buffers, adds a real non-blocking mode to > inode reclaim and avoids physical inode writeback from the VFS while > fixing bugs in handling delayed write inodes. Hence this is more > about enabling efficient delayed write metadata than it is able > killing async inode writeback. > > The idea behind this series is to make metadata buffers get > written from xfsbufd via the delayed write queue rather than being > issued asynchronously from all over the place. To do this, async > buffer writeback is almost entirely removed from XFS, replaced > instead by delayed writes and a method to expedite flushing of > delayed write buffers when required. > > The result of funnelling all the buffer IO into a single place > is that we can more tightly control and therefore optimise the > submission of metadata IO. Aggregating the buffers before dispatch > allows much better sort efficiency of the buffers as the sort window > is not limited to the size of the elevator congestion hysteresis > limit. Hence we can approach 100% merge effeciency on large numbers > of buffers when dispatched for IO and greatly reduce the amount > of seeking metadata writeback causes. > > The major change is to the inode flushing and reclaim code. Delayed > write inodes hold the flush lock for much longer than for async > writeback, and hence blocking on the flush lock can cause extremely > long latencies without other mechanisms to expedite the release of > the flush locks. To prevent needing to flush inodes immediately, > all operations are done non-blocking unless synchronous. This > required a significant rework of the inode reclaim code, but it > greatly simplified other pieces of code (e.g. log item pushing). > > Version 5 > - drop the fsync changes to xfs_fs_write_inode() and the associated > locking changes, replace them with a targeted inode logging > function from Christoph Hellwig to fix a performance regression on > fs_mark -S4 workloads on an SSD. > > Version 4 > - rework inode reclaim checks for better legibility > - add warning to reclaim code when delwri flush errors occur > - kill XFS_ITEM_FLUSHING now it is not used > - clean up sync_mode flags being pushed into xfs_iflush() > - kill the now unused xfs_bawrite() function > - include Christoph's fsync cache flush fix > - rework the inode locking and call to xfs_fsync() when doing > synchronous inode writes to close races between the fsync and > the background delwri flush afterwards. > > Version 3 > - rework inode reclaim to: > - separate it from xfs_iflush return values > - provide a non-blocking mode for background operation > - apply delwri buffer promotion tricks to dquot flushing > - kill unneeded dquot flushing flags, similar to inode flushing flag > removal > - fix sync inode flush bug when trying to flush delwri inodes > > Version 2: > - use generic list sort function > - when unmounting, push the delwri buffers first, then do sync inode > reclaim so that reclaim doesn't block for 15 seconds waiting for > delwri inode buffers to be aged and written before the inodes can > be reclaimed. > > Alex, the patch series is available in the git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/dgc/xfs for-2.6.34 I looked over the whole series again and it all looks good to me. I will pull from your for-2.6.34 branch and will post it on OSS after I've tested it a bit. Signed-off-by: Alex Elder -Alex > Christoph Hellwig (2): > xfs: remove invalid barrier optimization from xfs_fsync > xfs: log changed inodes instead of writing them synchronously > > Dave Chinner (7): > xfs: Make inode reclaim states explicit > xfs: Use delayed write for inodes rather than async V2 > xfs: Don't issue buffer IO direct from AIL push V2 > xfs: Sort delayed write buffers before dispatch > xfs: Use delay write promotion for dquot flushing > xfs: kill the unused XFS_QMOPT_* flush flags V2 > xfs: kill xfs_bawrite > > fs/xfs/linux-2.6/xfs_buf.c | 135 ++++++++++++++++++++++++++-------------- > fs/xfs/linux-2.6/xfs_buf.h | 3 +- > fs/xfs/linux-2.6/xfs_super.c | 111 ++++++++++++++++++++++++--------- > fs/xfs/linux-2.6/xfs_sync.c | 138 +++++++++++++++++++++++++++++++++------- > fs/xfs/linux-2.6/xfs_trace.h | 1 + > fs/xfs/quota/xfs_dquot.c | 38 +++++------- > fs/xfs/quota/xfs_dquot_item.c | 87 ++++---------------------- > fs/xfs/quota/xfs_dquot_item.h | 4 - > fs/xfs/quota/xfs_qm.c | 14 ++--- > fs/xfs/xfs_buf_item.c | 64 ++++++++++--------- > fs/xfs/xfs_inode.c | 86 ++------------------------ > fs/xfs/xfs_inode.h | 11 +--- > fs/xfs/xfs_inode_item.c | 108 +++++++------------------------- > fs/xfs/xfs_inode_item.h | 6 -- > fs/xfs/xfs_mount.c | 13 ++++- > fs/xfs/xfs_quota.h | 8 +-- > fs/xfs/xfs_trans.h | 3 +- > fs/xfs/xfs_trans_ail.c | 13 ++-- > fs/xfs/xfs_vnodeops.c | 12 +--- > 19 files changed, 410 insertions(+), 445 deletions(-) > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@redhat.com Tue Feb 9 13:25:22 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o19JPLA8244488 for ; Tue, 9 Feb 2010 13:25:22 -0600 X-ASG-Debug-ID: 1265743594-759303be0000-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 2F4311390AED for ; Tue, 9 Feb 2010 11:26:34 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LT4z6YojEhjL1Hg9 for ; Tue, 09 Feb 2010 11:26:34 -0800 (PST) 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 o19JQXlQ010455 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 9 Feb 2010 14:26:34 -0500 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 o19JQVlA020418 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 9 Feb 2010 14:26:33 -0500 Message-ID: <4B71B6E7.1000203@redhat.com> Date: Tue, 09 Feb 2010 13:26:31 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: xfs-oss CC: ext4 development X-ASG-Orig-Subj: [PATCH] xfstests: optionally run all tests under quota Subject: [PATCH] xfstests: optionally run all tests under quota 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: 1265743595 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22106 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 patch might be a little heavy handed, but it seems to work; if you set USE_QUOTA=1 in your environment, all tests should be run with quota on and enabled. This will hopefully help shake out some of the ext4 quota problems, although one needs to keep an eye on the console to see whether warnings scroll by. Signed-off-by: Eric Sandeen --- diff --git a/common.rc b/common.rc index 6424871..4fde921 100644 --- a/common.rc +++ b/common.rc @@ -64,6 +64,9 @@ _mount_opts() *) ;; esac + if [ ! -z "$USE_QUOTA" ]; then + export MOUNT_OPTIONS="$MOUNT_OPTIONS -o usrquota,grpquota" + fi } _mkfs_opts() @@ -161,6 +164,10 @@ _test_options() type=$1 TEST_OPTIONS="" + if [ ! -z "$USE_QUOTA" ]; then + TEST_OPTIONS="-o usrquota,grpquota" + fi + if [ "$FSTYP" != "xfs" ]; then return fi @@ -202,6 +209,25 @@ _mount_ops_filter() } +_setup_quota() +{ + mountpoint=$1 + if [ ! -z "$USE_QUOTA" ]; then + case $FSTYP in + xfs) + ;; + ext*|reiserfs) + quotaoff $mountpoint &>/dev/null + quotacheck -u -g $mountpoint + quotaon $mountpoint + ;; + *) + _fail "Don't know how to turn on quota on $FSTYP" + ;; + esac + fi +} + _scratch_mount_options() { _scratch_options mount @@ -212,6 +238,7 @@ _scratch_mount_options() _scratch_mount() { _mount -t $FSTYP `_scratch_mount_options $*` + _setup_quota $SCRATCH_MNT } _scratch_unmount() @@ -229,6 +256,7 @@ _test_mount() { _test_options mount _mount -t $FSTYP $TEST_OPTIONS $TEST_FS_MOUNT_OPTS $* $TEST_DEV $TEST_DIR + _setup_quota $TEST_DIR } _scratch_mkfs_options() From aelder@sgi.com Tue Feb 9 14:21:43 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_12 autolearn=no version=3.3.0-rupdated 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 o19KLhGW247951 for ; Tue, 9 Feb 2010 14:21:43 -0600 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 524538F80CE; Tue, 9 Feb 2010 12:22:54 -0800 (PST) Received: from [128.162.232.155] ([128.162.232.155]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 9 Feb 2010 14:22:54 -0600 Subject: Re: [PATCH] xfs: only clear the suid bit once in xfs_write From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20100203194331.GA20199@infradead.org> References: <20100203194331.GA20199@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Tue, 09 Feb 2010 14:22:53 -0600 Message-ID: <1265746973.26394.9.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 09 Feb 2010 20:22:54.0249 (UTC) FILETIME=[A9002190:01CAA9C5] 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-02-03 at 14:43 -0500, Christoph Hellwig wrote: > file_remove_suid already calls into ->setattr to clear the suid and sgid > bits if needed, no need to start a second transaction to do it ourselves. > > Note that xfs_write_clear_setuid issues a sync transaction while the > path through ->setattr doesn't, but that is consistant with the other > filesystems. > > Signed-off-by: Christoph Hellwig Looks good. Those S*ID bits sure get checked and cleared in a lot of places... Reviewed-by: Alex Elder > Index: xfs/fs/xfs/linux-2.6/xfs_lrw.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_lrw.c 2010-02-03 20:37:45.956003749 +0100 > +++ xfs/fs/xfs/linux-2.6/xfs_lrw.c 2010-02-03 20:37:49.348003520 +0100 > @@ -630,18 +630,9 @@ start: > * by root. This keeps people from modifying setuid and > * setgid binaries. > */ > - > - if (((xip->i_d.di_mode & S_ISUID) || > - ((xip->i_d.di_mode & (S_ISGID | S_IXGRP)) == > - (S_ISGID | S_IXGRP))) && > - !capable(CAP_FSETID)) { > - error = xfs_write_clear_setuid(xip); > - if (likely(!error)) > - error = -file_remove_suid(file); > - if (unlikely(error)) { > - goto out_unlock_internal; > - } > - } > + error = -file_remove_suid(file); > + if (unlikely(error)) > + goto out_unlock_internal; > > /* We can write back this queue in page reclaim */ > current->backing_dev_info = mapping->backing_dev_info; > Index: xfs/fs/xfs/xfs_rw.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_rw.c 2010-02-03 20:37:45.965004126 +0100 > +++ xfs/fs/xfs/xfs_rw.c 2010-02-03 20:37:49.349010212 +0100 > @@ -47,48 +47,6 @@ > #include "xfs_trace.h" > > /* > - * This is a subroutine for xfs_write() and other writers (xfs_ioctl) > - * which clears the setuid and setgid bits when a file is written. > - */ > -int > -xfs_write_clear_setuid( > - xfs_inode_t *ip) > -{ > - xfs_mount_t *mp; > - xfs_trans_t *tp; > - int error; > - > - mp = ip->i_mount; > - tp = xfs_trans_alloc(mp, XFS_TRANS_WRITEID); > - if ((error = xfs_trans_reserve(tp, 0, > - XFS_WRITEID_LOG_RES(mp), > - 0, 0, 0))) { > - xfs_trans_cancel(tp, 0); > - return error; > - } > - xfs_ilock(ip, XFS_ILOCK_EXCL); > - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > - xfs_trans_ihold(tp, ip); > - ip->i_d.di_mode &= ~S_ISUID; > - > - /* > - * Note that we don't have to worry about mandatory > - * file locking being disabled here because we only > - * clear the S_ISGID bit if the Group execute bit is > - * on, but if it was on then mandatory locking wouldn't > - * have been enabled. > - */ > - if (ip->i_d.di_mode & S_IXGRP) { > - ip->i_d.di_mode &= ~S_ISGID; > - } > - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > - xfs_trans_set_sync(tp); > - error = xfs_trans_commit(tp, 0); > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > - return 0; > -} > - > -/* > * Force a shutdown of the filesystem instantly while keeping > * the filesystem consistent. We don't do an unmount here; just shutdown > * the shop, make sure that absolutely nothing persistent happens to > Index: xfs/fs/xfs/xfs_rw.h > =================================================================== > --- xfs.orig/fs/xfs/xfs_rw.h 2010-02-03 20:37:53.085003394 +0100 > +++ xfs/fs/xfs/xfs_rw.h 2010-02-03 20:37:57.946033654 +0100 > @@ -39,7 +39,6 @@ xfs_fsb_to_db(struct xfs_inode *ip, xfs_ > /* > * Prototypes for functions in xfs_rw.c. > */ > -extern int xfs_write_clear_setuid(struct xfs_inode *ip); > extern int xfs_read_buf(struct xfs_mount *mp, xfs_buftarg_t *btp, > xfs_daddr_t blkno, int len, uint flags, > struct xfs_buf **bpp); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Tue Feb 9 14:42:00 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o19Kg0Vh249343 for ; Tue, 9 Feb 2010 14:42:00 -0600 X-ASG-Debug-ID: 1265748192-5ea200630000-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 1E1861391828 for ; Tue, 9 Feb 2010 12:43:12 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id YcUfyIAEwBRwMyVD for ; Tue, 09 Feb 2010 12:43:12 -0800 (PST) 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 B3C31127664A for ; Tue, 9 Feb 2010 14:43:11 -0600 (CST) Message-ID: <4B71C8DF.1090909@sandeen.net> Date: Tue, 09 Feb 2010 14:43:11 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH] xfstests: make 204 generic Subject: [PATCH] xfstests: make 204 generic 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: 1265748193 X-Barracuda-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=MARKETING_SUBJECT, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.22112 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 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 204 can be generic. Also remove a stray _scratch_mkfs that snuck into _scratch_mkfs_sized :/ Signed-off-by: Eric Sandeen --- diff --git a/204 b/204 index 1ac9ebf..14ebcdc 100755 --- a/204 +++ b/204 @@ -35,12 +35,13 @@ status=1 # failure is the default! . ./common.filter # real QA test starts here -_supported_fs xfs +_supported_fs generic _supported_os Linux _require_scratch -_scratch_mkfs_xfs -d size=104m >/dev/null +SIZE=104*1024*1024 +_scratch_mkfs_sized $SIZE &> /dev/null _scratch_mount for i in `seq 1 22500`; do diff --git a/common.rc b/common.rc index 0a02a2b..c76bcde 100644 --- a/common.rc +++ b/common.rc @@ -325,7 +325,6 @@ _scratch_mkfs_sized() _notrun "Filesystem $FSTYP not supported in _scratch_mkfs_sized" ;; esac - _scratch_mkfs } # Emulate an N-data-disk stripe w/ various stripe units From BATV+f4938f14c6ec46ffcbb1+2361+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 9 16:01:49 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o19M1k0Y254972 for ; Tue, 9 Feb 2010 16:01:48 -0600 X-ASG-Debug-ID: 1265752979-5e9b02160000-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 A4F0D139276C for ; Tue, 9 Feb 2010 14:02:59 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id uIWOKpio10amOcas for ; Tue, 09 Feb 2010 14:02:59 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NeyAc-0005Im-Pr; Tue, 09 Feb 2010 22:02:58 +0000 Date: Tue, 9 Feb 2010 17:02:58 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] xfstests: make 204 generic Subject: Re: [PATCH] xfstests: make 204 generic Message-ID: <20100209220258.GA20187@infradead.org> References: <4B71C8DF.1090909@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B71C8DF.1090909@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: 1265752979 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, Feb 09, 2010 at 02:43:11PM -0600, Eric Sandeen wrote: > 204 can be generic. Looks good. > Also remove a stray _scratch_mkfs that snuck into > _scratch_mkfs_sized :/ Heh, that might have made the ENOSPC tests pass rather easily before.. > Signed-off-by: Eric Sandeen Reviewed-by: Christoph Hellwig From BATV+f4938f14c6ec46ffcbb1+2361+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 9 16:03:31 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o19M3UsU255071 for ; Tue, 9 Feb 2010 16:03:30 -0600 X-ASG-Debug-ID: 1265753083-5e9f02340000-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 201DF139278A for ; Tue, 9 Feb 2010 14:04:43 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id TkfZl2eMiq8oLhd3 for ; Tue, 09 Feb 2010 14:04:43 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NeyCJ-0005Ms-Ie; Tue, 09 Feb 2010 22:04:43 +0000 Date: Tue, 9 Feb 2010 17:04:43 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss , ext4 development X-ASG-Orig-Subj: Re: [PATCH] xfstests: optionally run all tests under quota Subject: Re: [PATCH] xfstests: optionally run all tests under quota Message-ID: <20100209220443.GB20187@infradead.org> References: <4B71B6E7.1000203@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B71B6E7.1000203@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: 1265753084 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, Feb 09, 2010 at 01:26:31PM -0600, Eric Sandeen wrote: > This patch might be a little heavy handed, but it seems to > work; if you set USE_QUOTA=1 in your environment, all > tests should be run with quota on and enabled. I'd rather prefer a -quota option to ./check than a magic environment variable. From sandeen@sandeen.net Tue Feb 9 16:03:54 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o19M3sN7255107 for ; Tue, 9 Feb 2010 16:03:54 -0600 X-ASG-Debug-ID: 1265753107-2a3f02090000-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 A494B1BF22A for ; Tue, 9 Feb 2010 14:05:07 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id 2tkeFz5zzTkhnX5X for ; Tue, 09 Feb 2010 14:05:07 -0800 (PST) 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 DC74B12AEBEC; Tue, 9 Feb 2010 16:05:06 -0600 (CST) Message-ID: <4B71DC12.9010408@sandeen.net> Date: Tue, 09 Feb 2010 16:05:06 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] xfstests: make 204 generic Subject: Re: [PATCH] xfstests: make 204 generic References: <4B71C8DF.1090909@sandeen.net> <20100209220258.GA20187@infradead.org> In-Reply-To: <20100209220258.GA20187@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: 1265753107 X-Barracuda-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=MARKETING_SUBJECT, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.22117 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 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: > On Tue, Feb 09, 2010 at 02:43:11PM -0600, Eric Sandeen wrote: >> 204 can be generic. > > Looks good. > >> Also remove a stray _scratch_mkfs that snuck into >> _scratch_mkfs_sized :/ > > Heh, that might have made the ENOSPC tests pass rather easily before.. Yeah :/ >> Signed-off-by: Eric Sandeen > > Reviewed-by: Christoph Hellwig > Thanks, -eric From BATV+c92b07a41bedde9ca4f4+2362+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 10 03:06:41 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1A96c8l035220 for ; Wed, 10 Feb 2010 03:06:41 -0600 X-ASG-Debug-ID: 1265792871-7d1f03590000-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 4961A13940A9; Wed, 10 Feb 2010 01:07:51 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id bPQQGEQORHkP3UrK; Wed, 10 Feb 2010 01:07:51 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nf8Y2-00026j-Mn; Wed, 10 Feb 2010 09:07:50 +0000 Date: Wed, 10 Feb 2010 04:07:50 -0500 From: Christoph Hellwig To: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [RFC PATCH 2/2] xfs_export_operations.commit_metadata Subject: Re: [RFC PATCH 2/2] xfs_export_operations.commit_metadata Message-ID: <20100210090750.GB21875@infradead.org> References: <20100210003220.6021.74943.stgit@case> <20100210003337.6021.10942.stgit@case> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100210003337.6021.10942.stgit@case> 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: 1265792872 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, Feb 09, 2010 at 06:33:37PM -0600, Ben Myers wrote: > Here is the commit_metadata export_operation for xfs. We take two dentries and > force the log up to the larger lsn. It looks to me that in nfsd the child is > always modified after the parent so generally we expect the child's lsn to be > larger. If that's not the case we'll just force the entire thing. > > The basic form of this is based upon one of Christoph's suggestions. I'm an > xfs newbie so I'm not very comfortable with it yet. My understanding is that I > need to verify that all of the necessary changes make it into the transations > we're forcing into the log here. I am still looking into that and hopefully > the XFS gurus can continue to provide guidance. Ccing the xfs list would help with that :) Anyway, I think it looks pretty good, but there's quite a few smaller nitpicks: > +STATIC int > +xfs_fs_nfs_commit_metadata( > + struct dentry *parent, > + struct dentry *child) > +{ > + struct xfs_inode *p_xip = NULL, *c_xip = NULL; Normal xfs naming would be dp for the parent, and ip for the child, it would be good to stick to that. > + struct xfs_mount *i_mount = NULL; Normal name all over xfs would be mp. > + } else if (parent && child) { > + p_xip = XFS_I(parent->d_inode); > + c_xip = XFS_I(child->d_inode); > + xfs_ilock(p_xip, XFS_ILOCK_SHARED); > + xfs_ilock(c_xip, XFS_ILOCK_SHARED); If we need to lock both parent and child we need to use xfs_lock_two_inodes to make sure the lock order is correct. > + if (xfs_ipincount(c_xip)) { > + /* > + * AFAICS the child is always modified after the parent > + * in nfsd so should always have a larger lsn. > + */ > + if (c_xip->i_itemp->ili_last_lsn > force_lsn) { > + force_lsn = c_xip->i_itemp->ili_last_lsn; > + } else { > + force_lsn = 0; /* whole thing */ > + } I wouldn't rely on that and always take the larger one. Now with the simplification of always having a non-zero first argument suggested in the previous mail this might be simplified down to: STATIC int xfs_fs_nfs_commit_metadata( struct dentry *parent, struct dentry *child) { struct xfs_inode *dp = XFS_I(parent->d_inode); struct xfs_inode *ip = NULL; struct xfs_mount *mp = dp->i_mount; xfs_lsn_t force_lsn = 0; int error = 0; if (child) { ip = XFS_I(child->d_inode); xfs_lock_two_inodes(dp, ip, XFS_ILOCK_SHARED); } else { xfs_ilock(dp, XFS_ILOCK_SHARED); } if (xfs_ipincount(dp)) force_lsn = dp->i_itemp->ili_last_lsn; if (ip && xfs_ipincount(ip)) force_lsn = max(force_lsn, ip->i_itemp->ili_last_lsn); error = _xfs_log_force_lsn(mp, force_lsn, NULL); if (ip) xfs_iunlock(ip, XFS_ILOCK_SHARED); xfs_iunlock(dp, XFS_ILOCK_SHARED); return error; } Note that _xfs_log_force_lsn is new in the XFS tree, mainline still has _xfs_log_force with an lsn argument. Also note that ->commit_metadata probably should take just two inodes instead of two dentires given the level it operates on, but it shouldn't matter too much. From BATV+c92b07a41bedde9ca4f4+2362+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 10 04:10:21 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1AAAHr1039059 for ; Wed, 10 Feb 2010 04:10:20 -0600 X-ASG-Debug-ID: 1265796690-686302300000-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 1EBA31C0C79; Wed, 10 Feb 2010 02:11:30 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id QAH3FjxR5jZP82iI; Wed, 10 Feb 2010 02:11:30 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nf9Xe-00051F-FV; Wed, 10 Feb 2010 10:11:30 +0000 Date: Wed, 10 Feb 2010 05:11:30 -0500 From: Christoph Hellwig To: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [RFC PATCH 2/2] xfs_export_operations.commit_metadata Subject: Re: [RFC PATCH 2/2] xfs_export_operations.commit_metadata Message-ID: <20100210101130.GA7993@infradead.org> References: <20100210003220.6021.74943.stgit@case> <20100210003337.6021.10942.stgit@case> <20100210090750.GB21875@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100210090750.GB21875@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: 1265796691 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, Feb 10, 2010 at 04:07:50AM -0500, Christoph Hellwig wrote: > > + /* > > + * AFAICS the child is always modified after the parent > > + * in nfsd so should always have a larger lsn. > > + */ > > + if (c_xip->i_itemp->ili_last_lsn > force_lsn) { > > + force_lsn = c_xip->i_itemp->ili_last_lsn; > > + } else { > > + force_lsn = 0; /* whole thing */ > > + } > > I wouldn't rely on that and always take the larger one. Or we could use that fact for making the prototype saner: - the commit_metadata only takes a single inode to force out - we make sure to always call in on the child first. For any log based filesystem that will force the parent update, too. - we then call it on the parent, which will be a no-op and thus fast for a log based filesystem, but still provide a fallback if that is not the case. From patrick@news-service.com Wed Feb 10 06:41:46 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_BACKHAIR_26 autolearn=no version=3.3.0-rupdated 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 o1ACfkdO047507 for ; Wed, 10 Feb 2010 06:41:46 -0600 X-ASG-Debug-ID: 1265805777-1f10009e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from pu01.news-service.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0EE671C13C2 for ; Wed, 10 Feb 2010 04:42:58 -0800 (PST) Received: from pu01.news-service.com (ns1.news-service.com [195.114.240.3]) by cuda.sgi.com with ESMTP id 7QKqrlxiKoSGZlES for ; Wed, 10 Feb 2010 04:42:58 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by pu01.news-service.com (Postfix) with ESMTP id 1FB4313E41; Wed, 10 Feb 2010 13:42:57 +0100 (CET) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: Debian amavisd-new at pu01.news-service.com Received: from pu01.news-service.com ([127.0.0.1]) by localhost (pu01.nse [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id M8al5kBE3ppn; Wed, 10 Feb 2010 13:42:54 +0100 (CET) Received: from [172.25.0.47] (nse01.nse [172.25.0.47]) by pu01.news-service.com (Postfix) with ESMTP id D533F13E24; Wed, 10 Feb 2010 13:42:54 +0100 (CET) Message-ID: <4B72A9D1.8030101@news-service.com> Date: Wed, 10 Feb 2010 13:42:57 +0100 From: Patrick Schreurs User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.7) Gecko/20100111 Thunderbird/3.0.1 MIME-Version: 1.0 To: Christoph Hellwig CC: Dave Chinner , Tommy van Leeuwen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Subject: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) References: <4B0A8075.8080008@news-service.com> <20091211115932.GA20632@infradead.org> <4B3F9F88.9030307@news-service.com> <20100107110446.GA13802@discord.disaster> <4B45CFAC.4000607@news-service.com> <20100108113114.GA8654@discord.disaster> <4B504B03.7050604@news-service.com> <4B6706CE.1020207@news-service.com> <20100208194226.GD9527@infradead.org> <4B712166.9010701@news-service.com> <20100209103157.GA5197@infradead.org> In-Reply-To: <20100209103157.GA5197@infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ns1.news-service.com[195.114.240.3] X-Barracuda-Start-Time: 1265805779 X-Barracuda-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.86 X-Barracuda-Spam-Status: No, SCORE=-0.86 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE_7582B, INTERRUPTUS, INTERRUPTUS_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.22167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 INTERRUPTUS RAW: Message looks to contain HTML-interrupted text 0.65 INTERRUPTUS_2 Message looks to contain HTML-interrupted text 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Status: Clean On 9-2-2010 11:31, Christoph Hellwig wrote: > On Tue, Feb 09, 2010 at 09:48:38AM +0100, Patrick Schreurs wrote: >> This is a clean 2.6.32.3 with the xfs-inode-reclaim-2.6.32 patch i >> received from Dave on January 8th (see attachment). > > I can't find anything interesting regarding I_RECLAIMABLE manipulation > in there. The only thing I could think off going wrong is i_flags > and i_update_core sitting in the same word and the compiler causing > some read-modify-write cycles for it. Can you test the patch below? > It fixes the abose issue up, and to make sure sure the assert you hit > isn't as lethal changes it into a WARN_ON, which will still print the > backtrace, but not crash the machine. Thanks for the patch. After having this patch applied we saw *a lot* warnings. They all look like this: Feb 10 13:20:38 sb06 kernel: ------------[ cut here ]------------ Feb 10 13:20:38 sb06 kernel: WARNING: at fs/xfs/linux-2.6/xfs_sync.c:768 xfs_reclaim_inode_now+0x3d/0x84() Feb 10 13:20:38 sb06 kernel: Hardware name: PowerEdge 1950 Feb 10 13:20:38 sb06 kernel: Modules linked in: acpi_cpufreq cpufreq_ondemand ipmi_si ipmi_devintf ipmi_msghandler bonding mptspi serio_raw rng_core scsi_transport_spi bnx2 thermal processor thermal_sys Feb 10 13:20:38 sb06 kernel: Pid: 3145, comm: xfssyncd Not tainted 2.6.32.3 #2 Feb 10 13:20:38 sb06 kernel: Call Trace: Feb 10 13:20:38 sb06 kernel: [] ? xfs_reclaim_inode_now+0x3d/0x84 Feb 10 13:20:38 sb06 kernel: [] ? xfs_reclaim_inode_now+0x3d/0x84 Feb 10 13:20:38 sb06 kernel: [] ? warn_slowpath_common+0x77/0xa3 Feb 10 13:20:38 sb06 kernel: [] ? xfs_reclaim_inode_now+0x3d/0x84 Feb 10 13:20:38 sb06 kernel: [] ? xfs_inode_ag_walk+0x68/0xa2 Feb 10 13:20:38 sb06 kernel: [] ? xfs_reclaim_inode_now+0x0/0x84 Feb 10 13:20:38 sb06 kernel: [] ? xfs_inode_ag_iterator+0x50/0x7e Feb 10 13:20:38 sb06 kernel: [] ? xfs_reclaim_inode_now+0x0/0x84 Feb 10 13:20:38 sb06 kernel: [] ? xfs_sync_worker+0x26/0x52 Feb 10 13:20:38 sb06 kernel: [] ? xfssyncd+0x123/0x180 Feb 10 13:20:38 sb06 kernel: [] ? xfssyncd+0x0/0x180 Feb 10 13:20:38 sb06 kernel: [] ? kthread+0x79/0x81 Feb 10 13:20:38 sb06 kernel: [] ? child_rip+0xa/0x20 Feb 10 13:20:38 sb06 kernel: [] ? kthread+0x0/0x81 Feb 10 13:20:38 sb06 kernel: [] ? child_rip+0x0/0x20 Feb 10 13:20:38 sb06 kernel: ---[ end trace 1ae862ca12666a87 ]--- and some look like this: Feb 10 13:20:38 sb06 kernel: ------------[ cut here ]------------ Feb 10 13:20:38 sb06 kernel: WARNING: at fs/xfs/linux-2.6/xfs_sync.c:768 xfs_reclaim_inode_now+0x3d/0x84() Feb 10 13:20:38 sb06 kernel: Hardware name: PowerEdge 1950 Feb 10 13:20:38 sb06 kernel: Modules linked in: acpi_cpufreq cpufreq_ondemand ipmi_si ipmi_devintf ipmi_msghandlerspes 13]n2r4a 2f1>nx85k7[<4x0-[e :7we_ospes 13nx85k7[<4x0-[e :7we_ospes 13nx85k7[<4x0-[e :7we_ospes 13nx85k7[<4x0-[e :7we_ospies 13nx85k7[<4x0-[e :7we_ospes 13nx85k7[<4x0-[e :7we_ospes 13nx85k7[<4x0-[e :7we_ospes 13nx85k7[<4x0-[e :7we_ospes 13nx85k7[<4x0-[e :7we_ospes 13nx85k7[<4x0-[e :7we_ospes 13nx85k7[<4x0-[e :7we_ospes 13nx85k7[<4x0-[e :7we_ospes 13ode_no]n2r4a 2f1>nx85k7[<4x0-[e :7we_ospes 13nx85k7[<4x0-[e :7we_ospes 13] ? xfs_inode_ag_iterator+0x50/0x7e Feb 10 13:20:38 sb06 kernel: [] ? xfs_reclaim_inode_now+0x0/0x84 Feb 10 13:20:38 sb06 kernel: [] ? xfs_sync_worker+0x26/0x52 Feb 10 13:20:38 sb06 kernel: [] ? xfssyncd+0x123/0x180 Feb 10 13:20:38 sb06 kernel: [] ? xfssyncd+0x0/0x180 Feb 10 13:20:38 sb06 kernel: [] ? kthread+0x79/0x81 Feb 10 13:20:38 sb06 kernel: [] ? child_rip+0xa/0x20 Feb 10 13:20:38 sb06 kernel: [] ? kthread+0x0/0x81 Feb 10 13:20:38 sb06 kernel: [] ? child_rip+0x0/0x20 Feb 10 13:20:38 sb06 kernel: ---[ end trace 1ae862ca12666b1c ]--- I hope this clarifies things. If you need more info, don't hesitate to contact me. Thanks, -Patrick From BATV+c92b07a41bedde9ca4f4+2362+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 10 08:54:01 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1AErvEu055471 for ; Wed, 10 Feb 2010 08:54:01 -0600 X-ASG-Debug-ID: 1265813711-581c01150000-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 E356E1CBCAF7 for ; Wed, 10 Feb 2010 06:55:11 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id V54jJesv3HnEPiR3 for ; Wed, 10 Feb 2010 06:55:11 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NfDy8-0008C0-8A; Wed, 10 Feb 2010 14:55:08 +0000 Date: Wed, 10 Feb 2010 09:55:08 -0500 From: Christoph Hellwig To: Patrick Schreurs Cc: Christoph Hellwig , Dave Chinner , Tommy van Leeuwen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Subject: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Message-ID: <20100210145508.GA29047@infradead.org> References: <4B3F9F88.9030307@news-service.com> <20100107110446.GA13802@discord.disaster> <4B45CFAC.4000607@news-service.com> <20100108113114.GA8654@discord.disaster> <4B504B03.7050604@news-service.com> <4B6706CE.1020207@news-service.com> <20100208194226.GD9527@infradead.org> <4B712166.9010701@news-service.com> <20100209103157.GA5197@infradead.org> <4B72A9D1.8030101@news-service.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B72A9D1.8030101@news-service.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: 1265813711 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, Feb 10, 2010 at 01:42:57PM +0100, Patrick Schreurs wrote: > Thanks for the patch. After having this patch applied we saw *a lot* > warnings. They all look like this: Ok, looks like that is not an issue, so you can discard that patch. I went down to the radix tree code to look for races in it's tag handling, but then noticed that we might have an issue with our usage of the radix-tree API. Can you try the patch below ontop of Dave's rollup, and instead of my previous one? --- From: Christoph Hellwig Subject: xfs: fix locking for inode cache radix tree tag updates The radix-tree code requires it's users to serialize tag updates against other updates to the tree. While XFS protects tag updates against each other it does not serialize them against updates of the tree contents, which can lead to tag corruption. Fix the inode cache to always take pag_ici_lock in exclusive mode when updating radix tree tags. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_sync.c 2010-02-10 14:28:46.648004203 +0100 +++ linux-2.6/fs/xfs/linux-2.6/xfs_sync.c 2010-02-10 14:29:56.657023619 +0100 @@ -734,12 +734,12 @@ xfs_inode_set_reclaim_tag( xfs_mount_t *mp = ip->i_mount; xfs_perag_t *pag = xfs_get_perag(mp, ip->i_ino); - read_lock(&pag->pag_ici_lock); + write_lock(&pag->pag_ici_lock); spin_lock(&ip->i_flags_lock); __xfs_inode_set_reclaim_tag(pag, ip); __xfs_iflags_set(ip, XFS_IRECLAIMABLE); spin_unlock(&ip->i_flags_lock); - read_unlock(&pag->pag_ici_lock); + write_unlock(&pag->pag_ici_lock); xfs_put_perag(mp, pag); } Index: linux-2.6/fs/xfs/xfs_iget.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_iget.c 2010-02-10 14:30:01.092254586 +0100 +++ linux-2.6/fs/xfs/xfs_iget.c 2010-02-10 14:34:00.199005529 +0100 @@ -228,13 +228,12 @@ xfs_iget_cache_hit( xfs_itrace_exit_tag(ip, "xfs_iget.alloc"); /* - * We need to set XFS_INEW atomically with clearing the - * reclaimable tag so that we do have an indicator of the - * inode still being initialized. + * We need to set XFS_IRECLAIM to prevent xfs_reclaim_inode + * from stomping over us while we recycle the inode. We can't + * clear the radix tree reclaimable tag yet as it requires + * pag_ici_lock to be helt exclusive. */ - ip->i_flags |= XFS_INEW; - ip->i_flags &= ~XFS_IRECLAIMABLE; - __xfs_inode_clear_reclaim_tag(mp, pag, ip); + ip->i_flags |= XFS_IRECLAIM; spin_unlock(&ip->i_flags_lock); read_unlock(&pag->pag_ici_lock); @@ -253,7 +252,15 @@ xfs_iget_cache_hit( __xfs_inode_set_reclaim_tag(pag, ip); goto out_error; } - inode->i_state = I_LOCK|I_NEW; + + write_lock(&pag->pag_ici_lock); + spin_lock(&ip->i_flags_lock); + ip->i_flags &= ~(XFS_IRECLAIMABLE | XFS_IRECLAIM); + ip->i_flags |= XFS_INEW; + __xfs_inode_clear_reclaim_tag(mp, pag, ip); + inode->i_state = I_LOCK | I_NEW; + spin_unlock(&ip->i_flags_lock); + write_unlock(&pag->pag_ici_lock); } else { /* If the VFS inode is being torn down, pause and try again. */ if (!igrab(inode)) { From patrick@news-service.com Wed Feb 10 09:41:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1AFfWpw058443 for ; Wed, 10 Feb 2010 09:41:32 -0600 X-ASG-Debug-ID: 1265816564-278f039f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from pu01.news-service.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BB5EE139564B for ; Wed, 10 Feb 2010 07:42:44 -0800 (PST) Received: from pu01.news-service.com (ns1.news-service.com [195.114.240.3]) by cuda.sgi.com with ESMTP id ayDGLgEU0o2fzkq7 for ; Wed, 10 Feb 2010 07:42:44 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by pu01.news-service.com (Postfix) with ESMTP id C53E213E41; Wed, 10 Feb 2010 16:42:43 +0100 (CET) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: Debian amavisd-new at pu01.news-service.com Received: from pu01.news-service.com ([127.0.0.1]) by localhost (pu01.nse [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ZOLqkgo+p9vx; Wed, 10 Feb 2010 16:42:41 +0100 (CET) Received: from [172.25.0.47] (nse01.nse [172.25.0.47]) by pu01.news-service.com (Postfix) with ESMTP id ABACA13E24; Wed, 10 Feb 2010 16:42:41 +0100 (CET) Message-ID: <4B72D3F3.2040308@news-service.com> Date: Wed, 10 Feb 2010 16:42:43 +0100 From: Patrick Schreurs User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.7) Gecko/20100111 Thunderbird/3.0.1 MIME-Version: 1.0 To: Christoph Hellwig CC: Dave Chinner , Tommy van Leeuwen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Subject: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) References: <4B3F9F88.9030307@news-service.com> <20100107110446.GA13802@discord.disaster> <4B45CFAC.4000607@news-service.com> <20100108113114.GA8654@discord.disaster> <4B504B03.7050604@news-service.com> <4B6706CE.1020207@news-service.com> <20100208194226.GD9527@infradead.org> <4B712166.9010701@news-service.com> <20100209103157.GA5197@infradead.org> <4B72A9D1.8030101@news-service.com> <20100210145508.GA29047@infradead.org> In-Reply-To: <20100210145508.GA29047@infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ns1.news-service.com[195.114.240.3] X-Barracuda-Start-Time: 1265816565 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean On 10-2-2010 15:55, Christoph Hellwig wrote: > On Wed, Feb 10, 2010 at 01:42:57PM +0100, Patrick Schreurs wrote: >> Thanks for the patch. After having this patch applied we saw *a lot* >> warnings. They all look like this: > > Ok, looks like that is not an issue, so you can discard that patch. > > I went down to the radix tree code to look for races in it's tag > handling, but then noticed that we might have an issue with our > usage of the radix-tree API. Can you try the patch below ontop > of Dave's rollup, and instead of my previous one? Okay. This patch is currently active. Thanks. I don't have a way to trigger it, so we'll have to wait and see what happens. Obviously we'll keep you posted. Have any of these patches been sent to the stable team? And have these patches been submitted to the upcoming 2.6.33 kernel? -Patrick From BATV+c92b07a41bedde9ca4f4+2362+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 10 09:45:53 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1AFjqHG058696 for ; Wed, 10 Feb 2010 09:45:53 -0600 X-ASG-Debug-ID: 1265816826-586002fd0000-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 0E0F41CBD0EB for ; Wed, 10 Feb 2010 07:47:06 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 7gl21Rwo0GnX5FG8 for ; Wed, 10 Feb 2010 07:47:06 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NfEmP-0007gM-Bq; Wed, 10 Feb 2010 15:47:05 +0000 Date: Wed, 10 Feb 2010 10:47:05 -0500 From: Christoph Hellwig To: Patrick Schreurs Cc: Christoph Hellwig , Dave Chinner , Tommy van Leeuwen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Subject: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Message-ID: <20100210154705.GA28809@infradead.org> References: <4B45CFAC.4000607@news-service.com> <20100108113114.GA8654@discord.disaster> <4B504B03.7050604@news-service.com> <4B6706CE.1020207@news-service.com> <20100208194226.GD9527@infradead.org> <4B712166.9010701@news-service.com> <20100209103157.GA5197@infradead.org> <4B72A9D1.8030101@news-service.com> <20100210145508.GA29047@infradead.org> <4B72D3F3.2040308@news-service.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B72D3F3.2040308@news-service.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: 1265816827 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, Feb 10, 2010 at 04:42:43PM +0100, Patrick Schreurs wrote: > Have any of these patches been sent to the stable team? And have these > patches been submitted to the upcoming 2.6.33 kernel? Everything before the current test patches is in 2.6.33-rc, I'm not sure what has made it to stable yet, but if I remember correctly Dave was going to send his fixes to -stable. From BATV+c92b07a41bedde9ca4f4+2362+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 10 12:07:47 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1AI7djF068074 for ; Wed, 10 Feb 2010 12:07:47 -0600 X-ASG-Debug-ID: 1265825332-64cb00c60000-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 A81A71396794 for ; Wed, 10 Feb 2010 10:08:52 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id prYW2uDRlmHVahXa for ; Wed, 10 Feb 2010 10:08:52 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NfGzb-0003EF-Re; Wed, 10 Feb 2010 18:08:51 +0000 Date: Wed, 10 Feb 2010 13:08:51 -0500 From: Christoph Hellwig To: linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: XFS status update for January 2010 Subject: XFS status update for January 2010 Message-ID: <20100210180851.GA9854@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: 1265825333 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 January saw additional release candidates of the Linux 2.6.33 kernel, including a couple of bug fixes for XFS. In the meantime the XFS tree has been growing a large number of patches destined for the Linux 2.6.34 merge window: a large rework of the handling of per-AG data, support for the quota netlink interface, and better power saving behavior of the XFS kernel threads, and of course various cleanups. A large patch series to replace the current asynchronous inode writeback with a new scheme that uses the delayed write buffers was posted to the list. The new scheme, which allows archive better I/O locality by dispatching meta-data I/O from a single place has been discussed extensively and is expected to be merged in February. On the userspace side January saw the 3.1.0 and 3.1.1 releases of xfsprogs, as well as the 3.0.4 release of xfsdump. The biggest changes in xfsprogs 3.1.0 were optimizations in xfs_repair that lead to a much lower memory usage, and optional use of the blkid library for filesystem detection and retrieving storage topology information. The 3.1.1 release contained various important bug fixes for these changes and a various improvements to the build system. The major feature of xfsdump 3.0.4 were fixes for time stamp handling on 64-bit systems. The xfstests package also lots of activity including various new testcases and an improved build system. From sandeen@sandeen.net Wed Feb 10 13:31:27 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1AJVR6h073204 for ; Wed, 10 Feb 2010 13:31:27 -0600 X-ASG-Debug-ID: 1265830359-426601f40000-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 C887B1CBE071 for ; Wed, 10 Feb 2010 11:32:39 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id pXynTW3AaF1xs8Zn for ; Wed, 10 Feb 2010 11:32:39 -0800 (PST) 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 7C6BA8F4FF6 for ; Wed, 10 Feb 2010 13:32:39 -0600 (CST) Message-ID: <4B7309D7.5090800@sandeen.net> Date: Wed, 10 Feb 2010 13:32:39 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH] enable inode64 by default when possible Subject: [PATCH] enable inode64 by default when possible 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: 1265830360 X-Barracuda-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.22192 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 Taking another swing at this. As XFS continues to position itself as the choice for very large Linux filesystems, we need to be mindful of the problems that the 32-bit inode restriction can cause with allocations and performance. As such, this patch changes the default to inode64 whenever XFS_BIG_INUMS is set, which in turn depends on either CONFIG_LBDAF or 64-bit longs. Going forward, we may wish to do this unconditionally for all filesystems by choosing CONFIG_LBDAF by default when xfs is chosen, but I'll leave that for later. This patch adds a "noinode64" option for backwards compatibility. (Minor update to documentation for "nobarrier" as well, which had not been previously documented). Signed-off-by: Eric Sandeen --- diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt index 9878f50..05b845a 100644 --- a/Documentation/filesystems/xfs.txt +++ b/Documentation/filesystems/xfs.txt @@ -37,7 +37,10 @@ When mounting an XFS filesystem, the following options are accepted. Enables the use of block layer write barriers for writes into the journal and unwritten extent conversion. This allows for drive level write caching to be enabled, for devices that - support write barriers. + support write barriers. This is the default. + + nobarrier + Disables the use of block layer write barriers. dmapi Enable the DMAPI (Data Management API) event callouts. @@ -66,8 +69,16 @@ When mounting an XFS filesystem, the following options are accepted. Indicates that XFS is allowed to create inodes at any location in the filesystem, including those which will result in inode numbers occupying more than 32 bits of significance. This is - provided for backwards compatibility, but causes problems for - backup applications that cannot handle large inode numbers. + the default for 64-bit or CONFIG_LBDAF kernels as of 2.6.33. + + noinode64 + Indicates that XFS must create inodes in filesystem locations + which will not result in inode numbers occupying more than 32 + bits of significance. This is provided for backwards compatibility, + for 32-bit applications which may not use the 64-bit stat interface, + such as backup applications that cannot handle large inode numbers. + Note that this only affects new inode creation; existing 64-bit + inode locations are unaffected. largeio/nolargeio If "nolargeio" is specified, the optimal I/O reported in diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 97c0f5a..7c74965 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -95,6 +95,7 @@ mempool_t *xfs_ioend_pool; #define MNTOPT_NOBARRIER "nobarrier" /* .. disable */ #define MNTOPT_OSYNCISOSYNC "osyncisosync" /* o_sync is REALLY o_sync */ #define MNTOPT_64BITINODE "inode64" /* inodes can be allocated anywhere */ +#define MNTOPT_32BITINODE "noinode64" /* inodes allocated in 32-bit range */ #define MNTOPT_IKEEP "ikeep" /* do not free empty inode clusters */ #define MNTOPT_NOIKEEP "noikeep" /* free empty inode clusters */ #define MNTOPT_LARGEIO "largeio" /* report large I/O sizes in stat() */ @@ -196,7 +197,9 @@ xfs_parseargs( */ mp->m_flags |= XFS_MOUNT_BARRIER; mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; +#ifndef XFS_BIG_INUMS mp->m_flags |= XFS_MOUNT_SMALL_INUMS; +#endif /* * These can be overridden by the mount option parsing. @@ -317,6 +320,8 @@ xfs_parseargs( this_char); return EINVAL; #endif + } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { + mp->m_flags |= XFS_MOUNT_SMALL_INUMS; } else if (!strcmp(this_char, MNTOPT_NOUUID)) { mp->m_flags |= XFS_MOUNT_NOUUID; } else if (!strcmp(this_char, MNTOPT_BARRIER)) { @@ -534,6 +539,7 @@ xfs_showargs( { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, { XFS_MOUNT_DMAPI, "," MNTOPT_DMAPI }, { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, + { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_32BITINODE }, { 0, NULL } }; static struct proc_xfs_info xfs_info_unset[] = { From eflorac@intellique.com Wed Feb 10 14:03:45 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1AK3i27075668 for ; Wed, 10 Feb 2010 14:03:45 -0600 X-ASG-Debug-ID: 1265832295-37a903b10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp5-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 104671CBE24F for ; Wed, 10 Feb 2010 12:04:57 -0800 (PST) Received: from smtp5-g21.free.fr (smtp5-g21.free.fr [212.27.42.5]) by cuda.sgi.com with ESMTP id UwOJzF23LgCMEmrW for ; Wed, 10 Feb 2010 12:04:57 -0800 (PST) Received: from smtp5-g21.free.fr (localhost [127.0.0.1]) by smtp5-g21.free.fr (Postfix) with ESMTP id 7C3C0D48015 for ; Wed, 10 Feb 2010 21:04:53 +0100 (CET) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp5-g21.free.fr (Postfix) with ESMTP id 81CA9D48147 for ; Wed, 10 Feb 2010 21:04:51 +0100 (CET) Date: Wed, 10 Feb 2010 21:04:48 +0100 From: Emmanuel Florac To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] enable inode64 by default when possible Subject: Re: [PATCH] enable inode64 by default when possible Message-ID: <20100210210448.36f16aba@galadriel.home> In-Reply-To: <4B7309D7.5090800@sandeen.net> References: <4B7309D7.5090800@sandeen.net> 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: smtp5-g21.free.fr[212.27.42.5] X-Barracuda-Start-Time: 1265832299 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22194 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 Wed, 10 Feb 2010 13:32:39 -0600 vous =E9criviez: > As such, this patch changes the default to inode64 whenever > XFS_BIG_INUMS is set, which in turn depends on either > CONFIG_LBDAF or 64-bit longs. But doesn't it cause problems specially for NFS sharing ? --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From bpm@sgi.com Wed Feb 10 14:13:36 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1AKDaDw076447 for ; Wed, 10 Feb 2010 14:13:36 -0600 Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7F3608F8066; Wed, 10 Feb 2010 12:14:47 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id A0E164266A1; Wed, 10 Feb 2010 14:15:27 -0600 (CST) Date: Wed, 10 Feb 2010 14:15:27 -0600 From: bpm@sgi.com To: Christoph Hellwig Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC PATCH 2/2] xfs_export_operations.commit_metadata Message-ID: <20100210201527.GJ23654@sgi.com> References: <20100210003220.6021.74943.stgit@case> <20100210003337.6021.10942.stgit@case> <20100210090750.GB21875@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100210090750.GB21875@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Howdy, On Wed, Feb 10, 2010 at 04:07:50AM -0500, Christoph Hellwig wrote: > On Tue, Feb 09, 2010 at 06:33:37PM -0600, Ben Myers wrote: > > hopefully > > the XFS gurus can continue to provide guidance. > > Ccing the xfs list would help with that :) I'll cross-post the next rev. ;) > > + if (xfs_ipincount(c_xip)) { > > + /* > > + * AFAICS the child is always modified after the parent > > + * in nfsd so should always have a larger lsn. > > + */ > > + if (c_xip->i_itemp->ili_last_lsn > force_lsn) { > > + force_lsn = c_xip->i_itemp->ili_last_lsn; > > + } else { > > + force_lsn = 0; /* whole thing */ > > + } > > I wouldn't rely on that and always take the larger one. I am concerned that ili_last_lsn will roll over at some point. I haven't figured out how to detect that yet. > Now with the simplification of always having a non-zero first argument > suggested in the previous mail this might be simplified down to: > > STATIC int > xfs_fs_nfs_commit_metadata( > struct dentry *parent, > struct dentry *child) > { > struct xfs_inode *dp = XFS_I(parent->d_inode); > struct xfs_inode *ip = NULL; > struct xfs_mount *mp = dp->i_mount; > xfs_lsn_t force_lsn = 0; > int error = 0; > > if (child) { > ip = XFS_I(child->d_inode); > xfs_lock_two_inodes(dp, ip, XFS_ILOCK_SHARED); > } else { > xfs_ilock(dp, XFS_ILOCK_SHARED); > } > > if (xfs_ipincount(dp)) > force_lsn = dp->i_itemp->ili_last_lsn; > if (ip && xfs_ipincount(ip)) > force_lsn = max(force_lsn, ip->i_itemp->ili_last_lsn); > + if (force_lsn) > error = _xfs_log_force_lsn(mp, force_lsn, NULL); > > if (ip) > xfs_iunlock(ip, XFS_ILOCK_SHARED); > xfs_iunlock(dp, XFS_ILOCK_SHARED); > > return error; > } That's nice! > Note that _xfs_log_force_lsn is new in the XFS tree, mainline still > has _xfs_log_force with an lsn argument. I've been working with Bruce's tree. Not sure how best to handle that. Thanks, Ben From sandeen@sandeen.net Wed Feb 10 14:14:10 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1AKE9eu076507 for ; Wed, 10 Feb 2010 14:14:09 -0600 X-ASG-Debug-ID: 1265832921-573500aa0000-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 238D81396BB6 for ; Wed, 10 Feb 2010 12:15:21 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id VGFhwAzeGfOri3aC for ; Wed, 10 Feb 2010 12:15:21 -0800 (PST) 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 6FD9312AEC00; Wed, 10 Feb 2010 14:15:21 -0600 (CST) Message-ID: <4B7313D9.9020603@sandeen.net> Date: Wed, 10 Feb 2010 14:15:21 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Emmanuel Florac CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] enable inode64 by default when possible Subject: Re: [PATCH] enable inode64 by default when possible References: <4B7309D7.5090800@sandeen.net> <20100210210448.36f16aba@galadriel.home> In-Reply-To: <20100210210448.36f16aba@galadriel.home> 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: 1265832923 X-Barracuda-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.22195 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 Emmanuel Florac wrote: > Le Wed, 10 Feb 2010 13:32:39 -0600 vous criviez: > >> As such, this patch changes the default to inode64 whenever >> XFS_BIG_INUMS is set, which in turn depends on either >> CONFIG_LBDAF or 64-bit longs. > > But doesn't it cause problems specially for NFS sharing ? > For some clients, yes - as do other NFS servers. That's what noinode64 is for... Also, newer nfs clients have an option: nfs.enable_ino64= [NFS] enable 64-bit inode numbers. If zero, the NFS client will fake up a 32-bit inode number for the readdir() and stat() syscalls instead of returning the full 64-bit number. The default is to return 64-bit inode numbers. (see Documentation/kernel-parameters.txt) At some point we have to drag people kicking and screaming out of 1988, I think! :) (I am mindful that this may manifest itself as "xfs is incompatible" but if we document this and advertise it a bit, I hope we can avoid that. At some point, apps just need to be fixed.) -Eric From eflorac@intellique.com Wed Feb 10 14:41:27 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1AKfRpS078500 for ; Wed, 10 Feb 2010 14:41:27 -0600 X-ASG-Debug-ID: 1265834554-246001360000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp5-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 313641C32F9 for ; Wed, 10 Feb 2010 12:42:38 -0800 (PST) Received: from smtp5-g21.free.fr (smtp5-g21.free.fr [212.27.42.5]) by cuda.sgi.com with ESMTP id IAuqKAgI8Zy3NMk3 for ; Wed, 10 Feb 2010 12:42:38 -0800 (PST) Received: from smtp5-g21.free.fr (localhost [127.0.0.1]) by smtp5-g21.free.fr (Postfix) with ESMTP id 80344D48103; Wed, 10 Feb 2010 21:42:30 +0100 (CET) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp5-g21.free.fr (Postfix) with ESMTP id 662BFD48201; Wed, 10 Feb 2010 21:42:28 +0100 (CET) Date: Wed, 10 Feb 2010 21:42:16 +0100 From: Emmanuel Florac To: Eric Sandeen Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] enable inode64 by default when possible Subject: Re: [PATCH] enable inode64 by default when possible Message-ID: <20100210214216.0ab263fd@galadriel.home> In-Reply-To: <4B7313D9.9020603@sandeen.net> References: <4B7309D7.5090800@sandeen.net> <20100210210448.36f16aba@galadriel.home> <4B7313D9.9020603@sandeen.net> 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: smtp5-g21.free.fr[212.27.42.5] X-Barracuda-Start-Time: 1265834561 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22196 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 Wed, 10 Feb 2010 14:15:21 -0600 vous =E9criviez: > > But doesn't it cause problems specially for NFS sharing ? > > =20 >=20 > For some clients, yes - as do other NFS servers. It would be nice to mention which one... At least it would be good to know at least approximately which releases of the main Unix clients (Linux, Solaris, OS X, BSDs, HP/UX, AIX) are compatible. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From SRS0+Mqth+70+fromorbit.com=david@internode.on.net Wed Feb 10 15:28:06 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1ALS5Vn081992 for ; Wed, 10 Feb 2010 15:28:05 -0600 X-ASG-Debug-ID: 1265837357-54e9005f0000-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 201E81C358C for ; Wed, 10 Feb 2010 13:29:17 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id N2k4M3sABXePSSr8 for ; Wed, 10 Feb 2010 13:29:17 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 1690883-1927428 for multiple; Thu, 11 Feb 2010 07:59:16 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NfK7X-0002fn-12; Thu, 11 Feb 2010 08:29:15 +1100 Date: Thu, 11 Feb 2010 08:29:14 +1100 From: Dave Chinner To: bpm@sgi.com Cc: Christoph Hellwig , linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [RFC PATCH 2/2] xfs_export_operations.commit_metadata Subject: Re: [RFC PATCH 2/2] xfs_export_operations.commit_metadata Message-ID: <20100210212914.GT11483@discord.disaster> References: <20100210003220.6021.74943.stgit@case> <20100210003337.6021.10942.stgit@case> <20100210090750.GB21875@infradead.org> <20100210201527.GJ23654@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100210201527.GJ23654@sgi.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1265837359 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22199 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, Feb 10, 2010 at 02:15:27PM -0600, bpm@sgi.com wrote: > Howdy, > > On Wed, Feb 10, 2010 at 04:07:50AM -0500, Christoph Hellwig wrote: > > On Tue, Feb 09, 2010 at 06:33:37PM -0600, Ben Myers wrote: > > > hopefully > > > the XFS gurus can continue to provide guidance. > > > > Ccing the xfs list would help with that :) > > I'll cross-post the next rev. ;) > > > > + if (xfs_ipincount(c_xip)) { > > > + /* > > > + * AFAICS the child is always modified after the parent > > > + * in nfsd so should always have a larger lsn. > > > + */ > > > + if (c_xip->i_itemp->ili_last_lsn > force_lsn) { > > > + force_lsn = c_xip->i_itemp->ili_last_lsn; > > > + } else { > > > + force_lsn = 0; /* whole thing */ > > > + } > > > > I wouldn't rely on that and always take the larger one. > > I am concerned that ili_last_lsn will roll over at some point. I > haven't figured out how to detect that yet. XFS_LSN_CMP() should be used for LSN comparisons - it handles rollover corectly. > > Now with the simplification of always having a non-zero first argument > > suggested in the previous mail this might be simplified down to: > > > > STATIC int > > xfs_fs_nfs_commit_metadata( > > struct dentry *parent, > > struct dentry *child) > > { > > struct xfs_inode *dp = XFS_I(parent->d_inode); > > struct xfs_inode *ip = NULL; > > struct xfs_mount *mp = dp->i_mount; > > xfs_lsn_t force_lsn = 0; > > int error = 0; > > > > if (child) { > > ip = XFS_I(child->d_inode); > > xfs_lock_two_inodes(dp, ip, XFS_ILOCK_SHARED); > > } else { > > xfs_ilock(dp, XFS_ILOCK_SHARED); > > } > > > > if (xfs_ipincount(dp)) > > force_lsn = dp->i_itemp->ili_last_lsn; > > if (ip && xfs_ipincount(ip)) > > force_lsn = max(force_lsn, ip->i_itemp->ili_last_lsn); So this should be: if (XFS_LSN_CMP(force_lsn, ip->i_itemp->ili_last_lsn) < 0) force_lsn = ip->i_itemp->ili_last_lsn; Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+c92b07a41bedde9ca4f4+2362+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 10 15:56:31 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1ALuUDi083837 for ; Wed, 10 Feb 2010 15:56:31 -0600 X-ASG-Debug-ID: 1265839064-19d701130000-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 2FA7613973F8; Wed, 10 Feb 2010 13:57:44 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id GfFo0zDixB9gAzXB; Wed, 10 Feb 2010 13:57:44 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NfKZ6-0001ST-JY; Wed, 10 Feb 2010 21:57:44 +0000 Date: Wed, 10 Feb 2010 16:57:44 -0500 From: Christoph Hellwig To: bpm@sgi.com Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [RFC PATCH 2/2] xfs_export_operations.commit_metadata Subject: Re: [RFC PATCH 2/2] xfs_export_operations.commit_metadata Message-ID: <20100210215744.GB25004@infradead.org> References: <20100210003220.6021.74943.stgit@case> <20100210003337.6021.10942.stgit@case> <20100210090750.GB21875@infradead.org> <20100210201527.GJ23654@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100210201527.GJ23654@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: 1265839065 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, Feb 10, 2010 at 02:15:27PM -0600, bpm@sgi.com wrote: > > Note that _xfs_log_force_lsn is new in the XFS tree, mainline still > > has _xfs_log_force with an lsn argument. > > I've been working with Bruce's tree. Not sure how best to handle that. Keep working against it for now, the merge fixup will be easy enough. From jpiszcz@lucidpixels.com Thu Feb 11 08:08:28 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BE8SDj151398 for ; Thu, 11 Feb 2010 08:08:28 -0600 X-ASG-Debug-ID: 1265897380-5897007c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E028B1C5899 for ; Thu, 11 Feb 2010 06:09:40 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id FeALlbCRQp6GrcZl for ; Thu, 11 Feb 2010 06:09:40 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id C1E1C38DFB8; Thu, 11 Feb 2010 09:09:39 -0500 (EST) Date: Thu, 11 Feb 2010 09:09:39 -0500 (EST) From: Justin Piszcz To: linux-kernel@vger.kernel.org, linux-raid@vger.kernl.org, xfs@oss.sgi.com, Alan Piszcz X-ASG-Orig-Subj: 2.6.32.3 x86_64 - XFS hangs, all I/O to D-state bug (again) Subject: 2.6.32.3 x86_64 - XFS hangs, all I/O to D-state bug (again) Message-ID: User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1265897381 X-Barracuda-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.22254 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 Hello, While tarring and compressing (bzip2) a lot of files, the following error occurred, note the output is not clean because this was taken from netconsole. When this occurs, the host cannot be rebooted with reboot/proceses cannot be killed and the box locks up. There are no apparent hardware issues. Before, asterisk would trigger this bug, since asterisk no longer runs on this host, it ran for ~2-3 months without any problems, until now. Please cc me as I am not on the lists, thanks. Is this a md raid issue or XFS? From the trace it appears to be an XFS bug? Feb 11 07:38:14 l1 [ 20.270270] e100: eth1 NIC Link is Up 100 Mbps Full Duplex Feb 11 07:47:54 l1 [ 600.432165] INFO: task scp:4871 blocked for more than 120 seconds. Feb 11 07:47:54 l1 [ 600.432177] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Feb 11 07:47:54 l1 [ 600.432182] scp D Feb 11 07:47:54 l1 ffff8801eee6f14c Feb 11 07:47:54 l1 0 4871 4870 0x00000000 Feb 11 07:47:54 l1 [ 600.432188] ffff880220c87950 Feb 11 07:47:54 l1 0000000000000082 Feb 11 07:47:54 l1 0000000000200200 Feb 11 07:47:54 l1 ffff88023eb71400 Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432196] 000000000000c928 Feb 11 07:47:54 l1 ffff8801f7a55fd8 Feb 11 07:47:54 l1 ffff880205fc6150 Feb 11 07:47:54 l1 ffff880205fc63c8 Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432203] 0000000000001000 Feb 11 07:47:54 l1 ffffffff8108d02a Feb 11 07:47:54 l1 ffff8801eee6f0c0 Feb 11 07:47:54 l1 ffff880205fc63c8 Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432209] Call Trace: Feb 11 07:47:54 l1 [ 600.432230] [] ? generic_file_buffered_write+0x1aa/0x290 Feb 11 07:47:54 l1 [ 600.432236] [] ? __down_write_nested+0x7d/0xb0 Feb 11 07:47:54 l1 [ 600.432242] [] ? xfs_write+0x23d/0x950 Feb 11 07:47:54 l1 [ 600.432250] [] ? do_sync_write+0xe3/0x130 Feb 11 07:47:54 l1 [ 600.432260] [] ? autoremove_wake_function+0x0/0x30 Feb 11 07:47:54 l1 [ 600.432266] [] ? fsnotify+0x4/0x1a0 Feb 11 07:47:54 l1 [ 600.432271] [] ? common_interrupt+0xe/0x13 Feb 11 07:47:54 l1 [ 600.432276] [] ? vfs_write+0xcb/0x180 Feb 11 07:47:54 l1 [ 600.432280] [] ? sys_write+0x53/0xa0 Feb 11 07:47:54 l1 [ 600.432285] [] ? system_call_fastpath+0x16/0x1b Feb 11 07:47:54 l1 [ 600.432291] INFO: task flush-9:3:4874 blocked for more than 120 seconds. Feb 11 07:47:54 l1 [ 600.432294] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Feb 11 07:47:54 l1 [ 600.432297] flush-9:3 D Feb 11 07:47:54 l1 ffff88021948d750 Feb 11 07:47:54 l1 0 4874 2 0x00000000 Feb 11 07:47:54 l1 [ 600.432309] ffff88023fa3c8c0 Feb 11 07:47:54 l1 0000000000000046 Feb 11 07:47:54 l1 000000001948d750 Feb 11 07:47:54 l1 ffffffff8163d788 Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432323] 000000000000c928 Feb 11 07:47:54 l1 ffff8801f79fbfd8 Feb 11 07:47:54 l1 ffff88021948d750 Feb 11 07:47:54 l1 ffff88021948d9c8 Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432329] 000000013f467bb0 Feb 11 07:47:54 l1 ffffffff8108c183 Feb 11 07:47:54 l1 0000000000000000 Feb 11 07:47:54 l1 ffff88021948d9c8 Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432337] Call Trace: Feb 11 07:47:54 l1 [ 600.432341] [] ? find_lock_page+0x23/0x80 Feb 11 07:47:54 l1 [ 600.432344] [] ? find_or_create_page+0x41/0xc0 Feb 11 07:47:54 l1 [ 600.432349] [] ? schedule_timeout+0x195/0x1f0 Feb 11 07:47:54 l1 [ 600.432352] [] ? __down+0x61/0xa0 Feb 11 07:47:54 l1 [ 600.432356] [] ? down+0x46/0x50 Feb 11 07:47:54 l1 [ 600.432360] [] ? _xfs_buf_find+0x134/0x220 Feb 11 07:47:54 l1 [ 600.432363] [] ? xfs_buf_get_flags+0x6e/0x190 Feb 11 07:47:54 l1 [ 600.432366] [] ? xfs_buf_read_flags+0x12/0xa0 Feb 11 07:47:54 l1 [ 600.432371] [] ? xfs_trans_read_buf+0x1f6/0x350 Feb 11 07:47:54 l1 [ 600.432377] [] ? xfs_read_agf+0x68/0x190 Feb 11 07:47:54 l1 [ 600.432380] [] ? xfs_alloc_read_agf+0x30/0xd0 Feb 11 07:47:54 l1 [ 600.432383] [] ? xfs_alloc_fix_freelist+0x379/0x450 Feb 11 07:47:54 l1 [ 600.432388] [] ? xfs_iext_remove+0x35/0x80 Feb 11 07:47:54 l1 [ 600.432393] [] ? xfs_bmap_add_extent_delay_real+0x5ef/0x11a0 Feb 11 07:47:54 l1 [ 600.432396] [] ? xfs_trans_log_buf+0x63/0xa0 Feb 11 07:47:54 l1 [ 600.432401] [] ? xlog_state_get_iclog_space+0x60/0x2c0 Feb 11 07:47:54 l1 [ 600.432404] [] ? __down_read+0x17/0xae Feb 11 07:47:54 l1 [ 600.432408] [] ? xfs_alloc_vextent+0x310/0x4b0 Feb 11 07:47:54 l1 [ 600.432412] [] ? xfs_bmap_btalloc+0x598/0xa40 Feb 11 07:47:54 l1 [ 600.432417] [] ? xfs_bmapi+0x9e2/0x11a0 Feb 11 07:47:54 l1 [ 600.432422] [] ? xfs_trans_reserve+0x9f/0x210 Feb 11 07:47:54 l1 [ 600.432425] [] ? xfs_iomap_write_allocate+0x23e/0x3b0 Feb 11 07:47:54 l1 [ 600.432429] [] ? xfs_iomap+0x2c0/0x300 Feb 11 07:47:54 l1 [ 600.432433] [] ? xfs_map_blocks+0x25/0x30 Feb 11 07:47:54 l1 [ 600.432437] [] ? xfs_page_state_convert+0x414/0x6c0 Feb 11 07:47:54 l1 [ 600.432443] [] ? radix_tree_gang_lookup_tag_slot+0xc3/0xf0 Feb 11 07:47:54 l1 [ 600.432447] [] ? xfs_vm_writepage+0x77/0x130 Feb 11 07:47:54 l1 [ 600.432453] [] ? __writepage+0xa/0x40 Feb 11 07:47:54 l1 [ 600.432456] [] ? write_cache_pages+0x1df/0x3c0 Feb 11 07:47:54 l1 [ 600.432459] [] ? __writepage+0x0/0x40 Feb 11 07:47:54 l1 [ 600.432464] [] ? writeback_single_inode+0xd2/0x390 Feb 11 07:47:54 l1 [ 600.432468] [] ? writeback_inodes_wb+0x3ff/0x5e0 Feb 11 07:47:54 l1 [ 600.432473] [] ? wb_writeback+0x11e/0x1f0 Feb 11 07:47:54 l1 [ 600.432479] [] ? try_to_del_timer_sync+0x5e/0x90 Feb 11 07:47:54 l1 [ 600.432484] [] ? wb_do_writeback+0x17b/0x180 Feb 11 07:47:54 l1 [ 600.432487] [] ? bdi_writeback_task+0x5d/0xa0 Feb 11 07:47:54 l1 [ 600.432492] [] ? bdi_start_fn+0x0/0xf0 Feb 11 07:47:54 l1 [ 600.432496] [] ? bdi_start_fn+0x7e/0xf0 Feb 11 07:47:54 l1 [ 600.432499] [] ? bdi_start_fn+0x0/0xf0 Feb 11 07:47:54 l1 [ 600.432503] [] ? kthread+0x96/0xa0 Feb 11 07:47:54 l1 [ 600.432508] [] ? child_rip+0xa/0x20 Feb 11 07:47:54 l1 [ 600.432513] [] ? kthread+0x0/0xa0 Feb 11 07:47:54 l1 [ 600.432517] [] ? child_rip+0x0/0x20 Feb 11 07:49:54 l1 [ 720.432171] INFO: task scp:4871 blocked for more than 120 seconds. Feb 11 07:49:54 l1 [ 720.432187] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Feb 11 07:49:54 l1 [ 720.432192] scp D Feb 11 07:49:54 l1 ffff8801eee6f14c Feb 11 07:49:54 l1 0 4871 4870 0x00000000 Feb 11 07:49:54 l1 [ 720.432198] ffff880220c87950 Feb 11 07:49:54 l1 0000000000000082 Feb 11 07:49:54 l1 0000000000200200 Feb 11 07:49:54 l1 ffff88023eb71400 Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432206] 000000000000c928 Feb 11 07:49:54 l1 ffff8801f7a55fd8 Feb 11 07:49:54 l1 ffff880205fc6150 Feb 11 07:49:54 l1 ffff880205fc63c8 Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432217] 0000000000001000 Feb 11 07:49:54 l1 ffffffff8108d02a Feb 11 07:49:54 l1 ffff8801eee6f0c0 Feb 11 07:49:54 l1 ffff880205fc63c8 Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432224] Call Trace: Feb 11 07:49:54 l1 [ 720.432238] [] ? generic_file_buffered_write+0x1aa/0x290 Feb 11 07:49:54 l1 [ 720.432243] [] ? __down_write_nested+0x7d/0xb0 Feb 11 07:49:54 l1 [ 720.432249] [] ? xfs_write+0x23d/0x950 Feb 11 07:49:54 l1 [ 720.432254] [] ? do_sync_write+0xe3/0x130 Feb 11 07:49:54 l1 [ 720.432259] [] ? autoremove_wake_function+0x0/0x30 Feb 11 07:49:54 l1 [ 720.432265] [] ? fsnotify+0x4/0x1a0 Feb 11 07:49:54 l1 [ 720.432270] [] ? common_interrupt+0xe/0x13 Feb 11 07:49:54 l1 [ 720.432275] [] ? vfs_write+0xcb/0x180 Feb 11 07:49:54 l1 [ 720.432280] [] ? sys_write+0x53/0xa0 Feb 11 07:49:54 l1 [ 720.432285] [] ? system_call_fastpath+0x16/0x1b Feb 11 07:49:54 l1 [ 720.432291] INFO: task flush-9:3:4874 blocked for more than 120 seconds. Feb 11 07:49:54 l1 [ 720.432295] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Feb 11 07:49:54 l1 [ 720.432298] flush-9:3 D Feb 11 07:49:54 l1 ffff88021948d750 Feb 11 07:49:54 l1 0 4874 2 0x00000000 Feb 11 07:49:54 l1 [ 720.432306] ffff88023fa3c8c0 Feb 11 07:49:54 l1 0000000000000046 Feb 11 07:49:54 l1 000000001948d750 Feb 11 07:49:54 l1 ffffffff8163d788 Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432322] 000000000000c928 Feb 11 07:49:54 l1 ffff8801f79fbfd8 Feb 11 07:49:54 l1 ffff88021948d750 Feb 11 07:49:54 l1 ffff88021948d9c8 Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432329] 000000013f467bb0 Feb 11 07:49:54 l1 ffffffff8108c183 Feb 11 07:49:54 l1 0000000000000000 Feb 11 07:49:54 l1 ffff88021948d9c8 Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432336] Call Trace: Feb 11 07:49:54 l1 [ 720.432340] [] ? find_lock_page+0x23/0x80 Feb 11 07:49:54 l1 [ 720.432343] [] ? find_or_create_page+0x41/0xc0 Feb 11 07:49:54 l1 [ 720.432348] [] ? schedule_timeout+0x195/0x1f0 Feb 11 07:49:54 l1 [ 720.432351] [] ? __down+0x61/0xa0 Feb 11 07:49:54 l1 [ 720.432356] [] ? down+0x46/0x50 Feb 11 07:49:54 l1 [ 720.432361] [] ? _xfs_buf_find+0x134/0x220 Feb 11 07:49:54 l1 [ 720.432365] [] ? xfs_buf_get_flags+0x6e/0x190 Feb 11 07:49:54 l1 [ 720.432368] [] ? xfs_buf_read_flags+0x12/0xa0 Feb 11 07:49:54 l1 [ 720.432373] [] ? xfs_trans_read_buf+0x1f6/0x350 Feb 11 07:49:54 l1 [ 720.432378] [] ? xfs_read_agf+0x68/0x190 Feb 11 07:49:54 l1 [ 720.432382] [] ? xfs_alloc_read_agf+0x30/0xd0 Feb 11 07:49:54 l1 [ 720.432386] [] ? xfs_alloc_fix_freelist+0x379/0x450 Feb 11 07:49:54 l1 [ 720.432391] [] ? xfs_iext_remove+0x35/0x80 Feb 11 07:49:54 l1 [ 720.432396] [] ? xfs_bmap_add_extent_delay_real+0x5ef/0x11a0 Feb 11 07:49:54 l1 [ 720.432399] [] ? xfs_trans_log_buf+0x63/0xa0 Feb 11 07:49:54 l1 [ 720.432404] [] ? xlog_state_get_iclog_space+0x60/0x2c0 Feb 11 07:49:54 l1 [ 720.432410] [] ? __down_read+0x17/0xae Feb 11 07:49:54 l1 [ 720.432415] [] ? xfs_alloc_vextent+0x310/0x4b0 Feb 11 07:49:54 l1 [ 720.432420] [] ? xfs_bmap_btalloc+0x598/0xa40 Feb 11 07:49:54 l1 [ 720.432426] [] ? xfs_bmapi+0x9e2/0x11a0 Feb 11 07:49:54 l1 [ 720.432430] [] ? xfs_trans_reserve+0x9f/0x210 Feb 11 07:49:54 l1 [ 720.432434] [] ? xfs_iomap_write_allocate+0x23e/0x3b0 Feb 11 07:49:54 l1 [ 720.432437] [] ? xfs_iomap+0x2c0/0x300 Feb 11 07:49:54 l1 [ 720.432441] [] ? xfs_map_blocks+0x25/0x30 Feb 11 07:49:54 l1 [ 720.432445] [] ? xfs_page_state_convert+0x414/0x6c0 Feb 11 07:49:54 l1 [ 720.432451] [] ? radix_tree_gang_lookup_tag_slot+0xc3/0xf0 Feb 11 07:49:54 l1 [ 720.432455] [] ? xfs_vm_writepage+0x77/0x130 Feb 11 07:49:54 l1 [ 720.432459] [] ? __writepage+0xa/0x40 Feb 11 07:49:54 l1 [ 720.432462] [] ? write_cache_pages+0x1df/0x3c0 Feb 11 07:49:54 l1 [ 720.432466] [] ? __writepage+0x0/0x40 Feb 11 07:49:54 l1 [ 720.432472] [] ? writeback_single_inode+0xd2/0x390 Feb 11 07:49:54 l1 [ 720.432476] [] ? writeback_inodes_wb+0x3ff/0x5e0 Feb 11 07:49:54 l1 [ 720.432480] [] ? wb_writeback+0x11e/0x1f0 Feb 11 07:49:54 l1 [ 720.432485] [] ? try_to_del_timer_sync+0x5e/0x90 Feb 11 07:49:54 l1 [ 720.432489] [] ? wb_do_writeback+0x17b/0x180 Feb 11 07:49:54 l1 [ 720.432493] [] ? bdi_writeback_task+0x5d/0xa0 Feb 11 07:49:54 l1 [ 720.432497] [] ? bdi_start_fn+0x0/0xf0 Feb 11 07:49:54 l1 [ 720.432500] [] ? bdi_start_fn+0x7e/0xf0 Feb 11 07:49:54 l1 [ 720.432503] [] ? bdi_start_fn+0x0/0xf0 Feb 11 07:49:54 l1 [ 720.432506] [] ? kthread+0x96/0xa0 Feb 11 07:49:54 l1 [ 720.432511] [] ? child_rip+0xa/0x20 Feb 11 07:49:54 l1 [ 720.432515] [] ? kthread+0x0/0xa0 Feb 11 07:49:54 l1 [ 720.432519] [] ? child_rip+0x0/0x20 Justin. From jpiszcz@lucidpixels.com Thu Feb 11 08:12:19 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BECJoM151656 for ; Thu, 11 Feb 2010 08:12:19 -0600 X-ASG-Debug-ID: 1265897611-412501220000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EE0EE1399FF8 for ; Thu, 11 Feb 2010 06:13:31 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id RTY2Bn7ap5GqYbmq for ; Thu, 11 Feb 2010 06:13:31 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 58AE738DFB8; Thu, 11 Feb 2010 09:13:31 -0500 (EST) Date: Thu, 11 Feb 2010 09:13:31 -0500 (EST) From: Justin Piszcz To: linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, xfs@oss.sgi.com, Alan Piszcz X-ASG-Orig-Subj: Re: 2.6.32.3 x86_64 - XFS hangs, all I/O to D-state bug (again) Subject: Re: 2.6.32.3 x86_64 - XFS hangs, all I/O to D-state bug (again) In-Reply-To: Message-ID: References: User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1265897612 X-Barracuda-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.22255 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 The errors in the e-mail had bad formatting, please see the following: http://home.comcast.net/~jpiszcz/20100211/crash.txt In addition, the linux-raid list had a typo in it, fixed. On Thu, 11 Feb 2010, Justin Piszcz wrote: > Hello, > > While tarring and compressing (bzip2) a lot of files, the following error > occurred, note the output is not clean because this was taken from > netconsole. > > When this occurs, the host cannot be rebooted with reboot/proceses cannot > be killed and the box locks up. There are no apparent hardware issues. > > Before, asterisk would trigger this bug, since asterisk no longer runs on > this host, it ran for ~2-3 months without any problems, until now. > > Please cc me as I am not on the lists, thanks. > > Is this a md raid issue or XFS? From the trace it appears to be an XFS bug? > > Feb 11 07:38:14 l1 [ 20.270270] e100: eth1 NIC Link is Up 100 Mbps Full > Duplex Feb 11 07:47:54 l1 [ 600.432165] INFO: task scp:4871 blocked for more > than 120 seconds. Feb 11 07:47:54 l1 [ 600.432177] "echo 0 > > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Feb 11 > 07:47:54 l1 [ 600.432182] scp D > Feb 11 07:47:54 l1 ffff8801eee6f14c Feb 11 07:47:54 l1 0 4871 4870 > 0x00000000 Feb 11 07:47:54 l1 [ 600.432188] ffff880220c87950 > Feb 11 07:47:54 l1 0000000000000082 > Feb 11 07:47:54 l1 0000000000200200 > Feb 11 07:47:54 l1 ffff88023eb71400 > Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432196] 000000000000c928 > Feb 11 07:47:54 l1 ffff8801f7a55fd8 > Feb 11 07:47:54 l1 ffff880205fc6150 > Feb 11 07:47:54 l1 ffff880205fc63c8 > Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432203] 0000000000001000 > Feb 11 07:47:54 l1 ffffffff8108d02a > Feb 11 07:47:54 l1 ffff8801eee6f0c0 > Feb 11 07:47:54 l1 ffff880205fc63c8 > Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432209] Call Trace: Feb 11 > 07:47:54 l1 [ 600.432230] [] ? > generic_file_buffered_write+0x1aa/0x290 Feb 11 07:47:54 l1 [ 600.432236] > [] ? __down_write_nested+0x7d/0xb0 Feb 11 07:47:54 l1 [ > 600.432242] [] ? xfs_write+0x23d/0x950 Feb 11 07:47:54 l1 > [ 600.432250] [] ? do_sync_write+0xe3/0x130 Feb 11 > 07:47:54 l1 [ 600.432260] [] ? > autoremove_wake_function+0x0/0x30 Feb 11 07:47:54 l1 [ 600.432266] > [] ? fsnotify+0x4/0x1a0 Feb 11 07:47:54 l1 [ 600.432271] > [] ? common_interrupt+0xe/0x13 Feb 11 07:47:54 l1 [ > 600.432276] [] ? vfs_write+0xcb/0x180 Feb 11 07:47:54 l1 [ > 600.432280] [] ? sys_write+0x53/0xa0 Feb 11 07:47:54 l1 [ > 600.432285] [] ? system_call_fastpath+0x16/0x1b Feb 11 > 07:47:54 l1 [ 600.432291] INFO: task flush-9:3:4874 blocked for more than > 120 seconds. Feb 11 07:47:54 l1 [ 600.432294] "echo 0 > > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Feb 11 > 07:47:54 l1 [ 600.432297] flush-9:3 D > Feb 11 07:47:54 l1 ffff88021948d750 Feb 11 07:47:54 l1 0 4874 2 > 0x00000000 Feb 11 07:47:54 l1 [ 600.432309] ffff88023fa3c8c0 > Feb 11 07:47:54 l1 0000000000000046 > Feb 11 07:47:54 l1 000000001948d750 > Feb 11 07:47:54 l1 ffffffff8163d788 > Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432323] 000000000000c928 > Feb 11 07:47:54 l1 ffff8801f79fbfd8 > Feb 11 07:47:54 l1 ffff88021948d750 > Feb 11 07:47:54 l1 ffff88021948d9c8 > Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432329] 000000013f467bb0 > Feb 11 07:47:54 l1 ffffffff8108c183 > Feb 11 07:47:54 l1 0000000000000000 > Feb 11 07:47:54 l1 ffff88021948d9c8 > Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432337] Call Trace: Feb 11 > 07:47:54 l1 [ 600.432341] [] ? find_lock_page+0x23/0x80 > Feb 11 07:47:54 l1 [ 600.432344] [] ? > find_or_create_page+0x41/0xc0 Feb 11 07:47:54 l1 [ 600.432349] > [] ? schedule_timeout+0x195/0x1f0 Feb 11 07:47:54 l1 [ > 600.432352] [] ? __down+0x61/0xa0 Feb 11 07:47:54 l1 [ > 600.432356] [] ? down+0x46/0x50 Feb 11 07:47:54 l1 [ > 600.432360] [] ? _xfs_buf_find+0x134/0x220 Feb 11 07:47:54 > l1 [ 600.432363] [] ? xfs_buf_get_flags+0x6e/0x190 Feb 11 > 07:47:54 l1 [ 600.432366] [] ? > xfs_buf_read_flags+0x12/0xa0 Feb 11 07:47:54 l1 [ 600.432371] > [] ? xfs_trans_read_buf+0x1f6/0x350 Feb 11 07:47:54 l1 [ > 600.432377] [] ? xfs_read_agf+0x68/0x190 Feb 11 07:47:54 > l1 [ 600.432380] [] ? xfs_alloc_read_agf+0x30/0xd0 Feb 11 > 07:47:54 l1 [ 600.432383] [] ? > xfs_alloc_fix_freelist+0x379/0x450 Feb 11 07:47:54 l1 [ 600.432388] > [] ? xfs_iext_remove+0x35/0x80 Feb 11 07:47:54 l1 [ > 600.432393] [] ? > xfs_bmap_add_extent_delay_real+0x5ef/0x11a0 Feb 11 07:47:54 l1 [ 600.432396] > [] ? xfs_trans_log_buf+0x63/0xa0 Feb 11 07:47:54 l1 [ > 600.432401] [] ? xlog_state_get_iclog_space+0x60/0x2c0 Feb > 11 07:47:54 l1 [ 600.432404] [] ? __down_read+0x17/0xae > Feb 11 07:47:54 l1 [ 600.432408] [] ? > xfs_alloc_vextent+0x310/0x4b0 Feb 11 07:47:54 l1 [ 600.432412] > [] ? xfs_bmap_btalloc+0x598/0xa40 Feb 11 07:47:54 l1 [ > 600.432417] [] ? xfs_bmapi+0x9e2/0x11a0 Feb 11 07:47:54 l1 > [ 600.432422] [] ? xfs_trans_reserve+0x9f/0x210 Feb 11 > 07:47:54 l1 [ 600.432425] [] ? > xfs_iomap_write_allocate+0x23e/0x3b0 Feb 11 07:47:54 l1 [ 600.432429] > [] ? xfs_iomap+0x2c0/0x300 Feb 11 07:47:54 l1 [ > 600.432433] [] ? xfs_map_blocks+0x25/0x30 Feb 11 07:47:54 > l1 [ 600.432437] [] ? xfs_page_state_convert+0x414/0x6c0 > Feb 11 07:47:54 l1 [ 600.432443] [] ? > radix_tree_gang_lookup_tag_slot+0xc3/0xf0 Feb 11 07:47:54 l1 [ 600.432447] > [] ? xfs_vm_writepage+0x77/0x130 Feb 11 07:47:54 l1 [ > 600.432453] [] ? __writepage+0xa/0x40 Feb 11 07:47:54 l1 [ > 600.432456] [] ? write_cache_pages+0x1df/0x3c0 Feb 11 > 07:47:54 l1 [ 600.432459] [] ? __writepage+0x0/0x40 Feb > 11 07:47:54 l1 [ 600.432464] [] ? > writeback_single_inode+0xd2/0x390 Feb 11 07:47:54 l1 [ 600.432468] > [] ? writeback_inodes_wb+0x3ff/0x5e0 Feb 11 07:47:54 l1 [ > 600.432473] [] ? wb_writeback+0x11e/0x1f0 Feb 11 07:47:54 > l1 [ 600.432479] [] ? try_to_del_timer_sync+0x5e/0x90 Feb > 11 07:47:54 l1 [ 600.432484] [] ? > wb_do_writeback+0x17b/0x180 Feb 11 07:47:54 l1 [ 600.432487] > [] ? bdi_writeback_task+0x5d/0xa0 Feb 11 07:47:54 l1 [ > 600.432492] [] ? bdi_start_fn+0x0/0xf0 Feb 11 07:47:54 l1 > [ 600.432496] [] ? bdi_start_fn+0x7e/0xf0 Feb 11 07:47:54 > l1 [ 600.432499] [] ? bdi_start_fn+0x0/0xf0 Feb 11 > 07:47:54 l1 [ 600.432503] [] ? kthread+0x96/0xa0 Feb 11 > 07:47:54 l1 [ 600.432508] [] ? child_rip+0xa/0x20 Feb 11 > 07:47:54 l1 [ 600.432513] [] ? kthread+0x0/0xa0 Feb 11 > 07:47:54 l1 [ 600.432517] [] ? child_rip+0x0/0x20 Feb 11 > 07:49:54 l1 [ 720.432171] INFO: task scp:4871 blocked for more than 120 > seconds. Feb 11 07:49:54 l1 [ 720.432187] "echo 0 > > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Feb 11 > 07:49:54 l1 [ 720.432192] scp D > Feb 11 07:49:54 l1 ffff8801eee6f14c Feb 11 07:49:54 l1 0 4871 4870 > 0x00000000 Feb 11 07:49:54 l1 [ 720.432198] ffff880220c87950 > Feb 11 07:49:54 l1 0000000000000082 > Feb 11 07:49:54 l1 0000000000200200 > Feb 11 07:49:54 l1 ffff88023eb71400 > Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432206] 000000000000c928 > Feb 11 07:49:54 l1 ffff8801f7a55fd8 > Feb 11 07:49:54 l1 ffff880205fc6150 > Feb 11 07:49:54 l1 ffff880205fc63c8 > Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432217] 0000000000001000 > Feb 11 07:49:54 l1 ffffffff8108d02a > Feb 11 07:49:54 l1 ffff8801eee6f0c0 > Feb 11 07:49:54 l1 ffff880205fc63c8 > Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432224] Call Trace: Feb 11 > 07:49:54 l1 [ 720.432238] [] ? > generic_file_buffered_write+0x1aa/0x290 Feb 11 07:49:54 l1 [ 720.432243] > [] ? __down_write_nested+0x7d/0xb0 Feb 11 07:49:54 l1 [ > 720.432249] [] ? xfs_write+0x23d/0x950 Feb 11 07:49:54 l1 > [ 720.432254] [] ? do_sync_write+0xe3/0x130 Feb 11 > 07:49:54 l1 [ 720.432259] [] ? > autoremove_wake_function+0x0/0x30 Feb 11 07:49:54 l1 [ 720.432265] > [] ? fsnotify+0x4/0x1a0 Feb 11 07:49:54 l1 [ 720.432270] > [] ? common_interrupt+0xe/0x13 Feb 11 07:49:54 l1 [ > 720.432275] [] ? vfs_write+0xcb/0x180 Feb 11 07:49:54 l1 [ > 720.432280] [] ? sys_write+0x53/0xa0 Feb 11 07:49:54 l1 [ > 720.432285] [] ? system_call_fastpath+0x16/0x1b Feb 11 > 07:49:54 l1 [ 720.432291] INFO: task flush-9:3:4874 blocked for more than > 120 seconds. Feb 11 07:49:54 l1 [ 720.432295] "echo 0 > > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Feb 11 > 07:49:54 l1 [ 720.432298] flush-9:3 D > Feb 11 07:49:54 l1 ffff88021948d750 Feb 11 07:49:54 l1 0 4874 2 > 0x00000000 Feb 11 07:49:54 l1 [ 720.432306] ffff88023fa3c8c0 > Feb 11 07:49:54 l1 0000000000000046 > Feb 11 07:49:54 l1 000000001948d750 > Feb 11 07:49:54 l1 ffffffff8163d788 > Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432322] 000000000000c928 > Feb 11 07:49:54 l1 ffff8801f79fbfd8 > Feb 11 07:49:54 l1 ffff88021948d750 > Feb 11 07:49:54 l1 ffff88021948d9c8 > Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432329] 000000013f467bb0 > Feb 11 07:49:54 l1 ffffffff8108c183 > Feb 11 07:49:54 l1 0000000000000000 > Feb 11 07:49:54 l1 ffff88021948d9c8 > Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432336] Call Trace: Feb 11 > 07:49:54 l1 [ 720.432340] [] ? find_lock_page+0x23/0x80 > Feb 11 07:49:54 l1 [ 720.432343] [] ? > find_or_create_page+0x41/0xc0 Feb 11 07:49:54 l1 [ 720.432348] > [] ? schedule_timeout+0x195/0x1f0 Feb 11 07:49:54 l1 [ > 720.432351] [] ? __down+0x61/0xa0 Feb 11 07:49:54 l1 [ > 720.432356] [] ? down+0x46/0x50 Feb 11 07:49:54 l1 [ > 720.432361] [] ? _xfs_buf_find+0x134/0x220 Feb 11 07:49:54 > l1 [ 720.432365] [] ? xfs_buf_get_flags+0x6e/0x190 Feb 11 > 07:49:54 l1 [ 720.432368] [] ? > xfs_buf_read_flags+0x12/0xa0 Feb 11 07:49:54 l1 [ 720.432373] > [] ? xfs_trans_read_buf+0x1f6/0x350 Feb 11 07:49:54 l1 [ > 720.432378] [] ? xfs_read_agf+0x68/0x190 Feb 11 07:49:54 > l1 [ 720.432382] [] ? xfs_alloc_read_agf+0x30/0xd0 Feb 11 > 07:49:54 l1 [ 720.432386] [] ? > xfs_alloc_fix_freelist+0x379/0x450 Feb 11 07:49:54 l1 [ 720.432391] > [] ? xfs_iext_remove+0x35/0x80 Feb 11 07:49:54 l1 [ > 720.432396] [] ? > xfs_bmap_add_extent_delay_real+0x5ef/0x11a0 Feb 11 07:49:54 l1 [ 720.432399] > [] ? xfs_trans_log_buf+0x63/0xa0 Feb 11 07:49:54 l1 [ > 720.432404] [] ? xlog_state_get_iclog_space+0x60/0x2c0 Feb > 11 07:49:54 l1 [ 720.432410] [] ? __down_read+0x17/0xae > Feb 11 07:49:54 l1 [ 720.432415] [] ? > xfs_alloc_vextent+0x310/0x4b0 Feb 11 07:49:54 l1 [ 720.432420] > [] ? xfs_bmap_btalloc+0x598/0xa40 Feb 11 07:49:54 l1 [ > 720.432426] [] ? xfs_bmapi+0x9e2/0x11a0 Feb 11 07:49:54 l1 > [ 720.432430] [] ? xfs_trans_reserve+0x9f/0x210 Feb 11 > 07:49:54 l1 [ 720.432434] [] ? > xfs_iomap_write_allocate+0x23e/0x3b0 Feb 11 07:49:54 l1 [ 720.432437] > [] ? xfs_iomap+0x2c0/0x300 Feb 11 07:49:54 l1 [ > 720.432441] [] ? xfs_map_blocks+0x25/0x30 Feb 11 07:49:54 > l1 [ 720.432445] [] ? xfs_page_state_convert+0x414/0x6c0 > Feb 11 07:49:54 l1 [ 720.432451] [] ? > radix_tree_gang_lookup_tag_slot+0xc3/0xf0 Feb 11 07:49:54 l1 [ 720.432455] > [] ? xfs_vm_writepage+0x77/0x130 Feb 11 07:49:54 l1 [ > 720.432459] [] ? __writepage+0xa/0x40 Feb 11 07:49:54 l1 [ > 720.432462] [] ? write_cache_pages+0x1df/0x3c0 Feb 11 > 07:49:54 l1 [ 720.432466] [] ? __writepage+0x0/0x40 Feb > 11 07:49:54 l1 [ 720.432472] [] ? > writeback_single_inode+0xd2/0x390 Feb 11 07:49:54 l1 [ 720.432476] > [] ? writeback_inodes_wb+0x3ff/0x5e0 Feb 11 07:49:54 l1 [ > 720.432480] [] ? wb_writeback+0x11e/0x1f0 Feb 11 07:49:54 > l1 [ 720.432485] [] ? try_to_del_timer_sync+0x5e/0x90 Feb > 11 07:49:54 l1 [ 720.432489] [] ? > wb_do_writeback+0x17b/0x180 Feb 11 07:49:54 l1 [ 720.432493] > [] ? bdi_writeback_task+0x5d/0xa0 Feb 11 07:49:54 l1 [ > 720.432497] [] ? bdi_start_fn+0x0/0xf0 Feb 11 07:49:54 l1 > [ 720.432500] [] ? bdi_start_fn+0x7e/0xf0 Feb 11 07:49:54 > l1 [ 720.432503] [] ? bdi_start_fn+0x0/0xf0 Feb 11 > 07:49:54 l1 [ 720.432506] [] ? kthread+0x96/0xa0 Feb 11 > 07:49:54 l1 [ 720.432511] [] ? child_rip+0xa/0x20 Feb 11 > 07:49:54 l1 [ 720.432515] [] ? kthread+0x0/0xa0 Feb 11 > 07:49:54 l1 [ 720.432519] [] ? child_rip+0x0/0x20 > > Justin. > > From jpiszcz@lucidpixels.com Thu Feb 11 08:22:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BEMVHp152523 for ; Thu, 11 Feb 2010 08:22:31 -0600 X-ASG-Debug-ID: 1265898224-40b203050000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 34C6F1C5961 for ; Thu, 11 Feb 2010 06:23:44 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id lkM0FQlQ14ebEewf for ; Thu, 11 Feb 2010 06:23:44 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 5BD2A38DFB8; Thu, 11 Feb 2010 09:23:44 -0500 (EST) Date: Thu, 11 Feb 2010 09:23:44 -0500 (EST) From: Justin Piszcz To: linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, xfs@oss.sgi.com, Alan Piszcz X-ASG-Orig-Subj: Re: 2.6.32.3 x86_64 - XFS hangs, all I/O to D-state bug (again) Subject: Re: 2.6.32.3 x86_64 - XFS hangs, all I/O to D-state bug (again) In-Reply-To: Message-ID: References: User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1265898225 X-Barracuda-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.22256 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 Is this normal? After the crash I just showed, the system was rebooted, it is resyncing now but is this normal? $ cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] md1 : active raid1 sdb2[1] sda2[0] 136448 blocks [2/2] [UU] md2 : active raid1 sdb3[1] sda3[0] 129596288 blocks [2/2] [UU] md3 : active raid5 sdj1[7] sdi1[6] sdh1[5] sdf1[3] sdg1[4] sde1[2] sdd1[1] sdc1[0] 5128001536 blocks level 5, 1024k chunk, algorithm 2 [8/8] [UUUUUUUU] [==>..................] resync = 12.3% (90186112/732571648) finish=1046.9min speed=10226K/sec md0 : active raid1 sdb1[1] sda1[0] 16787776 blocks [2/2] [UU] unused devices: -- root 24 0.3 0.0 0 0 ? S 07:37 0:23 [async/mgr] root 15514 0.2 0.0 0 0 ? S 08:04 0:11 [async/0] root 15515 0.2 0.0 0 0 ? S 08:04 0:09 [async/1] root 15516 0.2 0.0 0 0 ? S 08:04 0:10 [async/2] root 15517 0.2 0.0 0 0 ? S 08:04 0:09 [async/3] root 15518 0.2 0.0 0 0 ? S 08:04 0:10 [async/4] root 15519 0.2 0.0 0 0 ? S 08:04 0:10 [async/5] root 15520 0.2 0.0 0 0 ? S 08:04 0:11 [async/6] root 15521 0.2 0.0 0 0 ? S 08:04 0:10 [async/7] root 15522 0.2 0.0 0 0 ? S 08:04 0:10 [async/8] root 15523 0.2 0.0 0 0 ? S 08:04 0:10 [async/9] root 15524 0.2 0.0 0 0 ? S 08:04 0:10 [async/10] root 15525 0.2 0.0 0 0 ? S 08:04 0:10 [async/11] root 15526 0.2 0.0 0 0 ? S 08:04 0:11 [async/12] root 15527 0.2 0.0 0 0 ? S 08:04 0:10 [async/13] root 15528 0.2 0.0 0 0 ? S 08:04 0:11 [async/14] root 15529 0.2 0.0 0 0 ? S 08:04 0:10 [async/15] root 15530 0.2 0.0 0 0 ? S 08:04 0:10 [async/16] root 15531 0.2 0.0 0 0 ? S 08:04 0:11 [async/17] root 15532 0.2 0.0 0 0 ? S 08:04 0:11 [async/18] root 15533 0.2 0.0 0 0 ? S 08:04 0:11 [async/19] root 15534 0.2 0.0 0 0 ? S 08:04 0:11 [async/20] root 15535 0.2 0.0 0 0 ? S 08:04 0:11 [async/21] root 15536 0.2 0.0 0 0 ? S 08:04 0:10 [async/22] root 15537 0.2 0.0 0 0 ? S 08:04 0:10 [async/23] root 15538 0.2 0.0 0 0 ? S 08:04 0:11 [async/24] root 15539 0.2 0.0 0 0 ? S 08:04 0:11 [async/25] root 15540 0.2 0.0 0 0 ? S 08:04 0:11 [async/26] root 15541 0.2 0.0 0 0 ? S 08:04 0:11 [async/27] root 15542 0.2 0.0 0 0 ? S 08:04 0:10 [async/28] root 15543 0.2 0.0 0 0 ? S 08:04 0:12 [async/29] root 15544 0.2 0.0 0 0 ? S 08:04 0:10 [async/30] root 15545 0.2 0.0 0 0 ? S 08:04 0:11 [async/31] root 15546 0.2 0.0 0 0 ? R 08:04 0:11 [async/32] root 15547 0.2 0.0 0 0 ? S 08:04 0:11 [async/33] root 15548 0.2 0.0 0 0 ? S 08:04 0:11 [async/34] root 15549 0.2 0.0 0 0 ? R 08:04 0:11 [async/35] root 15550 0.2 0.0 0 0 ? S 08:04 0:11 [async/36] root 15551 0.2 0.0 0 0 ? S 08:04 0:11 [async/37] root 15552 0.2 0.0 0 0 ? S 08:04 0:11 [async/38] root 15553 0.2 0.0 0 0 ? S 08:04 0:10 [async/39] root 15554 0.2 0.0 0 0 ? S 08:04 0:11 [async/40] root 15555 0.2 0.0 0 0 ? S 08:04 0:11 [async/41] root 15556 0.2 0.0 0 0 ? S 08:04 0:11 [async/42] root 15557 0.2 0.0 0 0 ? S 08:04 0:10 [async/43] root 15558 0.2 0.0 0 0 ? S 08:04 0:10 [async/44] root 15559 0.2 0.0 0 0 ? R 08:04 0:11 [async/45] root 15560 0.2 0.0 0 0 ? S 08:04 0:10 [async/46] root 15561 0.2 0.0 0 0 ? S 08:04 0:11 [async/47] root 15562 0.2 0.0 0 0 ? S 08:04 0:10 [async/48] root 15563 0.2 0.0 0 0 ? S 08:04 0:11 [async/49] root 15564 0.2 0.0 0 0 ? S 08:04 0:11 [async/50] root 15565 0.2 0.0 0 0 ? R 08:04 0:11 [async/51] root 15566 0.2 0.0 0 0 ? S 08:04 0:11 [async/52] root 15567 0.2 0.0 0 0 ? S 08:04 0:11 [async/53] root 15568 0.2 0.0 0 0 ? S 08:04 0:11 [async/54] root 15569 0.2 0.0 0 0 ? S 08:04 0:10 [async/55] root 15570 0.2 0.0 0 0 ? S 08:04 0:11 [async/56] root 15571 0.2 0.0 0 0 ? S 08:04 0:10 [async/57] root 15572 0.2 0.0 0 0 ? S 08:04 0:12 [async/58] root 15573 0.2 0.0 0 0 ? S 08:04 0:10 [async/59] root 15574 0.2 0.0 0 0 ? S 08:04 0:12 [async/60] root 15575 0.2 0.0 0 0 ? S 08:04 0:11 [async/61] root 15576 0.2 0.0 0 0 ? S 08:04 0:10 [async/62] root 15577 0.2 0.0 0 0 ? R 08:04 0:12 [async/63] root 15578 0.2 0.0 0 0 ? S 08:04 0:11 [async/64] root 15579 0.2 0.0 0 0 ? S 08:04 0:11 [async/65] root 15580 0.2 0.0 0 0 ? S 08:04 0:11 [async/66] root 15581 0.2 0.0 0 0 ? S 08:04 0:10 [async/67] root 15582 0.2 0.0 0 0 ? S 08:04 0:12 [async/68] root 15583 0.2 0.0 0 0 ? S 08:04 0:10 [async/69] root 15584 0.2 0.0 0 0 ? R 08:04 0:11 [async/70] root 15585 0.2 0.0 0 0 ? S 08:04 0:10 [async/71] root 15586 0.2 0.0 0 0 ? S 08:04 0:11 [async/72] root 15587 0.2 0.0 0 0 ? S 08:04 0:11 [async/73] root 15588 0.2 0.0 0 0 ? S 08:04 0:11 [async/74] root 15589 0.2 0.0 0 0 ? S 08:04 0:11 [async/75] root 15590 0.2 0.0 0 0 ? S 08:04 0:11 [async/76] root 15591 0.2 0.0 0 0 ? S 08:04 0:11 [async/77] root 15592 0.2 0.0 0 0 ? S 08:04 0:11 [async/78] root 15593 0.2 0.0 0 0 ? S 08:04 0:11 [async/79] root 15594 0.2 0.0 0 0 ? S 08:04 0:11 [async/80] root 15595 0.2 0.0 0 0 ? S 08:04 0:10 [async/81] root 15596 0.2 0.0 0 0 ? S 08:04 0:11 [async/82] root 15597 0.2 0.0 0 0 ? S 08:04 0:12 [async/83] root 15598 0.2 0.0 0 0 ? S 08:04 0:11 [async/84] root 15599 0.2 0.0 0 0 ? S 08:04 0:11 [async/85] root 15600 0.2 0.0 0 0 ? S 08:04 0:11 [async/86] root 15601 0.2 0.0 0 0 ? S 08:04 0:10 [async/87] root 15602 0.2 0.0 0 0 ? S 08:04 0:12 [async/88] root 15603 0.2 0.0 0 0 ? S 08:04 0:11 [async/89] root 15604 0.2 0.0 0 0 ? S 08:04 0:11 [async/90] root 15605 0.2 0.0 0 0 ? S 08:04 0:11 [async/91] root 15606 0.2 0.0 0 0 ? S 08:04 0:11 [async/92] root 15607 0.2 0.0 0 0 ? S 08:04 0:13 [async/93] root 15608 0.2 0.0 0 0 ? S 08:04 0:11 [async/94] root 15609 0.2 0.0 0 0 ? S 08:04 0:11 [async/95] root 15610 0.2 0.0 0 0 ? S 08:04 0:11 [async/96] root 15611 0.2 0.0 0 0 ? S 08:04 0:10 [async/97] root 15612 0.2 0.0 0 0 ? S 08:04 0:12 [async/98] root 15613 0.2 0.0 0 0 ? S 08:04 0:11 [async/99] root 15614 0.2 0.0 0 0 ? S 08:04 0:11 [async/100] root 15615 0.2 0.0 0 0 ? S 08:04 0:11 [async/101] root 15616 0.2 0.0 0 0 ? S 08:04 0:11 [async/102] root 15617 0.2 0.0 0 0 ? S 08:04 0:12 [async/103] root 15618 0.2 0.0 0 0 ? S 08:04 0:11 [async/104] root 15619 0.2 0.0 0 0 ? R 08:04 0:12 [async/105] root 15620 0.2 0.0 0 0 ? S 08:04 0:11 [async/106] root 15621 0.2 0.0 0 0 ? S 08:04 0:10 [async/107] root 15622 0.2 0.0 0 0 ? S 08:04 0:12 [async/108] root 15623 0.2 0.0 0 0 ? S 08:04 0:12 [async/109] root 15624 0.2 0.0 0 0 ? S 08:04 0:11 [async/110] root 15625 0.2 0.0 0 0 ? S 08:04 0:11 [async/111] root 15626 0.2 0.0 0 0 ? S 08:04 0:11 [async/112] root 15627 0.2 0.0 0 0 ? S 08:04 0:12 [async/113] root 15628 0.2 0.0 0 0 ? S 08:04 0:12 [async/114] root 15629 0.2 0.0 0 0 ? S 08:04 0:12 [async/115] root 15630 0.2 0.0 0 0 ? S 08:04 0:12 [async/116] root 15631 0.2 0.0 0 0 ? S 08:04 0:10 [async/117] root 15632 0.2 0.0 0 0 ? S 08:04 0:12 [async/118] root 15633 0.2 0.0 0 0 ? S 08:04 0:11 [async/119] root 15634 0.2 0.0 0 0 ? S 08:04 0:11 [async/120] root 15635 0.2 0.0 0 0 ? S 08:04 0:11 [async/121] root 15636 0.2 0.0 0 0 ? S 08:04 0:11 [async/122] root 15637 0.2 0.0 0 0 ? S 08:04 0:12 [async/123] root 15638 0.2 0.0 0 0 ? R 08:04 0:11 [async/124] root 15639 0.2 0.0 0 0 ? S 08:04 0:11 [async/125] root 15640 0.2 0.0 0 0 ? S 08:04 0:12 [async/126] root 15641 0.2 0.0 0 0 ? S 08:04 0:10 [async/127] root 15642 0.2 0.0 0 0 ? S 08:04 0:12 [async/128] root 15643 0.2 0.0 0 0 ? S 08:04 0:12 [async/129] root 15644 0.2 0.0 0 0 ? S 08:04 0:11 [async/130] root 15645 0.2 0.0 0 0 ? S 08:04 0:11 [async/131] root 15646 0.2 0.0 0 0 ? S 08:04 0:11 [async/132] root 15647 0.2 0.0 0 0 ? S 08:04 0:12 [async/133] root 15648 0.2 0.0 0 0 ? S 08:04 0:12 [async/134] root 15649 0.2 0.0 0 0 ? S 08:04 0:11 [async/135] root 15650 0.2 0.0 0 0 ? S 08:04 0:11 [async/136] root 15651 0.2 0.0 0 0 ? S 08:04 0:11 [async/137] root 15652 0.2 0.0 0 0 ? S 08:04 0:12 [async/138] root 15653 0.2 0.0 0 0 ? S 08:04 0:11 [async/139] root 15654 0.2 0.0 0 0 ? S 08:04 0:11 [async/140] root 15655 0.2 0.0 0 0 ? S 08:04 0:11 [async/141] root 15656 0.2 0.0 0 0 ? S 08:04 0:11 [async/142] root 15657 0.2 0.0 0 0 ? S 08:04 0:12 [async/143] root 15658 0.2 0.0 0 0 ? S 08:04 0:11 [async/144] root 15659 0.2 0.0 0 0 ? S 08:04 0:11 [async/145] root 15660 0.2 0.0 0 0 ? S 08:04 0:11 [async/146] root 15661 0.2 0.0 0 0 ? S 08:04 0:11 [async/147] root 15662 0.2 0.0 0 0 ? S 08:04 0:12 [async/148] root 15663 0.2 0.0 0 0 ? S 08:04 0:11 [async/149] root 15664 0.2 0.0 0 0 ? S 08:04 0:11 [async/150] root 15665 0.2 0.0 0 0 ? S 08:04 0:11 [async/151] root 15666 0.2 0.0 0 0 ? S 08:04 0:11 [async/152] root 15667 0.2 0.0 0 0 ? S 08:04 0:12 [async/153] root 15668 0.2 0.0 0 0 ? S 08:04 0:11 [async/154] root 15669 0.2 0.0 0 0 ? S 08:04 0:11 [async/155] root 15670 0.2 0.0 0 0 ? S 08:04 0:11 [async/156] root 15671 0.2 0.0 0 0 ? S 08:04 0:11 [async/157] root 15672 0.2 0.0 0 0 ? S 08:04 0:13 [async/158] root 15673 0.2 0.0 0 0 ? S 08:04 0:11 [async/159] root 15674 0.2 0.0 0 0 ? S 08:04 0:11 [async/160] root 15675 0.2 0.0 0 0 ? S 08:04 0:11 [async/161] root 15676 0.2 0.0 0 0 ? S 08:04 0:10 [async/162] root 15677 0.2 0.0 0 0 ? S 08:04 0:12 [async/163] root 15678 0.2 0.0 0 0 ? S 08:04 0:11 [async/164] root 15679 0.2 0.0 0 0 ? S 08:04 0:11 [async/165] root 15680 0.2 0.0 0 0 ? S 08:04 0:11 [async/166] root 15681 0.2 0.0 0 0 ? S 08:04 0:11 [async/167] root 15682 0.2 0.0 0 0 ? S 08:04 0:12 [async/168] root 15683 0.2 0.0 0 0 ? S 08:04 0:11 [async/169] root 15684 0.2 0.0 0 0 ? R 08:04 0:11 [async/170] root 15685 0.2 0.0 0 0 ? S 08:04 0:11 [async/171] root 15686 0.2 0.0 0 0 ? S 08:04 0:10 [async/172] root 15687 0.2 0.0 0 0 ? S 08:04 0:12 [async/173] root 15688 0.2 0.0 0 0 ? S 08:04 0:11 [async/174] root 15689 0.2 0.0 0 0 ? S 08:04 0:11 [async/175] root 15690 0.2 0.0 0 0 ? S 08:04 0:11 [async/176] root 15691 0.2 0.0 0 0 ? S 08:04 0:11 [async/177] root 15692 0.2 0.0 0 0 ? S 08:04 0:12 [async/178] root 15693 0.2 0.0 0 0 ? S 08:04 0:10 [async/179] root 15694 0.2 0.0 0 0 ? S 08:04 0:12 [async/180] root 15695 0.2 0.0 0 0 ? S 08:04 0:11 [async/181] root 15696 0.2 0.0 0 0 ? S 08:04 0:10 [async/182] root 15697 0.2 0.0 0 0 ? S 08:04 0:12 [async/183] root 15698 0.2 0.0 0 0 ? R 08:04 0:11 [async/184] root 15699 0.2 0.0 0 0 ? S 08:04 0:11 [async/185] root 15700 0.2 0.0 0 0 ? S 08:04 0:11 [async/186] root 15701 0.2 0.0 0 0 ? S 08:04 0:10 [async/187] root 15702 0.2 0.0 0 0 ? R 08:04 0:12 [async/188] root 15703 0.2 0.0 0 0 ? S 08:04 0:10 [async/189] root 15704 0.2 0.0 0 0 ? R 08:04 0:11 [async/190] root 15705 0.2 0.0 0 0 ? S 08:04 0:11 [async/191] root 15706 0.2 0.0 0 0 ? R 08:04 0:11 [async/192] root 15707 0.2 0.0 0 0 ? S 08:04 0:11 [async/193] root 15708 0.2 0.0 0 0 ? R 08:04 0:11 [async/194] root 15709 0.2 0.0 0 0 ? S 08:04 0:11 [async/195] root 15710 0.2 0.0 0 0 ? S 08:04 0:11 [async/196] root 15711 0.2 0.0 0 0 ? R 08:04 0:10 [async/197] root 15712 0.2 0.0 0 0 ? R 08:04 0:12 [async/198] root 15713 0.2 0.0 0 0 ? S 08:04 0:11 [async/199] root 15714 0.2 0.0 0 0 ? S 08:04 0:11 [async/200] root 15715 0.2 0.0 0 0 ? R 08:04 0:11 [async/201] root 15716 0.2 0.0 0 0 ? S 08:04 0:11 [async/202] root 15717 0.2 0.0 0 0 ? R 08:04 0:12 [async/203] root 15718 0.2 0.0 0 0 ? R 08:04 0:11 [async/204] root 15719 0.2 0.0 0 0 ? S 08:04 0:11 [async/205] root 15720 0.2 0.0 0 0 ? R 08:04 0:11 [async/206] root 15721 0.2 0.0 0 0 ? R 08:04 0:11 [async/207] root 15722 0.2 0.0 0 0 ? S 08:04 0:12 [async/208] root 15723 0.2 0.0 0 0 ? R 08:04 0:11 [async/209] root 15724 0.2 0.0 0 0 ? S 08:04 0:11 [async/210] root 15725 0.2 0.0 0 0 ? R 08:04 0:11 [async/211] root 15726 0.2 0.0 0 0 ? S 08:04 0:11 [async/212] root 15727 0.2 0.0 0 0 ? R 08:04 0:12 [async/213] root 15728 0.2 0.0 0 0 ? S 08:04 0:11 [async/214] root 15729 0.2 0.0 0 0 ? R 08:04 0:12 [async/215] root 15730 0.2 0.0 0 0 ? S 08:04 0:11 [async/216] root 15731 0.2 0.0 0 0 ? R 08:04 0:11 [async/217] root 15732 0.2 0.0 0 0 ? S 08:04 0:12 [async/218] root 15733 0.2 0.0 0 0 ? R 08:04 0:11 [async/219] root 15734 0.2 0.0 0 0 ? S 08:04 0:11 [async/220] root 15735 0.2 0.0 0 0 ? R 08:04 0:11 [async/221] root 15736 0.2 0.0 0 0 ? R 08:04 0:11 [async/222] root 15737 0.2 0.0 0 0 ? R 08:04 0:12 [async/223] root 15738 0.2 0.0 0 0 ? S 08:04 0:11 [async/224] root 15739 0.2 0.0 0 0 ? R 08:04 0:11 [async/225] root 15740 0.2 0.0 0 0 ? R 08:04 0:12 [async/226] root 15741 0.2 0.0 0 0 ? S 08:04 0:11 [async/227] root 15742 0.2 0.0 0 0 ? R 08:04 0:12 [async/228] root 15743 0.2 0.0 0 0 ? S 08:04 0:11 [async/229] root 15744 0.2 0.0 0 0 ? R 08:04 0:11 [async/230] root 15745 0.2 0.0 0 0 ? R 08:04 0:11 [async/231] root 15746 0.2 0.0 0 0 ? S 08:04 0:11 [async/232] root 15747 0.2 0.0 0 0 ? S 08:04 0:12 [async/233] root 15748 0.2 0.0 0 0 ? S 08:04 0:11 [async/234] root 15749 0.2 0.0 0 0 ? S 08:04 0:12 [async/235] root 15750 0.2 0.0 0 0 ? S 08:04 0:12 [async/236] root 15751 0.2 0.0 0 0 ? S 08:04 0:11 [async/237] root 15752 0.2 0.0 0 0 ? S 08:04 0:13 [async/238] root 15753 0.2 0.0 0 0 ? S 08:04 0:12 [async/239] root 15754 0.2 0.0 0 0 ? R 08:04 0:12 [async/240] root 15755 0.2 0.0 0 0 ? S 08:04 0:13 [async/241] root 15756 0.3 0.0 0 0 ? R 08:04 0:15 [async/242] root 15757 0.2 0.0 0 0 ? R 08:04 0:13 [async/243] root 15758 0.2 0.0 0 0 ? R 08:04 0:13 [async/244] root 15759 0.2 0.0 0 0 ? R 08:04 0:13 [async/245] root 15760 0.3 0.0 0 0 ? R 08:04 0:14 [async/246] root 15761 0.5 0.0 0 0 ? S 08:04 0:24 [async/247] root 15762 0.3 0.0 0 0 ? R 08:04 0:16 [async/248] root 15763 0.4 0.0 0 0 ? R 08:04 0:18 [async/249] root 15764 0.4 0.0 0 0 ? R 08:04 0:20 [async/250] root 15765 0.5 0.0 0 0 ? R 08:04 0:25 [async/251] root 15766 0.8 0.0 0 0 ? R 08:04 0:37 [async/252] root 15767 1.3 0.0 0 0 ? R 08:04 1:01 [async/253] root 15768 1.9 0.0 0 0 ? S 08:04 1:30 [async/254] root 15769 2.1 0.0 0 0 ? R 08:04 1:40 [async/255] On Thu, 11 Feb 2010, Justin Piszcz wrote: > The errors in the e-mail had bad formatting, please see the following: > http://home.comcast.net/~jpiszcz/20100211/crash.txt > > In addition, the linux-raid list had a typo in it, fixed. > > On Thu, 11 Feb 2010, Justin Piszcz wrote: > >> Hello, >> >> While tarring and compressing (bzip2) a lot of files, the following error >> occurred, note the output is not clean because this was taken from >> netconsole. >> >> When this occurs, the host cannot be rebooted with reboot/proceses cannot >> be killed and the box locks up. There are no apparent hardware issues. >> >> Before, asterisk would trigger this bug, since asterisk no longer runs on >> this host, it ran for ~2-3 months without any problems, until now. >> >> Please cc me as I am not on the lists, thanks. >> >> Is this a md raid issue or XFS? From the trace it appears to be an XFS bug? >> >> Feb 11 07:38:14 l1 [ 20.270270] e100: eth1 NIC Link is Up 100 Mbps Full >> Duplex Feb 11 07:47:54 l1 [ 600.432165] INFO: task scp:4871 blocked for >> more than 120 seconds. Feb 11 07:47:54 l1 [ 600.432177] "echo 0 > >> /proc/sys/kernel/hung_task_timeout_secs" disables this message. Feb 11 >> 07:47:54 l1 [ 600.432182] scp D >> Feb 11 07:47:54 l1 ffff8801eee6f14c Feb 11 07:47:54 l1 0 4871 4870 >> 0x00000000 Feb 11 07:47:54 l1 [ 600.432188] ffff880220c87950 >> Feb 11 07:47:54 l1 0000000000000082 >> Feb 11 07:47:54 l1 0000000000200200 >> Feb 11 07:47:54 l1 ffff88023eb71400 >> Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432196] 000000000000c928 >> Feb 11 07:47:54 l1 ffff8801f7a55fd8 >> Feb 11 07:47:54 l1 ffff880205fc6150 >> Feb 11 07:47:54 l1 ffff880205fc63c8 >> Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432203] 0000000000001000 >> Feb 11 07:47:54 l1 ffffffff8108d02a >> Feb 11 07:47:54 l1 ffff8801eee6f0c0 >> Feb 11 07:47:54 l1 ffff880205fc63c8 >> Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432209] Call Trace: Feb 11 >> 07:47:54 l1 [ 600.432230] [] ? >> generic_file_buffered_write+0x1aa/0x290 Feb 11 07:47:54 l1 [ 600.432236] >> [] ? __down_write_nested+0x7d/0xb0 Feb 11 07:47:54 l1 [ >> 600.432242] [] ? xfs_write+0x23d/0x950 Feb 11 07:47:54 >> l1 [ 600.432250] [] ? do_sync_write+0xe3/0x130 Feb 11 >> 07:47:54 l1 [ 600.432260] [] ? >> autoremove_wake_function+0x0/0x30 Feb 11 07:47:54 l1 [ 600.432266] >> [] ? fsnotify+0x4/0x1a0 Feb 11 07:47:54 l1 [ 600.432271] >> [] ? common_interrupt+0xe/0x13 Feb 11 07:47:54 l1 [ >> 600.432276] [] ? vfs_write+0xcb/0x180 Feb 11 07:47:54 l1 >> [ 600.432280] [] ? sys_write+0x53/0xa0 Feb 11 07:47:54 >> l1 [ 600.432285] [] ? system_call_fastpath+0x16/0x1b Feb >> 11 07:47:54 l1 [ 600.432291] INFO: task flush-9:3:4874 blocked for more >> than 120 seconds. Feb 11 07:47:54 l1 [ 600.432294] "echo 0 > >> /proc/sys/kernel/hung_task_timeout_secs" disables this message. Feb 11 >> 07:47:54 l1 [ 600.432297] flush-9:3 D >> Feb 11 07:47:54 l1 ffff88021948d750 Feb 11 07:47:54 l1 0 4874 2 >> 0x00000000 Feb 11 07:47:54 l1 [ 600.432309] ffff88023fa3c8c0 >> Feb 11 07:47:54 l1 0000000000000046 >> Feb 11 07:47:54 l1 000000001948d750 >> Feb 11 07:47:54 l1 ffffffff8163d788 >> Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432323] 000000000000c928 >> Feb 11 07:47:54 l1 ffff8801f79fbfd8 >> Feb 11 07:47:54 l1 ffff88021948d750 >> Feb 11 07:47:54 l1 ffff88021948d9c8 >> Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432329] 000000013f467bb0 >> Feb 11 07:47:54 l1 ffffffff8108c183 >> Feb 11 07:47:54 l1 0000000000000000 >> Feb 11 07:47:54 l1 ffff88021948d9c8 >> Feb 11 07:47:54 l1 Feb 11 07:47:54 l1 [ 600.432337] Call Trace: Feb 11 >> 07:47:54 l1 [ 600.432341] [] ? find_lock_page+0x23/0x80 >> Feb 11 07:47:54 l1 [ 600.432344] [] ? >> find_or_create_page+0x41/0xc0 Feb 11 07:47:54 l1 [ 600.432349] >> [] ? schedule_timeout+0x195/0x1f0 Feb 11 07:47:54 l1 [ >> 600.432352] [] ? __down+0x61/0xa0 Feb 11 07:47:54 l1 [ >> 600.432356] [] ? down+0x46/0x50 Feb 11 07:47:54 l1 [ >> 600.432360] [] ? _xfs_buf_find+0x134/0x220 Feb 11 >> 07:47:54 l1 [ 600.432363] [] ? >> xfs_buf_get_flags+0x6e/0x190 Feb 11 07:47:54 l1 [ 600.432366] >> [] ? xfs_buf_read_flags+0x12/0xa0 Feb 11 07:47:54 l1 [ >> 600.432371] [] ? xfs_trans_read_buf+0x1f6/0x350 Feb 11 >> 07:47:54 l1 [ 600.432377] [] ? xfs_read_agf+0x68/0x190 >> Feb 11 07:47:54 l1 [ 600.432380] [] ? >> xfs_alloc_read_agf+0x30/0xd0 Feb 11 07:47:54 l1 [ 600.432383] >> [] ? xfs_alloc_fix_freelist+0x379/0x450 Feb 11 07:47:54 >> l1 [ 600.432388] [] ? xfs_iext_remove+0x35/0x80 Feb 11 >> 07:47:54 l1 [ 600.432393] [] ? >> xfs_bmap_add_extent_delay_real+0x5ef/0x11a0 Feb 11 07:47:54 l1 [ >> 600.432396] [] ? xfs_trans_log_buf+0x63/0xa0 Feb 11 >> 07:47:54 l1 [ 600.432401] [] ? >> xlog_state_get_iclog_space+0x60/0x2c0 Feb 11 07:47:54 l1 [ 600.432404] >> [] ? __down_read+0x17/0xae Feb 11 07:47:54 l1 [ >> 600.432408] [] ? xfs_alloc_vextent+0x310/0x4b0 Feb 11 >> 07:47:54 l1 [ 600.432412] [] ? >> xfs_bmap_btalloc+0x598/0xa40 Feb 11 07:47:54 l1 [ 600.432417] >> [] ? xfs_bmapi+0x9e2/0x11a0 Feb 11 07:47:54 l1 [ >> 600.432422] [] ? xfs_trans_reserve+0x9f/0x210 Feb 11 >> 07:47:54 l1 [ 600.432425] [] ? >> xfs_iomap_write_allocate+0x23e/0x3b0 Feb 11 07:47:54 l1 [ 600.432429] >> [] ? xfs_iomap+0x2c0/0x300 Feb 11 07:47:54 l1 [ >> 600.432433] [] ? xfs_map_blocks+0x25/0x30 Feb 11 >> 07:47:54 l1 [ 600.432437] [] ? >> xfs_page_state_convert+0x414/0x6c0 Feb 11 07:47:54 l1 [ 600.432443] >> [] ? radix_tree_gang_lookup_tag_slot+0xc3/0xf0 Feb 11 >> 07:47:54 l1 [ 600.432447] [] ? >> xfs_vm_writepage+0x77/0x130 Feb 11 07:47:54 l1 [ 600.432453] >> [] ? __writepage+0xa/0x40 Feb 11 07:47:54 l1 [ >> 600.432456] [] ? write_cache_pages+0x1df/0x3c0 Feb 11 >> 07:47:54 l1 [ 600.432459] [] ? __writepage+0x0/0x40 Feb >> 11 07:47:54 l1 [ 600.432464] [] ? >> writeback_single_inode+0xd2/0x390 Feb 11 07:47:54 l1 [ 600.432468] >> [] ? writeback_inodes_wb+0x3ff/0x5e0 Feb 11 07:47:54 l1 [ >> 600.432473] [] ? wb_writeback+0x11e/0x1f0 Feb 11 >> 07:47:54 l1 [ 600.432479] [] ? >> try_to_del_timer_sync+0x5e/0x90 Feb 11 07:47:54 l1 [ 600.432484] >> [] ? wb_do_writeback+0x17b/0x180 Feb 11 07:47:54 l1 [ >> 600.432487] [] ? bdi_writeback_task+0x5d/0xa0 Feb 11 >> 07:47:54 l1 [ 600.432492] [] ? bdi_start_fn+0x0/0xf0 Feb >> 11 07:47:54 l1 [ 600.432496] [] ? >> bdi_start_fn+0x7e/0xf0 Feb 11 07:47:54 l1 [ 600.432499] >> [] ? bdi_start_fn+0x0/0xf0 Feb 11 07:47:54 l1 [ >> 600.432503] [] ? kthread+0x96/0xa0 Feb 11 07:47:54 l1 [ >> 600.432508] [] ? child_rip+0xa/0x20 Feb 11 07:47:54 l1 [ >> 600.432513] [] ? kthread+0x0/0xa0 Feb 11 07:47:54 l1 [ >> 600.432517] [] ? child_rip+0x0/0x20 Feb 11 07:49:54 l1 [ >> 720.432171] INFO: task scp:4871 blocked for more than 120 seconds. Feb 11 >> 07:49:54 l1 [ 720.432187] "echo 0 > >> /proc/sys/kernel/hung_task_timeout_secs" disables this message. Feb 11 >> 07:49:54 l1 [ 720.432192] scp D >> Feb 11 07:49:54 l1 ffff8801eee6f14c Feb 11 07:49:54 l1 0 4871 4870 >> 0x00000000 Feb 11 07:49:54 l1 [ 720.432198] ffff880220c87950 >> Feb 11 07:49:54 l1 0000000000000082 >> Feb 11 07:49:54 l1 0000000000200200 >> Feb 11 07:49:54 l1 ffff88023eb71400 >> Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432206] 000000000000c928 >> Feb 11 07:49:54 l1 ffff8801f7a55fd8 >> Feb 11 07:49:54 l1 ffff880205fc6150 >> Feb 11 07:49:54 l1 ffff880205fc63c8 >> Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432217] 0000000000001000 >> Feb 11 07:49:54 l1 ffffffff8108d02a >> Feb 11 07:49:54 l1 ffff8801eee6f0c0 >> Feb 11 07:49:54 l1 ffff880205fc63c8 >> Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432224] Call Trace: Feb 11 >> 07:49:54 l1 [ 720.432238] [] ? >> generic_file_buffered_write+0x1aa/0x290 Feb 11 07:49:54 l1 [ 720.432243] >> [] ? __down_write_nested+0x7d/0xb0 Feb 11 07:49:54 l1 [ >> 720.432249] [] ? xfs_write+0x23d/0x950 Feb 11 07:49:54 >> l1 [ 720.432254] [] ? do_sync_write+0xe3/0x130 Feb 11 >> 07:49:54 l1 [ 720.432259] [] ? >> autoremove_wake_function+0x0/0x30 Feb 11 07:49:54 l1 [ 720.432265] >> [] ? fsnotify+0x4/0x1a0 Feb 11 07:49:54 l1 [ 720.432270] >> [] ? common_interrupt+0xe/0x13 Feb 11 07:49:54 l1 [ >> 720.432275] [] ? vfs_write+0xcb/0x180 Feb 11 07:49:54 l1 >> [ 720.432280] [] ? sys_write+0x53/0xa0 Feb 11 07:49:54 >> l1 [ 720.432285] [] ? system_call_fastpath+0x16/0x1b Feb >> 11 07:49:54 l1 [ 720.432291] INFO: task flush-9:3:4874 blocked for more >> than 120 seconds. Feb 11 07:49:54 l1 [ 720.432295] "echo 0 > >> /proc/sys/kernel/hung_task_timeout_secs" disables this message. Feb 11 >> 07:49:54 l1 [ 720.432298] flush-9:3 D >> Feb 11 07:49:54 l1 ffff88021948d750 Feb 11 07:49:54 l1 0 4874 2 >> 0x00000000 Feb 11 07:49:54 l1 [ 720.432306] ffff88023fa3c8c0 >> Feb 11 07:49:54 l1 0000000000000046 >> Feb 11 07:49:54 l1 000000001948d750 >> Feb 11 07:49:54 l1 ffffffff8163d788 >> Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432322] 000000000000c928 >> Feb 11 07:49:54 l1 ffff8801f79fbfd8 >> Feb 11 07:49:54 l1 ffff88021948d750 >> Feb 11 07:49:54 l1 ffff88021948d9c8 >> Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432329] 000000013f467bb0 >> Feb 11 07:49:54 l1 ffffffff8108c183 >> Feb 11 07:49:54 l1 0000000000000000 >> Feb 11 07:49:54 l1 ffff88021948d9c8 >> Feb 11 07:49:54 l1 Feb 11 07:49:54 l1 [ 720.432336] Call Trace: Feb 11 >> 07:49:54 l1 [ 720.432340] [] ? find_lock_page+0x23/0x80 >> Feb 11 07:49:54 l1 [ 720.432343] [] ? >> find_or_create_page+0x41/0xc0 Feb 11 07:49:54 l1 [ 720.432348] >> [] ? schedule_timeout+0x195/0x1f0 Feb 11 07:49:54 l1 [ >> 720.432351] [] ? __down+0x61/0xa0 Feb 11 07:49:54 l1 [ >> 720.432356] [] ? down+0x46/0x50 Feb 11 07:49:54 l1 [ >> 720.432361] [] ? _xfs_buf_find+0x134/0x220 Feb 11 >> 07:49:54 l1 [ 720.432365] [] ? >> xfs_buf_get_flags+0x6e/0x190 Feb 11 07:49:54 l1 [ 720.432368] >> [] ? xfs_buf_read_flags+0x12/0xa0 Feb 11 07:49:54 l1 [ >> 720.432373] [] ? xfs_trans_read_buf+0x1f6/0x350 Feb 11 >> 07:49:54 l1 [ 720.432378] [] ? xfs_read_agf+0x68/0x190 >> Feb 11 07:49:54 l1 [ 720.432382] [] ? >> xfs_alloc_read_agf+0x30/0xd0 Feb 11 07:49:54 l1 [ 720.432386] >> [] ? xfs_alloc_fix_freelist+0x379/0x450 Feb 11 07:49:54 >> l1 [ 720.432391] [] ? xfs_iext_remove+0x35/0x80 Feb 11 >> 07:49:54 l1 [ 720.432396] [] ? >> xfs_bmap_add_extent_delay_real+0x5ef/0x11a0 Feb 11 07:49:54 l1 [ >> 720.432399] [] ? xfs_trans_log_buf+0x63/0xa0 Feb 11 >> 07:49:54 l1 [ 720.432404] [] ? >> xlog_state_get_iclog_space+0x60/0x2c0 Feb 11 07:49:54 l1 [ 720.432410] >> [] ? __down_read+0x17/0xae Feb 11 07:49:54 l1 [ >> 720.432415] [] ? xfs_alloc_vextent+0x310/0x4b0 Feb 11 >> 07:49:54 l1 [ 720.432420] [] ? >> xfs_bmap_btalloc+0x598/0xa40 Feb 11 07:49:54 l1 [ 720.432426] >> [] ? xfs_bmapi+0x9e2/0x11a0 Feb 11 07:49:54 l1 [ >> 720.432430] [] ? xfs_trans_reserve+0x9f/0x210 Feb 11 >> 07:49:54 l1 [ 720.432434] [] ? >> xfs_iomap_write_allocate+0x23e/0x3b0 Feb 11 07:49:54 l1 [ 720.432437] >> [] ? xfs_iomap+0x2c0/0x300 Feb 11 07:49:54 l1 [ >> 720.432441] [] ? xfs_map_blocks+0x25/0x30 Feb 11 >> 07:49:54 l1 [ 720.432445] [] ? >> xfs_page_state_convert+0x414/0x6c0 Feb 11 07:49:54 l1 [ 720.432451] >> [] ? radix_tree_gang_lookup_tag_slot+0xc3/0xf0 Feb 11 >> 07:49:54 l1 [ 720.432455] [] ? >> xfs_vm_writepage+0x77/0x130 Feb 11 07:49:54 l1 [ 720.432459] >> [] ? __writepage+0xa/0x40 Feb 11 07:49:54 l1 [ >> 720.432462] [] ? write_cache_pages+0x1df/0x3c0 Feb 11 >> 07:49:54 l1 [ 720.432466] [] ? __writepage+0x0/0x40 Feb >> 11 07:49:54 l1 [ 720.432472] [] ? >> writeback_single_inode+0xd2/0x390 Feb 11 07:49:54 l1 [ 720.432476] >> [] ? writeback_inodes_wb+0x3ff/0x5e0 Feb 11 07:49:54 l1 [ >> 720.432480] [] ? wb_writeback+0x11e/0x1f0 Feb 11 >> 07:49:54 l1 [ 720.432485] [] ? >> try_to_del_timer_sync+0x5e/0x90 Feb 11 07:49:54 l1 [ 720.432489] >> [] ? wb_do_writeback+0x17b/0x180 Feb 11 07:49:54 l1 [ >> 720.432493] [] ? bdi_writeback_task+0x5d/0xa0 Feb 11 >> 07:49:54 l1 [ 720.432497] [] ? bdi_start_fn+0x0/0xf0 Feb >> 11 07:49:54 l1 [ 720.432500] [] ? >> bdi_start_fn+0x7e/0xf0 Feb 11 07:49:54 l1 [ 720.432503] >> [] ? bdi_start_fn+0x0/0xf0 Feb 11 07:49:54 l1 [ >> 720.432506] [] ? kthread+0x96/0xa0 Feb 11 07:49:54 l1 [ >> 720.432511] [] ? child_rip+0xa/0x20 Feb 11 07:49:54 l1 [ >> 720.432515] [] ? kthread+0x0/0xa0 Feb 11 07:49:54 l1 [ >> 720.432519] [] ? child_rip+0x0/0x20 >> >> Justin. >> >> > From jpiszcz@lucidpixels.com Thu Feb 11 08:33:49 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BEXmGk153221 for ; Thu, 11 Feb 2010 08:33:48 -0600 X-ASG-Debug-ID: 1265898902-412402360000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D29B01395696 for ; Thu, 11 Feb 2010 06:35:02 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id es0udfFNevL0ZI5g for ; Thu, 11 Feb 2010 06:35:02 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 2B0F338DFB8; Thu, 11 Feb 2010 09:35:02 -0500 (EST) Date: Thu, 11 Feb 2010 09:35:02 -0500 (EST) From: Justin Piszcz To: linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, xfs@oss.sgi.com, Alan Piszcz X-ASG-Orig-Subj: Re: 2.6.32.3 x86_64 - XFS hangs, all I/O to D-state bug (again) Subject: Re: 2.6.32.3 x86_64 - XFS hangs, all I/O to D-state bug (again) In-Reply-To: Message-ID: References: User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1265898902 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22255 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, 11 Feb 2010, Justin Piszcz wrote: Hm.. # cd /raid5_mdadm # touch a .. hang .. >From echo t to sysrq-trigger: [ 6906.296062] touch D ffff880222402680 0 705 599 0x00000000 [ 6906.296062] ffff880034de3360 0000000000000086 0000000000014000 ffffffff811c985b [ 6906.296062] 000000000000c928 ffff88019c26bfd8 ffff880222402680 ffff8802224028f8 [ 6906.296062] 0000000300014000 ffffffff811f5277 ffff88023e52f000 ffff8802224028f8 [ 6906.296062] Call Trace: [ 6906.296062] [] ? xfs_buf_item_init+0xab/0x110 [ 6906.296062] [] ? xfs_trans_read_buf+0x247/0x350 [ 6906.296062] [] ? xfs_buf_rele+0x3b/0x100 [ 6906.296122] [] ? cache_alloc_refill+0x96/0x590 [ 6906.296125] [] ? schedule_timeout+0x195/0x1f0 [ 6906.296127] [] ? __down+0x61/0xa0 [ 6906.296131] [] ? down+0x46/0x50 [ 6906.296134] [] ? xfs_getsb+0x15/0x40 [ 6906.296134] [] ? xfs_trans_getsb+0x5a/0xc0 [ 6906.296134] [] ? xfs_trans_apply_sb_deltas+0xf/0x300 [ 6906.296144] [] ? _xfs_trans_commit+0xeb/0x3a0 [ 6906.296144] [] ? xfs_ialloc+0x513/0x6d0 [ 6906.296144] [] ? xfs_dir_createname+0x17a/0x1d0 [ 6906.296144] [] ? current_fs_time+0x1e/0x30 [ 6906.296144] [] ? xfs_create+0x491/0x520 [ 6906.296165] [] ? xfs_vn_mknod+0x82/0x130 [ 6906.296167] [] ? vfs_create+0xa6/0xf0 [ 6906.296170] [] ? do_filp_open+0x9fe/0xad0 [ 6906.296174] [] ? handle_mm_fault+0x1b9/0x7d0 [ 6906.296177] [] ? thread_return+0x3e/0x622 [ 6906.296177] [] ? do_sys_open+0x97/0x150 [ 6906.296177] [] ? system_call_fastpath+0x16/0x1b From BATV+f70b159b6df183c2dc19+2363+infradead.org+hch@bombadil.srs.infradead.org Thu Feb 11 08:50:11 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BEoAJG154488 for ; Thu, 11 Feb 2010 08:50:11 -0600 X-ASG-Debug-ID: 1265899885-7eb8011b0000-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 BF4EC1CC1129 for ; Thu, 11 Feb 2010 06:51:25 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id FCGbmaLLVYGo2pA6 for ; Thu, 11 Feb 2010 06:51:25 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NfaO4-0003VS-00; Thu, 11 Feb 2010 14:51:24 +0000 Date: Thu, 11 Feb 2010 09:51:23 -0500 From: Christoph Hellwig To: Justin Piszcz Cc: linux-kernel@vger.kernel.org, linux-raid@vger.kernl.org, xfs@oss.sgi.com, Alan Piszcz X-ASG-Orig-Subj: Re: 2.6.32.3 x86_64 - XFS hangs, all I/O to D-state bug (again) Subject: Re: 2.6.32.3 x86_64 - XFS hangs, all I/O to D-state bug (again) Message-ID: <20100211145123.GA13114@infradead.org> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.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: 1265899885 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 Can you check if this still happens with the patch below? Index: linux-2.6/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_buf.c 2010-02-11 15:47:49.677253958 +0100 +++ linux-2.6/fs/xfs/linux-2.6/xfs_buf.c 2010-02-11 15:48:03.630005040 +0100 @@ -1158,8 +1158,7 @@ _xfs_buf_ioapply( bp->b_flags &= ~_XBF_RUN_QUEUES; rw = (bp->b_flags & XBF_WRITE) ? WRITE_META : READ_META; } else { - rw = (bp->b_flags & XBF_WRITE) ? WRITE : - (bp->b_flags & XBF_READ_AHEAD) ? READA : READ; + rw = (bp->b_flags & XBF_WRITE) ? WRITE : READ; } /* Special code path for reading a sub page size buffer in -- From BATV+f70b159b6df183c2dc19+2363+infradead.org+hch@bombadil.srs.infradead.org Thu Feb 11 08:55:19 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BEtIK8154859 for ; Thu, 11 Feb 2010 08:55:19 -0600 X-ASG-Debug-ID: 1265900193-413403b60000-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 979F8139A4F0 for ; Thu, 11 Feb 2010 06:56:33 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id kyJmZjOBvGJfU5F8 for ; Thu, 11 Feb 2010 06:56:33 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NfaT2-0004VD-Qo; Thu, 11 Feb 2010 14:56:32 +0000 Date: Thu, 11 Feb 2010 09:56:32 -0500 From: Christoph Hellwig To: Justin Piszcz Cc: linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, xfs@oss.sgi.com, Alan Piszcz X-ASG-Orig-Subj: Re: 2.6.32.3 x86_64 - XFS hangs, all I/O to D-state bug (again) Subject: Re: 2.6.32.3 x86_64 - XFS hangs, all I/O to D-state bug (again) Message-ID: <20100211145632.GA16912@infradead.org> References: <20100211145123.GA13114@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100211145123.GA13114@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: 1265900193 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, Feb 11, 2010 at 09:51:23AM -0500, Christoph Hellwig wrote: > Can you check if this still happens with the patch below? Or the 2.6.32 variant of it: Index: xfs/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.c 2010-02-11 15:52:14.442003504 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_buf.c 2010-02-11 15:52:33.172024387 +0100 @@ -1182,8 +1182,7 @@ _xfs_buf_ioapply( bp->b_flags &= ~_XBF_RUN_QUEUES; rw = (bp->b_flags & XBF_WRITE) ? WRITE_SYNC : READ_SYNC; } else { - rw = (bp->b_flags & XBF_WRITE) ? WRITE : - (bp->b_flags & XBF_READ_AHEAD) ? READA : READ; + rw = (bp->b_flags & XBF_WRITE) ? WRITE : READ; } /* Special code path for reading a sub page size buffer in -- From bpm@sgi.com Thu Feb 11 13:25:02 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BJP1ge172387 for ; Thu, 11 Feb 2010 13:25:01 -0600 Received: from snoot.americas.sgi.com (case.americas.sgi.com [128.162.244.182]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7421A8F809C; Thu, 11 Feb 2010 11:26:13 -0800 (PST) Received: from [127.0.0.2] (localhost [127.0.0.1]) by snoot.americas.sgi.com (Postfix) with ESMTP id 2218C4A343DB; Thu, 11 Feb 2010 13:26:12 -0600 (CST) Subject: [PATCH 0/2] commit_metadata export operation v3 To: linux-nfs@vger.kernel.org From: Ben Myers Cc: xfs@oss.sgi.com Date: Thu, 11 Feb 2010 13:26:12 -0600 Message-ID: <20100211192611.12949.65493.stgit@case> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 latest version of the knfsd sync changes. I have addressed the suggestions provided by Christoph, Trond, and Dave. Thanks, Ben --- Ben Myers (2): commit_metadata export operation replacing nfsd_sync_dir xfs_export_operations.commit_metadata fs/nfsd/nfs3proc.c | 2 - fs/nfsd/nfs4proc.c | 2 - fs/nfsd/nfs4recover.c | 4 - fs/nfsd/nfs4state.c | 2 - fs/nfsd/nfsproc.c | 4 + fs/nfsd/vfs.c | 116 +++++++++++++++++++---------------------- fs/nfsd/vfs.h | 3 - fs/xfs/linux-2.6/xfs_export.c | 43 +++++++++++++++ include/linux/exportfs.h | 6 ++ 9 files changed, 111 insertions(+), 71 deletions(-) -- From bpm@sgi.com Thu Feb 11 13:25:08 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BJP78L172410 for ; Thu, 11 Feb 2010 13:25:07 -0600 Received: from snoot.americas.sgi.com (case.americas.sgi.com [128.162.244.182]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6C48AC00B; Thu, 11 Feb 2010 11:26:18 -0800 (PST) Received: from [127.0.0.2] (localhost [127.0.0.1]) by snoot.americas.sgi.com (Postfix) with ESMTP id 324144A343DB; Thu, 11 Feb 2010 13:26:17 -0600 (CST) Subject: [PATCH 1/2] commit_metadata export operation replacing nfsd_sync_dir To: linux-nfs@vger.kernel.org From: Ben Myers Cc: xfs@oss.sgi.com Date: Thu, 11 Feb 2010 13:26:17 -0600 Message-ID: <20100211192617.12949.37316.stgit@case> In-Reply-To: <20100211192611.12949.65493.stgit@case> References: <20100211192611.12949.65493.stgit@case> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 - Add commit_metadata export_operation to allow the underlying filesystem to decide how to sync parent and child inodes most efficiently. - Usage of nfsd_sync_dir and write_inode_now has been replaced with the commit_metadata function that takes a svc_fh and optional dentry for the child. - The commit_metadata function calls the commit_metadata export_op if it's there, or else falls back to sync_inode instead of fsync and write_inode_now because only metadata need be synched here. - nfsd4_sync_rec_dir now uses vfs_fsync so that commit_metadata can be static - Add a 'delay_commit' arg to nfsd_setattr so that callers of nfsd_create_setattr can commit parent and child together avoiding an extra sync. Signed-off-by: Ben Myers --- fs/nfsd/nfs3proc.c | 2 - fs/nfsd/nfs4proc.c | 2 - fs/nfsd/nfs4recover.c | 4 -- fs/nfsd/nfs4state.c | 2 - fs/nfsd/nfsproc.c | 4 +- fs/nfsd/vfs.c | 116 ++++++++++++++++++++++------------------------ fs/nfsd/vfs.h | 3 - include/linux/exportfs.h | 6 ++ 8 files changed, 68 insertions(+), 71 deletions(-) diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c index 3d68f45..fe3af23 100644 --- a/fs/nfsd/nfs3proc.c +++ b/fs/nfsd/nfs3proc.c @@ -76,7 +76,7 @@ nfsd3_proc_setattr(struct svc_rqst *rqstp, struct nfsd3_sattrargs *argp, fh_copy(&resp->fh, &argp->fh); nfserr = nfsd_setattr(rqstp, &resp->fh, &argp->attrs, - argp->check_guard, argp->guardtime); + argp->check_guard, argp->guardtime, 0); RETURN_STATUS(nfserr); } diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index 37514c4..c6e3c7f 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c @@ -803,7 +803,7 @@ nfsd4_setattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, if (status) goto out; status = nfsd_setattr(rqstp, &cstate->current_fh, &setattr->sa_iattr, - 0, (time_t)0); + 0, 0, 0); out: mnt_drop_write(cstate->current_fh.fh_export->ex_path.mnt); return status; diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index 5a754f7..98fb98e 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c @@ -119,9 +119,7 @@ out_no_tfm: static void nfsd4_sync_rec_dir(void) { - mutex_lock(&rec_dir.dentry->d_inode->i_mutex); - nfsd_sync_dir(rec_dir.dentry); - mutex_unlock(&rec_dir.dentry->d_inode->i_mutex); + vfs_fsync(NULL, rec_dir.dentry, 0); } int diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 3a20c09..f2fc8c8 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -2290,7 +2290,7 @@ nfsd4_truncate(struct svc_rqst *rqstp, struct svc_fh *fh, return 0; if (!(open->op_share_access & NFS4_SHARE_ACCESS_WRITE)) return nfserr_inval; - return nfsd_setattr(rqstp, fh, &iattr, 0, (time_t)0); + return nfsd_setattr(rqstp, fh, &iattr, 0, 0, 0); } static __be32 diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index a047ad6..f5e8280 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c @@ -69,7 +69,7 @@ nfsd_proc_setattr(struct svc_rqst *rqstp, struct nfsd_sattrargs *argp, argp->attrs.ia_valid, (long) argp->attrs.ia_size); fh_copy(&resp->fh, &argp->fh); - nfserr = nfsd_setattr(rqstp, &resp->fh, &argp->attrs,0, (time_t)0); + nfserr = nfsd_setattr(rqstp, &resp->fh, &argp->attrs, 0, 0, 0); return nfsd_return_attrs(nfserr, resp); } @@ -326,7 +326,7 @@ nfsd_proc_create(struct svc_rqst *rqstp, struct nfsd_createargs *argp, */ attr->ia_valid &= ATTR_SIZE; if (attr->ia_valid) - nfserr = nfsd_setattr(rqstp, newfhp, attr, 0, (time_t)0); + nfserr = nfsd_setattr(rqstp, newfhp, attr, 0, 0, 0); } out_unlock: diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 7062925..734a088 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include #ifdef CONFIG_NFSD_V3 #include "xdr3.h" @@ -271,6 +273,38 @@ out: return err; } +/* + * Commit metadata changes to stable storage. You pay pass NULL for dchild. + */ +static int +commit_metadata(struct svc_fh *fhp, struct dentry *dchild) +{ + struct inode *parent = fhp->fh_dentry->d_inode; + struct inode *child = NULL; + const struct export_operations *export_ops = parent->i_sb->s_export_op; + struct writeback_control wbc = { + .sync_mode = WB_SYNC_ALL, + .nr_to_write = 0, /* metadata only */ + }; + int error = 0, error2 = 0; + + if (!EX_ISSYNC(fhp->fh_export)) + return 0; + + if (dchild) + child = dchild->d_inode; + + if (export_ops->commit_metadata) { + error = export_ops->commit_metadata(parent, child); + } else { + if (child) + error2 = sync_inode(child, &wbc); + error = sync_inode(parent, &wbc); + if (error2) + error = error2; + } + return error; +} /* * Set various file attributes. @@ -278,7 +312,7 @@ out: */ __be32 nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, - int check_guard, time_t guardtime) + int check_guard, time_t guardtime, int delay_commit) { struct dentry *dentry; struct inode *inode; @@ -415,9 +449,8 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, } if (size_change) put_write_access(inode); - if (!err) - if (EX_ISSYNC(fhp->fh_export)) - write_inode_now(inode, 1); + if (!err && !delay_commit) + err = nfserrno(commit_metadata(fhp, NULL)); out: return err; @@ -770,28 +803,6 @@ nfsd_close(struct file *filp) } /* - * Sync a directory to disk. - * - * We can't just call vfs_fsync because our requirements are slightly odd: - * - * a) we do not have a file struct available - * b) we expect to have i_mutex already held by the caller - */ -int -nfsd_sync_dir(struct dentry *dentry) -{ - struct inode *inode = dentry->d_inode; - int error; - - WARN_ON(!mutex_is_locked(&inode->i_mutex)); - - error = filemap_write_and_wait(inode->i_mapping); - if (!error && inode->i_fop->fsync) - error = inode->i_fop->fsync(NULL, dentry, 0); - return error; -} - -/* * Obtain the readahead parameters for the file * specified by (dev, ino). */ @@ -1199,8 +1210,10 @@ nfsd_create_setattr(struct svc_rqst *rqstp, struct svc_fh *resfhp, */ if (current_fsuid() != 0) iap->ia_valid &= ~(ATTR_UID|ATTR_GID); - if (iap->ia_valid) - return nfsd_setattr(rqstp, resfhp, iap, 0, (time_t)0); + if (iap->ia_valid) { + return nfsd_setattr(rqstp, resfhp, iap, 0, 0, + 1 /* delay commit. our caller does it. */); + } return 0; } @@ -1332,12 +1345,8 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, goto out_nfserr; } - if (EX_ISSYNC(fhp->fh_export)) { - err = nfserrno(nfsd_sync_dir(dentry)); - write_inode_now(dchild->d_inode, 1); - } - - err2 = nfsd_create_setattr(rqstp, resfhp, iap); + err = nfsd_create_setattr(rqstp, resfhp, iap); + err2 = nfserrno(commit_metadata(fhp, dchild)); if (err2) err = err2; mnt_drop_write(fhp->fh_export->ex_path.mnt); @@ -1369,7 +1378,6 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, struct dentry *dentry, *dchild = NULL; struct inode *dirp; __be32 err; - __be32 err2; int host_err; __u32 v_mtime=0, v_atime=0; @@ -1464,11 +1472,6 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, if (created) *created = 1; - if (EX_ISSYNC(fhp->fh_export)) { - err = nfserrno(nfsd_sync_dir(dentry)); - /* setattr will sync the child (or not) */ - } - nfsd_check_ignore_resizing(iap); if (createmode == NFS3_CREATE_EXCLUSIVE) { @@ -1483,9 +1486,9 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, } set_attr: - err2 = nfsd_create_setattr(rqstp, resfhp, iap); - if (err2) - err = err2; + err = nfsd_create_setattr(rqstp, resfhp, iap); + if (!err) + err = nfserrno(commit_metadata(fhp, dchild)); mnt_drop_write(fhp->fh_export->ex_path.mnt); /* @@ -1600,12 +1603,10 @@ nfsd_symlink(struct svc_rqst *rqstp, struct svc_fh *fhp, } } else host_err = vfs_symlink(dentry->d_inode, dnew, path); - - if (!host_err) { - if (EX_ISSYNC(fhp->fh_export)) - host_err = nfsd_sync_dir(dentry); - } err = nfserrno(host_err); + if (!err) + err = nfserrno(commit_metadata(fhp, NULL)); + fh_unlock(fhp); mnt_drop_write(fhp->fh_export->ex_path.mnt); @@ -1667,11 +1668,7 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp, } host_err = vfs_link(dold, dirp, dnew); if (!host_err) { - if (EX_ISSYNC(ffhp->fh_export)) { - err = nfserrno(nfsd_sync_dir(ddir)); - write_inode_now(dest, 1); - } - err = 0; + err = nfserrno(commit_metadata(ffhp, dold)); } else { if (host_err == -EXDEV && rqstp->rq_vers == 2) err = nfserr_acces; @@ -1767,10 +1764,10 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen, goto out_dput_new; host_err = vfs_rename(fdir, odentry, tdir, ndentry); - if (!host_err && EX_ISSYNC(tfhp->fh_export)) { - host_err = nfsd_sync_dir(tdentry); + if (!host_err) { + host_err = commit_metadata(tfhp, NULL); if (!host_err) - host_err = nfsd_sync_dir(fdentry); + host_err = commit_metadata(ffhp, NULL); } mnt_drop_write(ffhp->fh_export->ex_path.mnt); @@ -1851,12 +1848,9 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, dput(rdentry); - if (host_err) - goto out_drop; - if (EX_ISSYNC(fhp->fh_export)) - host_err = nfsd_sync_dir(dentry); + if (!host_err) + host_err = commit_metadata(fhp, NULL); -out_drop: mnt_drop_write(fhp->fh_export->ex_path.mnt); out_nfserr: err = nfserrno(host_err); diff --git a/fs/nfsd/vfs.h b/fs/nfsd/vfs.h index 4b1de0a..5062afd 100644 --- a/fs/nfsd/vfs.h +++ b/fs/nfsd/vfs.h @@ -41,7 +41,7 @@ __be32 nfsd_lookup_dentry(struct svc_rqst *, struct svc_fh *, const char *, unsigned int, struct svc_export **, struct dentry **); __be32 nfsd_setattr(struct svc_rqst *, struct svc_fh *, - struct iattr *, int, time_t); + struct iattr *, int, time_t, int); int nfsd_mountpoint(struct dentry *, struct svc_export *); #ifdef CONFIG_NFSD_V4 __be32 nfsd4_set_nfs4_acl(struct svc_rqst *, struct svc_fh *, @@ -91,7 +91,6 @@ __be32 nfsd_statfs(struct svc_rqst *, struct svc_fh *, int nfsd_notify_change(struct inode *, struct iattr *); __be32 nfsd_permission(struct svc_rqst *, struct svc_export *, struct dentry *, int); -int nfsd_sync_dir(struct dentry *dp); #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) struct posix_acl *nfsd_get_posix_acl(struct svc_fh *, int); diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index dc12f41..9102ecf 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -96,6 +96,7 @@ struct fid { * @fh_to_parent: find the implied object's parent and get a dentry for it * @get_name: find the name for a given inode in a given directory * @get_parent: find the parent of a given directory + * @commit_metadata: commit metadata changes to stable storage * * See Documentation/filesystems/nfs/Exporting for details on how to use * this interface correctly. @@ -137,6 +138,10 @@ struct fid { * is also a directory. In the event that it cannot be found, or storage * space cannot be allocated, a %ERR_PTR should be returned. * + * commit_metadata: + * @commit_metadata should commit metadata changes to stable storage. + * Parent or child can be NULL. + * * Locking rules: * get_parent is called with child->d_inode->i_mutex down * get_name is not (which is possibly inconsistent) @@ -152,6 +157,7 @@ struct export_operations { int (*get_name)(struct dentry *parent, char *name, struct dentry *child); struct dentry * (*get_parent)(struct dentry *child); + int (*commit_metadata)(struct inode *parent, struct inode *child); }; extern int exportfs_encode_fh(struct dentry *dentry, struct fid *fid, From bpm@sgi.com Thu Feb 11 13:25:10 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BJP9jq172419 for ; Thu, 11 Feb 2010 13:25:09 -0600 Received: from snoot.americas.sgi.com (case.americas.sgi.com [128.162.244.182]) by relay3.corp.sgi.com (Postfix) with ESMTP id 45DEEAC00A; Thu, 11 Feb 2010 11:26:24 -0800 (PST) Received: from [127.0.0.2] (localhost [127.0.0.1]) by snoot.americas.sgi.com (Postfix) with ESMTP id 419364A343DC; Thu, 11 Feb 2010 13:26:22 -0600 (CST) Subject: [PATCH 2/2] xfs_export_operations.commit_metadata To: linux-nfs@vger.kernel.org From: Ben Myers Cc: xfs@oss.sgi.com Date: Thu, 11 Feb 2010 13:26:22 -0600 Message-ID: <20100211192622.12949.93762.stgit@case> In-Reply-To: <20100211192611.12949.65493.stgit@case> References: <20100211192611.12949.65493.stgit@case> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 This is the commit_metadata export operation for XFS, including the changes suggested by hch and dgc: - Takes two two inodes instead of dentries and can assume the parent is always set. - Uses xfs_lock_two_inodes for the ilock. - Forces the log up to the larger lsn of parent and child. - Uses XFS_LSN_CMP for lsn comparison. - Doesn't force the log if nobody had a pincount. Signed-off-by: Ben Myers --- fs/xfs/linux-2.6/xfs_export.c | 43 +++++++++++++++++++++++++++++++++++++++++ 1 files changed, 43 insertions(+), 0 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index 87b8cbd..d37ced1 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c @@ -29,6 +29,7 @@ #include "xfs_vnodeops.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" +#include "xfs_inode_item.h" /* * Note that we only accept fileids which are long enough rather than allow @@ -215,9 +216,51 @@ xfs_fs_get_parent( return d_obtain_alias(VFS_I(cip)); } +STATIC int +xfs_fs_nfs_commit_metadata( + struct inode *parent, + struct inode *child) +{ + struct xfs_inode *dp = XFS_I(parent); + struct xfs_inode *ip = NULL; + struct xfs_mount *mp = dp->i_mount; + xfs_lsn_t force_lsn = NULLCOMMITLSN; + int error = 0; + + if (child) { + ip = XFS_I(child); + xfs_lock_two_inodes(dp, ip, XFS_ILOCK_SHARED); + } else { + xfs_ilock(dp, XFS_ILOCK_SHARED); + } + + if (xfs_ipincount(dp)) { + force_lsn = dp->i_itemp->ili_last_lsn; + if (ip && xfs_ipincount(ip) && + XFS_LSN_CMP(force_lsn, ip->i_itemp->ili_last_lsn) < 0) { + force_lsn = ip->i_itemp->ili_last_lsn; + } + } else if (ip && xfs_ipincount(ip)) { + force_lsn = ip->i_itemp->ili_last_lsn; + } + + if (force_lsn != NULLCOMMITLSN) { + error = _xfs_log_force(mp, force_lsn, + XFS_LOG_FORCE | XFS_LOG_SYNC, NULL); + } + + if (child) + xfs_iunlock(ip, XFS_ILOCK_SHARED); + if (parent) + xfs_iunlock(dp, XFS_ILOCK_SHARED); + + return error; +} + const struct export_operations xfs_export_operations = { .encode_fh = xfs_fs_encode_fh, .fh_to_dentry = xfs_fs_fh_to_dentry, .fh_to_parent = xfs_fs_fh_to_parent, .get_parent = xfs_fs_get_parent, + .commit_metadata = xfs_fs_nfs_commit_metadata, }; From trond.myklebust@fys.uio.no Thu Feb 11 13:42:12 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BJgBs2173646 for ; Thu, 11 Feb 2010 13:42:12 -0600 X-ASG-Debug-ID: 1265917404-087c003a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-out1.uio.no (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8F13E1C7528; Thu, 11 Feb 2010 11:43:24 -0800 (PST) Received: from mail-out1.uio.no (mail-out1.uio.no [129.240.10.57]) by cuda.sgi.com with ESMTP id vJwFO15wJGrJTBC2; Thu, 11 Feb 2010 11:43:24 -0800 (PST) Received: from mail-mx5.uio.no ([129.240.10.46]) by mail-out1.uio.no with esmtp (Exim 4.69) (envelope-from ) id 1Nfewd-0005pC-Rp; Thu, 11 Feb 2010 20:43:23 +0100 Received: from c-68-40-206-115.hsd1.mi.comcast.net ([68.40.206.115] helo=[192.168.1.109]) by mail-mx5.uio.no with esmtpsa (SSLv3:CAMELLIA256-SHA:256) user trondmy (Exim 4.69) (envelope-from ) id 1Nfewd-0007sV-30; Thu, 11 Feb 2010 20:43:23 +0100 X-ASG-Orig-Subj: Re: [PATCH 0/2] commit_metadata export operation v3 Subject: Re: [PATCH 0/2] commit_metadata export operation v3 From: Trond Myklebust To: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com In-Reply-To: <20100211192611.12949.65493.stgit@case> References: <20100211192611.12949.65493.stgit@case> Content-Type: text/plain; charset="UTF-8" Date: Thu, 11 Feb 2010 14:43:19 -0500 Message-ID: <1265917399.478.37.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.28.2 (2.28.2-1.fc12) Content-Transfer-Encoding: 7bit X-UiO-Ratelimit-Test: rcpts/h 3 msgs/h 1 sum rcpts/h 6 sum msgs/h 2 total rcpts 2427 max rcpts/h 27 ratelimit 0 X-UiO-Spam-info: not spam, SpamAssassin (score=-5.0, required=5.0, autolearn=disabled, UIO_MAIL_IS_INTERNAL=-5, uiobl=NO, uiouri=NO) X-UiO-Scanned: 4A5C4C14F2F90C9316BCB9738A9A2A7E7A68FF9E X-UiO-SPAM-Test: remote_host: 68.40.206.115 spam_score: -49 maxlevel 80 minaction 2 bait 0 mail/h: 1 total 194 max/h 7 blacklist 0 greylist 0 ratelimit 0 X-Barracuda-Connect: mail-out1.uio.no[129.240.10.57] X-Barracuda-Start-Time: 1265917405 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22276 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-02-11 at 13:26 -0600, Ben Myers wrote: > Here is the latest version of the knfsd sync changes. I have addressed the > suggestions provided by Christoph, Trond, and Dave. > > Thanks, > Ben Hi Ben, This looks good to me, but before you send it on to Bruce, you might want to try rebasing this against his for-2.6.34 branch. That branch contains the stuff that is queued up for the next merge window, and includes Christoph's vfs_fsync() changes and my vfs_fsync_range() change to nfsd_commit(). See http://git.linux-nfs.org/?p=bfields/linux.git;a=shortlog;h=refs/heads/for-2.6.34 Cheers Trond From bpm@sgi.com Thu Feb 11 16:03:44 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BM3hhl183569 for ; Thu, 11 Feb 2010 16:03:43 -0600 Received: from snoot.americas.sgi.com (case.americas.sgi.com [128.162.244.182]) by relay2.corp.sgi.com (Postfix) with ESMTP id DACE7304062; Thu, 11 Feb 2010 14:04:55 -0800 (PST) Received: from [127.0.0.2] (localhost [127.0.0.1]) by snoot.americas.sgi.com (Postfix) with ESMTP id 133394A721E1; Thu, 11 Feb 2010 16:04:55 -0600 (CST) Subject: [PATCH 0/2] commit_metadata export operation v4 To: bfields@fieldses.org From: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 11 Feb 2010 16:04:55 -0600 Message-ID: <20100211220454.26466.37578.stgit@case> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 Hey Bruce, Here is the latest version of the knfsd sync changes. I have addressed the suggestions provided by Christoph, Trond, and Dave. This time rebased atop for-2.6.34 (I hope). Sorry for the extra noise. Thanks, Ben --- Ben Myers (2): commit_metadata export operation replacing nfsd_sync_dir xfs_export_operations.commit_metadata fs/nfsd/nfs3proc.c | 2 - fs/nfsd/nfs4proc.c | 2 - fs/nfsd/nfs4recover.c | 4 - fs/nfsd/nfs4state.c | 2 - fs/nfsd/nfsproc.c | 4 + fs/nfsd/vfs.c | 116 +++++++++++++++++++---------------------- fs/nfsd/vfs.h | 3 - fs/xfs/linux-2.6/xfs_export.c | 43 +++++++++++++++ include/linux/exportfs.h | 6 ++ 9 files changed, 111 insertions(+), 71 deletions(-) -- From bpm@sgi.com Thu Feb 11 16:03:49 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BM3m1X183591 for ; Thu, 11 Feb 2010 16:03:48 -0600 Received: from snoot.americas.sgi.com (case.americas.sgi.com [128.162.244.182]) by relay1.corp.sgi.com (Postfix) with ESMTP id AF2A38F80CF; Thu, 11 Feb 2010 14:05:00 -0800 (PST) Received: from [127.0.0.2] (localhost [127.0.0.1]) by snoot.americas.sgi.com (Postfix) with ESMTP id 2406D4A721E1; Thu, 11 Feb 2010 16:05:00 -0600 (CST) Subject: [PATCH 1/2] commit_metadata export operation replacing nfsd_sync_dir To: bfields@fieldses.org From: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 11 Feb 2010 16:05:00 -0600 Message-ID: <20100211220500.26466.24169.stgit@case> In-Reply-To: <20100211220454.26466.37578.stgit@case> References: <20100211220454.26466.37578.stgit@case> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 - Add commit_metadata export_operation to allow the underlying filesystem to decide how to sync parent and child inodes most efficiently. - Usage of nfsd_sync_dir and write_inode_now has been replaced with the commit_metadata function that takes a svc_fh and optional dentry for the child. - The commit_metadata function calls the commit_metadata export_op if it's there, or else falls back to sync_inode instead of fsync and write_inode_now because only metadata need be synched here. - nfsd4_sync_rec_dir now uses vfs_fsync so that commit_metadata can be static - Add a 'delay_commit' arg to nfsd_setattr so that callers of nfsd_create_setattr can commit parent and child together avoiding an extra sync. Signed-off-by: Ben Myers --- fs/nfsd/nfs3proc.c | 2 - fs/nfsd/nfs4proc.c | 2 - fs/nfsd/nfs4recover.c | 4 -- fs/nfsd/nfs4state.c | 2 - fs/nfsd/nfsproc.c | 4 +- fs/nfsd/vfs.c | 116 ++++++++++++++++++++++------------------------ fs/nfsd/vfs.h | 3 - include/linux/exportfs.h | 6 ++ 8 files changed, 68 insertions(+), 71 deletions(-) diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c index 3d68f45..fe3af23 100644 --- a/fs/nfsd/nfs3proc.c +++ b/fs/nfsd/nfs3proc.c @@ -76,7 +76,7 @@ nfsd3_proc_setattr(struct svc_rqst *rqstp, struct nfsd3_sattrargs *argp, fh_copy(&resp->fh, &argp->fh); nfserr = nfsd_setattr(rqstp, &resp->fh, &argp->attrs, - argp->check_guard, argp->guardtime); + argp->check_guard, argp->guardtime, 0); RETURN_STATUS(nfserr); } diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index 37514c4..c6e3c7f 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c @@ -803,7 +803,7 @@ nfsd4_setattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, if (status) goto out; status = nfsd_setattr(rqstp, &cstate->current_fh, &setattr->sa_iattr, - 0, (time_t)0); + 0, 0, 0); out: mnt_drop_write(cstate->current_fh.fh_export->ex_path.mnt); return status; diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index 5a754f7..98fb98e 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c @@ -119,9 +119,7 @@ out_no_tfm: static void nfsd4_sync_rec_dir(void) { - mutex_lock(&rec_dir.dentry->d_inode->i_mutex); - nfsd_sync_dir(rec_dir.dentry); - mutex_unlock(&rec_dir.dentry->d_inode->i_mutex); + vfs_fsync(NULL, rec_dir.dentry, 0); } int diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 3a20c09..f2fc8c8 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -2290,7 +2290,7 @@ nfsd4_truncate(struct svc_rqst *rqstp, struct svc_fh *fh, return 0; if (!(open->op_share_access & NFS4_SHARE_ACCESS_WRITE)) return nfserr_inval; - return nfsd_setattr(rqstp, fh, &iattr, 0, (time_t)0); + return nfsd_setattr(rqstp, fh, &iattr, 0, 0, 0); } static __be32 diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index a047ad6..f5e8280 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c @@ -69,7 +69,7 @@ nfsd_proc_setattr(struct svc_rqst *rqstp, struct nfsd_sattrargs *argp, argp->attrs.ia_valid, (long) argp->attrs.ia_size); fh_copy(&resp->fh, &argp->fh); - nfserr = nfsd_setattr(rqstp, &resp->fh, &argp->attrs,0, (time_t)0); + nfserr = nfsd_setattr(rqstp, &resp->fh, &argp->attrs, 0, 0, 0); return nfsd_return_attrs(nfserr, resp); } @@ -326,7 +326,7 @@ nfsd_proc_create(struct svc_rqst *rqstp, struct nfsd_createargs *argp, */ attr->ia_valid &= ATTR_SIZE; if (attr->ia_valid) - nfserr = nfsd_setattr(rqstp, newfhp, attr, 0, (time_t)0); + nfserr = nfsd_setattr(rqstp, newfhp, attr, 0, 0, 0); } out_unlock: diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index ed024d3..97474fb 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include #ifdef CONFIG_NFSD_V3 #include "xdr3.h" @@ -271,6 +273,38 @@ out: return err; } +/* + * Commit metadata changes to stable storage. You pay pass NULL for dchild. + */ +static int +commit_metadata(struct svc_fh *fhp, struct dentry *dchild) +{ + struct inode *parent = fhp->fh_dentry->d_inode; + struct inode *child = NULL; + const struct export_operations *export_ops = parent->i_sb->s_export_op; + struct writeback_control wbc = { + .sync_mode = WB_SYNC_ALL, + .nr_to_write = 0, /* metadata only */ + }; + int error = 0, error2 = 0; + + if (!EX_ISSYNC(fhp->fh_export)) + return 0; + + if (dchild) + child = dchild->d_inode; + + if (export_ops->commit_metadata) { + error = export_ops->commit_metadata(parent, child); + } else { + if (child) + error2 = sync_inode(child, &wbc); + error = sync_inode(parent, &wbc); + if (error2) + error = error2; + } + return error; +} /* * Set various file attributes. @@ -278,7 +312,7 @@ out: */ __be32 nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, - int check_guard, time_t guardtime) + int check_guard, time_t guardtime, int delay_commit) { struct dentry *dentry; struct inode *inode; @@ -415,9 +449,8 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, } if (size_change) put_write_access(inode); - if (!err) - if (EX_ISSYNC(fhp->fh_export)) - write_inode_now(inode, 1); + if (!err && !delay_commit) + err = nfserrno(commit_metadata(fhp, NULL)); out: return err; @@ -769,28 +802,6 @@ nfsd_close(struct file *filp) } /* - * Sync a directory to disk. - * - * We can't just call vfs_fsync because our requirements are slightly odd: - * - * a) we do not have a file struct available - * b) we expect to have i_mutex already held by the caller - */ -int -nfsd_sync_dir(struct dentry *dentry) -{ - struct inode *inode = dentry->d_inode; - int error; - - WARN_ON(!mutex_is_locked(&inode->i_mutex)); - - error = filemap_write_and_wait(inode->i_mapping); - if (!error && inode->i_fop->fsync) - error = inode->i_fop->fsync(NULL, dentry, 0); - return error; -} - -/* * Obtain the readahead parameters for the file * specified by (dev, ino). */ @@ -1198,8 +1209,10 @@ nfsd_create_setattr(struct svc_rqst *rqstp, struct svc_fh *resfhp, */ if (current_fsuid() != 0) iap->ia_valid &= ~(ATTR_UID|ATTR_GID); - if (iap->ia_valid) - return nfsd_setattr(rqstp, resfhp, iap, 0, (time_t)0); + if (iap->ia_valid) { + return nfsd_setattr(rqstp, resfhp, iap, 0, 0, + 1 /* delay commit. our caller does it. */); + } return 0; } @@ -1331,12 +1344,8 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, goto out_nfserr; } - if (EX_ISSYNC(fhp->fh_export)) { - err = nfserrno(nfsd_sync_dir(dentry)); - write_inode_now(dchild->d_inode, 1); - } - - err2 = nfsd_create_setattr(rqstp, resfhp, iap); + err = nfsd_create_setattr(rqstp, resfhp, iap); + err2 = nfserrno(commit_metadata(fhp, dchild)); if (err2) err = err2; mnt_drop_write(fhp->fh_export->ex_path.mnt); @@ -1368,7 +1377,6 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, struct dentry *dentry, *dchild = NULL; struct inode *dirp; __be32 err; - __be32 err2; int host_err; __u32 v_mtime=0, v_atime=0; @@ -1463,11 +1471,6 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, if (created) *created = 1; - if (EX_ISSYNC(fhp->fh_export)) { - err = nfserrno(nfsd_sync_dir(dentry)); - /* setattr will sync the child (or not) */ - } - nfsd_check_ignore_resizing(iap); if (createmode == NFS3_CREATE_EXCLUSIVE) { @@ -1482,9 +1485,9 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, } set_attr: - err2 = nfsd_create_setattr(rqstp, resfhp, iap); - if (err2) - err = err2; + err = nfsd_create_setattr(rqstp, resfhp, iap); + if (!err) + err = nfserrno(commit_metadata(fhp, dchild)); mnt_drop_write(fhp->fh_export->ex_path.mnt); /* @@ -1599,12 +1602,10 @@ nfsd_symlink(struct svc_rqst *rqstp, struct svc_fh *fhp, } } else host_err = vfs_symlink(dentry->d_inode, dnew, path); - - if (!host_err) { - if (EX_ISSYNC(fhp->fh_export)) - host_err = nfsd_sync_dir(dentry); - } err = nfserrno(host_err); + if (!err) + err = nfserrno(commit_metadata(fhp, NULL)); + fh_unlock(fhp); mnt_drop_write(fhp->fh_export->ex_path.mnt); @@ -1666,11 +1667,7 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp, } host_err = vfs_link(dold, dirp, dnew); if (!host_err) { - if (EX_ISSYNC(ffhp->fh_export)) { - err = nfserrno(nfsd_sync_dir(ddir)); - write_inode_now(dest, 1); - } - err = 0; + err = nfserrno(commit_metadata(ffhp, dold)); } else { if (host_err == -EXDEV && rqstp->rq_vers == 2) err = nfserr_acces; @@ -1766,10 +1763,10 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen, goto out_dput_new; host_err = vfs_rename(fdir, odentry, tdir, ndentry); - if (!host_err && EX_ISSYNC(tfhp->fh_export)) { - host_err = nfsd_sync_dir(tdentry); + if (!host_err) { + host_err = commit_metadata(tfhp, NULL); if (!host_err) - host_err = nfsd_sync_dir(fdentry); + host_err = commit_metadata(ffhp, NULL); } mnt_drop_write(ffhp->fh_export->ex_path.mnt); @@ -1850,12 +1847,9 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, dput(rdentry); - if (host_err) - goto out_drop; - if (EX_ISSYNC(fhp->fh_export)) - host_err = nfsd_sync_dir(dentry); + if (!host_err) + host_err = commit_metadata(fhp, NULL); -out_drop: mnt_drop_write(fhp->fh_export->ex_path.mnt); out_nfserr: err = nfserrno(host_err); diff --git a/fs/nfsd/vfs.h b/fs/nfsd/vfs.h index 4b1de0a..5062afd 100644 --- a/fs/nfsd/vfs.h +++ b/fs/nfsd/vfs.h @@ -41,7 +41,7 @@ __be32 nfsd_lookup_dentry(struct svc_rqst *, struct svc_fh *, const char *, unsigned int, struct svc_export **, struct dentry **); __be32 nfsd_setattr(struct svc_rqst *, struct svc_fh *, - struct iattr *, int, time_t); + struct iattr *, int, time_t, int); int nfsd_mountpoint(struct dentry *, struct svc_export *); #ifdef CONFIG_NFSD_V4 __be32 nfsd4_set_nfs4_acl(struct svc_rqst *, struct svc_fh *, @@ -91,7 +91,6 @@ __be32 nfsd_statfs(struct svc_rqst *, struct svc_fh *, int nfsd_notify_change(struct inode *, struct iattr *); __be32 nfsd_permission(struct svc_rqst *, struct svc_export *, struct dentry *, int); -int nfsd_sync_dir(struct dentry *dp); #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) struct posix_acl *nfsd_get_posix_acl(struct svc_fh *, int); diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index dc12f41..9102ecf 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -96,6 +96,7 @@ struct fid { * @fh_to_parent: find the implied object's parent and get a dentry for it * @get_name: find the name for a given inode in a given directory * @get_parent: find the parent of a given directory + * @commit_metadata: commit metadata changes to stable storage * * See Documentation/filesystems/nfs/Exporting for details on how to use * this interface correctly. @@ -137,6 +138,10 @@ struct fid { * is also a directory. In the event that it cannot be found, or storage * space cannot be allocated, a %ERR_PTR should be returned. * + * commit_metadata: + * @commit_metadata should commit metadata changes to stable storage. + * Parent or child can be NULL. + * * Locking rules: * get_parent is called with child->d_inode->i_mutex down * get_name is not (which is possibly inconsistent) @@ -152,6 +157,7 @@ struct export_operations { int (*get_name)(struct dentry *parent, char *name, struct dentry *child); struct dentry * (*get_parent)(struct dentry *child); + int (*commit_metadata)(struct inode *parent, struct inode *child); }; extern int exportfs_encode_fh(struct dentry *dentry, struct fid *fid, From bpm@sgi.com Thu Feb 11 16:03:57 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BM3vdD183614 for ; Thu, 11 Feb 2010 16:03:57 -0600 Received: from snoot.americas.sgi.com (case.americas.sgi.com [128.162.244.182]) by relay3.corp.sgi.com (Postfix) with ESMTP id 09993AC00C; Thu, 11 Feb 2010 14:05:05 -0800 (PST) Received: from [127.0.0.2] (localhost [127.0.0.1]) by snoot.americas.sgi.com (Postfix) with ESMTP id 35D154A721E1; Thu, 11 Feb 2010 16:05:05 -0600 (CST) Subject: [PATCH 2/2] xfs_export_operations.commit_metadata To: bfields@fieldses.org From: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 11 Feb 2010 16:05:05 -0600 Message-ID: <20100211220505.26466.99037.stgit@case> In-Reply-To: <20100211220454.26466.37578.stgit@case> References: <20100211220454.26466.37578.stgit@case> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 This is the commit_metadata export operation for XFS, including the changes suggested by hch and dgc: - Takes two two inodes instead of dentries and can assume the parent is always set. - Uses xfs_lock_two_inodes for the ilock. - Forces the log up to the larger lsn of parent and child. - Uses XFS_LSN_CMP for lsn comparison. - Doesn't force the log if nobody had a pincount. Signed-off-by: Ben Myers --- fs/xfs/linux-2.6/xfs_export.c | 43 +++++++++++++++++++++++++++++++++++++++++ 1 files changed, 43 insertions(+), 0 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index 87b8cbd..d37ced1 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c @@ -29,6 +29,7 @@ #include "xfs_vnodeops.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" +#include "xfs_inode_item.h" /* * Note that we only accept fileids which are long enough rather than allow @@ -215,9 +216,51 @@ xfs_fs_get_parent( return d_obtain_alias(VFS_I(cip)); } +STATIC int +xfs_fs_nfs_commit_metadata( + struct inode *parent, + struct inode *child) +{ + struct xfs_inode *dp = XFS_I(parent); + struct xfs_inode *ip = NULL; + struct xfs_mount *mp = dp->i_mount; + xfs_lsn_t force_lsn = NULLCOMMITLSN; + int error = 0; + + if (child) { + ip = XFS_I(child); + xfs_lock_two_inodes(dp, ip, XFS_ILOCK_SHARED); + } else { + xfs_ilock(dp, XFS_ILOCK_SHARED); + } + + if (xfs_ipincount(dp)) { + force_lsn = dp->i_itemp->ili_last_lsn; + if (ip && xfs_ipincount(ip) && + XFS_LSN_CMP(force_lsn, ip->i_itemp->ili_last_lsn) < 0) { + force_lsn = ip->i_itemp->ili_last_lsn; + } + } else if (ip && xfs_ipincount(ip)) { + force_lsn = ip->i_itemp->ili_last_lsn; + } + + if (force_lsn != NULLCOMMITLSN) { + error = _xfs_log_force(mp, force_lsn, + XFS_LOG_FORCE | XFS_LOG_SYNC, NULL); + } + + if (child) + xfs_iunlock(ip, XFS_ILOCK_SHARED); + if (parent) + xfs_iunlock(dp, XFS_ILOCK_SHARED); + + return error; +} + const struct export_operations xfs_export_operations = { .encode_fh = xfs_fs_encode_fh, .fh_to_dentry = xfs_fs_fh_to_dentry, .fh_to_parent = xfs_fs_fh_to_parent, .get_parent = xfs_fs_get_parent, + .commit_metadata = xfs_fs_nfs_commit_metadata, }; From aelder@sgi.com Thu Feb 11 17:08:49 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1BN8mns188095 for ; Thu, 11 Feb 2010 17:08:48 -0600 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 E0B8B304089; Thu, 11 Feb 2010 15:10:00 -0800 (PST) Received: from [128.162.232.188] ([128.162.232.188]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 11 Feb 2010 17:10:00 -0600 Subject: Re: [PATCH] xfs: optimize log flushing in xfs_fsync From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20100205095755.GA30848@infradead.org> References: <20100205095755.GA30848@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Thu, 11 Feb 2010 17:10:00 -0600 Message-ID: <1265929800.2793.30.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 11 Feb 2010 23:10:00.0683 (UTC) FILETIME=[560C0BB0:01CAAB6F] 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-02-05 at 04:57 -0500, Christoph Hellwig wrote: > If we have a pinned inode it must have a log item attached to it. > Usually that log item will have ili_last_lsn already set, in which > case we only need to flush the log up to that LSN instead of doing > a full log force. This gives speedups of about 5% in some fsync > heavy workloads. This looks good. I was going to suggest: ASSERT(ip->i_itemp != NULL); before it's dereferenced, but a pinned inode had better have an item pointer... Reviewed-by: Alex Elder > Signed-off-by: Christoph Hellwig > > Index: xfs/fs/xfs/xfs_vnodeops.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_vnodeops.c 2010-02-04 17:38:33.679254119 +0100 > +++ xfs/fs/xfs/xfs_vnodeops.c 2010-02-04 17:38:51.606006156 +0100 > @@ -626,8 +626,14 @@ xfs_fsync( > * force the log. > */ > if (xfs_ipincount(ip)) { > - error = _xfs_log_force(ip->i_mount, XFS_LOG_SYNC, > - &log_flushed); > + if (ip->i_itemp->ili_last_lsn) { > + error = _xfs_log_force_lsn(ip->i_mount, > + ip->i_itemp->ili_last_lsn, > + XFS_LOG_SYNC, &log_flushed); > + } else { > + error = _xfs_log_force(ip->i_mount, > + XFS_LOG_SYNC, &log_flushed); > + } > } > } else { > /* > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From richih.mailinglist@gmail.com Fri Feb 12 08:06:09 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CE689j256046 for ; Fri, 12 Feb 2010 08:06:08 -0600 X-ASG-Debug-ID: 1265983642-079b005b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B68F91CC64AF for ; Fri, 12 Feb 2010 06:07:22 -0800 (PST) Received: from mail-ew0-f227.google.com (mail-ew0-f227.google.com [209.85.219.227]) by cuda.sgi.com with ESMTP id GT1jpzCRFZBd44rm for ; Fri, 12 Feb 2010 06:07:22 -0800 (PST) Received: by ewy27 with SMTP id 27so2604370ewy.18 for ; Fri, 12 Feb 2010 06:07:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:date:message-id:subject :from:to:content-type; bh=0msQ6KfOaxWDe3+8WxT81ieZIRZ5Q5w5j8k2/bM48zE=; b=vm9N9Ch50xcTQ80ciAwCILrWcaQ4fcQtmdAR48cZkyIE19oPx+JjwZW7jevpKz90zn wntJfuIdrwj4mTFYT2ocR+2D6a6+O5HexIqaPg0+Zu6b3uwgRdi+J1hUrfctP6zpouB2 Zx63CklCRfCrDhSGXD2STtHhXgTpjdzuInRdo= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=XgU4PuOI/hl6IU+gbzTtHuDhDoIFsBSBbcwJnSWiB4qu4JktnswTcuCB/CdaPNJPTa /nmxxv+bU56fargWCxvAxRXEC1rr5Ebml04Jxidk2bLGtY1TnWrp0ggVqtyOnH8gPUpW g649r7E/8RhyqFhiF+bHH2YpRwKWckiWfryXs= MIME-Version: 1.0 Received: by 10.213.96.227 with SMTP id i35mr1070969ebn.35.1265983641826; Fri, 12 Feb 2010 06:07:21 -0800 (PST) Date: Fri, 12 Feb 2010 15:07:21 +0100 Message-ID: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> X-ASG-Orig-Subj: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now From: Richard Hartmann To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ew0-f227.google.com[209.85.219.227] X-Barracuda-Start-Time: 1265983643 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.22347 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 Hi all, one of our RAIDs recovered into an inconsistant state and I need to get back what data I can. All steps taken happened and will continue to happen under Linux with either Debian and/or grml. The XFS file system that can not be mounted is in a partition which is 1.5 TiB in size. I put an additional 2 TiB drive and used dd_rescue to copy over what the RAID presents as one large block device. I then ran kpartx on the image to create the appropriate devices in /dev/mapper. As the metadata was corrupt, I ran xfs_metadump -g and -go to have a personal backup and one I could give out if needed. I then ran xfs_repair -L /dev/mapper/loop1p3 which has not been making any progress for the last hour. I don't see much load in ways of CPU or i/o, yet there is literally no progress at all. I am hanging at: no . entry for directory 39756 no .. entry for directory 39756 problem with directory contents in inode 39756 cleared inode 39756 data fork in ino 39771 claims free block 8391321 bad directory block magic # 0x58443242 in block 0 for directory inode 39771 corrupt block 0 in directory inode 39771 will junk block no . entry for directory 39771 no .. entry for directory 39771 problem with directory contents in inode 39771 cleared inode 39771 data fork in ino 39774 claims free block 44122 data fork in ino 39774 claims free block 8432730 bad directory block magic # 0x1f1f1f1f in block 0 for directory inode 39774 corrupt block 0 in directory inode 39774 will junk block no . entry for directory 39774 no .. entry for directory 39774 problem with directory contents in inode 39774 cleared inode 39774 multiple . entries in directory inode 39816: clearing entry multiple .. entries in directory inode 39816: clearing entry bad directory block magic # 0x58443244 in block 0 for directory inode 39840 corrupt block 0 in directory inode 39840 will junk block no . entry for directory 39840 no .. entry for directory 39840 problem with directory contents in inode 39840 cleared inode 39840 bad . entry in directory inode 39909, was 45188: correcting data fork in ino 40102 claims free block 8400946 ab3e1b90: Badness in key lookup (length) bp=(bno 258176, len 8192 bytes) key=(bno 258176, len 4096 bytes) ab3e1b90: Badness in key lookup (length) bp=(bno 258224, len 8192 bytes) key=(bno 258224, len 4096 bytes) Is there any way to read out the current state of xfs_repair and tell what it is doing and when it will finish? I am aware that the end time is impossible to predict, I am just looking for ballpark figures. Thanks a _lot_ for any and all help, Richard From aelder@sgi.com Fri Feb 12 08:22:30 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CEMTVd257211 for ; Fri, 12 Feb 2010 08:22:30 -0600 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 307A5AC00D; Fri, 12 Feb 2010 06:23:42 -0800 (PST) Received: from [134.15.64.63] ([134.15.64.63]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 12 Feb 2010 08:23:41 -0600 Subject: Re: [PATCH 1/2] commit_metadata export operation replacing nfsd_sync_dir From: Alex Elder Reply-To: aelder@sgi.com To: Ben Myers Cc: bfields@fieldses.org, linux-nfs@vger.kernel.org, xfs@oss.sgi.com In-Reply-To: <20100211220500.26466.24169.stgit@case> References: <20100211220454.26466.37578.stgit@case> <20100211220500.26466.24169.stgit@case> Content-Type: text/plain; charset="UTF-8" Date: Fri, 12 Feb 2010 08:23:40 -0600 Message-ID: <1265984620.3201.73.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 12 Feb 2010 14:23:41.0634 (UTC) FILETIME=[F9E15220:01CAABEE] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Generally this looks like a good change, but I do have some questions embedded below. -Alex On Thu, 2010-02-11 at 16:05 -0600, Ben Myers wrote: > - Add commit_metadata export_operation to allow the underlying filesystem to > decide how to sync parent and child inodes most efficiently. > > - Usage of nfsd_sync_dir and write_inode_now has been replaced with the > commit_metadata function that takes a svc_fh and optional dentry for the child. In the cases you pass the child dentry, you will now be syncing things to disk in a slightly different way/order from before. I think this way is actually much better, but I thought I'd ask anyway: are you sure that it's OK to sync them at the same time, rather than directory first, then child (or the other way around, depending on the case)? > - The commit_metadata function calls the commit_metadata export_op if it's > there, or else falls back to sync_inode instead of fsync and write_inode_now > because only metadata need be synched here. > > - nfsd4_sync_rec_dir now uses vfs_fsync so that commit_metadata can be static > > - Add a 'delay_commit' arg to nfsd_setattr so that callers of > nfsd_create_setattr can commit parent and child together avoiding an extra > sync. I think this is a distinct enough change to warrant a separate patch from the commit_metadata feature. > > Signed-off-by: Ben Myers . . . > index 5a754f7..98fb98e 100644 > --- a/fs/nfsd/nfs4recover.c > +++ b/fs/nfsd/nfs4recover.c > @@ -119,9 +119,7 @@ out_no_tfm: > static void > nfsd4_sync_rec_dir(void) > { > - mutex_lock(&rec_dir.dentry->d_inode->i_mutex); > - nfsd_sync_dir(rec_dir.dentry); > - mutex_unlock(&rec_dir.dentry->d_inode->i_mutex); > + vfs_fsync(NULL, rec_dir.dentry, 0); Why do you no longer need to acquire the mutex here? I see it gets acquired during the ->fsync() call inside vfs_fsync_range(), but is there a reason that it needed to be held during the filemap_write_and_wait() (as is done in the nfsd_sync_dir() code) also? . . . > diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c > index ed024d3..97474fb 100644 > --- a/fs/nfsd/vfs.c > +++ b/fs/nfsd/vfs.c . . . > @@ -415,9 +449,8 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, > } > if (size_change) > put_write_access(inode); > - if (!err) > - if (EX_ISSYNC(fhp->fh_export)) > - write_inode_now(inode, 1); > + if (!err && !delay_commit) > + err = nfserrno(commit_metadata(fhp, NULL)); Is this sufficient even if the size has changed? > out: > return err; > . . . > @@ -1766,10 +1763,10 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen, > goto out_dput_new; > > host_err = vfs_rename(fdir, odentry, tdir, ndentry); > - if (!host_err && EX_ISSYNC(tfhp->fh_export)) { > - host_err = nfsd_sync_dir(tdentry); > + if (!host_err) { > + host_err = commit_metadata(tfhp, NULL); > if (!host_err) > - host_err = nfsd_sync_dir(fdentry); > + host_err = commit_metadata(ffhp, NULL); It violates the spirit of the "parent" and "child" nature of its arguments, but it might be nice to commit both directories' metadata with the same call here. . . . From aelder@sgi.com Fri Feb 12 08:45:35 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CEjZRZ258827 for ; Fri, 12 Feb 2010 08:45:35 -0600 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 AC4AD8F8052; Fri, 12 Feb 2010 06:46:47 -0800 (PST) Received: from [134.15.64.63] ([134.15.64.63]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 12 Feb 2010 08:46:47 -0600 Subject: Re: [PATCH 2/2] xfs_export_operations.commit_metadata From: Alex Elder Reply-To: aelder@sgi.com To: Ben Myers Cc: bfields@fieldses.org, linux-nfs@vger.kernel.org, xfs@oss.sgi.com In-Reply-To: <20100211220505.26466.99037.stgit@case> References: <20100211220454.26466.37578.stgit@case> <20100211220505.26466.99037.stgit@case> Content-Type: text/plain; charset="UTF-8" Date: Fri, 12 Feb 2010 08:46:46 -0600 Message-ID: <1265986006.3201.112.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 12 Feb 2010 14:46:47.0518 (UTC) FILETIME=[33EE6FE0:01CAABF2] 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-02-11 at 16:05 -0600, Ben Myers wrote: > This is the commit_metadata export operation for XFS, including the changes > suggested by hch and dgc: > > - Takes two two inodes instead of dentries and can assume the parent is > always set. I alluded to this in my review of the first patch. This could be changed considered in a more generic sense, "sync one or two inodes' metadata" rather than presupposing the two inodes have a parent/child relationship. > - Uses xfs_lock_two_inodes for the ilock. > > - Forces the log up to the larger lsn of parent and child. > > - Uses XFS_LSN_CMP for lsn comparison. > > - Doesn't force the log if nobody had a pincount. So if the log doesn't get forced, what causes the desired metadata sync expected as a result of this call? (Maybe this is a dumb question.) > Signed-off-by: Ben Myers > --- > fs/xfs/linux-2.6/xfs_export.c | 43 +++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 43 insertions(+), 0 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c > index 87b8cbd..d37ced1 100644 > --- a/fs/xfs/linux-2.6/xfs_export.c > +++ b/fs/xfs/linux-2.6/xfs_export.c > @@ -29,6 +29,7 @@ > #include "xfs_vnodeops.h" > #include "xfs_bmap_btree.h" > #include "xfs_inode.h" > +#include "xfs_inode_item.h" > > /* > * Note that we only accept fileids which are long enough rather than allow > @@ -215,9 +216,51 @@ xfs_fs_get_parent( > return d_obtain_alias(VFS_I(cip)); > } > > +STATIC int > +xfs_fs_nfs_commit_metadata( > + struct inode *parent, > + struct inode *child) > +{ > + struct xfs_inode *dp = XFS_I(parent); > + struct xfs_inode *ip = NULL; > + struct xfs_mount *mp = dp->i_mount; > + xfs_lsn_t force_lsn = NULLCOMMITLSN; > + int error = 0; > + > + if (child) { > + ip = XFS_I(child); > + xfs_lock_two_inodes(dp, ip, XFS_ILOCK_SHARED); > + } else { > + xfs_ilock(dp, XFS_ILOCK_SHARED); > + } > + > + if (xfs_ipincount(dp)) { > + force_lsn = dp->i_itemp->ili_last_lsn; > + if (ip && xfs_ipincount(ip) && > + XFS_LSN_CMP(force_lsn, ip->i_itemp->ili_last_lsn) < 0) { > + force_lsn = ip->i_itemp->ili_last_lsn; > + } > + } else if (ip && xfs_ipincount(ip)) { > + force_lsn = ip->i_itemp->ili_last_lsn; > + } > + > + if (force_lsn != NULLCOMMITLSN) { > + error = _xfs_log_force(mp, force_lsn, > + XFS_LOG_FORCE | XFS_LOG_SYNC, NULL); You want this here: error = xfs_log_force_lsn(mp, force_lsn, XFS_LOG_FORCE | XFS_LOG_SYNC); > + } > + > + if (child) > + xfs_iunlock(ip, XFS_ILOCK_SHARED); > + if (parent) > + xfs_iunlock(dp, XFS_ILOCK_SHARED); > + > + return error; > +} > + > const struct export_operations xfs_export_operations = { > .encode_fh = xfs_fs_encode_fh, > .fh_to_dentry = xfs_fs_fh_to_dentry, > .fh_to_parent = xfs_fs_fh_to_parent, > .get_parent = xfs_fs_get_parent, > + .commit_metadata = xfs_fs_nfs_commit_metadata, > }; > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Fri Feb 12 09:27:02 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CFR1vC261772 for ; Fri, 12 Feb 2010 09:27:01 -0600 X-ASG-Debug-ID: 1265988495-335e00b30000-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 64DFA1B9103 for ; Fri, 12 Feb 2010 07:28:15 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id 6Bnx6Pho7Hl2lilh for ; Fri, 12 Feb 2010 07:28:15 -0800 (PST) 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 2228712AEBF8; Fri, 12 Feb 2010 09:28:15 -0600 (CST) Message-ID: <4B75738D.80108@sandeen.net> Date: Fri, 12 Feb 2010 09:28:13 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Richard Hartmann CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> In-Reply-To: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.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: 1265988496 X-Barracuda-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.22352 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 Richard Hartmann wrote: > Hi all, > > one of our RAIDs recovered into an inconsistant state and I need to get > back what data I can. > > All steps taken happened and will continue to happen under Linux with > either Debian and/or grml. > > The XFS file system that can not be mounted is in a partition which is > 1.5 TiB in size. > I put an additional 2 TiB drive and used dd_rescue to copy over what the > RAID presents as one large block device. > > I then ran kpartx on the image to create the appropriate devices in > /dev/mapper. > > As the metadata was corrupt, I ran xfs_metadump -g and -go to have a > personal backup and one I could give out if needed. > > I then ran xfs_repair -L /dev/mapper/loop1p3 which has not been making > any progress for the last hour. > I don't see much load in ways of CPU or i/o, yet there is literally no > progress at all. I am hanging at: > > > no . entry for directory 39756 > no .. entry for directory 39756 > problem with directory contents in inode 39756 > cleared inode 39756 > data fork in ino 39771 claims free block 8391321 > bad directory block magic # 0x58443242 in block 0 for directory inode 39771 > corrupt block 0 in directory inode 39771 > will junk block > no . entry for directory 39771 > no .. entry for directory 39771 > problem with directory contents in inode 39771 > cleared inode 39771 > data fork in ino 39774 claims free block 44122 > data fork in ino 39774 claims free block 8432730 > bad directory block magic # 0x1f1f1f1f in block 0 for directory inode 39774 > corrupt block 0 in directory inode 39774 > will junk block > no . entry for directory 39774 > no .. entry for directory 39774 > problem with directory contents in inode 39774 > cleared inode 39774 > multiple . entries in directory inode 39816: clearing entry > multiple .. entries in directory inode 39816: clearing entry > bad directory block magic # 0x58443244 in block 0 for directory inode 39840 > corrupt block 0 in directory inode 39840 > will junk block > no . entry for directory 39840 > no .. entry for directory 39840 > problem with directory contents in inode 39840 > cleared inode 39840 > bad . entry in directory inode 39909, was 45188: correcting > data fork in ino 40102 claims free block 8400946 > ab3e1b90: Badness in key lookup (length) > bp=(bno 258176, len 8192 bytes) key=(bno 258176, len 4096 bytes) > ab3e1b90: Badness in key lookup (length) > bp=(bno 258224, len 8192 bytes) key=(bno 258224, len 4096 bytes) > > > Is there any way to read out the current state of xfs_repair and tell > what it is doing and when it will finish? I am aware that the end time > is impossible to predict, I am just looking for ballpark figures. to see if it's moving, I'd try stracing the process or examining it with gdb if you are able. You didn't say which version of xfsprogs you have; IIRC at least one known problem with hanging has been fixed upstream. -Eric From richih.mailinglist@gmail.com Fri Feb 12 10:44:06 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CGi6g0005532 for ; Fri, 12 Feb 2010 10:44:06 -0600 X-ASG-Debug-ID: 1265993120-434f03790000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2017A13A2E04 for ; Fri, 12 Feb 2010 08:45:20 -0800 (PST) Received: from mail-ew0-f227.google.com (mail-ew0-f227.google.com [209.85.219.227]) by cuda.sgi.com with ESMTP id 032xZutwcvXZnUXH for ; Fri, 12 Feb 2010 08:45:20 -0800 (PST) Received: by ewy27 with SMTP id 27so2782437ewy.18 for ; Fri, 12 Feb 2010 08:45:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type; bh=t5zDik/zUW36D1r1gIsmI4cJ95aT6F1vjKcRxs+kxIw=; b=NJIcvISejfvRbKmWDlLG5xLCGdEjflis+Djdu0RNasvtNbd62xIjOj2V4QVEVLb4wT 9JrG+IjgXFr8v9+d4eBudclPMjoo4fdRl17ELGNkOc+YfZsKEmqL+aGcxjANZak88Xrx +odtMDoCYKLvlmPGMOa62MPnlhAVVFZ6kaIm0= 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=pvMSmTyMZCZ8/yRiyXWCp4MqsT1I05BDbfNzWFnaC1QnykVdkPBWV+Foll3kAqywJx DbazO+nMmuLRBxBfnc9S0Pt3g+EnCgE/l5GhzZrY42VCEnxNw35Br1GamAqop+zztVXe zjQWf3rEcbxJxzYK9TmqYf7HmZPlhVOvcQgkM= MIME-Version: 1.0 Received: by 10.213.109.131 with SMTP id j3mr1178794ebp.36.1265993119455; Fri, 12 Feb 2010 08:45:19 -0800 (PST) In-Reply-To: <4B75738D.80108@sandeen.net> References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <4B75738D.80108@sandeen.net> Date: Fri, 12 Feb 2010 17:45:08 +0100 Message-ID: <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now From: Richard Hartmann To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ew0-f227.google.com[209.85.219.227] X-Barracuda-Start-Time: 1265993121 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.22357 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 Fri, Feb 12, 2010 at 16:28, Eric Sandeen wrote: > to see if it's moving, I'd try stracing the process or examining it > with gdb if you are able. I thought about that, but I fear that I will flood my terminal off with crap and/or that I somehow impair xfs_repair while doing so. > You didn't say which version of xfsprogs you have; IIRC at least one known > problem with hanging has been fixed upstream. root@grml ~ # xfs_repair -V xfs_repair version 3.0.4 root@grml ~ # I seriously do hope that I am not affected... Thanks, Richard PS: If you need any other debug info, please tell me From richih.mailinglist@gmail.com Fri Feb 12 11:01:47 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_41 autolearn=no version=3.3.0-rupdated 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 o1CH1lCQ006789 for ; Fri, 12 Feb 2010 11:01:47 -0600 X-ASG-Debug-ID: 1265994180-18a601ab0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6CBE61CC76B7 for ; Fri, 12 Feb 2010 09:03:00 -0800 (PST) Received: from mail-ew0-f227.google.com (mail-ew0-f227.google.com [209.85.219.227]) by cuda.sgi.com with ESMTP id N3nrzPaglmOrosuC for ; Fri, 12 Feb 2010 09:03:00 -0800 (PST) Received: by ewy27 with SMTP id 27so2802137ewy.18 for ; Fri, 12 Feb 2010 09:02:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type; bh=Xk14p9HPwpjhFkkzxn3SmU602PeJowdHfwGYW17maJ0=; b=gOaLw7edx1dZ3ZBnwm8DiMhXO+BS5SO5rfoeL/tcs3SDsOrIqGO0OX4bXWR+90MQxf eG701EtElV4fHE3PO9XNdAO7ijuWI/gyORyrvnKJDBdcZaa70FBMZSkjNp6HcF+uaTQS zHA3CDsMAsO0n97rKP1KzHT0xUX1fTdQLL6ls= 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=eNW+eQ152bquA7Ng8X4DMGV86u9Eph6An1T/KxVCaL081tyLEaM5DqXY8mi3Y0AmIz ak6oTWwzlYUgcERX7wUPFBs4xZuVCPn1hNSqipkHWJCnrc4pxzLR9+3y6/npEgdT4qpW 7+1PU4bwZFlnnl4z3AD2/c7oqAj8DkcZsjTnc= MIME-Version: 1.0 Received: by 10.213.100.231 with SMTP id z39mr1198079ebn.20.1265994179606; Fri, 12 Feb 2010 09:02:59 -0800 (PST) In-Reply-To: <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <4B75738D.80108@sandeen.net> <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> Date: Fri, 12 Feb 2010 18:02:59 +0100 Message-ID: <2d460de71002120902g3bda548t4e202dfe43a0c742@mail.gmail.com> X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now From: Richard Hartmann To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ew0-f227.google.com[209.85.219.227] X-Barracuda-Start-Time: 1265994182 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0036 1.0000 -1.9977 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.22358 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 Fri, Feb 12, 2010 at 17:45, Richard Hartmann wrote: > I thought about that, but I fear that I will flood my terminal off with crap > and/or that I somehow impair xfs_repair while doing so. Running it for ten minutes gives me: root@grml ~ # strace -p13629 Process 13629 attached - interrupt to quit futex(0xa381b4cc, FUTEX_WAIT_PRIVATE, 2, NULL^C Process 13629 detached root@grml ~ # Richard From richih.mailinglist@gmail.com Fri Feb 12 11:03:38 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CH3b3D006914 for ; Fri, 12 Feb 2010 11:03:37 -0600 X-ASG-Debug-ID: 1265994292-18a601be0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 180AB1CC76D8 for ; Fri, 12 Feb 2010 09:04:52 -0800 (PST) Received: from mail-ew0-f227.google.com (mail-ew0-f227.google.com [209.85.219.227]) by cuda.sgi.com with ESMTP id 6OUt3If1EbdKTZNm for ; Fri, 12 Feb 2010 09:04:52 -0800 (PST) Received: by ewy27 with SMTP id 27so2804080ewy.18 for ; Fri, 12 Feb 2010 09:04:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type; bh=iPGXFQiTDjEjYsqfO+nL/nxMPRv0hyi9ncTF5oXH2cI=; b=uTXyMcpTnqzY9PTOOMlY06FIK/RJGnbmip2j0VZJbz/gs443d7G4BePcahu2MIQue2 QOIb4WguOCNsUAe7Ozzv0NJyXnqNBOfyQzuN8ZBBEBe5A4KJ7WuSI6QD3azne1UdPObM w0VzooGc8XGTvl5fzz4dvHRYF2mlLLe537Aio= 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=ejJmQuGfv1eb/jHtKGwTz40BOQd9BGlFisUeimybfSV9Heu8xA9/Io66GF0rhw2114 3FdPl9gkmrmQBpUpOzHuoRZ58oszACuAoXHDlsiC5qM0SA5xc7jW2mdXtp1YaroXCGta Gt9ImtyeQnY9c9JfOZQpye7vbwACxCUSJjB2o= MIME-Version: 1.0 Received: by 10.213.26.138 with SMTP id e10mr1182554ebc.80.1265994291974; Fri, 12 Feb 2010 09:04:51 -0800 (PST) In-Reply-To: <20100212165801.GA7323@puku.stupidest.org> References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <20100212165801.GA7323@puku.stupidest.org> Date: Fri, 12 Feb 2010 18:04:51 +0100 Message-ID: <2d460de71002120904n346b1b1n307a07a3dd4d9@mail.gmail.com> X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now From: Richard Hartmann To: Chris Wedgwood Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ew0-f227.google.com[209.85.219.227] X-Barracuda-Start-Time: 1265994293 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.22358 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 Fri, Feb 12, 2010 at 17:58, Chris Wedgwood wrote: > try adding -P Which leads me to the question if it would be save to just CTRL-C a running xfs_repair (or if there is a different graceful shutdown function). In any case, I would then retry with 3.1.0/3.1.1. Thanks, Richard From richih.mailinglist@gmail.com Fri Feb 12 11:05:19 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CH5I5j007188 for ; Fri, 12 Feb 2010 11:05:19 -0600 X-ASG-Debug-ID: 1265994393-1cf201300000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 10C3B1CC76F8 for ; Fri, 12 Feb 2010 09:06:33 -0800 (PST) Received: from mail-ew0-f227.google.com (mail-ew0-f227.google.com [209.85.219.227]) by cuda.sgi.com with ESMTP id JADd1s1QHF1rj3vz for ; Fri, 12 Feb 2010 09:06:33 -0800 (PST) Received: by ewy27 with SMTP id 27so2805984ewy.18 for ; Fri, 12 Feb 2010 09:06:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type; bh=xf9YtUCCz1l1d+fURRTX1QHGiEwNWeyg+PQfRL2R0Dw=; b=wjtXbQrLk6xj5n/XqJrxdNeWPfQOUMdgEwN3C+Dqgn4DTHBdnE0Ec/GA/BLB+lJzkT J0SppDfqtElxsZF/rH8VFFZJKvi+8Cx2/6vL6F4OdWvoEx2a7Y1H6uMe0Pg0SAxNfc1U 9Qbye0RQxKIXc7PIfwJ5W8NOfVwJP74inhY1w= 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=LHZfiJe3tBLmZuzFLECSdKL3sxf2ove5bDETqU9PoL6y4iNyHDiywblie+KwIxejLu dwRwEC7kKzCzoIuXW1V6lTOz7D2fOku1hmOwOpRRkgJRbbXxMNK4UyuLQLMJnCU4vbFD Nac+bEJ/t106Rv3ykCSSJoJfX4ZB056U0qO4g= MIME-Version: 1.0 Received: by 10.213.109.91 with SMTP id i27mr1164188ebp.90.1265994392188; Fri, 12 Feb 2010 09:06:32 -0800 (PST) In-Reply-To: <2d460de71002120904n346b1b1n307a07a3dd4d9@mail.gmail.com> References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <20100212165801.GA7323@puku.stupidest.org> <2d460de71002120904n346b1b1n307a07a3dd4d9@mail.gmail.com> Date: Fri, 12 Feb 2010 18:06:32 +0100 Message-ID: <2d460de71002120906g5d0ba253g9e843a7a1f0e1647@mail.gmail.com> X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now From: Richard Hartmann To: Chris Wedgwood Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ew0-f227.google.com[209.85.219.227] X-Barracuda-Start-Time: 1265994394 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.22358 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 Fri, Feb 12, 2010 at 18:04, Richard Hartmann wrote: > On Fri, Feb 12, 2010 at 17:58, Chris Wedgwood wrote: > >> try adding -P > > Which leads me to the question if it would be save to just CTRL-C a > running xfs_repair (or if there is a different graceful shutdown function). -P Disable prefetching of inode and directory blocks. Use this option if you find xfs_repair gets stuck and stops proceeding. Interrupting a stuck xfs_repair is safe. Well, OK :) Thanks, Richard From sandeen@sandeen.net Fri Feb 12 11:11:52 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CHBqxA007668 for ; Fri, 12 Feb 2010 11:11:52 -0600 X-ASG-Debug-ID: 1265994786-671603640000-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 2FADD13A3514 for ; Fri, 12 Feb 2010 09:13:06 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id KWyPHcnDFTbz0fxc for ; Fri, 12 Feb 2010 09:13:06 -0800 (PST) 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 3054C124CF0A; Fri, 12 Feb 2010 11:13:06 -0600 (CST) Message-ID: <4B758C22.5050102@sandeen.net> Date: Fri, 12 Feb 2010 11:13:06 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Richard Hartmann CC: Chris Wedgwood , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <20100212165801.GA7323@puku.stupidest.org> <2d460de71002120904n346b1b1n307a07a3dd4d9@mail.gmail.com> In-Reply-To: <2d460de71002120904n346b1b1n307a07a3dd4d9@mail.gmail.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: 1265994787 X-Barracuda-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.22359 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 Richard Hartmann wrote: > On Fri, Feb 12, 2010 at 17:58, Chris Wedgwood wrote: > >> try adding -P > > Which leads me to the question if it would be save to just CTRL-C a > running xfs_repair (or if there is a different graceful shutdown function). It is safe, as the manpage says right there by the -P option ;) -Eric > In any case, I would then retry with 3.1.0/3.1.1. > > > Thanks, > Richard > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From BATV+f8d98581e68b70e8387d+2364+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 12 11:29:55 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CHTrDj008906 for ; Fri, 12 Feb 2010 11:29:54 -0600 X-ASG-Debug-ID: 1265995867-2b4900130000-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 B0DF61521F64; Fri, 12 Feb 2010 09:31:07 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id mfwHdE5sxtLmog69; Fri, 12 Feb 2010 09:31:07 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NfzMA-00070F-RS; Fri, 12 Feb 2010 17:31:06 +0000 Date: Fri, 12 Feb 2010 12:31:06 -0500 From: Christoph Hellwig To: Alex Elder Cc: Ben Myers , bfields@fieldses.org, linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] commit_metadata export operation replacing nfsd_sync_dir Subject: Re: [PATCH 1/2] commit_metadata export operation replacing nfsd_sync_dir Message-ID: <20100212173106.GA22633@infradead.org> References: <20100211220454.26466.37578.stgit@case> <20100211220500.26466.24169.stgit@case> <1265984620.3201.73.camel@doink1> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1265984620.3201.73.camel@doink1> 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: 1265995868 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 the cases you pass the child dentry, you will now be syncing > things to disk in a slightly different way/order from before. > I think this way is actually much better, but I thought I'd ask > anyway: are you sure that it's OK to sync them at the same time, > rather than directory first, then child (or the other way around, > depending on the case)? The order is defined by when we commit the transactions, if we do the log force on the later one first we already write out the first transaction. Note that in any transaction filesystems the changes that create/mkdir/link/unlink do to parent and child will be in the same transaction anyway, which is kinda the point of adding the transactions to start with. Only for the case where we do a setattr in addition to the primary transaction we'll actually have another transaction to deal with and the above applies. > > nfsd4_sync_rec_dir(void) > > { > > - mutex_lock(&rec_dir.dentry->d_inode->i_mutex); > > - nfsd_sync_dir(rec_dir.dentry); > > - mutex_unlock(&rec_dir.dentry->d_inode->i_mutex); > > + vfs_fsync(NULL, rec_dir.dentry, 0); > > Why do you no longer need to acquire the mutex here? > I see it gets acquired during the ->fsync() call > inside vfs_fsync_range(), but is there a reason > that it needed to be held during the filemap_write_and_wait() > (as is done in the nfsd_sync_dir() code) also? We don't need i_mutex for filemap_write_and_wait, it's just held because someone used the nfsd_sync_dir helper where it doesn't fit very well. > > @@ -415,9 +449,8 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, > > } > > if (size_change) > > put_write_access(inode); > > - if (!err) > > - if (EX_ISSYNC(fhp->fh_export)) > > - write_inode_now(inode, 1); > > + if (!err && !delay_commit) > > + err = nfserrno(commit_metadata(fhp, NULL)); > > Is this sufficient even if the size has changed? Yes. From sgi-linux-xfs@lo.gmane.org Fri Feb 12 11:30:17 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_41 autolearn=no version=3.3.0-rupdated 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 o1CHUHfP008966 for ; Fri, 12 Feb 2010 11:30:17 -0600 X-ASG-Debug-ID: 1265995891-468703570000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lo.gmane.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6DCAB1CB089 for ; Fri, 12 Feb 2010 09:31:31 -0800 (PST) Received: from lo.gmane.org (lo.gmane.org [80.91.229.12]) by cuda.sgi.com with ESMTP id jgPApfDF0NNDPNeW for ; Fri, 12 Feb 2010 09:31:31 -0800 (PST) Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1NfzMW-0001DB-OB for linux-xfs@oss.sgi.com; Fri, 12 Feb 2010 18:31:28 +0100 Received: from vm15c-113.broadinstitute.org ([69.173.114.122]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 12 Feb 2010 18:31:28 +0100 Received: from nico by vm15c-113.broadinstitute.org with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 12 Feb 2010 18:31:28 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com From: Nicolas Stransky X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Date: Fri, 12 Feb 2010 12:31:03 -0500 Lines: 25 Message-ID: References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <4B75738D.80108@sandeen.net> <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> <2d460de71002120902g3bda548t4e202dfe43a0c742@mail.gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: vm15c-113.broadinstitute.org User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.8) Gecko/20100212 Shredder/3.0.2pre In-Reply-To: <2d460de71002120902g3bda548t4e202dfe43a0c742@mail.gmail.com> Sender: news X-Barracuda-Connect: lo.gmane.org[80.91.229.12] X-Barracuda-Start-Time: 1265995892 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22360 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'm running into the same problem exactly, except that it's not 10 minutes, but DAYS. What is the version that fixes this? Thanks On 2/12/10 12:02 PM, Richard Hartmann wrote: > On Fri, Feb 12, 2010 at 17:45, Richard Hartmann > wrote: > >> I thought about that, but I fear that I will flood my terminal off with crap >> and/or that I somehow impair xfs_repair while doing so. > > Running it for ten minutes gives me: > > root@grml ~ # strace -p13629 > Process 13629 attached - interrupt to quit > futex(0xa381b4cc, FUTEX_WAIT_PRIVATE, 2, NULL^C > Process 13629 detached > root@grml ~ # -- Nico From linush@verizon.net Fri Feb 12 11:43:24 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CHhNv1009934 for ; Fri, 12 Feb 2010 11:43:24 -0600 X-ASG-Debug-ID: 1265996676-3141003d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from vms173013pub.verizon.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 123CA13A398A for ; Fri, 12 Feb 2010 09:44:36 -0800 (PST) Received: from vms173013pub.verizon.net (vms173013pub.verizon.net [206.46.173.13]) by cuda.sgi.com with ESMTP id EYy53tFiYVt9pElD for ; Fri, 12 Feb 2010 09:44:36 -0800 (PST) Received: from [192.168.10.2] ([unknown] [98.114.168.230]) by vms173013.mailsrvcs.net (Sun Java(tm) System Messaging Server 7u2-7.02 32bit (built Apr 16 2009)) with ESMTPA id <0KXQ00KZ0PAZRJF2@vms173013.mailsrvcs.net> for xfs@oss.sgi.com; Fri, 12 Feb 2010 11:44:59 -0600 (CST) X-ASG-Orig-Subj: xfs_repair doesn't fix sb versionnum missing attr Subject: xfs_repair doesn't fix sb versionnum missing attr From: C Linus Hicks To: xfs@oss.sgi.com Content-type: text/plain Date: Fri, 12 Feb 2010 12:44:34 -0500 Message-id: <1265996674.7755.7.camel@lh10.linush.net> MIME-version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-8.el5_2.3) Content-transfer-encoding: 7bit X-Barracuda-Connect: vms173013pub.verizon.net[206.46.173.13] X-Barracuda-Start-Time: 1265996679 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22361 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 run: xfs_check /dev/sdc10 And it reports: sb versionnum missing attr bit 10 Then I run: xfs_repair /dev/sdc10 And it reports output from 7 phases and "done". Again I run: xfs_check /dev/sdc10 And it reports: sb versionnum missing attr bit 10 Is this how it's supposed to work? Thanks for any help. Linus From BATV+f8d98581e68b70e8387d+2364+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 12 11:45:52 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CHjqiD010136 for ; Fri, 12 Feb 2010 11:45:52 -0600 X-ASG-Debug-ID: 1265996827-4f7a03170000-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 09B221CB163; Fri, 12 Feb 2010 09:47:07 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 0GY4krrRjZkInQh9; Fri, 12 Feb 2010 09:47:07 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nfzbf-0001vN-7y; Fri, 12 Feb 2010 17:47:07 +0000 Date: Fri, 12 Feb 2010 12:47:07 -0500 From: Christoph Hellwig To: Alex Elder Cc: Ben Myers , bfields@fieldses.org, linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Subject: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Message-ID: <20100212174706.GB22633@infradead.org> References: <20100211220454.26466.37578.stgit@case> <20100211220505.26466.99037.stgit@case> <1265986006.3201.112.camel@doink1> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1265986006.3201.112.camel@doink1> 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: 1265996828 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, Feb 12, 2010 at 08:46:46AM -0600, Alex Elder wrote: > On Thu, 2010-02-11 at 16:05 -0600, Ben Myers wrote: > > This is the commit_metadata export operation for XFS, including the changes > > suggested by hch and dgc: > > > > - Takes two two inodes instead of dentries and can assume the parent is > > always set. > > I alluded to this in my review of the first patch. > This could be changed considered in a more generic > sense, "sync one or two inodes' metadata" rather > than presupposing the two inodes have a parent/child > relationship. Or just implement my later suggestion to only pass one inode to the method and cal in on both inodes. For the non-create case where we have only one transaction to deal with fhr first call will take care of it and unpin the second inode by forcing the log buffer out. For the create case we need to make sure to call it on the child first so that we force out the setattr transaction which also forced out the earlier one. This keeps the calling convention quite a bit simpler, and also means we don't have to bother with locking two inodes or lsn comparisms. > > - Uses xfs_lock_two_inodes for the ilock. > > > > - Forces the log up to the larger lsn of parent and child. > > > > - Uses XFS_LSN_CMP for lsn comparison. > > > > - Doesn't force the log if nobody had a pincount. > > So if the log doesn't get forced, what causes the > desired metadata sync expected as a result of this > call? (Maybe this is a dumb question.) Inodes get pinned on transaction commit, and unpinned when the log I/O for that transaction completes. If the inode is not pinned this implies it has already been written to disk, e.g. because we're filling the log so fast that we need to write out more log buffers in that tiny window between the metada operation and the commit_metadata call. > > + force_lsn = ip->i_itemp->ili_last_lsn; > > + } > > + > > + if (force_lsn != NULLCOMMITLSN) { > > + error = _xfs_log_force(mp, force_lsn, > > + XFS_LOG_FORCE | XFS_LOG_SYNC, NULL); > > You want this here: > error = xfs_log_force_lsn(mp, force_lsn, XFS_LOG_FORCE | XFS_LOG_SYNC); In the XFS tree we do want either xfs_log_force_lsn(mp, force_lsn, XFS_LOG_SYNC); or error = _xfs_log_force_lsn(mp, force_lsn, XFS_LOG_SYNC, NULL); if we care enough about the returned error. But Ben is working against the NFS tree which doesn't have that change yet. We can deal with that by either commiting the old variant to the nfs tree and then leaving sending Stephen a patch to fix it up in -next, or just not apply the xfs commit_metadata implementation yet, and wait for it until both the xfs and nfs trees have hit mainline. From sandeen@sandeen.net Fri Feb 12 11:48:57 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_41 autolearn=no version=3.3.0-rupdated 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 o1CHmvHH010343 for ; Fri, 12 Feb 2010 11:48:57 -0600 X-ASG-Debug-ID: 1265997011-100403770000-w1Z2WR 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 3842E1CC77EF for ; Fri, 12 Feb 2010 09:50:11 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id vYoLagIM1xF85zuB for ; Fri, 12 Feb 2010 09:50:11 -0800 (PST) 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 75C6312AEBF8; Fri, 12 Feb 2010 11:50:11 -0600 (CST) Message-ID: <4B7594D3.6040304@sandeen.net> Date: Fri, 12 Feb 2010 11:50:11 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Nicolas Stransky CC: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <4B75738D.80108@sandeen.net> <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> <2d460de71002120902g3bda548t4e202dfe43a0c742@mail.gmail.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: 1265997012 X-Barracuda-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.22362 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 Nicolas Stransky wrote: > I'm running into the same problem exactly, except that it's not 10 > minutes, but DAYS. > > What is the version that fixes this? hard to say without knowing for sure what version you're using, and what exactly "this" is that you're seeing :) Providing an xfs_metadump of the corrupted fs that hangs repair is also about the best thing you could do for investigation, if you've already determined that the latest release doesn't help. -Eric > Thanks > > On 2/12/10 12:02 PM, Richard Hartmann wrote: >> On Fri, Feb 12, 2010 at 17:45, Richard Hartmann >> wrote: >> >>> I thought about that, but I fear that I will flood my terminal off with crap >>> and/or that I somehow impair xfs_repair while doing so. >> Running it for ten minutes gives me: >> >> root@grml ~ # strace -p13629 >> Process 13629 attached - interrupt to quit >> futex(0xa381b4cc, FUTEX_WAIT_PRIVATE, 2, NULL^C >> Process 13629 detached >> root@grml ~ # > > From sgi-linux-xfs@lo.gmane.org Fri Feb 12 12:15:26 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_41 autolearn=no version=3.3.0-rupdated 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 o1CIFPbl012334 for ; Fri, 12 Feb 2010 12:15:26 -0600 X-ASG-Debug-ID: 1265998599-4d95003d0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lo.gmane.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EDC621CB5D7 for ; Fri, 12 Feb 2010 10:16:40 -0800 (PST) Received: from lo.gmane.org (lo.gmane.org [80.91.229.12]) by cuda.sgi.com with ESMTP id TdxeeK2xGqlVJMYQ for ; Fri, 12 Feb 2010 10:16:40 -0800 (PST) Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1Ng04F-0005Py-It for linux-xfs@oss.sgi.com; Fri, 12 Feb 2010 19:16:39 +0100 Received: from vm15c-113.broadinstitute.org ([69.173.114.122]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 12 Feb 2010 19:16:39 +0100 Received: from nico by vm15c-113.broadinstitute.org with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 12 Feb 2010 19:16:39 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com From: Nicolas Stransky X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Date: Fri, 12 Feb 2010 13:16:16 -0500 Lines: 61 Message-ID: References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <4B75738D.80108@sandeen.net> <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> <2d460de71002120902g3bda548t4e202dfe43a0c742@mail.gmail.com> <4B7594D3.6040304@sandeen.net> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: vm15c-113.broadinstitute.org User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.8) Gecko/20100212 Shredder/3.0.2pre In-Reply-To: <4B7594D3.6040304@sandeen.net> Sender: news X-Barracuda-Connect: lo.gmane.org[80.91.229.12] X-Barracuda-Start-Time: 1265998600 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22362 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 Right :) I'm using xfsprogs 3.1.0, on Debian Lenny, because 3.1.1 fails to build for some reason. I've been trying to repair a 1.4TB filesystem for more than a week, without success. xfs_repair never completes. I straced the stuck process today and got: Process 28510 attached - interrupt to quit futex(0x429cb58, FUTEX_WAIT_PRIVATE, 2, NULL I'm running xfs_repair -P -t5 -m500 /dev/sda1 because the machine only has 2GB of RAM and was swapping like crazy. I'll see how it goes with the -P option. I'm happy to provide xfs_metadump if this still hangs! Thanks, Nico On 2/12/10 12:50 PM, Eric Sandeen wrote: > Nicolas Stransky wrote: >> I'm running into the same problem exactly, except that it's not 10 >> minutes, but DAYS. >> >> What is the version that fixes this? > > hard to say without knowing for sure what version you're using, and > what exactly "this" is that you're seeing :) > > Providing an xfs_metadump of the corrupted fs that hangs repair > is also about the best thing you could do for investigation, > if you've already determined that the latest release doesn't help. > > -Eric > >> Thanks >> >> On 2/12/10 12:02 PM, Richard Hartmann wrote: >>> On Fri, Feb 12, 2010 at 17:45, Richard Hartmann >>> wrote: >>> >>>> I thought about that, but I fear that I will flood my terminal off with crap >>>> and/or that I somehow impair xfs_repair while doing so. >>> Running it for ten minutes gives me: >>> >>> root@grml ~ # strace -p13629 >>> Process 13629 attached - interrupt to quit >>> futex(0xa381b4cc, FUTEX_WAIT_PRIVATE, 2, NULL^C >>> Process 13629 detached >>> root@grml ~ # >> >> > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > -- Nico From bpm@sgi.com Fri Feb 12 13:54:55 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CJste1019824 for ; Fri, 12 Feb 2010 13:54:55 -0600 Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id A9289AC00D; Fri, 12 Feb 2010 11:56:06 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 06A164266A1; Fri, 12 Feb 2010 13:56:47 -0600 (CST) Date: Fri, 12 Feb 2010 13:56:47 -0600 From: bpm@sgi.com To: Christoph Hellwig Cc: Alex Elder , bfields@fieldses.org, linux-nfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Message-ID: <20100212195647.GQ23654@sgi.com> References: <20100211220454.26466.37578.stgit@case> <20100211220505.26466.99037.stgit@case> <1265986006.3201.112.camel@doink1> <20100212174706.GB22633@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100212174706.GB22633@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Feb 12, 2010 at 12:47:07PM -0500, Christoph Hellwig wrote: > On Fri, Feb 12, 2010 at 08:46:46AM -0600, Alex Elder wrote: > > On Thu, 2010-02-11 at 16:05 -0600, Ben Myers wrote: > > > This is the commit_metadata export operation for XFS, including the changes > > > suggested by hch and dgc: > > > > > > - Takes two two inodes instead of dentries and can assume the parent is > > > always set. > > > > I alluded to this in my review of the first patch. > > This could be changed considered in a more generic > > sense, "sync one or two inodes' metadata" rather > > than presupposing the two inodes have a parent/child > > relationship. > > Or just implement my later suggestion to only pass one inode to the > method and cal in on both inodes. For the non-create case where > we have only one transaction to deal with fhr first call will take > care of it and unpin the second inode by forcing the log buffer out. > For the create case we need to make sure to call it on the child first > so that we force out the setattr transaction which also forced out the > earlier one. I chose not implement that suggestion because I prefer not to rely upon the coincidence that the child be modified last and synced first in knfsd. It is better that the intent of the patch be clear, and that filesystems other than xfs also have enough information to sort out how to sync more efficiently. knfsd shouldn't be forced to sync in a specific order just because that's what works best for xfs. Or, mebbe it should and I'm being thick. ;) Alex's suggestion that ->commit_metadata be more generic about the relationship of the two inodes seems reasonable, not sure what that means for vfs.c:commit_metadata. This will help with the rename case. > This keeps the calling convention quite a bit simpler, > and also means we don't have to bother with locking two inodes or lsn > comparisms. Don't need the ilock to check pincount? > > > + error = _xfs_log_force(mp, force_lsn, > > > + XFS_LOG_FORCE | XFS_LOG_SYNC, NULL); > > > > You want this here: > > error = xfs_log_force_lsn(mp, force_lsn, XFS_LOG_FORCE | XFS_LOG_SYNC); > > In the XFS tree we do want either > > xfs_log_force_lsn(mp, force_lsn, XFS_LOG_SYNC); > > or > error = _xfs_log_force_lsn(mp, force_lsn, XFS_LOG_SYNC, NULL); > > if we care enough about the returned error. But Ben is working against > the NFS tree which doesn't have that change yet. > > We can deal with that by either commiting the old variant to the nfs > tree and then leaving sending Stephen a patch to fix it up in -next, > or just not apply the xfs commit_metadata implementation yet, and wait > for it until both the xfs and nfs trees have hit mainline. Yeah. I don't know who Stephen is. Thanks, Ben From richih.mailinglist@gmail.com Fri Feb 12 14:00:03 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CK02Rl020443 for ; Fri, 12 Feb 2010 14:00:03 -0600 X-ASG-Debug-ID: 1266004875-336800930000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0091E13A2EB0 for ; Fri, 12 Feb 2010 12:01:15 -0800 (PST) Received: from mail-ew0-f227.google.com (mail-ew0-f227.google.com [209.85.219.227]) by cuda.sgi.com with ESMTP id NrBEafCTqdPqNOZp for ; Fri, 12 Feb 2010 12:01:15 -0800 (PST) Received: by ewy27 with SMTP id 27so3000740ewy.18 for ; Fri, 12 Feb 2010 12:01:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type; bh=h0xgjSeC5MKpPd3kzy6cJjrTzr3rkr1SliVIvGZuAI4=; b=D07Hy5yngkELqPzTbi0jIA0nK4WaySs0BKV6vJ/4pihW24GudiWUzP3CZbMeLUsx0V Q8Y2DdF1tnfMT41vnW+KcgxdqVoxOWn0uJIdPtX4ouqGr/afuml+XzY22aZsHozPseDC 5Rv4d4ebVF+GM4ZUlG4grFNnWL6v5qZxHsOXo= 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=Bjd0YS0nw68Se1XlzbibZYoKX3ouc9GtFvjql4O6lSmDczAHE96OhPJupNUH7IOtUh 569MPH6Varab2Egn0CC5aK1chI5mmXo19GfUMPKlA5W8Wbk2xRCEJz/vQxF5DupZDoSc VyNeLYXQe+JUXmvqO5lm36UG4iiXjft1YKQiY= MIME-Version: 1.0 Received: by 10.213.53.71 with SMTP id l7mr431814ebg.10.1266004871271; Fri, 12 Feb 2010 12:01:11 -0800 (PST) In-Reply-To: <4B7594D3.6040304@sandeen.net> References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <4B75738D.80108@sandeen.net> <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> <2d460de71002120902g3bda548t4e202dfe43a0c742@mail.gmail.com> <4B7594D3.6040304@sandeen.net> Date: Fri, 12 Feb 2010 21:01:11 +0100 Message-ID: <2d460de71002121201q224d3bc8xe48089eccdf6f6a@mail.gmail.com> X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now From: Richard Hartmann To: Eric Sandeen Cc: Nicolas Stransky , linux-xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ew0-f227.google.com[209.85.219.227] X-Barracuda-Start-Time: 1266004877 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.22368 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 Fri, Feb 12, 2010 at 18:50, Eric Sandeen wrote: > hard to say without knowing for sure what version you're using, and > what exactly "this" is that you're seeing :) 3.0.4 - I stated that in another subthread so it might have gotten lost. > Providing an xfs_metadump of the corrupted fs that hangs repair > is also about the best thing you could do for investigation, > if you've already determined that the latest release doesn't help. http://dediserver.eu/misc/mailstore_metadata_obscured__after_xfs_repair_hang.bz2 http://dediserver.eu/misc/mailstore_metadata_obscured.bz2 These logs will stay up for at least a week or three. Richard From bfields@fieldses.org Fri Feb 12 14:02:14 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CK2EJC020796 for ; Fri, 12 Feb 2010 14:02:14 -0600 X-ASG-Debug-ID: 1266005008-62b202a00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from fieldses.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7F1DB13A3CBE; Fri, 12 Feb 2010 12:03:28 -0800 (PST) Received: from fieldses.org (fieldses.org [174.143.236.118]) by cuda.sgi.com with ESMTP id YAkWIPj0XyflsZs0; Fri, 12 Feb 2010 12:03:28 -0800 (PST) Received: from bfields by fieldses.org with local (Exim 4.69) (envelope-from ) id 1Ng1k7-00069J-HA; Fri, 12 Feb 2010 15:03:59 -0500 Date: Fri, 12 Feb 2010 15:03:59 -0500 From: "J. Bruce Fields" To: bpm@sgi.com Cc: Christoph Hellwig , Alex Elder , linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Subject: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Message-ID: <20100212200359.GA23361@fieldses.org> References: <20100211220454.26466.37578.stgit@case> <20100211220505.26466.99037.stgit@case> <1265986006.3201.112.camel@doink1> <20100212174706.GB22633@infradead.org> <20100212195647.GQ23654@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100212195647.GQ23654@sgi.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: fieldses.org[174.143.236.118] X-Barracuda-Start-Time: 1266005009 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22368 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, Feb 12, 2010 at 01:56:47PM -0600, bpm@sgi.com wrote: > On Fri, Feb 12, 2010 at 12:47:07PM -0500, Christoph Hellwig wrote: > > if we care enough about the returned error. But Ben is working against > > the NFS tree which doesn't have that change yet. > > > > We can deal with that by either commiting the old variant to the nfs > > tree and then leaving sending Stephen a patch to fix it up in -next, > > or just not apply the xfs commit_metadata implementation yet, and wait > > for it until both the xfs and nfs trees have hit mainline. Assuming the xfs tree's something stable, I could also just go ahead and pull it into the nfsd tree. (Or we could do it the other way around--as long as when the merge window opens we try to send the pull requests in the same order.) --b. From sandeen@sandeen.net Fri Feb 12 14:09:57 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CK9vAw021841 for ; Fri, 12 Feb 2010 14:09:57 -0600 X-ASG-Debug-ID: 1266005471-5123038b0000-w1Z2WR 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 95A6F1CBAC9 for ; Fri, 12 Feb 2010 12:11:11 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id SDwtHCZUW4rquqnH for ; Fri, 12 Feb 2010 12:11:11 -0800 (PST) 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 75ABC10CF868; Fri, 12 Feb 2010 14:11:11 -0600 (CST) Message-ID: <4B75B5DF.2050407@sandeen.net> Date: Fri, 12 Feb 2010 14:11:11 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Richard Hartmann CC: linux-xfs@oss.sgi.com, Nicolas Stransky X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <4B75738D.80108@sandeen.net> <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> <2d460de71002120902g3bda548t4e202dfe43a0c742@mail.gmail.com> <4B7594D3.6040304@sandeen.net> <2d460de71002121201q224d3bc8xe48089eccdf6f6a@mail.gmail.com> In-Reply-To: <2d460de71002121201q224d3bc8xe48089eccdf6f6a@mail.gmail.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: 1266005472 X-Barracuda-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.22369 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 Richard Hartmann wrote: > On Fri, Feb 12, 2010 at 18:50, Eric Sandeen wrote: > >> hard to say without knowing for sure what version you're using, and >> what exactly "this" is that you're seeing :) > > 3.0.4 - I stated that in another subthread so it might have gotten lost. That question was for Nicolas ;) -Eric From sandeen@sandeen.net Fri Feb 12 14:27:52 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CKRqoL023799 for ; Fri, 12 Feb 2010 14:27:52 -0600 X-ASG-Debug-ID: 1266006546-08a203e20000-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 8F23D1CC8D99 for ; Fri, 12 Feb 2010 12:29:06 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id jbprLY68M8XfGqeV for ; Fri, 12 Feb 2010 12:29:06 -0800 (PST) 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 A5E4510CF864; Fri, 12 Feb 2010 14:29:06 -0600 (CST) Message-ID: <4B75BA12.1060704@sandeen.net> Date: Fri, 12 Feb 2010 14:29:06 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: C Linus Hicks CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair doesn't fix sb versionnum missing attr Subject: Re: xfs_repair doesn't fix sb versionnum missing attr References: <1265996674.7755.7.camel@lh10.linush.net> In-Reply-To: <1265996674.7755.7.camel@lh10.linush.net> 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: 1266006547 X-Barracuda-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.22371 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 C Linus Hicks wrote: > I run: > > xfs_check /dev/sdc10 > > And it reports: > > sb versionnum missing attr bit 10 > > Then I run: > > xfs_repair /dev/sdc10 > > And it reports output from 7 phases and "done". > > Again I run: > > xfs_check /dev/sdc10 > > And it reports: > > sb versionnum missing attr bit 10 > > Is this how it's supposed to work? > Thanks for any help. > Linus > I've never seen that before. This might be interesting to see: # xfs_db /dev/sdc10 xfs_db> sb 0 xfs_db> version If you want to send me a zipped-up, obfuscated metadump of the filesystem I could take a quick look. -Eric From sgi-linux-xfs@lo.gmane.org Fri Feb 12 14:30:03 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_210,J_CHICKENPOX_41 autolearn=no version=3.3.0-rupdated 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 o1CKU2no024066 for ; Fri, 12 Feb 2010 14:30:03 -0600 X-ASG-Debug-ID: 1266006676-5c5e033a0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lo.gmane.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C00A313A48CE for ; Fri, 12 Feb 2010 12:31:16 -0800 (PST) Received: from lo.gmane.org (lo.gmane.org [80.91.229.12]) by cuda.sgi.com with ESMTP id OHn6k7JE8ia2xQL0 for ; Fri, 12 Feb 2010 12:31:16 -0800 (PST) Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1Ng2AV-0008OA-N3 for linux-xfs@oss.sgi.com; Fri, 12 Feb 2010 21:31:15 +0100 Received: from vm15c-113.broadinstitute.org ([69.173.114.122]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 12 Feb 2010 21:31:15 +0100 Received: from nico by vm15c-113.broadinstitute.org with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 12 Feb 2010 21:31:15 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com From: Nicolas Stransky X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Date: Fri, 12 Feb 2010 15:30:54 -0500 Lines: 71 Message-ID: References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <4B75738D.80108@sandeen.net> <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> <2d460de71002120902g3bda548t4e202dfe43a0c742@mail.gmail.com> <4B7594D3.6040304@sandeen.net> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: vm15c-113.broadinstitute.org User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.8) Gecko/20100212 Shredder/3.0.2pre In-Reply-To: Sender: news X-Barracuda-Connect: lo.gmane.org[80.91.229.12] X-Barracuda-Start-Time: 1266006677 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22370 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 -P option allowed me to complete xfs_repair successfully, but it also deleted almost everything on the filesystem... A directory that I could mount -o ro,norecovery before, with tens of GB of data in it, is now empty... That is really too bad. Thanks for your help. On 2/12/10 1:16 PM, Nicolas Stransky wrote: > Right :) > I'm using xfsprogs 3.1.0, on Debian Lenny, because 3.1.1 fails to build > for some reason. > I've been trying to repair a 1.4TB filesystem for more than a week, > without success. xfs_repair never completes. I straced the stuck process > today and got: > Process 28510 attached - interrupt to quit > futex(0x429cb58, FUTEX_WAIT_PRIVATE, 2, NULL > > I'm running xfs_repair -P -t5 -m500 /dev/sda1 because the machine only > has 2GB of RAM and was swapping like crazy. I'll see how it goes with > the -P option. > > I'm happy to provide xfs_metadump if this still hangs! > > Thanks, > Nico > > On 2/12/10 12:50 PM, Eric Sandeen wrote: >> Nicolas Stransky wrote: >>> I'm running into the same problem exactly, except that it's not 10 >>> minutes, but DAYS. >>> >>> What is the version that fixes this? >> >> hard to say without knowing for sure what version you're using, and >> what exactly "this" is that you're seeing :) >> >> Providing an xfs_metadump of the corrupted fs that hangs repair >> is also about the best thing you could do for investigation, >> if you've already determined that the latest release doesn't help. >> >> -Eric >> >>> Thanks >>> >>> On 2/12/10 12:02 PM, Richard Hartmann wrote: >>>> On Fri, Feb 12, 2010 at 17:45, Richard Hartmann >>>> wrote: >>>> >>>>> I thought about that, but I fear that I will flood my terminal off with crap >>>>> and/or that I somehow impair xfs_repair while doing so. >>>> Running it for ten minutes gives me: >>>> >>>> root@grml ~ # strace -p13629 >>>> Process 13629 attached - interrupt to quit >>>> futex(0xa381b4cc, FUTEX_WAIT_PRIVATE, 2, NULL^C >>>> Process 13629 detached >>>> root@grml ~ # >>> >>> >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >> > > -- Nico From BATV+f8d98581e68b70e8387d+2364+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 12 14:34:45 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CKYing024757 for ; Fri, 12 Feb 2010 14:34:45 -0600 X-ASG-Debug-ID: 1266006960-12f0007f0000-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 3E8001CC8E04; Fri, 12 Feb 2010 12:36:00 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id RObFgl9Ur7sICZ00; Fri, 12 Feb 2010 12:36:00 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Ng2F5-0008DX-EX; Fri, 12 Feb 2010 20:35:59 +0000 Date: Fri, 12 Feb 2010 15:35:59 -0500 From: Christoph Hellwig To: bpm@sgi.com Cc: Christoph Hellwig , Alex Elder , bfields@fieldses.org, linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Subject: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Message-ID: <20100212203559.GA28731@infradead.org> References: <20100211220454.26466.37578.stgit@case> <20100211220505.26466.99037.stgit@case> <1265986006.3201.112.camel@doink1> <20100212174706.GB22633@infradead.org> <20100212195647.GQ23654@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100212195647.GQ23654@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: 1266006960 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, Feb 12, 2010 at 01:56:47PM -0600, bpm@sgi.com wrote: > I chose not implement that suggestion because I prefer not to rely upon > the coincidence that the child be modified last and synced first in > knfsd. It does ot rely on that coincidence for correctness, just for a small performance optimization. > It is better that the intent of the patch be clear, and that > filesystems other than xfs also have enough information to sort out how > to sync more efficiently. knfsd shouldn't be forced to sync in a > specific order just because that's what works best for xfs. Or, mebbe > it should and I'm being thick. ;) The order of parent and child only happens in the create case where NFS does a separate ->setattr call. For all the operations handled by the filesystem parent and child are in the same transaction for every transactional filesystem. > > This keeps the calling convention quite a bit simpler, > > and also means we don't have to bother with locking two inodes or lsn > > comparisms. > > Don't need the ilock to check pincount? Ah sorry, that should have read not bothering with locking two inodes at the same time, which always is a bit troublesome. We do need to lock the inode for looking at the pincount. > > We can deal with that by either commiting the old variant to the nfs > > tree and then leaving sending Stephen a patch to fix it up in -next, > > or just not apply the xfs commit_metadata implementation yet, and wait > > for it until both the xfs and nfs trees have hit mainline. > > Yeah. I don't know who Stephen is. Stephen Rothwell is the maintainer of the linux-next tree. From BATV+f8d98581e68b70e8387d+2364+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 12 14:35:47 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CKZkjP024890 for ; Fri, 12 Feb 2010 14:35:46 -0600 X-ASG-Debug-ID: 1266007021-5c5d036c0000-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 2C31A13A3D09; Fri, 12 Feb 2010 12:37:01 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id UAJQZGEIjm7HiFR1; Fri, 12 Feb 2010 12:37:01 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Ng2G5-0008R8-7d; Fri, 12 Feb 2010 20:37:01 +0000 Date: Fri, 12 Feb 2010 15:37:01 -0500 From: Christoph Hellwig To: "J. Bruce Fields" Cc: bpm@sgi.com, Christoph Hellwig , Alex Elder , linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Subject: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Message-ID: <20100212203701.GB28731@infradead.org> References: <20100211220454.26466.37578.stgit@case> <20100211220505.26466.99037.stgit@case> <1265986006.3201.112.camel@doink1> <20100212174706.GB22633@infradead.org> <20100212195647.GQ23654@sgi.com> <20100212200359.GA23361@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100212200359.GA23361@fieldses.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: 1266007022 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, Feb 12, 2010 at 03:03:59PM -0500, J. Bruce Fields wrote: > Assuming the xfs tree's something stable, I could also just go ahead and > pull it into the nfsd tree. > > (Or we could do it the other way around--as long as when the merge > window opens we try to send the pull requests in the same order.) The xfs tree is supposed to be stable and we only had very few incidents where a patch had to be pulled again. But it's also a quite large set of changes. From richih.mailinglist@gmail.com Fri Feb 12 14:37:56 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_210 autolearn=no version=3.3.0-rupdated 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 o1CKbtPo025130 for ; Fri, 12 Feb 2010 14:37:55 -0600 X-ASG-Debug-ID: 1266007150-67ff02f90000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ew0-f227.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 55D9D1CBE8F for ; Fri, 12 Feb 2010 12:39:10 -0800 (PST) Received: from mail-ew0-f227.google.com (mail-ew0-f227.google.com [209.85.219.227]) by cuda.sgi.com with ESMTP id xtBE02iUSljCdro9 for ; Fri, 12 Feb 2010 12:39:10 -0800 (PST) Received: by ewy27 with SMTP id 27so3041666ewy.18 for ; Fri, 12 Feb 2010 12:39:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type; bh=KSGzsAv0EizXL/HS+rWQNBqXiK0uG2VL1+ySEy7/bFU=; b=uBjlnNDPBMeZLiXwvteI6KMBpGpyvQ4/Bk9ytZA215lzwudSP9vqTr3PmWp3UxmIuH QM2kMfZPz9nWGGXWk1FD+ftUrDTVNkW/QbKseE5MIOohUAuyNJEMXiTXsOofdlMcjPFV UXDx0s6UPAWcdL+FY6y3M26nMuY5Qlu1BzJiY= 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=Nse10IrlAjak3uezVPM1CYK4ZO+K7ks92ME601uL3MvfWGVMqBgNZMs6nwnPG0Vrx2 QdIpYdRdY3/8FqDMoFjMTJlBQ3sHCJViGiqf0gYox1lTr7jkgcVwgr+lu5OCus8PwHI6 UCr7Eu06UTH1FXYaTkNMHtEb9kQmkVwbHElRg= MIME-Version: 1.0 Received: by 10.213.109.91 with SMTP id i27mr1359297ebp.90.1266007149643; Fri, 12 Feb 2010 12:39:09 -0800 (PST) In-Reply-To: References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <4B75738D.80108@sandeen.net> <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> <2d460de71002120902g3bda548t4e202dfe43a0c742@mail.gmail.com> <4B7594D3.6040304@sandeen.net> Date: Fri, 12 Feb 2010 21:39:09 +0100 Message-ID: <2d460de71002121239y42ec9671id5e147e9709e42ac@mail.gmail.com> X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now From: Richard Hartmann To: Nicolas Stransky Cc: linux-xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ew0-f227.google.com[209.85.219.227] X-Barracuda-Start-Time: 1266007151 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0440 1.0000 -1.7378 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.22371 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 Fri, Feb 12, 2010 at 21:30, Nicolas Stransky wrote: > The -P option allowed me to complete xfs_repair successfully, but it > also deleted almost everything on the filesystem... A directory that I > could mount -o ro,norecovery before, with tens of GB of data in it, is > now empty... That is really too bad. Do you still have a backup of the raw disk? Richard From linush@verizon.net Fri Feb 12 14:46:31 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CKkUPh026197 for ; Fri, 12 Feb 2010 14:46:31 -0600 X-ASG-Debug-ID: 1266007665-3365019e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from vms173019pub.verizon.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 24EE913A4571 for ; Fri, 12 Feb 2010 12:47:45 -0800 (PST) Received: from vms173019pub.verizon.net (vms173019pub.verizon.net [206.46.173.19]) by cuda.sgi.com with ESMTP id CWpNEHBVKXpF8lib for ; Fri, 12 Feb 2010 12:47:45 -0800 (PST) Received: from [192.168.10.2] ([unknown] [98.114.168.230]) by vms173019.mailsrvcs.net (Sun Java(tm) System Messaging Server 7u2-7.02 32bit (built Apr 16 2009)) with ESMTPA id <0KXQ000YAXR5CQ83@vms173019.mailsrvcs.net> for xfs@oss.sgi.com; Fri, 12 Feb 2010 14:47:30 -0600 (CST) X-ASG-Orig-Subj: Re: xfs_repair doesn't fix sb versionnum missing attr Subject: Re: xfs_repair doesn't fix sb versionnum missing attr From: C Linus Hicks To: Eric Sandeen Cc: xfs@oss.sgi.com In-reply-to: <4B75BA12.1060704@sandeen.net> References: <1265996674.7755.7.camel@lh10.linush.net> <4B75BA12.1060704@sandeen.net> Content-type: text/plain Date: Fri, 12 Feb 2010 15:47:29 -0500 Message-id: <1266007649.7755.12.camel@lh10.linush.net> MIME-version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-8.el5_2.3) Content-transfer-encoding: 7bit X-Barracuda-Connect: vms173019pub.verizon.net[206.46.173.19] X-Barracuda-Start-Time: 1266007666 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22372 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-02-12 at 14:29 -0600, Eric Sandeen wrote: > C Linus Hicks wrote: > > I run: > > > > xfs_check /dev/sdc10 > > > > And it reports: > > > > sb versionnum missing attr bit 10 > > > > Then I run: > > > > xfs_repair /dev/sdc10 > > > > And it reports output from 7 phases and "done". > > > > Again I run: > > > > xfs_check /dev/sdc10 > > > > And it reports: > > > > sb versionnum missing attr bit 10 > > > > Is this how it's supposed to work? > > Thanks for any help. > > Linus > > > > I've never seen that before. > > This might be interesting to see: > > # xfs_db /dev/sdc10 > xfs_db> sb 0 > xfs_db> version > > If you want to send me a zipped-up, obfuscated metadump of the filesystem > I could take a quick look. > > -Eric The output from the "version" command: versionnum [0x3084+0x0] = V4,ALIGN,DIRV2,EXTFLG I'll email the metadump directly to you so as not to pollute the list. From sandeen@sandeen.net Fri Feb 12 14:47:24 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_210 autolearn=no version=3.3.0-rupdated 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 o1CKlNkI026326 for ; Fri, 12 Feb 2010 14:47:23 -0600 X-ASG-Debug-ID: 1266007718-680803830000-w1Z2WR 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 DCD041CC0D1 for ; Fri, 12 Feb 2010 12:48:38 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id H1xLKrkdKed8doCh for ; Fri, 12 Feb 2010 12:48:38 -0800 (PST) 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 5562210CF845; Fri, 12 Feb 2010 14:48:38 -0600 (CST) Message-ID: <4B75BEA6.70403@sandeen.net> Date: Fri, 12 Feb 2010 14:48:38 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Nicolas Stransky CC: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <4B75738D.80108@sandeen.net> <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> <2d460de71002120902g3bda548t4e202dfe43a0c742@mail.gmail.com> <4B7594D3.6040304@sandeen.net> 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: 1266007718 X-Barracuda-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.22371 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 Nicolas Stransky wrote: > The -P option allowed me to complete xfs_repair successfully, but it > also deleted almost everything on the filesystem... A directory that I > could mount -o ro,norecovery before, with tens of GB of data in it, is > now empty... That is really too bad. Any idea what happened to the fs - what prompted the repair? Did you save the logs, or a preliminary metadump? I wonder what it found. The files aren't in lost+found/ ? > Thanks for your help. Such as it was, I guess... -Eric From aelder@sgi.com Fri Feb 12 14:48:35 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CKmYkT026463 for ; Fri, 12 Feb 2010 14:48:35 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0A2CD8F8096; Fri, 12 Feb 2010 12:49:46 -0800 (PST) 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 o1CKnjDU024590; Fri, 12 Feb 2010 14:49:45 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o1CKnjAf024589; Fri, 12 Feb 2010 14:49:45 -0600 From: Alex Elder Message-Id: <201002122049.o1CKnjAf024589@stout.americas.sgi.com> Date: Fri, 12 Feb 2010 14:49:45 -0600 To: xfs@oss.sgi.com Subject: [PATCH] xfsprogs: fix some warnings 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 Fix a couple of build warnings. Signed-off-by: Alex Elder --- ltp/fsx.c | 2 +- src/loggen.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) Index: b/ltp/fsx.c =================================================================== --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -1038,7 +1038,7 @@ __aio_rw(int rw, int fd, char *buf, unsi fprintf(stderr, "bad io length: %lu instead of %u\n", res, len); else { - fprintf(stderr, "errcode=%d\n", -res); + fprintf(stderr, "errcode=%ld\n", -res); fprintf(stderr, "aio_rw: async io failed: %s\n", strerror(-res)); ret = res; Index: b/src/loggen.c =================================================================== --- a/src/loggen.c +++ b/src/loggen.c @@ -240,6 +240,7 @@ loggen_empty(int count) blfs.blf_type = XFS_LI_BUF; blfs.blf_size = 2; blfs.blf_flags = XFS_BLI_CANCEL; + blfs.blf_len = 0; blfs.blf_blkno = 1; blfs.blf_map_size = 1; blfs.blf_data_map[0]= 0; From aelder@sgi.com Fri Feb 12 14:55:42 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_84 autolearn=no version=3.3.0-rupdated 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 o1CKtgob027301 for ; Fri, 12 Feb 2010 14:55:42 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 87E0FAC00D; Fri, 12 Feb 2010 12:56:54 -0800 (PST) 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 o1CKurto025551; Fri, 12 Feb 2010 14:56:53 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o1CKuruK025550; Fri, 12 Feb 2010 14:56:53 -0600 From: Alex Elder Message-Id: <201002122056.o1CKuruK025550@stout.americas.sgi.com> Date: Fri, 12 Feb 2010 14:56:53 -0600 To: xfs@oss.sgi.com Subject: [PATCH] dmapi: Fix a build warning 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 Fix a build warning. Signed-off-by: Alex Elder --- libdm/getdents.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) Index: dmapi/libdm/getdents.c =================================================================== --- dmapi.orig/libdm/getdents.c +++ dmapi/libdm/getdents.c @@ -72,7 +72,9 @@ extern int __have_no_getdents64; # endif #endif -#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#ifndef offsetof +# define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#endif /* ! offsetof */ /* For Linux we need a special version of this file since the From aelder@sgi.com Fri Feb 12 14:57:17 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CKvHYA027523 for ; Fri, 12 Feb 2010 14:57:17 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay2.corp.sgi.com (Postfix) with ESMTP id F2640304098 for ; Fri, 12 Feb 2010 12:58:29 -0800 (PST) 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 o1CKwTSm025740 for ; Fri, 12 Feb 2010 14:58:29 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o1CKwTq6025739 for xfs@oss.sgi.com; Fri, 12 Feb 2010 14:58:29 -0600 From: Alex Elder Message-Id: <201002122058.o1CKwTq6025739@stout.americas.sgi.com> Date: Fri, 12 Feb 2010 14:58:29 -0600 To: xfs@oss.sgi.com Subject: [PATCH] dmapi: digitally sign release tags 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 Arrange for the commit marking a new release to include a "Signed-off-by" line, and have the corresponding tag include a digital signature. Signed-off-by: Alex Elder --- release.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) Index: b/release.sh =================================================================== --- a/release.sh +++ b/release.sh @@ -13,10 +13,10 @@ sed -e "s/${version}.*/${version} (${dat mv doc/CHANGES.tmp doc/CHANGES echo "Commiting CHANGES update to git" -git-commit -a -m "${version} release" +git-commit -s -a -m "${version} release" echo "Tagging git repository" -git-tag v${version} +git tag -s -a -m "${version} release" v${version} echo "Creating source tarball in build/tar/" ./Makepkgs From aelder@sgi.com Fri Feb 12 14:59:45 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CKxiQo027814 for ; Fri, 12 Feb 2010 14:59:45 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3818EAC018; Fri, 12 Feb 2010 13:01:00 -0800 (PST) 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 o1CL0xUE026167; Fri, 12 Feb 2010 15:00:59 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o1CL0xn8026166; Fri, 12 Feb 2010 15:00:59 -0600 From: Alex Elder Message-Id: <201002122100.o1CL0xn8026166@stout.americas.sgi.com> Date: Fri, 12 Feb 2010 15:00:59 -0600 To: xfs@oss.sgi.com Subject: [PATCH] xfsdump: digitally sign release tags 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 Arrange for the commit marking a new release to include a "Signed-off-by" line, and have the corresponding tag include a digital signature. Signed-off-by: Alex Elder --- release.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) Index: b/release.sh =================================================================== --- a/release.sh +++ b/release.sh @@ -13,10 +13,10 @@ sed -e "s/${version}.*/${version} (${dat mv doc/CHANGES.tmp doc/CHANGES echo "Commiting CHANGES update to git" -git-commit -a -m "${version} release" +git commit -s -a -m "${version} release" echo "Tagging git repository" -git-tag v${version} +git tag -s -a -m "${version} release" v${version} echo "Creating source tarball" make dist From aelder@sgi.com Fri Feb 12 15:03:49 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CL3mFH028336 for ; Fri, 12 Feb 2010 15:03:49 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5A9688F8101; Fri, 12 Feb 2010 13:05:01 -0800 (PST) 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 o1CL51gm026683; Fri, 12 Feb 2010 15:05:01 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o1CL51p4026682; Fri, 12 Feb 2010 15:05:01 -0600 From: Alex Elder Message-Id: <201002122105.o1CL51p4026682@stout.americas.sgi.com> Date: Fri, 12 Feb 2010 15:05:01 -0600 To: xfs@oss.sgi.com Subject: [PATCH] xfsprogs: eliminate some build warnings 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 A few minor changes to get rid of some build warnings. Also a gratuitous name change. Signed-off-by: Alex Elder --- db/check.c | 4 ++-- include/xfs_da_btree.h | 2 +- include/xfs_types.h | 2 +- libxfs/xfs_da_btree.c | 9 +++++---- 4 files changed, 9 insertions(+), 8 deletions(-) Index: b/db/check.c =================================================================== --- a/db/check.c +++ b/db/check.c @@ -3059,7 +3059,7 @@ process_leaf_node_dir_v2( xfs_ino_t lino; int nex; xfs_ino_t parent; - int t; + int t = 0; int v; int v2; int x; @@ -3403,7 +3403,7 @@ process_quota( xfs_fileoff_t qbno; char *s = NULL; int scicb; - int t; + int t = 0; switch (qtype) { case IS_USER_QUOTA: Index: b/include/xfs_da_btree.h =================================================================== --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -251,7 +251,7 @@ xfs_daddr_t xfs_da_reada_buf(struct xfs_ int xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, xfs_dabuf_t *dead_buf); -uint xfs_da_hashname(const uchar_t *name_string, int name_length); +uint xfs_da_hashname(const char *name_string, int name_length); enum xfs_dacmp xfs_da_compname(struct xfs_da_args *args, const char *name, int len); Index: b/include/xfs_types.h =================================================================== --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -161,7 +161,7 @@ typedef enum { } xfs_btnum_t; struct xfs_name { - const char *name; + const uchar_t *name; int len; }; Index: b/libxfs/xfs_da_btree.c =================================================================== --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -1476,21 +1476,22 @@ xfs_da_path_shift(xfs_da_state_t *state, * This is implemented with some source-level loop unrolling. */ xfs_dahash_t -xfs_da_hashname(const uchar_t *name, int namelen) +xfs_da_hashname(const char *name_string, int name_length) { - xfs_dahash_t hash; + xfs_dahash_t hash; + const uchar_t *name = (const uchar_t *) name_string; /* * Do four characters at a time as long as we can. */ - for (hash = 0; namelen >= 4; namelen -= 4, name += 4) + for (hash = 0; name_length >= 4; name_length -= 4, name += 4) hash = (name[0] << 21) ^ (name[1] << 14) ^ (name[2] << 7) ^ (name[3] << 0) ^ rol32(hash, 7 * 4); /* * Now do the rest of the characters. */ - switch (namelen) { + switch (name_length) { case 3: return (name[0] << 14) ^ (name[1] << 7) ^ (name[2] << 0) ^ rol32(hash, 7 * 3); From BATV+f8d98581e68b70e8387d+2364+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 12 15:22:14 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CLMEaD030844 for ; Fri, 12 Feb 2010 15:22:14 -0600 X-ASG-Debug-ID: 1266009809-6d9401700000-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 256301CBF63; Fri, 12 Feb 2010 13:23:29 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id RfjhxsJVCZ6hfTfV; Fri, 12 Feb 2010 13:23:29 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Ng2z3-0001jk-Bj; Fri, 12 Feb 2010 21:23:29 +0000 Date: Fri, 12 Feb 2010 16:23:29 -0500 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: fix some warnings Subject: Re: [PATCH] xfsprogs: fix some warnings Message-ID: <20100212212329.GA6084@infradead.org> References: <201002122049.o1CKnjAf024589@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201002122049.o1CKnjAf024589@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: 1266009810 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, Feb 12, 2010 at 02:49:45PM -0600, Alex Elder wrote: > Fix a couple of build warnings. > > Signed-off-by: Alex Elder > > --- > ltp/fsx.c | 2 +- > src/loggen.c | 1 + > 2 files changed, 2 insertions(+), 1 deletion(-) Looks good, but it's actually for xfstests, not xfsdump as said in the subject line. Reviewed-by: Christoph Hellwig From BATV+f8d98581e68b70e8387d+2364+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 12 15:22:45 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_84 autolearn=no version=3.3.0-rupdated 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 o1CLMiAI030907 for ; Fri, 12 Feb 2010 15:22:44 -0600 X-ASG-Debug-ID: 1266009839-12ee02720000-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 261841CC8F2C; Fri, 12 Feb 2010 13:24:00 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id nwshPeAriCGYwdnx; Fri, 12 Feb 2010 13:24:00 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Ng2zX-0001nR-Qu; Fri, 12 Feb 2010 21:23:59 +0000 Date: Fri, 12 Feb 2010 16:23:59 -0500 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] dmapi: Fix a build warning Subject: Re: [PATCH] dmapi: Fix a build warning Message-ID: <20100212212359.GB6084@infradead.org> References: <201002122056.o1CKuruK025550@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201002122056.o1CKuruK025550@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: 1266009840 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, Feb 12, 2010 at 02:56:53PM -0600, Alex Elder wrote: > Fix a build warning. > > Signed-off-by: Alex Elder > > --- > libdm/getdents.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > Index: dmapi/libdm/getdents.c > =================================================================== > --- dmapi.orig/libdm/getdents.c > +++ dmapi/libdm/getdents.c > @@ -72,7 +72,9 @@ extern int __have_no_getdents64; > # endif > #endif > > -#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) > +#ifndef offsetof > +# define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) > +#endif /* ! offsetof */ Looks fine, but as we really should have offsetoff we might just kill it entirely. Reviewed-by: Christoph Hellwig From BATV+f8d98581e68b70e8387d+2364+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 12 15:23:16 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CLNFCp030972 for ; Fri, 12 Feb 2010 15:23:16 -0600 X-ASG-Debug-ID: 1266009871-6d8101660000-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 76BB31CC11F; Fri, 12 Feb 2010 13:24:31 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id vErEldGA1mvDyOhP; Fri, 12 Feb 2010 13:24:31 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Ng303-0001rn-5s; Fri, 12 Feb 2010 21:24:31 +0000 Date: Fri, 12 Feb 2010 16:24:31 -0500 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] dmapi: digitally sign release tags Subject: Re: [PATCH] dmapi: digitally sign release tags Message-ID: <20100212212431.GC6084@infradead.org> References: <201002122058.o1CKwTq6025739@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201002122058.o1CKwTq6025739@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: 1266009871 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, Feb 12, 2010 at 02:58:29PM -0600, Alex Elder wrote: > Arrange for the commit marking a new release to include a > "Signed-off-by" line, and have the corresponding tag include > a digital signature. > > Signed-off-by: Alex Elder Looks good, Reviewed-by: Christoph Hellwig If you start carding about dmapi there are a lot of build system updates that it still needs to pick up from xfsprogs. From BATV+f8d98581e68b70e8387d+2364+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 12 15:23:33 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CLNXLc031026 for ; Fri, 12 Feb 2010 15:23:33 -0600 X-ASG-Debug-ID: 1266009889-12f002c70000-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 301B11CC8F3C; Fri, 12 Feb 2010 13:24:49 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id HAy4xauJovo0aTCB; Fri, 12 Feb 2010 13:24:49 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Ng30K-0001uS-S8; Fri, 12 Feb 2010 21:24:48 +0000 Date: Fri, 12 Feb 2010 16:24:48 -0500 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsdump: digitally sign release tags Subject: Re: [PATCH] xfsdump: digitally sign release tags Message-ID: <20100212212448.GD6084@infradead.org> References: <201002122100.o1CL0xn8026166@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201002122100.o1CL0xn8026166@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: 1266009889 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, Feb 12, 2010 at 03:00:59PM -0600, Alex Elder wrote: > Arrange for the commit marking a new release to include a > "Signed-off-by" line, and have the corresponding tag include > a digital signature. > > Signed-off-by: Alex Elder Looks good, Reviewed-by: Christoph Hellwig From BATV+f8d98581e68b70e8387d+2364+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 12 15:25:07 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CLP7pr031187 for ; Fri, 12 Feb 2010 15:25:07 -0600 X-ASG-Debug-ID: 1266009982-292f01550000-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 990311CC8F53; Fri, 12 Feb 2010 13:26:22 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Gg3O8x5Y6gq0Jpye; Fri, 12 Feb 2010 13:26:22 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Ng31q-0002ZF-9r; Fri, 12 Feb 2010 21:26:22 +0000 Date: Fri, 12 Feb 2010 16:26:22 -0500 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: eliminate some build warnings Subject: Re: [PATCH] xfsprogs: eliminate some build warnings Message-ID: <20100212212622.GE6084@infradead.org> References: <201002122105.o1CL51p4026682@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201002122105.o1CL51p4026682@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: 1266009982 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, Feb 12, 2010 at 03:05:01PM -0600, Alex Elder wrote: > A few minor changes to get rid of some build warnings. > Also a gratuitous name change. > > Signed-off-by: Alex Elder Except for the db/check.c hunks these are files shared with the kernel, and changes should be done to the kernel files first and then resynced. I've started a resync of the kernel code with libxfs, but it's actually a lot of work, mostly due to the tracing changes on the kernel side. From sandeen@sandeen.net Fri Feb 12 15:28:23 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CLSMH6031530 for ; Fri, 12 Feb 2010 15:28:23 -0600 X-ASG-Debug-ID: 1266010177-6d8201bd0000-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 4B0171CC174 for ; Fri, 12 Feb 2010 13:29:37 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id 3wStXrvqiG6xDcXq for ; Fri, 12 Feb 2010 13:29:37 -0800 (PST) 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 8F29D10CF85F; Fri, 12 Feb 2010 15:29:37 -0600 (CST) Message-ID: <4B75C841.3010105@sandeen.net> Date: Fri, 12 Feb 2010 15:29:37 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: C Linus Hicks CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair doesn't fix sb versionnum missing attr Subject: Re: xfs_repair doesn't fix sb versionnum missing attr References: <1265996674.7755.7.camel@lh10.linush.net> <4B75BA12.1060704@sandeen.net> <1266007649.7755.12.camel@lh10.linush.net> In-Reply-To: <1266007649.7755.12.camel@lh10.linush.net> 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: 1266010178 X-Barracuda-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.22374 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 C Linus Hicks wrote: > On Fri, 2010-02-12 at 14:29 -0600, Eric Sandeen wrote: >> C Linus Hicks wrote: >>> I run: >>> >>> xfs_check /dev/sdc10 >>> >>> And it reports: >>> >>> sb versionnum missing attr bit 10 >>> >>> Then I run: >>> >>> xfs_repair /dev/sdc10 >>> >>> And it reports output from 7 phases and "done". >>> >>> Again I run: >>> >>> xfs_check /dev/sdc10 >>> >>> And it reports: >>> >>> sb versionnum missing attr bit 10 >>> >>> Is this how it's supposed to work? >>> Thanks for any help. >>> Linus >>> >> I've never seen that before. >> >> This might be interesting to see: >> >> # xfs_db /dev/sdc10 >> xfs_db> sb 0 >> xfs_db> version >> >> If you want to send me a zipped-up, obfuscated metadump of the filesystem >> I could take a quick look. >> >> -Eric > > The output from the "version" command: > > versionnum [0x3084+0x0] = V4,ALIGN,DIRV2,EXTFLG > > I'll email the metadump directly to you so as not to pollute the list. Ok so a little less mystery here; I was concerned about how we got here, but Linus had to manually reconstruct his superblock, hence the missing flags. Looks like there are selinux attributes on all the files, so of course the sb should have the attr flags set. This does look like one test that check has and repair doesn't. yep! Linus, FWIW simply creating a new file on the fs with xattrs (any old file works if selinux is on) will set the flags as if it were the first file created w/ an attr... [root@host Linus-repair-bug]# xfs_check sdc10-md.log.img sb versionnum missing attr bit 10 [root@host Linus-repair-bug]# mount -o loop sdc10-md.log.img mnt/ [root@host Linus-repair-bug]# echo foobar > mnt/blah [root@host Linus-repair-bug]# ls -Z mnt/blah -rw-r--r-- root root root:object_r:file_t mnt/blah [root@host Linus-repair-bug]# umount mnt [root@host Linus-repair-bug]# xfs_check sdc10-md.log.img [root@host Linus-repair-bug]# I suppose that check should get added to repair though. Care to file a bug so it doesn't get lost? -Eric From aelder@sgi.com Fri Feb 12 15:44:11 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CLiAv6033555 for ; Fri, 12 Feb 2010 15:44:11 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8EE4130408B; Fri, 12 Feb 2010 13:45:23 -0800 (PST) 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 o1CLjNLo028236; Fri, 12 Feb 2010 15:45:23 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o1CLjMRf028235; Fri, 12 Feb 2010 15:45:22 -0600 From: Alex Elder Message-Id: <201002122145.o1CLjMRf028235@stout.americas.sgi.com> Date: Fri, 12 Feb 2010 15:45:22 -0600 To: xfs@oss.sgi.com Subject: [PATCH] xfstests: clean up dmapi Makefile 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 The Makefile for the dmapi subdirectory gets generated by the build process. It should be cleaned up when doing a distclean. Signed-off-by: Alex Elder --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) Index: b/Makefile =================================================================== --- a/Makefile +++ b/Makefile @@ -99,3 +99,7 @@ install-dev install-lib: realclean distclean: clean rm -f $(LDIRT) $(CONFIGURE) rm -rf autom4te.cache Logs +ifeq ($(HAVE_DMAPI), true) + rm -f $(DMAPI_MAKEFILE) +endif + From linush@verizon.net Fri Feb 12 15:50:01 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CLo0VP034235 for ; Fri, 12 Feb 2010 15:50:01 -0600 X-ASG-Debug-ID: 1266011475-7d1701510000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from vms173007pub.verizon.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 286751CC2D4 for ; Fri, 12 Feb 2010 13:51:15 -0800 (PST) Received: from vms173007pub.verizon.net (vms173007pub.verizon.net [206.46.173.7]) by cuda.sgi.com with ESMTP id Tf1lVZaVfY5bmzS1 for ; Fri, 12 Feb 2010 13:51:15 -0800 (PST) Received: from [192.168.10.2] ([unknown] [98.114.168.230]) by vms173007.mailsrvcs.net (Sun Java(tm) System Messaging Server 7u2-7.02 32bit (built Apr 16 2009)) with ESMTPA id <0KXR006ZW0P6QZK0@vms173007.mailsrvcs.net> for xfs@oss.sgi.com; Fri, 12 Feb 2010 15:51:06 -0600 (CST) X-ASG-Orig-Subj: Re: xfs_repair doesn't fix sb versionnum missing attr Subject: Re: xfs_repair doesn't fix sb versionnum missing attr From: C Linus Hicks To: Eric Sandeen Cc: xfs@oss.sgi.com In-reply-to: <4B75C841.3010105@sandeen.net> References: <1265996674.7755.7.camel@lh10.linush.net> <4B75BA12.1060704@sandeen.net> <1266007649.7755.12.camel@lh10.linush.net> <4B75C841.3010105@sandeen.net> Content-type: text/plain Date: Fri, 12 Feb 2010 16:51:06 -0500 Message-id: <1266011466.7755.35.camel@lh10.linush.net> MIME-version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-8.el5_2.3) Content-transfer-encoding: 7bit X-Barracuda-Connect: vms173007pub.verizon.net[206.46.173.7] X-Barracuda-Start-Time: 1266011476 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22376 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-02-12 at 15:29 -0600, Eric Sandeen wrote: > C Linus Hicks wrote: > > On Fri, 2010-02-12 at 14:29 -0600, Eric Sandeen wrote: > >> C Linus Hicks wrote: > >>> I run: > >>> > >>> xfs_check /dev/sdc10 > >>> > >>> And it reports: > >>> > >>> sb versionnum missing attr bit 10 > >>> > >>> Then I run: > >>> > >>> xfs_repair /dev/sdc10 > >>> > >>> And it reports output from 7 phases and "done". > >>> > >>> Again I run: > >>> > >>> xfs_check /dev/sdc10 > >>> > >>> And it reports: > >>> > >>> sb versionnum missing attr bit 10 > >>> > >>> Is this how it's supposed to work? > >>> Thanks for any help. > >>> Linus > >>> > >> I've never seen that before. > >> > >> This might be interesting to see: > >> > >> # xfs_db /dev/sdc10 > >> xfs_db> sb 0 > >> xfs_db> version > >> > >> If you want to send me a zipped-up, obfuscated metadump of the filesystem > >> I could take a quick look. > >> > >> -Eric > > > > The output from the "version" command: > > > > versionnum [0x3084+0x0] = V4,ALIGN,DIRV2,EXTFLG > > > > I'll email the metadump directly to you so as not to pollute the list. > > Ok so a little less mystery here; I was concerned about how we got here, > but Linus had to manually reconstruct his superblock, hence the missing > flags. > > Looks like there are selinux attributes on all the files, so of course > the sb should have the attr flags set. > > This does look like one test that check has and repair doesn't. > > > > yep! > > Linus, FWIW simply creating a new file on the fs with xattrs (any > old file works if selinux is on) will set the flags as if it were > the first file created w/ an attr... > > [root@host Linus-repair-bug]# xfs_check sdc10-md.log.img > sb versionnum missing attr bit 10 > [root@host Linus-repair-bug]# mount -o loop sdc10-md.log.img mnt/ > [root@host Linus-repair-bug]# echo foobar > mnt/blah > [root@host Linus-repair-bug]# ls -Z mnt/blah > -rw-r--r-- root root root:object_r:file_t mnt/blah > [root@host Linus-repair-bug]# umount mnt > [root@host Linus-repair-bug]# xfs_check sdc10-md.log.img > [root@host Linus-repair-bug]# > > I suppose that check should get added to repair though. > > Care to file a bug so it doesn't get lost? > > -Eric Sure, I can do that. Linus From aelder@sgi.com Fri Feb 12 15:51:55 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CLptF3034492 for ; Fri, 12 Feb 2010 15:51:55 -0600 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 C8F4DAC012; Fri, 12 Feb 2010 13:53:07 -0800 (PST) Received: from [128.162.232.162] ([128.162.232.162]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 12 Feb 2010 15:53:07 -0600 Subject: Re: [PATCH] xfsprogs: eliminate some build warnings From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20100212212622.GE6084@infradead.org> References: <201002122105.o1CL51p4026682@stout.americas.sgi.com> <20100212212622.GE6084@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Fri, 12 Feb 2010 15:53:06 -0600 Message-ID: <1266011586.1865.16.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 12 Feb 2010 21:53:07.0361 (UTC) FILETIME=[C2B4B910:01CAAC2D] 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-02-12 at 16:26 -0500, Christoph Hellwig wrote: > > Except for the db/check.c hunks these are files shared with the > kernel, > and changes should be done to the kernel files first and then > resynced. > I've started a resync of the kernel code with libxfs, but it's > actually > a lot of work, mostly due to the tracing changes on the kernel side. OK, I'll re-submit without those libxfs changes shortly, and will wait for you (or someone else) to do it right. -Alex From aelder@sgi.com Fri Feb 12 15:52:26 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CLqQHP034571 for ; Fri, 12 Feb 2010 15:52:26 -0600 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 CCA33AC00D; Fri, 12 Feb 2010 13:53:41 -0800 (PST) Received: from [128.162.232.162] ([128.162.232.162]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 12 Feb 2010 15:53:41 -0600 Subject: Re: [PATCH] xfsprogs: fix some warnings From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20100212212329.GA6084@infradead.org> References: <201002122049.o1CKnjAf024589@stout.americas.sgi.com> <20100212212329.GA6084@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Fri, 12 Feb 2010 15:53:40 -0600 Message-ID: <1266011620.1865.17.camel@doink1> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 12 Feb 2010 21:53:41.0393 (UTC) FILETIME=[D6FD9810:01CAAC2D] 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-02-12 at 16:23 -0500, Christoph Hellwig wrote: > On Fri, Feb 12, 2010 at 02:49:45PM -0600, Alex Elder wrote: > > Fix a couple of build warnings. > > > > Signed-off-by: Alex Elder > > > > --- > > ltp/fsx.c | 2 +- > > src/loggen.c | 1 + > > 2 files changed, 2 insertions(+), 1 deletion(-) > > Looks good, but it's actually for xfstests, not xfsdump as said in > the subject line. > > Reviewed-by: Christoph Hellwig I will fix the subject line before I commit. Thanks. -Alex From sandeen@sandeen.net Fri Feb 12 16:18:45 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated 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 o1CMIirX037790 for ; Fri, 12 Feb 2010 16:18:44 -0600 X-ASG-Debug-ID: 1266013197-0cbc02790000-w1Z2WR 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 95D9513A4D69 for ; Fri, 12 Feb 2010 14:19:57 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id E9DCnl5fCxfATXX5 for ; Fri, 12 Feb 2010 14:19:57 -0800 (PST) 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 8956C10CF84C; Fri, 12 Feb 2010 16:19:56 -0600 (CST) Message-ID: <4B75D40C.4000903@sandeen.net> Date: Fri, 12 Feb 2010 16:19:56 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Richard Hartmann CC: linux-xfs@oss.sgi.com, Nicolas Stransky X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <4B75738D.80108@sandeen.net> <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> <2d460de71002120902g3bda548t4e202dfe43a0c742@mail.gmail.com> <4B7594D3.6040304@sandeen.net> <2d460de71002121201q224d3bc8xe48089eccdf6f6a@mail.gmail.com> In-Reply-To: <2d460de71002121201q224d3bc8xe48089eccdf6f6a@mail.gmail.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: 1266013198 X-Barracuda-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.22377 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 Richard Hartmann wrote: > On Fri, Feb 12, 2010 at 18:50, Eric Sandeen wrote: > >> hard to say without knowing for sure what version you're using, and >> what exactly "this" is that you're seeing :) > > 3.0.4 - I stated that in another subthread so it might have gotten lost. > > >> Providing an xfs_metadump of the corrupted fs that hangs repair >> is also about the best thing you could do for investigation, >> if you've already determined that the latest release doesn't help. > > http://dediserver.eu/misc/mailstore_metadata_obscured__after_xfs_repair_hang.bz2 > http://dediserver.eu/misc/mailstore_metadata_obscured.bz2 > > These logs will stay up for at least a week or three. > Ok it's hung in here it seems: (gdb) bt #0 0x0000003df2e0ce74 in __lll_lock_wait () from /lib64/libpthread.so.0 #1 0x0000003df2e08874 in _L_lock_106 () from /lib64/libpthread.so.0 #2 0x0000003df2e082e0 in pthread_mutex_lock () from /lib64/libpthread.so.0 #3 0x00000000004310d9 in libxfs_getbuf (device=, blkno=, len=) at rdwr.c:394 #4 0x000000000043110d in libxfs_readbuf (dev=140518781147480, blkno=128, len=-220135752, flags=-1) at rdwr.c:483 #5 0x0000000000413d94 in da_read_buf (mp=0x7fff54dbcb70, nex=1, bmp=) at dir2.c:110 #6 0x0000000000415b30 in process_block_dir2 (mp=0x7fff54dbcb70, ino=128, dip=0x7fcd14080e00, ino_discovery=1, dino_dirty=, dirname=0x464619 "", parent=0x7fff54dbca10, blkmap=0x1c19dd0, dot=0x7fff54dbc6fc, dotdot=0x7fff54dbc6f8, repair=0x7fff54dbc6f4) at dir2.c:1697 #7 0x00000000004161ac in process_dir2 (mp=0x7fff54dbcb70, ino=128, dip=0x7fcd14080e00, ino_discovery=1, dino_dirty=0x7fff54dbca20, dirname=0x464619 "", parent=0x7fff54dbca10, blkmap=0x1c19dd0) at dir2.c:2084 #8 0x000000000040e422 in process_dinode_int (mp=0x7fff54dbcb70, dino=0x7fcd14080e00, agno=0, ino=128, was_free=0, dirty=0x7fff54dbca20, used=0x7fff54dbca24, verify_mode=0, uncertain=0, ino_discovery=1, check_dups=0, extra_attr_check=1, isa_dir=0x7fff54dbca1c, parent=0x7fff54dbca10) at dinode.c:2661 #9 0x000000000040e79e in process_dinode (mp=0x7fcd1408d958, dino=0x80, agno=4074831544, ino=4294967295, was_free=28730568, dirty=0x464619, used=0x7fff54dbca24, ino_discovery=1, check_dups=0, extra_attr_check=1, isa_dir=0x7fff54dbca1c, parent=0x7fff54dbca10) at dinode.c:2772 #10 0x0000000000408483 in process_inode_chunk (mp=0x7fff54dbcb70, agno=0, num_inos=, first_irec=0x1b77930, ino_discovery=1, check_dups=0, extra_attr_check=1, bogus=0x7fff54dbcaa4) at dino_chunks.c:777 #11 0x0000000000408b22 in process_aginodes (mp=0x7fff54dbcb70, pf_args=0x361bae0, agno=0, ino_discovery=1, check_dups=0, extra_attr_check=1) at dino_chunks.c:1024 #12 0x000000000041a4ef in process_ag_func (wq=0x1d65a00, agno=0, arg=0x361bae0) at phase3.c:154 #13 0x000000000041ab55 in phase3 (mp=0x7fff54dbcb70) at phase3.c:193 #14 0x000000000042d5a1 in main (argc=, argv=) at xfs_repair.c:712 And you're right, it's not progressing. The filesystem is a real mess, but it's also making repair pretty unhappy :) 1st run hangs 2nd run completes with -P next run resets more link counts run after that segfaults :( And just a warning, post-repair about 22% of the files are in lost+found. It'd take a bit of dedicated time to sort out the issues in repair here, we need to do it but somebody's going to hav to find the time ... -Eric From sgi-linux-xfs@lo.gmane.org Fri Feb 12 16:20:57 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_210 autolearn=no version=3.3.0-rupdated 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 o1CMKsU7038064 for ; Fri, 12 Feb 2010 16:20:57 -0600 X-ASG-Debug-ID: 1266013329-720300b10000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lo.gmane.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1E5B51CC9392 for ; Fri, 12 Feb 2010 14:22:09 -0800 (PST) Received: from lo.gmane.org (lo.gmane.org [80.91.229.12]) by cuda.sgi.com with ESMTP id l55GbK2q5htCASzH for ; Fri, 12 Feb 2010 14:22:09 -0800 (PST) Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1Ng3tn-0007rv-9S for linux-xfs@oss.sgi.com; Fri, 12 Feb 2010 23:22:07 +0100 Received: from vm15c-113.broadinstitute.org ([69.173.114.122]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 12 Feb 2010 23:22:07 +0100 Received: from nico by vm15c-113.broadinstitute.org with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 12 Feb 2010 23:22:07 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com From: Nicolas Stransky X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Date: Fri, 12 Feb 2010 17:21:47 -0500 Lines: 13 Message-ID: References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <4B75738D.80108@sandeen.net> <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> <2d460de71002120902g3bda548t4e202dfe43a0c742@mail.gmail.com> <4B7594D3.6040304@sandeen.net> <2d460de71002121239y42ec9671id5e147e9709e42ac@mail.gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: vm15c-113.broadinstitute.org User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.8) Gecko/20100212 Shredder/3.0.2pre In-Reply-To: <2d460de71002121239y42ec9671id5e147e9709e42ac@mail.gmail.com> Sender: news X-Barracuda-Connect: lo.gmane.org[80.91.229.12] X-Barracuda-Start-Time: 1266013330 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.22378 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 2/12/10 3:39 PM, Richard Hartmann wrote: > On Fri, Feb 12, 2010 at 21:30, Nicolas Stransky wrote: >> The -P option allowed me to complete xfs_repair successfully, but it >> also deleted almost everything on the filesystem... A directory that I >> could mount -o ro,norecovery before, with tens of GB of data in it, is >> now empty... That is really too bad. > > Do you still have a backup of the raw disk? Unfortunately I don't. I think it's just lost now. -- Nico From sgi-linux-xfs@lo.gmane.org Fri Feb 12 16:26:37 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_210,J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated 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 o1CMQaOR038785 for ; Fri, 12 Feb 2010 16:26:36 -0600 X-ASG-Debug-ID: 1266013670-7ba700740000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lo.gmane.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F299B1CC939A for ; Fri, 12 Feb 2010 14:27:51 -0800 (PST) Received: from lo.gmane.org (lo.gmane.org [80.91.229.12]) by cuda.sgi.com with ESMTP id coSKkrz2yQBEhGLo for ; Fri, 12 Feb 2010 14:27:51 -0800 (PST) Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1Ng3zK-0003R4-GD for linux-xfs@oss.sgi.com; Fri, 12 Feb 2010 23:27:50 +0100 Received: from vm15c-113.broadinstitute.org ([69.173.114.122]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 12 Feb 2010 23:27:50 +0100 Received: from nico by vm15c-113.broadinstitute.org with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 12 Feb 2010 23:27:50 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com From: Nicolas Stransky X-ASG-Orig-Subj: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Subject: Re: xfs_repair on a 1.5 TiB image has been hanging for about an hour, now Date: Fri, 12 Feb 2010 17:27:30 -0500 Lines: 30 Message-ID: References: <2d460de71002120607g763afc2bt2167fcfbf4664b56@mail.gmail.com> <4B75738D.80108@sandeen.net> <2d460de71002120845ue5b127ex1033b37ae5ff6ba2@mail.gmail.com> <2d460de71002120902g3bda548t4e202dfe43a0c742@mail.gmail.com> <4B7594D3.6040304@sandeen.net> <4B75BEA6.70403@sandeen.net> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: vm15c-113.broadinstitute.org User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.8) Gecko/20100212 Shredder/3.0.2pre In-Reply-To: <4B75BEA6.70403@sandeen.net> Sender: news X-Barracuda-Connect: lo.gmane.org[80.91.229.12] X-Barracuda-Start-Time: 1266013672 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22378 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 2/12/10 3:48 PM, Eric Sandeen wrote: > Nicolas Stransky wrote: >> The -P option allowed me to complete xfs_repair successfully, but it >> also deleted almost everything on the filesystem... A directory that I >> could mount -o ro,norecovery before, with tens of GB of data in it, is >> now empty... That is really too bad. > > Any idea what happened to the fs - what prompted the repair? Yes, it's a RAID 5 array that failed pretty bad due to multiple reboots of the machine. Some disks failed and at some point, the RAID card did stopped to detect some of the disks, or failed to assemble the RAID array correctly. 3ware (LSI) issued a fix that allowed to start the array in degraded mode, but the xfs filesystem seemed in a pretty bad shape at that point. xfs_repair was failing right at the beginning and I had to xfs_repair -L. Then xfs_repair was hanging forever. It's only today, by using -P, that I got it to complete. > Did you save the logs, or a preliminary metadump? No I did not. > I wonder what it found. The files aren't in lost+found/ ? There are tons of gigs of files in lost+found but I can't really sort them and figure out which one is which at this point... Thanks, -- Nico From aelder@sgi.com Fri Feb 12 16:57:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CMvW8V042478 for ; Fri, 12 Feb 2010 16:57:32 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id 74D058F80FC; Fri, 12 Feb 2010 14:58:45 -0800 (PST) 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 o1CMwj5A020024; Fri, 12 Feb 2010 16:58:45 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o1CMwjrG020023; Fri, 12 Feb 2010 16:58:45 -0600 From: Alex Elder Message-Id: <201002122258.o1CMwjrG020023@stout.americas.sgi.com> Date: Fri, 12 Feb 2010 16:58:44 -0600 To: xfs@oss.sgi.com Subject: [PATCH v2] xfsprogs: eliminate some build warnings 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 A few minor changes to get rid of some build warnings. Signed-off-by: Alex Elder --- db/check.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) Index: b/db/check.c =================================================================== --- a/db/check.c +++ b/db/check.c @@ -3059,7 +3059,7 @@ process_leaf_node_dir_v2( xfs_ino_t lino; int nex; xfs_ino_t parent; - int t; + int t = 0; int v; int v2; int x; @@ -3403,7 +3403,7 @@ process_quota( xfs_fileoff_t qbno; char *s = NULL; int scicb; - int t; + int t = 0; switch (qtype) { case IS_USER_QUOTA: From aelder@oss.sgi.com Fri Feb 12 17:33:16 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1CNXF2o047797 for ; Fri, 12 Feb 2010 17:33:15 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o1CNXCch047708; Fri, 12 Feb 2010 17:33:12 -0600 Date: Fri, 12 Feb 2010 17:33:12 -0600 Message-Id: <201002122333.o1CNXCch047708@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-rc4-58-g180040b X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: d5db0f97fbbeff11c88dec1aaf1536a975afbaeb X-Git-Newrev: 180040b89ee2aed88c0a0b1fcf7ada9a512b12e3 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 180040b xfs: optimize log flushing in xfs_fsync 8718551 xfs: only clear the suid bit once in xfs_write 5322892 xfs: kill xfs_bawrite 07fec73 xfs: log changed inodes instead of writing them synchronously e8b217e xfs: remove invalid barrier optimization from xfs_fsync 20026d9 xfs: kill the unused XFS_QMOPT_* flush flags V2 7d6a7bd xfs: Use delay write promotion for dquot flushing 089716a xfs: Sort delayed write buffers before dispatch d808f61 xfs: Don't issue buffer IO direct from AIL push V2 c854363 xfs: Use delayed write for inodes rather than async V2 777df5a xfs: Make inode reclaim states explicit from d5db0f97fbbeff11c88dec1aaf1536a975afbaeb (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 180040b89ee2aed88c0a0b1fcf7ada9a512b12e3 Author: Christoph Hellwig Date: Fri Feb 5 09:57:55 2010 +0000 xfs: optimize log flushing in xfs_fsync If we have a pinned inode it must have a log item attached to it. Usually that log item will have ili_last_lsn already set, in which case we only need to flush the log up to that LSN instead of doing a full log force. This gives speedups of about 5% in some fsync heavy workloads. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit 87185517de81101da5afbc82cefdeed6eeaa38fb Author: Christoph Hellwig Date: Wed Feb 3 19:43:31 2010 +0000 xfs: only clear the suid bit once in xfs_write file_remove_suid already calls into ->setattr to clear the suid and sgid bits if needed, no need to start a second transaction to do it ourselves. Note that xfs_write_clear_setuid issues a sync transaction while the path through ->setattr doesn't, but that is consistant with the other filesystems. Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder Signed-off-by: Alex Elder commit 5322892d867e186c6b4c5fff5c99ea4863696a60 Author: Dave Chinner Date: Thu Feb 4 10:09:14 2010 +1100 xfs: kill xfs_bawrite There are no more users of this function left in the XFS code now that we've switched everything to delayed write flushing. Remove it. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 07fec73625dc0db6f9aed68019918208a2ca53f5 Author: Christoph Hellwig Date: Tue Feb 9 11:43:49 2010 +1100 xfs: log changed inodes instead of writing them synchronously When an inode has already be flushed delayed write, xfs_inode_clean() returns true and hence xfs_fs_write_inode() can return on a synchronous inode write without having written the inode. Currently these sycnhronous writes only come sync(1), unmount, a sycnhronous NFS export and cachefiles so should be relatively rare and out of common performance paths. Realistically, a synchronous inode write is not necessary here; we can avoid writing the inode by logging any non-transactional changes that are pending. This needs to be done with synchronous transactions, but it avoids seeking between the log and inode clusters as we do now. We don't force the log if the inode is pinned, though, so this differs from the fsync case. For normal sys_sync and unmount behaviour this is fine because we do a synchronous log force in xfs_sync_data which is called from the ->sync_fs code. It does however break the NFS synchronous export guarantees for now, but work is under way to fix this at a higher level or for the higher level to provide an additional flag in the writeback control to tell us that a log force is needed. Portions of this patch are based on work from Dave Chinner. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Alex Elder commit e8b217e7530c6a073ac69f1c85b922d93fdf5647 Author: Christoph Hellwig Date: Tue Feb 2 10:16:26 2010 +1100 xfs: remove invalid barrier optimization from xfs_fsync We always need to flush the disk write cache and can't skip it just because the no inode attributes have changed. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 20026d92013d7bb3abb295337191def6758fc086 Author: Dave Chinner Date: Thu Feb 4 09:48:58 2010 +1100 xfs: kill the unused XFS_QMOPT_* flush flags V2 dquots are never flushed asynchronously. Remove the flag and the async write support from the flush function. Make the default flush a delwri flush to make the inode flush code, which leaves the XFS_QMOPT_SYNC the only flag remaining. Convert that to use SYNC_WAIT instead, just like the inode flush code. V2: - just pass flush flags straight through Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 7d6a7bde52e449f21a0e86a7a4955b4e08a49d69 Author: Dave Chinner Date: Tue Jan 26 15:13:41 2010 +1100 xfs: Use delay write promotion for dquot flushing xfs_qm_dqflock_pushbuf_wait() does a very similar trick to item pushing used to do to flush out delayed write dquot buffers. Change it to use the new promotion method rather than an async flush. Also, xfs_qm_dqflock_pushbuf_wait() can return without the flush lock held, yet the callers make the assumption that after this call the flush lock is held. Always return with the flush lock held. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 089716aa1480b7197bcd678b8477774c379a2768 Author: Dave Chinner Date: Tue Jan 26 15:13:25 2010 +1100 xfs: Sort delayed write buffers before dispatch Currently when the xfsbufd writes delayed write buffers, it pushes them to disk in the order they come off the delayed write list. If there are lots of buffers ѕpread widely over the disk, this results in overwhelming the elevator sort queues in the block layer and we end up losing the posibility of merging adjacent buffers to minimise the number of IOs. Use the new generic list_sort function to sort the delwri dispatch queue before issue to ensure that the buffers are pushed in the most friendly order possible to the lower layers. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit d808f617ad00a413585b806de340feda5ad9a2da Author: Dave Chinner Date: Tue Feb 2 10:13:42 2010 +1100 xfs: Don't issue buffer IO direct from AIL push V2 All buffers logged into the AIL are marked as delayed write. When the AIL needs to push the buffer out, it issues an async write of the buffer. This means that IO patterns are dependent on the order of buffers in the AIL. Instead of flushing the buffer, promote the buffer in the delayed write list so that the next time the xfsbufd is run the buffer will be flushed by the xfsbufd. Return the state to the xfsaild that the buffer was promoted so that the xfsaild knows that it needs to cause the xfsbufd to run to flush the buffers that were promoted. Using the xfsbufd for issuing the IO allows us to dispatch all buffer IO from the one queue. This means that we can make much more enlightened decisions on what order to flush buffers to disk as we don't have multiple places issuing IO. Optimisations to xfsbufd will be in a future patch. Version 2 - kill XFS_ITEM_FLUSHING as it is now unused. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit c854363e80b49dd04a4de18ebc379eb8c8806674 Author: Dave Chinner Date: Sat Feb 6 12:39:36 2010 +1100 xfs: Use delayed write for inodes rather than async V2 We currently do background inode flush asynchronously, resulting in inodes being written in whatever order the background writeback issues them. Not only that, there are also blocking and non-blocking asynchronous inode flushes, depending on where the flush comes from. This patch completely removes asynchronous inode writeback. It removes all the strange writeback modes and replaces them with either a synchronous flush or a non-blocking delayed write flush. That is, inode flushes will only issue IO directly if they are synchronous, and background flushing may do nothing if the operation would block (e.g. on a pinned inode or buffer lock). Delayed write flushes will now result in the inode buffer sitting in the delwri queue of the buffer cache to be flushed by either an AIL push or by the xfsbufd timing out the buffer. This will allow accumulation of dirty inode buffers in memory and allow optimisation of inode cluster writeback at the xfsbufd level where we have much greater queue depths than the block layer elevators. We will also get adjacent inode cluster buffer IO merging for free when a later patch in the series allows sorting of the delayed write buffers before dispatch. This effectively means that any inode that is written back by background writeback will be seen as flush locked during AIL pushing, and will result in the buffers being pushed from there. This writeback path is currently non-optimal, but the next patch in the series will fix that problem. A side effect of this delayed write mechanism is that background inode reclaim will no longer directly flush inodes, nor can it wait on the flush lock. The result is that inode reclaim must leave the inode in the reclaimable state until it is clean. Hence attempts to reclaim a dirty inode in the background will simply skip the inode until it is clean and this allows other mechanisms (i.e. xfsbufd) to do more optimal writeback of the dirty buffers. As a result, the inode reclaim code has been rewritten so that it no longer relies on the ambiguous return values of xfs_iflush() to determine whether it is safe to reclaim an inode. Portions of this patch are derived from patches by Christoph Hellwig. Version 2: - cleanup reclaim code as suggested by Christoph - log background reclaim inode flush errors - just pass sync flags to xfs_iflush Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 777df5afdb26c71634edd60582be620ff94e87a0 Author: Dave Chinner Date: Sat Feb 6 12:37:26 2010 +1100 xfs: Make inode reclaim states explicit A.K.A.: don't rely on xfs_iflush() return value in reclaim We have gradually been moving checks out of the reclaim code because they are duplicated in xfs_iflush(). We've had a history of problems in this area, and many of them stem from the overloading of the return values from xfs_iflush() and interaction with inode flush locking to determine if the inode is safe to reclaim. With the desire to move to delayed write flushing of inodes and non-blocking inode tree reclaim walks, the overloading of the return value of xfs_iflush makes it very difficult to determine the correct thing to do next. This patch explicitly re-adds the checks to the inode reclaim code, removing the reliance on the return value of xfs_iflush() to determine what to do next. It also means that we can clearly document all the inode states that reclaim must handle and hence we can easily see that we handled all the necessary cases. This also removes the need for the xfs_inode_clean() check in xfs_iflush() as all callers now check this first (safely). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_buf.c | 135 ++++++++++++++++++++++++++-------------- fs/xfs/linux-2.6/xfs_buf.h | 3 +- fs/xfs/linux-2.6/xfs_lrw.c | 15 +---- fs/xfs/linux-2.6/xfs_super.c | 111 ++++++++++++++++++++++++--------- fs/xfs/linux-2.6/xfs_sync.c | 138 +++++++++++++++++++++++++++++++++------- fs/xfs/linux-2.6/xfs_trace.h | 1 + fs/xfs/quota/xfs_dquot.c | 38 +++++------- fs/xfs/quota/xfs_dquot_item.c | 87 ++++---------------------- fs/xfs/quota/xfs_dquot_item.h | 4 - fs/xfs/quota/xfs_qm.c | 14 ++--- fs/xfs/xfs_buf_item.c | 64 ++++++++++--------- fs/xfs/xfs_inode.c | 86 ++------------------------ fs/xfs/xfs_inode.h | 11 +--- fs/xfs/xfs_inode_item.c | 108 +++++++------------------------- fs/xfs/xfs_inode_item.h | 6 -- fs/xfs/xfs_mount.c | 13 ++++- fs/xfs/xfs_quota.h | 8 +-- fs/xfs/xfs_rw.c | 42 ------------ fs/xfs/xfs_rw.h | 1 - fs/xfs/xfs_trans.h | 3 +- fs/xfs/xfs_trans_ail.c | 13 ++-- fs/xfs/xfs_vnodeops.c | 22 +++---- 22 files changed, 421 insertions(+), 502 deletions(-) hooks/post-receive -- XFS development tree From aelder@sgi.com Sat Feb 13 14:22:42 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_54,J_CHICKENPOX_65,J_CHICKENPOX_66,URIBL_BLACK autolearn=no version=3.3.0-rupdated 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 o1DKMgYl153313 for ; Sat, 13 Feb 2010 14:22:42 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id A007B8F80F1 for ; Sat, 13 Feb 2010 12:23:55 -0800 (PST) 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 o1DKNtbm000700 for ; Sat, 13 Feb 2010 14:23:55 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o1DKNtoC000699 for xfs@oss.sgi.com; Sat, 13 Feb 2010 14:23:55 -0600 From: Alex Elder Message-Id: <201002132023.o1DKNtoC000699@stout.americas.sgi.com> Date: Sat, 13 Feb 2010 14:23:54 -0600 To: xfs@oss.sgi.com Subject: [PATCH] xfstests: remake dependencies only when necessary 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 There's no need to re-make the dependency file all the time. Make it so the "depend" target rebuilds the ".dep" file only if necessary. Also change the name of the dependency file created for "ltdepend" to be ".ltdep". Signed-off-by: Alex Elder --- Makefile | 4 ++-- include/buildrules | 16 +++++++++++----- lib/Makefile | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) Index: b/Makefile =================================================================== --- a/Makefile +++ b/Makefile @@ -27,8 +27,8 @@ endif TESTS = $(shell sed -n -e '/^[0-9][0-9][0-9]*/s/ .*//p' group) CONFIGURE = configure include/builddefs include/config.h LSRCFILES = configure configure.in aclocal.m4 README VERSION -LDIRT = config.log .dep config.status config.cache confdefs.h conftest* \ - check.log check.time +LDIRT = config.log .ltdep .dep config.status config.cache confdefs.h \ + conftest* check.log check.time ifeq ($(HAVE_DMAPI), true) DMAPI_MAKEFILE = dmapi/Makefile Index: b/include/buildrules =================================================================== --- a/include/buildrules +++ b/include/buildrules @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs clean clobber : $(addsuffix -clean,$(SUBDIRS)) $(Q)rm -f $(DIRT) - $(Q)rm -fr .libs .dep + $(Q)rm -fr .libs .ltdep .dep %-clean: @echo "Cleaning $*" @@ -75,11 +75,17 @@ $(_FORCE): MAKEDEP := $(MAKEDEPEND) $(CFLAGS) -ltdepend: $(CFILES) $(HFILES) +ltdepend: .ltdep + +.ltdep: $(CFILES) $(HFILES) @echo " [DEP]" - $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' > .dep + $(Q)[ -n "$(CFILES)" ] && \ + $(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' > .ltdep + +depend: .dep -depend: $(CFILES) $(HFILES) +.dep: $(CFILES) $(HFILES) @echo " [DEP]" - $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1,' > .dep + $(Q)[ -n "$(CFILES)" ] && \ + $(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1,' > .dep Index: b/lib/Makefile =================================================================== --- a/lib/Makefile +++ b/lib/Makefile @@ -25,4 +25,4 @@ include $(BUILDRULES) install install-dev: default --include .dep +-include .ltdep From aelder@sgi.com Sat Feb 13 14:22:52 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.4 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_63,J_CHICKENPOX_65,J_CHICKENPOX_66,URIBL_BLACK autolearn=no version=3.3.0-rupdated 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 o1DKMpCt153340 for ; Sat, 13 Feb 2010 14:22:52 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 144DAAC010 for ; Sat, 13 Feb 2010 12:24:05 -0800 (PST) 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 o1DKO4RY000705 for ; Sat, 13 Feb 2010 14:24:04 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o1DKO4Uw000704 for xfs@oss.sgi.com; Sat, 13 Feb 2010 14:24:04 -0600 From: Alex Elder Message-Id: <201002132024.o1DKO4Uw000704@stout.americas.sgi.com> Date: Sat, 13 Feb 2010 14:24:04 -0600 To: xfs@oss.sgi.com Subject: [PATCH] xfsprogs: remake dependencies only when necessary 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 There's no need to re-make the dependency file all the time. Make it so the "depend" target rebuilds the ".dep" file only if necessary. Also change the name of the dependency file created for "ltdepend" to be ".ltdep". Signed-off-by: Alex Elder --- Makefile | 6 +++--- include/buildrules | 12 ++++++++---- libdisk/Makefile | 2 +- libhandle/Makefile | 2 +- libxcmd/Makefile | 2 +- libxfs/Makefile | 2 +- libxlog/Makefile | 2 +- 7 files changed, 16 insertions(+), 12 deletions(-) Index: b/Makefile =================================================================== --- a/Makefile +++ b/Makefile @@ -30,9 +30,9 @@ SRCTAR = $(PKG_NAME)-$(PKG_VERSION).tar. CONFIGURE = aclocal.m4 configure config.guess config.sub install-sh ltmain.sh LSRCFILES = configure.in release.sh README VERSION $(CONFIGURE) -LDIRT = config.log .dep config.status config.cache confdefs.h conftest* \ - built .census install.* install-dev.* *.gz autom4te.cache/* libtool \ - include/builddefs include/platform_defs.h +LDIRT = config.log .ltdep .dep config.status config.cache confdefs.h \ + conftest* built .census install.* install-dev.* *.gz \ + autom4te.cache/* libtool include/builddefs include/platform_defs.h ifeq ($(HAVE_BUILDDEFS), yes) LDIRDIRT = $(SRCDIR) Index: b/include/buildrules =================================================================== --- a/include/buildrules +++ b/include/buildrules @@ -7,7 +7,7 @@ _BUILDRULES_INCLUDED_ = 1 include $(TOPDIR)/include/builddefs clean clobber : $(addsuffix -clean,$(SUBDIRS)) - @rm -f $(DIRT) .dep + @rm -f $(DIRT) .ltdep .dep @rm -fr $(DIRDIRT) %-clean: @echo "Cleaning $*" @@ -94,11 +94,15 @@ $(_FORCE): MAKEDEP := $(MAKEDEPEND) $(CFLAGS) -ltdepend: $(CFILES) $(HFILES) +ltdepend: .ltdep + +.ltdep: $(CFILES) $(HFILES) @echo " [DEP]" - $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' > .dep + $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' > .ltdep + +depend: .dep -depend: $(CFILES) $(HFILES) +.dep: $(CFILES) $(HFILES) @echo " [DEP]" $(Q)$(MAKEDEP) $(CFILES) > .dep Index: b/libdisk/Makefile =================================================================== --- a/libdisk/Makefile +++ b/libdisk/Makefile @@ -30,4 +30,4 @@ install-dev: default install-qa: install-dev --include .dep +-include .ltdep Index: b/libhandle/Makefile =================================================================== --- a/libhandle/Makefile +++ b/libhandle/Makefile @@ -27,4 +27,4 @@ install-dev: default install-qa: install-dev --include .dep +-include .ltdep Index: b/libxcmd/Makefile =================================================================== --- a/libxcmd/Makefile +++ b/libxcmd/Makefile @@ -34,4 +34,4 @@ include $(BUILDRULES) install install-dev install-qa: default --include .dep +-include .ltdep Index: b/libxfs/Makefile =================================================================== --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -46,4 +46,4 @@ install-dev: default install-qa: default --include .dep +-include .ltdep Index: b/libxlog/Makefile =================================================================== --- a/libxlog/Makefile +++ b/libxlog/Makefile @@ -21,4 +21,4 @@ include $(BUILDRULES) install install-dev install-qa: default --include .dep +-include .ltdep From aelder@sgi.com Sat Feb 13 14:22:56 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.4 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_63,J_CHICKENPOX_65,J_CHICKENPOX_66,URIBL_BLACK autolearn=no version=3.3.0-rupdated 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 o1DKMulx153357 for ; Sat, 13 Feb 2010 14:22:56 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id D421E8F80F1 for ; Sat, 13 Feb 2010 12:24:12 -0800 (PST) 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 o1DKOCAo000713 for ; Sat, 13 Feb 2010 14:24:12 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o1DKOCDF000711 for xfs@oss.sgi.com; Sat, 13 Feb 2010 14:24:12 -0600 From: Alex Elder Message-Id: <201002132024.o1DKOCDF000711@stout.americas.sgi.com> Date: Sat, 13 Feb 2010 14:24:12 -0600 To: xfs@oss.sgi.com Subject: [PATCH] xfsdump: remake dependencies only when necessary 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 There's no need to re-make the dependency file all the time. Make it so the "depend" target rebuilds the ".dep" file only if necessary. Also change the name of the dependency file created for "ltdepend" to be ".ltdep". Signed-off-by: Alex Elder --- Makefile | 6 +++--- dump/Makefile | 2 +- include/buildrules | 14 +++++++++----- librmt/Makefile | 2 +- restore/Makefile | 2 +- 5 files changed, 15 insertions(+), 11 deletions(-) Index: b/Makefile =================================================================== --- a/Makefile +++ b/Makefile @@ -30,9 +30,9 @@ SRCTAR = $(PKG_NAME)-$(PKG_VERSION).tar. CONFIGURE = aclocal.m4 configure config.guess config.sub install-sh ltmain.sh LSRCFILES = configure.in release.sh README VERSION $(CONFIGURE) -LDIRT = config.log .dep config.status config.cache confdefs.h conftest* \ - built .census install.* install-dev.* *.gz autom4te.cache/* libtool \ - include/builddefs include/config.h +LDIRT = config.log .ltdep .dep config.status config.cache confdefs.h \ + conftest* built .census install.* install-dev.* *.gz \ + autom4te.cache/* libtool include/builddefs include/config.h ifeq ($(HAVE_BUILDDEFS), yes) LDIRDIRT = $(SRCDIR) Index: b/dump/Makefile =================================================================== --- a/dump/Makefile +++ b/dump/Makefile @@ -105,7 +105,7 @@ install: default $(INSTALL) -S $(PKG_ROOT_SBIN_DIR)/$(LTCOMMAND) $(PKG_SBIN_DIR)/$(LTCOMMAND) install-dev: -depend: $(COMMINCL) $(COMMON) $(INVINCL) $(INVCOMMON) +.dep: $(COMMINCL) $(COMMON) $(INVINCL) $(INVCOMMON) $(COMMINCL) $(COMMON): @echo " [LN] $@" Index: b/include/buildrules =================================================================== --- a/include/buildrules +++ b/include/buildrules @@ -7,7 +7,7 @@ _BUILDRULES_INCLUDED_ = 1 include $(TOPDIR)/include/builddefs clean clobber : $(addsuffix -clean,$(SUBDIRS)) - @rm -f $(DIRT) .dep + @rm -f $(DIRT) .ltdep .dep @rm -fr $(DIRDIRT) %-clean: @echo "Cleaning $*" @@ -94,10 +94,14 @@ $(_FORCE): MAKEDEP := $(MAKEDEPEND) $(CFLAGS) -ltdepend: $(CFILES) $(HFILES) +ltdepend: .ltdep + +.ltdep: $(CFILES) $(HFILES) @echo " [DEP]" - $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' > .dep + $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' > .ltdep + +depend: .dep -depend: $(CFILES) $(HFILES) +.dep: $(CFILES) $(HFILES) @echo " [DEP]" - $(Q)$(MAKEDEP) $(CFILES) > .dep + $(Q)[ -n "$(CFILES)" ] && $(MAKEDEP) $(CFILES) > .dep Index: b/librmt/Makefile =================================================================== --- a/librmt/Makefile +++ b/librmt/Makefile @@ -21,4 +21,4 @@ include $(BUILDRULES) install install-dev: default --include .dep +-include .ltdep Index: b/restore/Makefile =================================================================== --- a/restore/Makefile +++ b/restore/Makefile @@ -117,7 +117,7 @@ install: default $(INSTALL) -S $(PKG_ROOT_SBIN_DIR)/$(LTCOMMAND) $(PKG_SBIN_DIR)/$(LTCOMMAND) install-dev: -depend: $(COMMINCL) $(COMMON) $(INVINCL) $(INVCOMMON) +.dep: $(COMMINCL) $(COMMON) $(INVINCL) $(INVCOMMON) $(COMMINCL) $(COMMON): @echo " [LN] $@" From aelder@sgi.com Sat Feb 13 14:23:07 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1DKN7eg153377 for ; Sat, 13 Feb 2010 14:23:07 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7F12B8F80F1 for ; Sat, 13 Feb 2010 12:24:23 -0800 (PST) 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 o1DKONxw000726 for ; Sat, 13 Feb 2010 14:24:23 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o1DKONX4000725 for xfs@oss.sgi.com; Sat, 13 Feb 2010 14:24:23 -0600 From: Alex Elder Message-Id: <201002132024.o1DKONX4000725@stout.americas.sgi.com> Date: Sat, 13 Feb 2010 14:24:23 -0600 To: xfs@oss.sgi.com Subject: [PATCH] dmapi: remake dependencies only when necessary 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 There's no need to re-make the dependency file all the time. Make it so the "depend" target rebuilds the ".dep" file only if necessary. Signed-off-by: Alex Elder --- include/buildrules | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) Index: b/include/buildrules =================================================================== --- a/include/buildrules +++ b/include/buildrules @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs clean clobber : $(addsuffix -clean,$(SUBDIRS)) rm -f $(DIRT) - @rm -fr .libs + @rm -fr .libs .dep %-clean: $(MAKE) -C $* clean @@ -72,9 +72,10 @@ ifdef LTLIBRARY DEPENDSCRIPT := $(DEPENDSCRIPT) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' endif -depend : $(CFILES) $(HFILES) $(addsuffix -depend,$(SUBDIRS)) +depend : .dep $(addsuffix -depend,$(SUBDIRS)) + +.dep : $(CFILES) $(HFILES) $(DEPENDSCRIPT) > .dep - test -s .dep || rm -f .dep %-depend: $(MAKE) -C $* depend From aelder@oss.sgi.com Sat Feb 13 14:40:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1DKedC7154672 for ; Sat, 13 Feb 2010 14:40:39 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o1DKedTP154644; Sat, 13 Feb 2010 14:40:39 -0600 Date: Sat, 13 Feb 2010 14:40:39 -0600 Message-Id: <201002132040.o1DKedTP154644@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-rc4-59-gd67b1b0 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 180040b89ee2aed88c0a0b1fcf7ada9a512b12e3 X-Git-Newrev: d67b1b03254c501fef371b0e5916c94a52bfc2c5 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 d67b1b0 fs/xfs: Correct NULL test from 180040b89ee2aed88c0a0b1fcf7ada9a512b12e3 (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 d67b1b03254c501fef371b0e5916c94a52bfc2c5 Author: Julia Lawall Date: Sat Feb 6 08:45:15 2010 +0000 fs/xfs: Correct NULL test Test the value that was just allocated rather than the previously tested one. A simplified version of the semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // @r@ expression *x; expression e; identifier l; @@ if (x == NULL || ...) { ... when forall return ...; } ... when != goto l; when != x = e when != &x *x == NULL // Signed-off-by: Julia Lawall Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/quota/xfs_qm.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) hooks/post-receive -- XFS development tree From BATV+bfc41a43d46a498a4513+2366+infradead.org+hch@bombadil.srs.infradead.org Sun Feb 14 15:43:03 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1ELh0DD260373 for ; Sun, 14 Feb 2010 15:43:03 -0600 X-ASG-Debug-ID: 1266183857-0d1603ae0000-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 D38E81DB9794; Sun, 14 Feb 2010 13:44:17 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id KCVqGGZP38p3FYDs; Sun, 14 Feb 2010 13:44:17 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NgmGG-0005aw-4q; Sun, 14 Feb 2010 21:44:16 +0000 Date: Sun, 14 Feb 2010 16:44:16 -0500 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v2] xfsprogs: eliminate some build warnings Subject: Re: [PATCH v2] xfsprogs: eliminate some build warnings Message-ID: <20100214214416.GA21311@infradead.org> References: <201002122258.o1CMwjrG020023@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201002122258.o1CMwjrG020023@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: 1266183857 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, Feb 12, 2010 at 04:58:44PM -0600, Alex Elder wrote: > A few minor changes to get rid of some build warnings. > > Signed-off-by: Alex Elder Looks good, Reviewed-by: Christoph Hellwig From BATV+bfc41a43d46a498a4513+2366+infradead.org+hch@bombadil.srs.infradead.org Sun Feb 14 15:43:45 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1ELhjlm260431 for ; Sun, 14 Feb 2010 15:43:45 -0600 X-ASG-Debug-ID: 1266183900-2f5102980000-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 D1F6A13A8964; Sun, 14 Feb 2010 13:45:00 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id fhFfIAhIKsxqe2Tj; Sun, 14 Feb 2010 13:45:00 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NgmGy-0005hc-45; Sun, 14 Feb 2010 21:45:00 +0000 Date: Sun, 14 Feb 2010 16:45:00 -0500 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: clean up dmapi Makefile Subject: Re: [PATCH] xfstests: clean up dmapi Makefile Message-ID: <20100214214500.GB21311@infradead.org> References: <201002122145.o1CLjMRf028235@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201002122145.o1CLjMRf028235@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: 1266183901 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 > Index: b/Makefile > =================================================================== > --- a/Makefile > +++ b/Makefile > @@ -99,3 +99,7 @@ install-dev install-lib: > realclean distclean: clean > rm -f $(LDIRT) $(CONFIGURE) > rm -rf autom4te.cache Logs > +ifeq ($(HAVE_DMAPI), true) > + rm -f $(DMAPI_MAKEFILE) > +endif Why not just remove it uncondtionally? From BATV+bfc41a43d46a498a4513+2366+infradead.org+hch@bombadil.srs.infradead.org Sun Feb 14 16:00:29 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1EM0SmV262065 for ; Sun, 14 Feb 2010 16:00:29 -0600 X-ASG-Debug-ID: 1266184905-2f4003400000-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 8309913A8A50 for ; Sun, 14 Feb 2010 14:01:45 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id QWLNp9j3BQiwMJv7 for ; Sun, 14 Feb 2010 14:01:45 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NgmXB-0002kn-11 for xfs@oss.sgi.com; Sun, 14 Feb 2010 22:01:45 +0000 Date: Sun, 14 Feb 2010 17:01:45 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: fix dquota trace format Subject: [PATCH] xfs: fix dquota trace format Message-ID: <20100214220144.GA10548@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: 1266184905 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 be32_to_cpu in the TP_printk output breaks automatic parsing of the trace format by the trace-cmd tools, so we have to move it into the TP_assign block. While we're at it also fix the format for the quota limits to more regular and easier parseable. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/xfs/linux-2.6/xfs_trace.h =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_trace.h 2010-02-12 20:26:31.506274631 +0100 +++ linux-2.6/fs/xfs/linux-2.6/xfs_trace.h 2010-02-12 20:32:17.319255704 +0100 @@ -565,7 +565,7 @@ DECLARE_EVENT_CLASS(xfs_dquot_class, TP_ARGS(dqp), TP_STRUCT__entry( __field(dev_t, dev) - __field(__be32, id) + __field(u32, id) __field(unsigned, flags) __field(unsigned, nrefs) __field(unsigned long long, res_bcount) @@ -578,7 +578,7 @@ DECLARE_EVENT_CLASS(xfs_dquot_class, ), \ TP_fast_assign( __entry->dev = dqp->q_mount->m_super->s_dev; - __entry->id = dqp->q_core.d_id; + __entry->id = be32_to_cpu(dqp->q_core.d_id); __entry->flags = dqp->dq_flags; __entry->nrefs = dqp->q_nrefs; __entry->res_bcount = dqp->q_res_bcount; @@ -594,10 +594,10 @@ DECLARE_EVENT_CLASS(xfs_dquot_class, be64_to_cpu(dqp->q_core.d_ino_softlimit); ), TP_printk("dev %d:%d id 0x%x flags %s nrefs %u res_bc 0x%llx " - "bcnt 0x%llx [hard 0x%llx | soft 0x%llx] " - "icnt 0x%llx [hard 0x%llx | soft 0x%llx]", + "bcnt 0x%llx bhardlimit 0x%llx bsoftlimit 0x%llx " + "icnt 0x%llx ihardlimit 0x%llx isoftlimit 0x%llx]", MAJOR(__entry->dev), MINOR(__entry->dev), - be32_to_cpu(__entry->id), + __entry->id, __print_flags(__entry->flags, "|", XFS_DQ_FLAGS), __entry->nrefs, __entry->res_bcount, From BATV+bfc41a43d46a498a4513+2366+infradead.org+hch@bombadil.srs.infradead.org Sun Feb 14 16:06:09 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1EM69wx000632 for ; Sun, 14 Feb 2010 16:06:09 -0600 X-ASG-Debug-ID: 1266185245-507200d40000-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 192761DB981E for ; Sun, 14 Feb 2010 14:07:25 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id NuHxS2MyFQcoFyPf for ; Sun, 14 Feb 2010 14:07:25 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Ngmcf-0003xF-QI for xfs@oss.sgi.com; Sun, 14 Feb 2010 22:07:25 +0000 Date: Sun, 14 Feb 2010 17:07:25 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfstests: fix awk syntax error in 219 Subject: [PATCH] xfstests: fix awk syntax error in 219 Message-ID: <20100214220725.GA14927@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: 1266185246 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 There's one brace too many here - this was pointed out in the review but slipped back into the commited patch. Signed-off-by: Christoph Hellwig Index: xfstests-dev/219 =================================================================== --- xfstests-dev.orig/219 2010-02-14 22:00:57.000000000 +0000 +++ xfstests-dev/219 2010-02-14 22:01:03.000000000 +0000 @@ -86,7 +86,7 @@ test_accounting() done repquota -$type -s -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | - awk '/^#/ { if (seen[$1]) next; seen[$1]++; } } { print; }' + awk '/^#/ { if (seen[$1]) next; seen[$1]++; } { print; }' } # real QA test starts here From BATV+bfc41a43d46a498a4513+2366+infradead.org+hch@bombadil.srs.infradead.org Sun Feb 14 16:06:37 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_53 autolearn=no version=3.3.0-rupdated 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 o1EM6bBs000683 for ; Sun, 14 Feb 2010 16:06:37 -0600 X-ASG-Debug-ID: 1266185273-4b0e00b20000-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 2F2AD1CF4F7 for ; Sun, 14 Feb 2010 14:07:53 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id JvcZItIQ0oPJpRlJ for ; Sun, 14 Feb 2010 14:07:53 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Ngmd7-00041G-IE for xfs@oss.sgi.com; Sun, 14 Feb 2010 22:07:53 +0000 Date: Sun, 14 Feb 2010 17:07:53 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfstests: use blkid raw mode Subject: [PATCH] xfstests: use blkid raw mode Message-ID: <20100214220753.GB14927@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: 1266185274 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 blkid without options usually gets no probe results at all just after creating a filesystem. This problem is due to the cache that blkid uses in it's default mode, and is unlikely to get fixed. Use the -p option to bypass the cache layer. Signed-off-by: Christoph Hellwig Index: xfstests-dev/common =================================================================== --- xfstests-dev.orig/common 2010-02-11 16:08:58.000000000 +0000 +++ xfstests-dev/common 2010-02-11 16:09:03.000000000 +0000 @@ -47,7 +47,7 @@ rm -f $tmp.list $tmp.tmp $tmp.sed # Autodetect fs type based on what's on $TEST_DEV if [ "$HOSTOS" == "Linux" ] then - export FSTYP=`blkid -s TYPE -o value $TEST_DEV` + export FSTYP=`blkid -p -s TYPE -o value $TEST_DEV` else export FSTYP=xfs fi From SRS0+6gd8+74+fromorbit.com=david@internode.on.net Sun Feb 14 16:15:50 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1EMFn52001337 for ; Sun, 14 Feb 2010 16:15:50 -0600 X-ASG-Debug-ID: 1266185824-53af00c20000-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 87E581CF513 for ; Sun, 14 Feb 2010 14:17:05 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id miLHqAE49NexPITS for ; Sun, 14 Feb 2010 14:17:05 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13694582-1927428 for multiple; Mon, 15 Feb 2010 08:47:04 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Ngmly-0007T8-Hj; Mon, 15 Feb 2010 09:17:02 +1100 Date: Mon, 15 Feb 2010 09:17:02 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: fix dquota trace format Subject: Re: [PATCH] xfs: fix dquota trace format Message-ID: <20100214221702.GC28392@discord.disaster> References: <20100214220144.GA10548@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100214220144.GA10548@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1266185826 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0196 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22553 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, Feb 14, 2010 at 05:01:45PM -0500, Christoph Hellwig wrote: > > The be32_to_cpu in the TP_printk output breaks automatic parsing of > the trace format by the trace-cmd tools, so we have to move it into > the TP_assign block. While we're at it also fix the format for the > quota limits to more regular and easier parseable. > > Signed-off-by: Christoph Hellwig Looks good. Reviewed-by: Dave Chinner Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+6gd8+74+fromorbit.com=david@internode.on.net Sun Feb 14 17:12:36 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1ENCZtc005987 for ; Sun, 14 Feb 2010 17:12:35 -0600 X-ASG-Debug-ID: 1266189230-4e3603070000-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 BF83E1CE009 for ; Sun, 14 Feb 2010 15:13:50 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id v2Q2RSEqDV4fVSuV for ; Sun, 14 Feb 2010 15:13:50 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 2122660-1927428 for multiple; Mon, 15 Feb 2010 09:43:49 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Ngnet-0007Vw-NW; Mon, 15 Feb 2010 10:13:47 +1100 Date: Mon, 15 Feb 2010 10:13:47 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix awk syntax error in 219 Subject: Re: [PATCH] xfstests: fix awk syntax error in 219 Message-ID: <20100214231347.GD28392@discord.disaster> References: <20100214220725.GA14927@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100214220725.GA14927@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1266189231 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: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22557 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, Feb 14, 2010 at 05:07:25PM -0500, Christoph Hellwig wrote: > There's one brace too many here - this was pointed out in the review > but slipped back into the commited patch. > > Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+wJe4+74+fromorbit.com=david@internode.on.net Sun Feb 14 17:13:39 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1ENDc5S006051 for ; Sun, 14 Feb 2010 17:13:39 -0600 X-ASG-Debug-ID: 1266189293-4b1b032b0000-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 B0A021CE00E for ; Sun, 14 Feb 2010 15:14:54 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id I3T7L3b8sWMVOjVA for ; Sun, 14 Feb 2010 15:14:54 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13572006-1927428 for multiple; Mon, 15 Feb 2010 09:44:53 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Ngnfv-0007W6-TR; Mon, 15 Feb 2010 10:14:51 +1100 Date: Mon, 15 Feb 2010 10:14:51 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: use blkid raw mode Subject: Re: [PATCH] xfstests: use blkid raw mode Message-ID: <20100214231451.GE28392@discord.disaster> References: <20100214220753.GB14927@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100214220753.GB14927@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1266189295 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22557 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, Feb 14, 2010 at 05:07:53PM -0500, Christoph Hellwig wrote: > blkid without options usually gets no probe results at all just after > creating a filesystem. This problem is due to the cache that blkid > uses in it's default mode, and is unlikely to get fixed. Use the -p > option to bypass the cache layer. > > Signed-off-by: Christoph Hellwig Make sense. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From BATV+1d2bc40de82a3f7823ed+2367+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 15 03:44:49 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1F9ilN3047250 for ; Mon, 15 Feb 2010 03:44:49 -0600 X-ASG-Debug-ID: 1266227165-5e7003dc0000-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 3EE6D1D040D for ; Mon, 15 Feb 2010 01:46:05 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id m39FVWscEl4jUFTM for ; Mon, 15 Feb 2010 01:46:05 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NgxWm-0000FD-RY for xfs@oss.sgi.com; Mon, 15 Feb 2010 09:46:04 +0000 Message-Id: <20100215094604.640912740@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 15 Feb 2010 04:44:48 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/4] [PATCH 3/4] xfs: remove wrapper for the fsync file operation Subject: [PATCH 3/4] [PATCH 3/4] xfs: remove wrapper for the fsync file operation References: <20100215094445.528696829@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-fsync-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: 1266227165 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 the fsync file operation is divided into a low-level routine doing all the work and one that implements the Linux file operation and does minimal argument wrapping. This is a leftover from the days of the vnode operations layer and can be removed to simplify the code a bit, as well as preparing for the implementation of an optimized fdatasync which needs to look at the Linux inode state. 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-02-15 10:18:58.640023657 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-02-15 10:28:07.311260422 +0100 @@ -35,6 +35,7 @@ #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" @@ -96,6 +97,120 @@ xfs_iozero( return (-status); } +/* + * We ignore the datasync flag here because a datasync is effectively + * identical to an fsync. That is, datasync implies that we need to write + * only the metadata needed to be able to access the data that is written + * if we crash after the call completes. Hence if we are writing beyond + * EOF we have to log the inode size change as well, which makes it a + * full fsync. If we don't write beyond EOF, the inode core will be + * clean in memory and so we don't need to log the inode, just like + * fsync. + */ +STATIC int +xfs_file_fsync( + struct file *file, + struct dentry *dentry, + int datasync) +{ + struct xfs_inode *ip = XFS_I(dentry->d_inode); + struct xfs_trans *tp; + int error = 0; + int log_flushed = 0; + + xfs_itrace_entry(ip); + + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) + return -XFS_ERROR(EIO); + + xfs_iflags_clear(ip, XFS_ITRUNCATED); + + /* + * We always need to make sure that the required inode state is safe on + * disk. The inode might be clean but we still might need to force the + * log because of committed transactions that haven't hit the disk yet. + * Likewise, there could be unflushed non-transactional changes to the + * inode core that have to go to disk and this requires us to issue + * a synchronous transaction to capture these changes correctly. + * + * This code relies on the assumption that if the i_update_core field + * of the inode is clear and the inode is unpinned then it is clean + * and no action is required. + */ + xfs_ilock(ip, XFS_ILOCK_SHARED); + + if (ip->i_update_core) { + /* + * Kick off a transaction to log the inode core to get the + * updates. The sync transaction will also force the log. + */ + xfs_iunlock(ip, XFS_ILOCK_SHARED); + tp = xfs_trans_alloc(ip->i_mount, XFS_TRANS_FSYNC_TS); + error = xfs_trans_reserve(tp, 0, + XFS_FSYNC_TS_LOG_RES(ip->i_mount), 0, 0, 0); + if (error) { + xfs_trans_cancel(tp, 0); + return -error; + } + xfs_ilock(ip, XFS_ILOCK_EXCL); + + /* + * Note - it's possible that we might have pushed ourselves out + * of the way during trans_reserve which would flush the inode. + * But there's no guarantee that the inode buffer has actually + * gone out yet (it's delwri). Plus the buffer could be pinned + * anyway if it's part of an inode in another recent + * transaction. So we play it safe and fire off the + * transaction anyway. + */ + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + xfs_trans_ihold(tp, ip); + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + xfs_trans_set_sync(tp); + error = _xfs_trans_commit(tp, 0, &log_flushed); + + xfs_iunlock(ip, XFS_ILOCK_EXCL); + } else { + /* + * Timestamps/size haven't changed since last inode flush or + * inode transaction commit. That means either nothing got + * written or a transaction committed which caught the updates. + * If the latter happened and the transaction hasn't hit the + * disk yet, the inode will be still be pinned. If it is, + * force the log. + */ + xfs_iunlock(ip, XFS_ILOCK_SHARED); + if (xfs_ipincount(ip)) { + if (ip->i_itemp->ili_last_lsn) { + error = _xfs_log_force_lsn(ip->i_mount, + ip->i_itemp->ili_last_lsn, + XFS_LOG_SYNC, &log_flushed); + } else { + error = _xfs_log_force(ip->i_mount, + XFS_LOG_SYNC, &log_flushed); + } + } + } + + if (ip->i_mount->m_flags & XFS_MOUNT_BARRIER) { + /* + * If the log write didn't issue an ordered tag we need + * to flush the disk cache for the data device now. + */ + if (!log_flushed) + xfs_blkdev_issue_flush(ip->i_mount->m_ddev_targp); + + /* + * If this inode is on the RT dev we need to flush that + * cache as well. + */ + if (XFS_IS_REALTIME_INODE(ip)) + xfs_blkdev_issue_flush(ip->i_mount->m_rtdev_targp); + } + + return -error; +} + STATIC ssize_t xfs_file_aio_read( struct kiocb *iocb, @@ -755,7 +870,8 @@ write_retry: mutex_lock(&inode->i_mutex); xfs_ilock(ip, iolock); - error2 = xfs_fsync(ip); + error2 = -xfs_file_fsync(file, file->f_path.dentry, + (file->f_flags & __O_SYNC) ? 0 : 1); if (!error) error = error2; } @@ -826,28 +942,6 @@ xfs_file_release( return -xfs_release(XFS_I(inode)); } -/* - * We ignore the datasync flag here because a datasync is effectively - * identical to an fsync. That is, datasync implies that we need to write - * only the metadata needed to be able to access the data that is written - * if we crash after the call completes. Hence if we are writing beyond - * EOF we have to log the inode size change as well, which makes it a - * full fsync. If we don't write beyond EOF, the inode core will be - * clean in memory and so we don't need to log the inode, just like - * fsync. - */ -STATIC int -xfs_file_fsync( - struct file *file, - struct dentry *dentry, - int datasync) -{ - struct xfs_inode *ip = XFS_I(dentry->d_inode); - - xfs_iflags_clear(ip, XFS_ITRUNCATED); - return -xfs_fsync(ip); -} - STATIC int xfs_file_readdir( struct file *filp, Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c 2010-02-15 10:18:58.647025822 +0100 +++ xfs/fs/xfs/xfs_vnodeops.c 2010-02-15 10:21:33.365253716 +0100 @@ -584,113 +584,6 @@ xfs_readlink( } /* - * xfs_fsync - * - * This is called to sync the inode and its data out to disk. We need to hold - * the I/O lock while flushing the data, and the inode lock while flushing the - * inode. The inode lock CANNOT be held while flushing the data, so acquire - * after we're done with that. - */ -int -xfs_fsync( - xfs_inode_t *ip) -{ - xfs_trans_t *tp; - int error = 0; - int log_flushed = 0; - - xfs_itrace_entry(ip); - - if (XFS_FORCED_SHUTDOWN(ip->i_mount)) - return XFS_ERROR(EIO); - - /* - * We always need to make sure that the required inode state is safe on - * disk. The inode might be clean but we still might need to force the - * log because of committed transactions that haven't hit the disk yet. - * Likewise, there could be unflushed non-transactional changes to the - * inode core that have to go to disk and this requires us to issue - * a synchronous transaction to capture these changes correctly. - * - * This code relies on the assumption that if the update_* fields - * of the inode are clear and the inode is unpinned then it is clean - * and no action is required. - */ - xfs_ilock(ip, XFS_ILOCK_SHARED); - - if (!ip->i_update_core) { - /* - * Timestamps/size haven't changed since last inode flush or - * inode transaction commit. That means either nothing got - * written or a transaction committed which caught the updates. - * If the latter happened and the transaction hasn't hit the - * disk yet, the inode will be still be pinned. If it is, - * force the log. - */ - xfs_iunlock(ip, XFS_ILOCK_SHARED); - if (xfs_ipincount(ip)) { - if (ip->i_itemp->ili_last_lsn) { - error = _xfs_log_force_lsn(ip->i_mount, - ip->i_itemp->ili_last_lsn, - XFS_LOG_SYNC, &log_flushed); - } else { - error = _xfs_log_force(ip->i_mount, - XFS_LOG_SYNC, &log_flushed); - } - } - } else { - /* - * Kick off a transaction to log the inode core to get the - * updates. The sync transaction will also force the log. - */ - xfs_iunlock(ip, XFS_ILOCK_SHARED); - tp = xfs_trans_alloc(ip->i_mount, XFS_TRANS_FSYNC_TS); - error = xfs_trans_reserve(tp, 0, - XFS_FSYNC_TS_LOG_RES(ip->i_mount), 0, 0, 0); - if (error) { - xfs_trans_cancel(tp, 0); - return error; - } - xfs_ilock(ip, XFS_ILOCK_EXCL); - - /* - * Note - it's possible that we might have pushed ourselves out - * of the way during trans_reserve which would flush the inode. - * But there's no guarantee that the inode buffer has actually - * gone out yet (it's delwri). Plus the buffer could be pinned - * anyway if it's part of an inode in another recent - * transaction. So we play it safe and fire off the - * transaction anyway. - */ - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, ip); - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - xfs_trans_set_sync(tp); - error = _xfs_trans_commit(tp, 0, &log_flushed); - - xfs_iunlock(ip, XFS_ILOCK_EXCL); - } - - if (ip->i_mount->m_flags & XFS_MOUNT_BARRIER) { - /* - * If the log write didn't issue an ordered tag we need - * to flush the disk cache for the data device now. - */ - if (!log_flushed) - xfs_blkdev_issue_flush(ip->i_mount->m_ddev_targp); - - /* - * If this inode is on the RT dev we need to flush that - * cache as well. - */ - if (XFS_IS_REALTIME_INODE(ip)) - xfs_blkdev_issue_flush(ip->i_mount->m_rtdev_targp); - } - - return error; -} - -/* * Flags for xfs_free_eofblocks */ #define XFS_FREE_EOF_TRYLOCK (1<<0) Index: xfs/fs/xfs/xfs_vnodeops.h =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.h 2010-02-15 10:18:58.668254206 +0100 +++ xfs/fs/xfs/xfs_vnodeops.h 2010-02-15 10:21:33.379012621 +0100 @@ -21,7 +21,6 @@ int xfs_setattr(struct xfs_inode *ip, st #define XFS_ATTR_NOACL 0x08 /* Don't call xfs_acl_chmod */ int xfs_readlink(struct xfs_inode *ip, char *link); -int xfs_fsync(struct xfs_inode *ip); int xfs_release(struct xfs_inode *ip); int xfs_inactive(struct xfs_inode *ip); int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name, From BATV+1d2bc40de82a3f7823ed+2367+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 15 03:44:49 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1F9imtP047253 for ; Mon, 15 Feb 2010 03:44:49 -0600 X-ASG-Debug-ID: 1266227165-611901660000-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 8895D1CCFB70 for ; Mon, 15 Feb 2010 01:46:05 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id EH2Fj3mDSdjCD40n for ; Mon, 15 Feb 2010 01:46:05 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NgxWn-0000Fk-67 for xfs@oss.sgi.com; Mon, 15 Feb 2010 09:46:05 +0000 Message-Id: <20100215094605.009247071@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 15 Feb 2010 04:44:49 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/4] [PATCH 4/4] xfs: implement optimized fdatasync Subject: [PATCH 4/4] [PATCH 4/4] xfs: implement optimized fdatasync References: <20100215094445.528696829@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-implement-fdatasync 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: 1266227165 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 Allow us to track the difference between timestamp and size updates by using mark_inode_dirty from the I/O completion code, and checking the VFS inode flags in xfs_file_fsync. 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-02-15 10:23:14.050003751 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-02-15 10:23:28.407272435 +0100 @@ -187,7 +187,7 @@ xfs_setfilesize( isize = xfs_ioend_new_eof(ioend); if (isize) { ip->i_d.di_size = isize; - xfs_mark_inode_dirty_sync(ip); + xfs_mark_inode_dirty(ip); } xfs_iunlock(ip, XFS_ILOCK_EXCL); @@ -341,7 +341,7 @@ xfs_submit_ioend_bio( * but don't update the inode size until I/O completion. */ if (xfs_ioend_new_eof(ioend)) - xfs_mark_inode_dirty_sync(XFS_I(ioend->io_inode)); + xfs_mark_inode_dirty(XFS_I(ioend->io_inode)); submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC_PLUG : WRITE, bio); Index: xfs/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_file.c 2010-02-15 10:23:25.212255603 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-02-15 10:26:34.946005568 +0100 @@ -97,16 +97,6 @@ xfs_iozero( return (-status); } -/* - * We ignore the datasync flag here because a datasync is effectively - * identical to an fsync. That is, datasync implies that we need to write - * only the metadata needed to be able to access the data that is written - * if we crash after the call completes. Hence if we are writing beyond - * EOF we have to log the inode size change as well, which makes it a - * full fsync. If we don't write beyond EOF, the inode core will be - * clean in memory and so we don't need to log the inode, just like - * fsync. - */ STATIC int xfs_file_fsync( struct file *file, @@ -139,7 +129,18 @@ xfs_file_fsync( */ xfs_ilock(ip, XFS_ILOCK_SHARED); - if (ip->i_update_core) { + /* + * First check if the VFS inode is marked dirty. All the dirtying + * of non-transactional updates no goes through mark_inode_dirty*, + * which allows us to distinguish beteeen pure timestamp updates + * and i_size updates which need to be caught for fdatasync. + * After that also theck for the dirty state in the XFS inode, which + * might gets cleared when the inode gets written out via the AIL + * or xfs_iflush_cluster. + */ + if (((dentry->d_inode->i_state & I_DIRTY_DATASYNC) || + ((dentry->d_inode->i_state & I_DIRTY_SYNC) && !datasync)) && + ip->i_update_core) { /* * Kick off a transaction to log the inode core to get the * updates. The sync transaction will also force the log. Index: xfs/fs/xfs/linux-2.6/xfs_iops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_iops.c 2010-02-15 10:23:14.069003332 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_iops.c 2010-02-15 10:23:28.419024635 +0100 @@ -91,6 +91,16 @@ xfs_mark_inode_dirty_sync( mark_inode_dirty_sync(inode); } +void +xfs_mark_inode_dirty( + xfs_inode_t *ip) +{ + struct inode *inode = VFS_I(ip); + + if (!(inode->i_state & (I_WILL_FREE|I_FREEING|I_CLEAR))) + mark_inode_dirty(inode); +} + /* * Change the requested timestamp in the given inode. * We don't lock across timestamp updates, and we don't log them but Index: xfs/fs/xfs/xfs_inode.h =================================================================== --- xfs.orig/fs/xfs/xfs_inode.h 2010-02-15 10:23:14.079253157 +0100 +++ xfs/fs/xfs/xfs_inode.h 2010-02-15 10:23:28.424047333 +0100 @@ -480,6 +480,7 @@ void xfs_lock_inodes(xfs_inode_t **, in void xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint); void xfs_synchronize_times(xfs_inode_t *); +void xfs_mark_inode_dirty(xfs_inode_t *); void xfs_mark_inode_dirty_sync(xfs_inode_t *); #define IHOLD(ip) \ From BATV+1d2bc40de82a3f7823ed+2367+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 15 03:44:50 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1F9ilNB047246 for ; Mon, 15 Feb 2010 03:44:49 -0600 X-ASG-Debug-ID: 1266227164-644a03650000-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 D35331D0406 for ; Mon, 15 Feb 2010 01:46:04 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id zBt2WXd2rA7ddhRQ for ; Mon, 15 Feb 2010 01:46:04 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NgxWl-0000DU-Pa for xfs@oss.sgi.com; Mon, 15 Feb 2010 09:46:03 +0000 Message-Id: <20100215094445.528696829@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 15 Feb 2010 04:44:45 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/4] implement optimized fdatasync Subject: [PATCH 0/4] implement optimized fdatasync 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: 1266227164 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 series implements a real fdatasync, that is one that is not simply identical to fdatasync, but one that skips logging the inode if there are only timestamp updates. In fact the first three patches are just broad cleanups to get the code into shape for the rather small patch 4 implementing the optimization. From BATV+1d2bc40de82a3f7823ed+2367+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 15 03:44:50 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1F9ilAh047249 for ; Mon, 15 Feb 2010 03:44:49 -0600 X-ASG-Debug-ID: 1266227164-67d403080000-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 330321D0406 for ; Mon, 15 Feb 2010 01:46:04 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id tMoNZEdyHwHXdCpa for ; Mon, 15 Feb 2010 01:46:04 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NgxWm-0000Eg-GT for xfs@oss.sgi.com; Mon, 15 Feb 2010 09:46:04 +0000 Message-Id: <20100215094604.318261333@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 15 Feb 2010 04:44:47 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/4] [PATCH 2/4] xfs: remove wrappers for read/write file operations Subject: [PATCH 2/4] [PATCH 2/4] xfs: remove wrappers for read/write file operations References: <20100215094445.528696829@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-fops-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: 1266227165 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 the aio_read, aio_write, splice_read and splice_write file operations are divided into a low-level routine doing all the work and one that implements the Linux file operations and does minimal argument wrapping. This is a leftover from the days of the vnode operations layer and can be removed to simplify the code a lot. 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-02-15 10:14:28.107003961 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-02-15 10:18:58.640023657 +0100 @@ -96,28 +96,34 @@ xfs_iozero( return (-status); } -ssize_t /* bytes read, or (-) error */ -xfs_read( - xfs_inode_t *ip, +STATIC ssize_t +xfs_file_aio_read( struct kiocb *iocb, const struct iovec *iovp, - unsigned int segs, - loff_t *offset, - int ioflags) + unsigned long nr_segs, + loff_t pos) { struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; - xfs_mount_t *mp = ip->i_mount; + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; size_t size = 0; ssize_t ret = 0; + int ioflags = 0; xfs_fsize_t n; unsigned long seg; - XFS_STATS_INC(xs_read_calls); + BUG_ON(iocb->ki_pos != pos); + + if (unlikely(file->f_flags & O_DIRECT)) + ioflags |= IO_ISDIRECT; + if (file->f_mode & FMODE_NOCMTIME) + ioflags |= IO_INVIS; + /* START copy & waste from filemap.c */ - for (seg = 0; seg < segs; seg++) { + for (seg = 0; seg < nr_segs; seg++) { const struct iovec *iv = &iovp[seg]; /* @@ -134,17 +140,16 @@ xfs_read( xfs_buftarg_t *target = XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; - if ((*offset & target->bt_smask) || + if ((iocb->ki_pos & target->bt_smask) || (size & target->bt_smask)) { - if (*offset == ip->i_size) { - return (0); - } + if (iocb->ki_pos == ip->i_size) + return 0; return -XFS_ERROR(EINVAL); } } - n = XFS_MAXIOFFSET(mp) - *offset; - if ((n <= 0) || (size == 0)) + n = XFS_MAXIOFFSET(mp) - iocb->ki_pos; + if (n <= 0 || size == 0) return 0; if (n < size) @@ -161,7 +166,7 @@ xfs_read( 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, *offset, size, + ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, ip, iocb->ki_pos, size, dmflags, &iolock); if (ret) { xfs_iunlock(ip, XFS_IOLOCK_SHARED); @@ -172,9 +177,11 @@ xfs_read( } if (unlikely(ioflags & IO_ISDIRECT)) { - if (inode->i_mapping->nrpages) - ret = -xfs_flushinval_pages(ip, (*offset & PAGE_CACHE_MASK), - -1, FI_REMAPF_LOCKED); + if (inode->i_mapping->nrpages) { + ret = -xfs_flushinval_pages(ip, + (iocb->ki_pos & PAGE_CACHE_MASK), + -1, FI_REMAPF_LOCKED); + } mutex_unlock(&inode->i_mutex); if (ret) { xfs_iunlock(ip, XFS_IOLOCK_SHARED); @@ -182,10 +189,9 @@ xfs_read( } } - trace_xfs_file_read(ip, size, *offset, ioflags); + trace_xfs_file_read(ip, size, iocb->ki_pos, ioflags); - iocb->ki_pos = *offset; - ret = generic_file_aio_read(iocb, iovp, segs, *offset); + ret = generic_file_aio_read(iocb, iovp, nr_segs, iocb->ki_pos); if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); @@ -193,20 +199,24 @@ xfs_read( return ret; } -ssize_t -xfs_splice_read( - xfs_inode_t *ip, +STATIC ssize_t +xfs_file_splice_read( struct file *infilp, loff_t *ppos, struct pipe_inode_info *pipe, size_t count, - int flags, - int ioflags) + unsigned int flags) { - xfs_mount_t *mp = ip->i_mount; + struct xfs_inode *ip = XFS_I(infilp->f_mapping->host); + struct xfs_mount *mp = ip->i_mount; + int ioflags = 0; ssize_t ret; XFS_STATS_INC(xs_read_calls); + + if (infilp->f_mode & FMODE_NOCMTIME) + ioflags |= IO_INVIS; + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return -EIO; @@ -234,22 +244,26 @@ xfs_splice_read( return ret; } -ssize_t -xfs_splice_write( - xfs_inode_t *ip, +STATIC ssize_t +xfs_file_splice_write( struct pipe_inode_info *pipe, struct file *outfilp, loff_t *ppos, size_t count, - int flags, - int ioflags) + unsigned int flags) { - xfs_mount_t *mp = ip->i_mount; - ssize_t ret; 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; XFS_STATS_INC(xs_write_calls); + + if (outfilp->f_mode & FMODE_NOCMTIME) + ioflags |= IO_INVIS; + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return -EIO; @@ -484,42 +498,43 @@ out_lock: return error; } -ssize_t /* bytes written, or (-) error */ -xfs_write( - struct xfs_inode *xip, +STATIC ssize_t +xfs_file_aio_write( struct kiocb *iocb, const struct iovec *iovp, - unsigned int nsegs, - loff_t *offset, - int ioflags) + unsigned long nr_segs, + loff_t pos) { struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; struct inode *inode = mapping->host; - unsigned long segs = nsegs; - xfs_mount_t *mp; + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; ssize_t ret = 0, error = 0; + int ioflags = 0; xfs_fsize_t isize, new_size; int iolock; int eventsent = 0; size_t ocount = 0, count; - loff_t pos; int need_i_mutex; XFS_STATS_INC(xs_write_calls); - error = generic_segment_checks(iovp, &segs, &ocount, VERIFY_READ); + BUG_ON(iocb->ki_pos != pos); + + if (unlikely(file->f_flags & O_DIRECT)) + ioflags |= IO_ISDIRECT; + if (file->f_mode & FMODE_NOCMTIME) + ioflags |= IO_INVIS; + + error = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); if (error) return error; count = ocount; - pos = *offset; - if (count == 0) return 0; - mp = xip->i_mount; - xfs_wait_for_freeze(mp, SB_FREEZE_WRITE); if (XFS_FORCED_SHUTDOWN(mp)) @@ -535,30 +550,30 @@ relock: mutex_lock(&inode->i_mutex); } - xfs_ilock(xip, XFS_ILOCK_EXCL|iolock); + xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); start: error = -generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); if (error) { - xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); + xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); goto out_unlock_mutex; } - if ((DM_EVENT_ENABLED(xip, DM_EVENT_WRITE) && + 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(xip, XFS_ILOCK_EXCL); - error = XFS_SEND_DATA(xip->i_mount, DM_EVENT_WRITE, xip, + 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(xip, XFS_ILOCK_EXCL); + xfs_ilock(ip, XFS_ILOCK_EXCL); eventsent = 1; /* @@ -568,33 +583,33 @@ start: * 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 != xip->i_size) + if ((file->f_flags & O_APPEND) && pos != ip->i_size) goto start; } if (ioflags & IO_ISDIRECT) { xfs_buftarg_t *target = - XFS_IS_REALTIME_INODE(xip) ? + XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; if ((pos & target->bt_smask) || (count & target->bt_smask)) { - xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); + xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); return XFS_ERROR(-EINVAL); } - if (!need_i_mutex && (mapping->nrpages || pos > xip->i_size)) { - xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); + if (!need_i_mutex && (mapping->nrpages || pos > ip->i_size)) { + xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); iolock = XFS_IOLOCK_EXCL; need_i_mutex = 1; mutex_lock(&inode->i_mutex); - xfs_ilock(xip, XFS_ILOCK_EXCL|iolock); + xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); goto start; } } new_size = pos + count; - if (new_size > xip->i_size) - xip->i_new_size = new_size; + if (new_size > ip->i_size) + ip->i_new_size = new_size; if (likely(!(ioflags & IO_INVIS))) file_update_time(file); @@ -608,14 +623,14 @@ start: * to zero it out up to the new size. */ - if (pos > xip->i_size) { - error = xfs_zero_eof(xip, pos, xip->i_size); + if (pos > ip->i_size) { + error = xfs_zero_eof(ip, pos, ip->i_size); if (error) { - xfs_iunlock(xip, XFS_ILOCK_EXCL); + xfs_iunlock(ip, XFS_ILOCK_EXCL); goto out_unlock_internal; } } - xfs_iunlock(xip, XFS_ILOCK_EXCL); + xfs_iunlock(ip, XFS_ILOCK_EXCL); /* * If we're writing the file then make sure to clear the @@ -633,7 +648,7 @@ start: if ((ioflags & IO_ISDIRECT)) { if (mapping->nrpages) { WARN_ON(need_i_mutex == 0); - error = xfs_flushinval_pages(xip, + error = xfs_flushinval_pages(ip, (pos & PAGE_CACHE_MASK), -1, FI_REMAPF_LOCKED); if (error) @@ -642,16 +657,16 @@ start: if (need_i_mutex) { /* demote the lock now the cached pages are gone */ - xfs_ilock_demote(xip, XFS_IOLOCK_EXCL); + xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); mutex_unlock(&inode->i_mutex); iolock = XFS_IOLOCK_SHARED; need_i_mutex = 0; } - trace_xfs_file_direct_write(xip, count, *offset, ioflags); + trace_xfs_file_direct_write(ip, count, iocb->ki_pos, ioflags); ret = generic_file_direct_write(iocb, iovp, - &segs, pos, offset, count, ocount); + &nr_segs, pos, &iocb->ki_pos, count, ocount); /* * direct-io write to a hole: fall through to buffered I/O @@ -664,7 +679,7 @@ start: count -= ret; ioflags &= ~IO_ISDIRECT; - xfs_iunlock(xip, iolock); + xfs_iunlock(ip, iolock); goto relock; } } else { @@ -672,15 +687,15 @@ start: ssize_t ret2 = 0; write_retry: - trace_xfs_file_buffered_write(xip, count, *offset, ioflags); - ret2 = generic_file_buffered_write(iocb, iovp, segs, - pos, offset, count, ret); + trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, ioflags); + ret2 = generic_file_buffered_write(iocb, iovp, nr_segs, + pos, &iocb->ki_pos, count, ret); /* * if we just got an ENOSPC, flush the inode now we * aren't holding any page locks and retry *once* */ if (ret2 == -ENOSPC && !enospc) { - error = xfs_flush_pages(xip, 0, -1, 0, FI_NONE); + error = xfs_flush_pages(ip, 0, -1, 0, FI_NONE); if (error) goto out_unlock_internal; enospc = 1; @@ -692,27 +707,27 @@ write_retry: current->backing_dev_info = NULL; isize = i_size_read(inode); - if (unlikely(ret < 0 && ret != -EFAULT && *offset > isize)) - *offset = isize; + if (unlikely(ret < 0 && ret != -EFAULT && iocb->ki_pos > isize)) + iocb->ki_pos = isize; - if (*offset > xip->i_size) { - xfs_ilock(xip, XFS_ILOCK_EXCL); - if (*offset > xip->i_size) - xip->i_size = *offset; - xfs_iunlock(xip, XFS_ILOCK_EXCL); + if (iocb->ki_pos > ip->i_size) { + xfs_ilock(ip, XFS_ILOCK_EXCL); + if (iocb->ki_pos > ip->i_size) + ip->i_size = iocb->ki_pos; + xfs_iunlock(ip, XFS_ILOCK_EXCL); } if (ret == -ENOSPC && - DM_EVENT_ENABLED(xip, DM_EVENT_NOSPACE) && !(ioflags & IO_INVIS)) { - xfs_iunlock(xip, iolock); + 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(xip->i_mount, DM_EVENT_NOSPACE, xip, - DM_RIGHT_NULL, xip, DM_RIGHT_NULL, NULL, NULL, + 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(xip, iolock); + xfs_ilock(ip, iolock); if (error) goto out_unlock_internal; goto start; @@ -729,7 +744,7 @@ write_retry: loff_t end = pos + ret - 1; int error2; - xfs_iunlock(xip, iolock); + xfs_iunlock(ip, iolock); if (need_i_mutex) mutex_unlock(&inode->i_mutex); @@ -738,17 +753,17 @@ write_retry: error = error2; if (need_i_mutex) mutex_lock(&inode->i_mutex); - xfs_ilock(xip, iolock); + xfs_ilock(ip, iolock); - error2 = xfs_fsync(xip); + error2 = xfs_fsync(ip); if (!error) error = error2; } out_unlock_internal: - if (xip->i_new_size) { - xfs_ilock(xip, XFS_ILOCK_EXCL); - xip->i_new_size = 0; + if (ip->i_new_size) { + xfs_ilock(ip, XFS_ILOCK_EXCL); + ip->i_new_size = 0; /* * If this was a direct or synchronous I/O that failed (such * as ENOSPC) then part of the I/O may have been written to @@ -756,89 +771,17 @@ write_retry: * file size may have been adjusted beyond the in-memory file * size and now needs to be truncated back. */ - if (xip->i_d.di_size > xip->i_size) - xip->i_d.di_size = xip->i_size; - xfs_iunlock(xip, XFS_ILOCK_EXCL); + if (ip->i_d.di_size > ip->i_size) + ip->i_d.di_size = ip->i_size; + xfs_iunlock(ip, XFS_ILOCK_EXCL); } - xfs_iunlock(xip, iolock); + xfs_iunlock(ip, iolock); out_unlock_mutex: if (need_i_mutex) mutex_unlock(&inode->i_mutex); return -error; } -STATIC ssize_t -xfs_file_aio_read( - struct kiocb *iocb, - const struct iovec *iov, - unsigned long nr_segs, - loff_t pos) -{ - struct file *file = iocb->ki_filp; - int ioflags = 0; - - BUG_ON(iocb->ki_pos != pos); - if (unlikely(file->f_flags & O_DIRECT)) - ioflags |= IO_ISDIRECT; - if (file->f_mode & FMODE_NOCMTIME) - ioflags |= IO_INVIS; - return xfs_read(XFS_I(file->f_path.dentry->d_inode), iocb, iov, - nr_segs, &iocb->ki_pos, ioflags); -} - -STATIC ssize_t -xfs_file_aio_write( - struct kiocb *iocb, - const struct iovec *iov, - unsigned long nr_segs, - loff_t pos) -{ - struct file *file = iocb->ki_filp; - int ioflags = 0; - - BUG_ON(iocb->ki_pos != pos); - if (unlikely(file->f_flags & O_DIRECT)) - ioflags |= IO_ISDIRECT; - if (file->f_mode & FMODE_NOCMTIME) - ioflags |= IO_INVIS; - return xfs_write(XFS_I(file->f_mapping->host), iocb, iov, nr_segs, - &iocb->ki_pos, ioflags); -} - -STATIC ssize_t -xfs_file_splice_read( - struct file *infilp, - loff_t *ppos, - struct pipe_inode_info *pipe, - size_t len, - unsigned int flags) -{ - int ioflags = 0; - - if (infilp->f_mode & FMODE_NOCMTIME) - ioflags |= IO_INVIS; - - return xfs_splice_read(XFS_I(infilp->f_path.dentry->d_inode), - infilp, ppos, pipe, len, flags, ioflags); -} - -STATIC ssize_t -xfs_file_splice_write( - struct pipe_inode_info *pipe, - struct file *outfilp, - loff_t *ppos, - size_t len, - unsigned int flags) -{ - int ioflags = 0; - - if (outfilp->f_mode & FMODE_NOCMTIME) - ioflags |= IO_INVIS; - - return xfs_splice_write(XFS_I(outfilp->f_path.dentry->d_inode), - pipe, outfilp, ppos, len, flags, ioflags); -} - STATIC int xfs_file_open( struct inode *inode, From BATV+1d2bc40de82a3f7823ed+2367+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 15 03:44:49 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_65,J_CHICKENPOX_66 autolearn=no version=3.3.0-rupdated 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 o1F9ilgY047245 for ; Mon, 15 Feb 2010 03:44:49 -0600 X-ASG-Debug-ID: 1266227164-611801840000-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 B21D71CCFB70 for ; Mon, 15 Feb 2010 01:46:04 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id BI4ewAPMjQ9P7Lmi for ; Mon, 15 Feb 2010 01:46:04 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NgxWm-0000E4-4h for xfs@oss.sgi.com; Mon, 15 Feb 2010 09:46:04 +0000 Message-Id: <20100215094603.932254045@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 15 Feb 2010 04:44:46 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/4] [PATCH 1/4] xfs: merge xfs_lrw.c into xfs_file.c Subject: [PATCH 1/4] [PATCH 1/4] xfs: merge xfs_lrw.c into xfs_file.c References: <20100215094445.528696829@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-kill-xfs_lrw-dot-c 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: 1266227164 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 the code to implement the file operations is split over two small files. Merge the content of xfs_lrw.c into xfs_file.c to have it in one place. Note that I haven't done various cleanups that are possible after this yet, they will follow in the next patch. Also the function xfs_dev_is_read_only which was in xfs_lrw.c before really doesn't fit in here at all and was moved to xfs_mount.c. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/Makefile =================================================================== --- xfs.orig/fs/xfs/Makefile 2010-02-13 22:54:22.756254098 +0100 +++ xfs/fs/xfs/Makefile 2010-02-13 22:54:25.908270580 +0100 @@ -105,7 +105,6 @@ xfs-y += $(addprefix $(XFS_LINUX)/, \ xfs_globals.o \ xfs_ioctl.o \ xfs_iops.o \ - xfs_lrw.o \ xfs_super.o \ xfs_sync.o \ xfs_xattr.o) Index: xfs/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_file.c 2010-02-13 22:51:38.134254237 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-02-13 23:01:49.075025713 +0100 @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" +#include "xfs_fs.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_inum.h" @@ -34,16 +35,738 @@ #include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.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" +#include "xfs_trace.h" #include static const struct vm_operations_struct xfs_file_vm_ops; +/* + * xfs_iozero + * + * xfs_iozero clears the specified range of buffer supplied, + * and marks all the affected blocks as valid and modified. If + * an affected block is not allocated, it will be allocated. If + * an affected block is not completely overwritten, and is not + * valid before the operation, it will be read from disk before + * being partially zeroed. + */ +STATIC int +xfs_iozero( + struct xfs_inode *ip, /* inode */ + loff_t pos, /* offset in file */ + size_t count) /* size of data to zero */ +{ + struct page *page; + struct address_space *mapping; + int status; + + mapping = VFS_I(ip)->i_mapping; + do { + unsigned offset, bytes; + void *fsdata; + + offset = (pos & (PAGE_CACHE_SIZE -1)); /* Within page */ + bytes = PAGE_CACHE_SIZE - offset; + if (bytes > count) + bytes = count; + + status = pagecache_write_begin(NULL, mapping, pos, bytes, + AOP_FLAG_UNINTERRUPTIBLE, + &page, &fsdata); + if (status) + break; + + zero_user(page, offset, bytes); + + status = pagecache_write_end(NULL, mapping, pos, bytes, bytes, + page, fsdata); + WARN_ON(status <= 0); /* can't return less than zero! */ + pos += bytes; + count -= bytes; + status = 0; + } while (count); + + return (-status); +} + +ssize_t /* bytes read, or (-) error */ +xfs_read( + xfs_inode_t *ip, + struct kiocb *iocb, + const struct iovec *iovp, + unsigned int segs, + loff_t *offset, + int ioflags) +{ + struct file *file = iocb->ki_filp; + struct inode *inode = file->f_mapping->host; + xfs_mount_t *mp = ip->i_mount; + size_t size = 0; + ssize_t ret = 0; + xfs_fsize_t n; + unsigned long seg; + + + XFS_STATS_INC(xs_read_calls); + + /* START copy & waste from filemap.c */ + for (seg = 0; seg < segs; seg++) { + const struct iovec *iv = &iovp[seg]; + + /* + * If any segment has a negative length, or the cumulative + * length ever wraps negative then return -EINVAL. + */ + size += iv->iov_len; + if (unlikely((ssize_t)(size|iv->iov_len) < 0)) + return XFS_ERROR(-EINVAL); + } + /* END copy & waste from filemap.c */ + + if (unlikely(ioflags & IO_ISDIRECT)) { + xfs_buftarg_t *target = + XFS_IS_REALTIME_INODE(ip) ? + mp->m_rtdev_targp : mp->m_ddev_targp; + if ((*offset & target->bt_smask) || + (size & target->bt_smask)) { + if (*offset == ip->i_size) { + return (0); + } + return -XFS_ERROR(EINVAL); + } + } + + n = XFS_MAXIOFFSET(mp) - *offset; + if ((n <= 0) || (size == 0)) + return 0; + + if (n < size) + size = n; + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + + if (unlikely(ioflags & IO_ISDIRECT)) + 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, *offset, 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, (*offset & PAGE_CACHE_MASK), + -1, FI_REMAPF_LOCKED); + mutex_unlock(&inode->i_mutex); + if (ret) { + xfs_iunlock(ip, XFS_IOLOCK_SHARED); + return ret; + } + } + + trace_xfs_file_read(ip, size, *offset, ioflags); + + iocb->ki_pos = *offset; + ret = generic_file_aio_read(iocb, iovp, segs, *offset); + if (ret > 0) + XFS_STATS_ADD(xs_read_bytes, ret); + + xfs_iunlock(ip, XFS_IOLOCK_SHARED); + return ret; +} + +ssize_t +xfs_splice_read( + xfs_inode_t *ip, + struct file *infilp, + loff_t *ppos, + struct pipe_inode_info *pipe, + size_t count, + int flags, + int ioflags) +{ + xfs_mount_t *mp = ip->i_mount; + ssize_t ret; + + XFS_STATS_INC(xs_read_calls); + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) + return -EIO; + + 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); + if (ret > 0) + XFS_STATS_ADD(xs_read_bytes, ret); + + xfs_iunlock(ip, XFS_IOLOCK_SHARED); + return ret; +} + +ssize_t +xfs_splice_write( + xfs_inode_t *ip, + struct pipe_inode_info *pipe, + struct file *outfilp, + loff_t *ppos, + size_t count, + int flags, + int ioflags) +{ + xfs_mount_t *mp = ip->i_mount; + ssize_t ret; + struct inode *inode = outfilp->f_mapping->host; + xfs_fsize_t isize, new_size; + + XFS_STATS_INC(xs_write_calls); + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) + return -EIO; + + 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); + if (new_size > ip->i_size) + ip->i_new_size = new_size; + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + trace_xfs_file_splice_write(ip, count, *ppos, ioflags); + + ret = generic_file_splice_write(pipe, outfilp, ppos, count, flags); + if (ret > 0) + XFS_STATS_ADD(xs_write_bytes, ret); + + isize = i_size_read(inode); + if (unlikely(ret < 0 && ret != -EFAULT && *ppos > isize)) + *ppos = isize; + + if (*ppos > ip->i_size) { + xfs_ilock(ip, XFS_ILOCK_EXCL); + if (*ppos > ip->i_size) + ip->i_size = *ppos; + xfs_iunlock(ip, XFS_ILOCK_EXCL); + } + + if (ip->i_new_size) { + xfs_ilock(ip, XFS_ILOCK_EXCL); + ip->i_new_size = 0; + if (ip->i_d.di_size > ip->i_size) + ip->i_d.di_size = ip->i_size; + xfs_iunlock(ip, XFS_ILOCK_EXCL); + } + xfs_iunlock(ip, XFS_IOLOCK_EXCL); + return ret; +} + +/* + * This routine is called to handle zeroing any space in the last + * block of the file that is beyond the EOF. We do this since the + * size is being increased without writing anything to that block + * and we don't want anyone to read the garbage on the disk. + */ +STATIC int /* error (positive) */ +xfs_zero_last_block( + xfs_inode_t *ip, + xfs_fsize_t offset, + xfs_fsize_t isize) +{ + xfs_fileoff_t last_fsb; + xfs_mount_t *mp = ip->i_mount; + int nimaps; + int zero_offset; + int zero_len; + int error = 0; + xfs_bmbt_irec_t imap; + + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); + + zero_offset = XFS_B_FSB_OFFSET(mp, isize); + if (zero_offset == 0) { + /* + * There are no extra bytes in the last block on disk to + * zero, so return. + */ + return 0; + } + + 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); + if (error) { + return error; + } + ASSERT(nimaps > 0); + /* + * If the block underlying isize is just a hole, then there + * is nothing to zero. + */ + if (imap.br_startblock == HOLESTARTBLOCK) { + return 0; + } + /* + * Zero the part of the last block beyond the EOF, and write it + * out sync. We need to drop the ilock while we do this so we + * don't deadlock when the buffer cache calls back to us. + */ + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + zero_len = mp->m_sb.sb_blocksize - zero_offset; + if (isize + zero_len > offset) + zero_len = offset - isize; + error = xfs_iozero(ip, isize, zero_len); + + xfs_ilock(ip, XFS_ILOCK_EXCL); + ASSERT(error >= 0); + return error; +} + +/* + * Zero any on disk space between the current EOF and the new, + * larger EOF. This handles the normal case of zeroing the remainder + * of the last block in the file and the unusual case of zeroing blocks + * out beyond the size of the file. This second case only happens + * with fixed size extents and when the system crashes before the inode + * size was updated but after blocks were allocated. If fill is set, + * then any holes in the range are filled and zeroed. If not, the holes + * are left alone as holes. + */ + +int /* error (positive) */ +xfs_zero_eof( + xfs_inode_t *ip, + xfs_off_t offset, /* starting I/O offset */ + xfs_fsize_t isize) /* current inode size */ +{ + xfs_mount_t *mp = ip->i_mount; + xfs_fileoff_t start_zero_fsb; + xfs_fileoff_t end_zero_fsb; + xfs_fileoff_t zero_count_fsb; + xfs_fileoff_t last_fsb; + xfs_fileoff_t zero_off; + xfs_fsize_t zero_len; + int nimaps; + int error = 0; + xfs_bmbt_irec_t imap; + + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); + ASSERT(offset > isize); + + /* + * First handle zeroing the block on which isize resides. + * We only zero a part of that block so it is handled specially. + */ + error = xfs_zero_last_block(ip, offset, isize); + if (error) { + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); + return error; + } + + /* + * Calculate the range between the new size and the old + * where blocks needing to be zeroed may exist. To get the + * block where the last byte in the file currently resides, + * we need to subtract one from the size and truncate back + * to a block boundary. We subtract 1 in case the size is + * exactly on a block boundary. + */ + last_fsb = isize ? XFS_B_TO_FSBT(mp, isize - 1) : (xfs_fileoff_t)-1; + start_zero_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)isize); + end_zero_fsb = XFS_B_TO_FSBT(mp, offset - 1); + ASSERT((xfs_sfiloff_t)last_fsb < (xfs_sfiloff_t)start_zero_fsb); + if (last_fsb == end_zero_fsb) { + /* + * The size was only incremented on its last block. + * We took care of that above, so just return. + */ + return 0; + } + + ASSERT(start_zero_fsb <= end_zero_fsb); + while (start_zero_fsb <= end_zero_fsb) { + 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); + if (error) { + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); + return error; + } + ASSERT(nimaps > 0); + + if (imap.br_state == XFS_EXT_UNWRITTEN || + imap.br_startblock == HOLESTARTBLOCK) { + /* + * This loop handles initializing pages that were + * partially initialized by the code below this + * loop. It basically zeroes the part of the page + * that sits on a hole and sets the page as P_HOLE + * and calls remapf if it is a mapped file. + */ + start_zero_fsb = imap.br_startoff + imap.br_blockcount; + ASSERT(start_zero_fsb <= (end_zero_fsb + 1)); + continue; + } + + /* + * There are blocks we need to zero. + * Drop the inode lock while we're doing the I/O. + * We'll still have the iolock to protect us. + */ + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + zero_off = XFS_FSB_TO_B(mp, start_zero_fsb); + zero_len = XFS_FSB_TO_B(mp, imap.br_blockcount); + + if ((zero_off + zero_len) > offset) + zero_len = offset - zero_off; + + error = xfs_iozero(ip, zero_off, zero_len); + if (error) { + goto out_lock; + } + + start_zero_fsb = imap.br_startoff + imap.br_blockcount; + ASSERT(start_zero_fsb <= (end_zero_fsb + 1)); + + xfs_ilock(ip, XFS_ILOCK_EXCL); + } + + return 0; + +out_lock: + xfs_ilock(ip, XFS_ILOCK_EXCL); + ASSERT(error >= 0); + return error; +} + +ssize_t /* bytes written, or (-) error */ +xfs_write( + struct xfs_inode *xip, + struct kiocb *iocb, + const struct iovec *iovp, + unsigned int nsegs, + loff_t *offset, + int ioflags) +{ + struct file *file = iocb->ki_filp; + struct address_space *mapping = file->f_mapping; + struct inode *inode = mapping->host; + unsigned long segs = nsegs; + xfs_mount_t *mp; + ssize_t ret = 0, error = 0; + xfs_fsize_t isize, new_size; + int iolock; + int eventsent = 0; + size_t ocount = 0, count; + loff_t pos; + int need_i_mutex; + + XFS_STATS_INC(xs_write_calls); + + error = generic_segment_checks(iovp, &segs, &ocount, VERIFY_READ); + if (error) + return error; + + count = ocount; + pos = *offset; + + if (count == 0) + return 0; + + mp = xip->i_mount; + + xfs_wait_for_freeze(mp, SB_FREEZE_WRITE); + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + +relock: + if (ioflags & IO_ISDIRECT) { + iolock = XFS_IOLOCK_SHARED; + need_i_mutex = 0; + } else { + iolock = XFS_IOLOCK_EXCL; + need_i_mutex = 1; + mutex_lock(&inode->i_mutex); + } + + xfs_ilock(xip, XFS_ILOCK_EXCL|iolock); + +start: + error = -generic_write_checks(file, &pos, &count, + S_ISBLK(inode->i_mode)); + if (error) { + xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); + goto out_unlock_mutex; + } + + if ((DM_EVENT_ENABLED(xip, DM_EVENT_WRITE) && + !(ioflags & IO_INVIS) && !eventsent)) { + int dmflags = FILP_DELAY_FLAG(file); + + if (need_i_mutex) + dmflags |= DM_FLAGS_IMUX; + + xfs_iunlock(xip, XFS_ILOCK_EXCL); + error = XFS_SEND_DATA(xip->i_mount, DM_EVENT_WRITE, xip, + pos, count, dmflags, &iolock); + if (error) { + goto out_unlock_internal; + } + xfs_ilock(xip, 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 != xip->i_size) + goto start; + } + + if (ioflags & IO_ISDIRECT) { + xfs_buftarg_t *target = + XFS_IS_REALTIME_INODE(xip) ? + mp->m_rtdev_targp : mp->m_ddev_targp; + + if ((pos & target->bt_smask) || (count & target->bt_smask)) { + xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); + return XFS_ERROR(-EINVAL); + } + + if (!need_i_mutex && (mapping->nrpages || pos > xip->i_size)) { + xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); + iolock = XFS_IOLOCK_EXCL; + need_i_mutex = 1; + mutex_lock(&inode->i_mutex); + xfs_ilock(xip, XFS_ILOCK_EXCL|iolock); + goto start; + } + } + + new_size = pos + count; + if (new_size > xip->i_size) + xip->i_new_size = new_size; + + if (likely(!(ioflags & IO_INVIS))) + file_update_time(file); + + /* + * If the offset is beyond the size of the file, we have a couple + * of things to do. First, if there is already space allocated + * we need to either create holes or zero the disk or ... + * + * If there is a page where the previous size lands, we need + * to zero it out up to the new size. + */ + + if (pos > xip->i_size) { + error = xfs_zero_eof(xip, pos, xip->i_size); + if (error) { + xfs_iunlock(xip, XFS_ILOCK_EXCL); + goto out_unlock_internal; + } + } + xfs_iunlock(xip, XFS_ILOCK_EXCL); + + /* + * If we're writing the file then make sure to clear the + * setuid and setgid bits if the process is not being run + * by root. This keeps people from modifying setuid and + * setgid binaries. + */ + error = -file_remove_suid(file); + if (unlikely(error)) + goto out_unlock_internal; + + /* We can write back this queue in page reclaim */ + current->backing_dev_info = mapping->backing_dev_info; + + if ((ioflags & IO_ISDIRECT)) { + if (mapping->nrpages) { + WARN_ON(need_i_mutex == 0); + error = xfs_flushinval_pages(xip, + (pos & PAGE_CACHE_MASK), + -1, FI_REMAPF_LOCKED); + if (error) + goto out_unlock_internal; + } + + if (need_i_mutex) { + /* demote the lock now the cached pages are gone */ + xfs_ilock_demote(xip, XFS_IOLOCK_EXCL); + mutex_unlock(&inode->i_mutex); + + iolock = XFS_IOLOCK_SHARED; + need_i_mutex = 0; + } + + trace_xfs_file_direct_write(xip, count, *offset, ioflags); + ret = generic_file_direct_write(iocb, iovp, + &segs, pos, offset, count, ocount); + + /* + * direct-io write to a hole: fall through to buffered I/O + * for completing the rest of the request. + */ + if (ret >= 0 && ret != count) { + XFS_STATS_ADD(xs_write_bytes, ret); + + pos += ret; + count -= ret; + + ioflags &= ~IO_ISDIRECT; + xfs_iunlock(xip, iolock); + goto relock; + } + } else { + int enospc = 0; + ssize_t ret2 = 0; + +write_retry: + trace_xfs_file_buffered_write(xip, count, *offset, ioflags); + ret2 = generic_file_buffered_write(iocb, iovp, segs, + pos, offset, count, ret); + /* + * if we just got an ENOSPC, flush the inode now we + * aren't holding any page locks and retry *once* + */ + if (ret2 == -ENOSPC && !enospc) { + error = xfs_flush_pages(xip, 0, -1, 0, FI_NONE); + if (error) + goto out_unlock_internal; + enospc = 1; + goto write_retry; + } + ret = ret2; + } + + current->backing_dev_info = NULL; + + isize = i_size_read(inode); + if (unlikely(ret < 0 && ret != -EFAULT && *offset > isize)) + *offset = isize; + + if (*offset > xip->i_size) { + xfs_ilock(xip, XFS_ILOCK_EXCL); + if (*offset > xip->i_size) + xip->i_size = *offset; + xfs_iunlock(xip, XFS_ILOCK_EXCL); + } + + if (ret == -ENOSPC && + DM_EVENT_ENABLED(xip, DM_EVENT_NOSPACE) && !(ioflags & IO_INVIS)) { + xfs_iunlock(xip, iolock); + if (need_i_mutex) + mutex_unlock(&inode->i_mutex); + error = XFS_SEND_NAMESP(xip->i_mount, DM_EVENT_NOSPACE, xip, + DM_RIGHT_NULL, xip, DM_RIGHT_NULL, NULL, NULL, + 0, 0, 0); /* Delay flag intentionally unused */ + if (need_i_mutex) + mutex_lock(&inode->i_mutex); + xfs_ilock(xip, iolock); + if (error) + goto out_unlock_internal; + goto start; + } + + error = -ret; + if (ret <= 0) + goto out_unlock_internal; + + XFS_STATS_ADD(xs_write_bytes, ret); + + /* Handle various SYNC-type writes */ + if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) { + loff_t end = pos + ret - 1; + int error2; + + xfs_iunlock(xip, iolock); + if (need_i_mutex) + mutex_unlock(&inode->i_mutex); + + error2 = filemap_write_and_wait_range(mapping, pos, end); + if (!error) + error = error2; + if (need_i_mutex) + mutex_lock(&inode->i_mutex); + xfs_ilock(xip, iolock); + + error2 = xfs_fsync(xip); + if (!error) + error = error2; + } + + out_unlock_internal: + if (xip->i_new_size) { + xfs_ilock(xip, XFS_ILOCK_EXCL); + xip->i_new_size = 0; + /* + * If this was a direct or synchronous I/O that failed (such + * as ENOSPC) then part of the I/O may have been written to + * disk before the error occured. In this case the on-disk + * file size may have been adjusted beyond the in-memory file + * size and now needs to be truncated back. + */ + if (xip->i_d.di_size > xip->i_size) + xip->i_d.di_size = xip->i_size; + xfs_iunlock(xip, XFS_ILOCK_EXCL); + } + xfs_iunlock(xip, iolock); + out_unlock_mutex: + if (need_i_mutex) + mutex_unlock(&inode->i_mutex); + return -error; +} + STATIC ssize_t xfs_file_aio_read( struct kiocb *iocb, Index: xfs/fs/xfs/linux-2.6/xfs_lrw.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_lrw.c 2010-02-13 22:51:38.119272745 +0100 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,796 +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_bit.h" -#include "xfs_log.h" -#include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_sb.h" -#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" -#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_inode_item.h" -#include "xfs_buf_item.h" -#include "xfs_utils.h" -#include "xfs_iomap.h" -#include "xfs_vnodeops.h" -#include "xfs_trace.h" - -#include -#include - - -/* - * xfs_iozero - * - * xfs_iozero clears the specified range of buffer supplied, - * and marks all the affected blocks as valid and modified. If - * an affected block is not allocated, it will be allocated. If - * an affected block is not completely overwritten, and is not - * valid before the operation, it will be read from disk before - * being partially zeroed. - */ -STATIC int -xfs_iozero( - struct xfs_inode *ip, /* inode */ - loff_t pos, /* offset in file */ - size_t count) /* size of data to zero */ -{ - struct page *page; - struct address_space *mapping; - int status; - - mapping = VFS_I(ip)->i_mapping; - do { - unsigned offset, bytes; - void *fsdata; - - offset = (pos & (PAGE_CACHE_SIZE -1)); /* Within page */ - bytes = PAGE_CACHE_SIZE - offset; - if (bytes > count) - bytes = count; - - status = pagecache_write_begin(NULL, mapping, pos, bytes, - AOP_FLAG_UNINTERRUPTIBLE, - &page, &fsdata); - if (status) - break; - - zero_user(page, offset, bytes); - - status = pagecache_write_end(NULL, mapping, pos, bytes, bytes, - page, fsdata); - WARN_ON(status <= 0); /* can't return less than zero! */ - pos += bytes; - count -= bytes; - status = 0; - } while (count); - - return (-status); -} - -ssize_t /* bytes read, or (-) error */ -xfs_read( - xfs_inode_t *ip, - struct kiocb *iocb, - const struct iovec *iovp, - unsigned int segs, - loff_t *offset, - int ioflags) -{ - struct file *file = iocb->ki_filp; - struct inode *inode = file->f_mapping->host; - xfs_mount_t *mp = ip->i_mount; - size_t size = 0; - ssize_t ret = 0; - xfs_fsize_t n; - unsigned long seg; - - - XFS_STATS_INC(xs_read_calls); - - /* START copy & waste from filemap.c */ - for (seg = 0; seg < segs; seg++) { - const struct iovec *iv = &iovp[seg]; - - /* - * If any segment has a negative length, or the cumulative - * length ever wraps negative then return -EINVAL. - */ - size += iv->iov_len; - if (unlikely((ssize_t)(size|iv->iov_len) < 0)) - return XFS_ERROR(-EINVAL); - } - /* END copy & waste from filemap.c */ - - if (unlikely(ioflags & IO_ISDIRECT)) { - xfs_buftarg_t *target = - XFS_IS_REALTIME_INODE(ip) ? - mp->m_rtdev_targp : mp->m_ddev_targp; - if ((*offset & target->bt_smask) || - (size & target->bt_smask)) { - if (*offset == ip->i_size) { - return (0); - } - return -XFS_ERROR(EINVAL); - } - } - - n = XFS_MAXIOFFSET(mp) - *offset; - if ((n <= 0) || (size == 0)) - return 0; - - if (n < size) - size = n; - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; - - if (unlikely(ioflags & IO_ISDIRECT)) - 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, *offset, 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, (*offset & PAGE_CACHE_MASK), - -1, FI_REMAPF_LOCKED); - mutex_unlock(&inode->i_mutex); - if (ret) { - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - return ret; - } - } - - trace_xfs_file_read(ip, size, *offset, ioflags); - - iocb->ki_pos = *offset; - ret = generic_file_aio_read(iocb, iovp, segs, *offset); - if (ret > 0) - XFS_STATS_ADD(xs_read_bytes, ret); - - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - return ret; -} - -ssize_t -xfs_splice_read( - xfs_inode_t *ip, - struct file *infilp, - loff_t *ppos, - struct pipe_inode_info *pipe, - size_t count, - int flags, - int ioflags) -{ - xfs_mount_t *mp = ip->i_mount; - ssize_t ret; - - XFS_STATS_INC(xs_read_calls); - if (XFS_FORCED_SHUTDOWN(ip->i_mount)) - return -EIO; - - 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); - if (ret > 0) - XFS_STATS_ADD(xs_read_bytes, ret); - - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - return ret; -} - -ssize_t -xfs_splice_write( - xfs_inode_t *ip, - struct pipe_inode_info *pipe, - struct file *outfilp, - loff_t *ppos, - size_t count, - int flags, - int ioflags) -{ - xfs_mount_t *mp = ip->i_mount; - ssize_t ret; - struct inode *inode = outfilp->f_mapping->host; - xfs_fsize_t isize, new_size; - - XFS_STATS_INC(xs_write_calls); - if (XFS_FORCED_SHUTDOWN(ip->i_mount)) - return -EIO; - - 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); - if (new_size > ip->i_size) - ip->i_new_size = new_size; - xfs_iunlock(ip, XFS_ILOCK_EXCL); - - trace_xfs_file_splice_write(ip, count, *ppos, ioflags); - - ret = generic_file_splice_write(pipe, outfilp, ppos, count, flags); - if (ret > 0) - XFS_STATS_ADD(xs_write_bytes, ret); - - isize = i_size_read(inode); - if (unlikely(ret < 0 && ret != -EFAULT && *ppos > isize)) - *ppos = isize; - - if (*ppos > ip->i_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); - if (*ppos > ip->i_size) - ip->i_size = *ppos; - xfs_iunlock(ip, XFS_ILOCK_EXCL); - } - - if (ip->i_new_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); - ip->i_new_size = 0; - if (ip->i_d.di_size > ip->i_size) - ip->i_d.di_size = ip->i_size; - xfs_iunlock(ip, XFS_ILOCK_EXCL); - } - xfs_iunlock(ip, XFS_IOLOCK_EXCL); - return ret; -} - -/* - * This routine is called to handle zeroing any space in the last - * block of the file that is beyond the EOF. We do this since the - * size is being increased without writing anything to that block - * and we don't want anyone to read the garbage on the disk. - */ -STATIC int /* error (positive) */ -xfs_zero_last_block( - xfs_inode_t *ip, - xfs_fsize_t offset, - xfs_fsize_t isize) -{ - xfs_fileoff_t last_fsb; - xfs_mount_t *mp = ip->i_mount; - int nimaps; - int zero_offset; - int zero_len; - int error = 0; - xfs_bmbt_irec_t imap; - - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - - zero_offset = XFS_B_FSB_OFFSET(mp, isize); - if (zero_offset == 0) { - /* - * There are no extra bytes in the last block on disk to - * zero, so return. - */ - return 0; - } - - 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); - if (error) { - return error; - } - ASSERT(nimaps > 0); - /* - * If the block underlying isize is just a hole, then there - * is nothing to zero. - */ - if (imap.br_startblock == HOLESTARTBLOCK) { - return 0; - } - /* - * Zero the part of the last block beyond the EOF, and write it - * out sync. We need to drop the ilock while we do this so we - * don't deadlock when the buffer cache calls back to us. - */ - xfs_iunlock(ip, XFS_ILOCK_EXCL); - - zero_len = mp->m_sb.sb_blocksize - zero_offset; - if (isize + zero_len > offset) - zero_len = offset - isize; - error = xfs_iozero(ip, isize, zero_len); - - xfs_ilock(ip, XFS_ILOCK_EXCL); - ASSERT(error >= 0); - return error; -} - -/* - * Zero any on disk space between the current EOF and the new, - * larger EOF. This handles the normal case of zeroing the remainder - * of the last block in the file and the unusual case of zeroing blocks - * out beyond the size of the file. This second case only happens - * with fixed size extents and when the system crashes before the inode - * size was updated but after blocks were allocated. If fill is set, - * then any holes in the range are filled and zeroed. If not, the holes - * are left alone as holes. - */ - -int /* error (positive) */ -xfs_zero_eof( - xfs_inode_t *ip, - xfs_off_t offset, /* starting I/O offset */ - xfs_fsize_t isize) /* current inode size */ -{ - xfs_mount_t *mp = ip->i_mount; - xfs_fileoff_t start_zero_fsb; - xfs_fileoff_t end_zero_fsb; - xfs_fileoff_t zero_count_fsb; - xfs_fileoff_t last_fsb; - xfs_fileoff_t zero_off; - xfs_fsize_t zero_len; - int nimaps; - int error = 0; - xfs_bmbt_irec_t imap; - - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); - ASSERT(offset > isize); - - /* - * First handle zeroing the block on which isize resides. - * We only zero a part of that block so it is handled specially. - */ - error = xfs_zero_last_block(ip, offset, isize); - if (error) { - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); - return error; - } - - /* - * Calculate the range between the new size and the old - * where blocks needing to be zeroed may exist. To get the - * block where the last byte in the file currently resides, - * we need to subtract one from the size and truncate back - * to a block boundary. We subtract 1 in case the size is - * exactly on a block boundary. - */ - last_fsb = isize ? XFS_B_TO_FSBT(mp, isize - 1) : (xfs_fileoff_t)-1; - start_zero_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)isize); - end_zero_fsb = XFS_B_TO_FSBT(mp, offset - 1); - ASSERT((xfs_sfiloff_t)last_fsb < (xfs_sfiloff_t)start_zero_fsb); - if (last_fsb == end_zero_fsb) { - /* - * The size was only incremented on its last block. - * We took care of that above, so just return. - */ - return 0; - } - - ASSERT(start_zero_fsb <= end_zero_fsb); - while (start_zero_fsb <= end_zero_fsb) { - 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); - if (error) { - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); - return error; - } - ASSERT(nimaps > 0); - - if (imap.br_state == XFS_EXT_UNWRITTEN || - imap.br_startblock == HOLESTARTBLOCK) { - /* - * This loop handles initializing pages that were - * partially initialized by the code below this - * loop. It basically zeroes the part of the page - * that sits on a hole and sets the page as P_HOLE - * and calls remapf if it is a mapped file. - */ - start_zero_fsb = imap.br_startoff + imap.br_blockcount; - ASSERT(start_zero_fsb <= (end_zero_fsb + 1)); - continue; - } - - /* - * There are blocks we need to zero. - * Drop the inode lock while we're doing the I/O. - * We'll still have the iolock to protect us. - */ - xfs_iunlock(ip, XFS_ILOCK_EXCL); - - zero_off = XFS_FSB_TO_B(mp, start_zero_fsb); - zero_len = XFS_FSB_TO_B(mp, imap.br_blockcount); - - if ((zero_off + zero_len) > offset) - zero_len = offset - zero_off; - - error = xfs_iozero(ip, zero_off, zero_len); - if (error) { - goto out_lock; - } - - start_zero_fsb = imap.br_startoff + imap.br_blockcount; - ASSERT(start_zero_fsb <= (end_zero_fsb + 1)); - - xfs_ilock(ip, XFS_ILOCK_EXCL); - } - - return 0; - -out_lock: - xfs_ilock(ip, XFS_ILOCK_EXCL); - ASSERT(error >= 0); - return error; -} - -ssize_t /* bytes written, or (-) error */ -xfs_write( - struct xfs_inode *xip, - struct kiocb *iocb, - const struct iovec *iovp, - unsigned int nsegs, - loff_t *offset, - int ioflags) -{ - struct file *file = iocb->ki_filp; - struct address_space *mapping = file->f_mapping; - struct inode *inode = mapping->host; - unsigned long segs = nsegs; - xfs_mount_t *mp; - ssize_t ret = 0, error = 0; - xfs_fsize_t isize, new_size; - int iolock; - int eventsent = 0; - size_t ocount = 0, count; - loff_t pos; - int need_i_mutex; - - XFS_STATS_INC(xs_write_calls); - - error = generic_segment_checks(iovp, &segs, &ocount, VERIFY_READ); - if (error) - return error; - - count = ocount; - pos = *offset; - - if (count == 0) - return 0; - - mp = xip->i_mount; - - xfs_wait_for_freeze(mp, SB_FREEZE_WRITE); - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; - -relock: - if (ioflags & IO_ISDIRECT) { - iolock = XFS_IOLOCK_SHARED; - need_i_mutex = 0; - } else { - iolock = XFS_IOLOCK_EXCL; - need_i_mutex = 1; - mutex_lock(&inode->i_mutex); - } - - xfs_ilock(xip, XFS_ILOCK_EXCL|iolock); - -start: - error = -generic_write_checks(file, &pos, &count, - S_ISBLK(inode->i_mode)); - if (error) { - xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); - goto out_unlock_mutex; - } - - if ((DM_EVENT_ENABLED(xip, DM_EVENT_WRITE) && - !(ioflags & IO_INVIS) && !eventsent)) { - int dmflags = FILP_DELAY_FLAG(file); - - if (need_i_mutex) - dmflags |= DM_FLAGS_IMUX; - - xfs_iunlock(xip, XFS_ILOCK_EXCL); - error = XFS_SEND_DATA(xip->i_mount, DM_EVENT_WRITE, xip, - pos, count, dmflags, &iolock); - if (error) { - goto out_unlock_internal; - } - xfs_ilock(xip, 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 != xip->i_size) - goto start; - } - - if (ioflags & IO_ISDIRECT) { - xfs_buftarg_t *target = - XFS_IS_REALTIME_INODE(xip) ? - mp->m_rtdev_targp : mp->m_ddev_targp; - - if ((pos & target->bt_smask) || (count & target->bt_smask)) { - xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); - return XFS_ERROR(-EINVAL); - } - - if (!need_i_mutex && (mapping->nrpages || pos > xip->i_size)) { - xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); - iolock = XFS_IOLOCK_EXCL; - need_i_mutex = 1; - mutex_lock(&inode->i_mutex); - xfs_ilock(xip, XFS_ILOCK_EXCL|iolock); - goto start; - } - } - - new_size = pos + count; - if (new_size > xip->i_size) - xip->i_new_size = new_size; - - if (likely(!(ioflags & IO_INVIS))) - file_update_time(file); - - /* - * If the offset is beyond the size of the file, we have a couple - * of things to do. First, if there is already space allocated - * we need to either create holes or zero the disk or ... - * - * If there is a page where the previous size lands, we need - * to zero it out up to the new size. - */ - - if (pos > xip->i_size) { - error = xfs_zero_eof(xip, pos, xip->i_size); - if (error) { - xfs_iunlock(xip, XFS_ILOCK_EXCL); - goto out_unlock_internal; - } - } - xfs_iunlock(xip, XFS_ILOCK_EXCL); - - /* - * If we're writing the file then make sure to clear the - * setuid and setgid bits if the process is not being run - * by root. This keeps people from modifying setuid and - * setgid binaries. - */ - error = -file_remove_suid(file); - if (unlikely(error)) - goto out_unlock_internal; - - /* We can write back this queue in page reclaim */ - current->backing_dev_info = mapping->backing_dev_info; - - if ((ioflags & IO_ISDIRECT)) { - if (mapping->nrpages) { - WARN_ON(need_i_mutex == 0); - error = xfs_flushinval_pages(xip, - (pos & PAGE_CACHE_MASK), - -1, FI_REMAPF_LOCKED); - if (error) - goto out_unlock_internal; - } - - if (need_i_mutex) { - /* demote the lock now the cached pages are gone */ - xfs_ilock_demote(xip, XFS_IOLOCK_EXCL); - mutex_unlock(&inode->i_mutex); - - iolock = XFS_IOLOCK_SHARED; - need_i_mutex = 0; - } - - trace_xfs_file_direct_write(xip, count, *offset, ioflags); - ret = generic_file_direct_write(iocb, iovp, - &segs, pos, offset, count, ocount); - - /* - * direct-io write to a hole: fall through to buffered I/O - * for completing the rest of the request. - */ - if (ret >= 0 && ret != count) { - XFS_STATS_ADD(xs_write_bytes, ret); - - pos += ret; - count -= ret; - - ioflags &= ~IO_ISDIRECT; - xfs_iunlock(xip, iolock); - goto relock; - } - } else { - int enospc = 0; - ssize_t ret2 = 0; - -write_retry: - trace_xfs_file_buffered_write(xip, count, *offset, ioflags); - ret2 = generic_file_buffered_write(iocb, iovp, segs, - pos, offset, count, ret); - /* - * if we just got an ENOSPC, flush the inode now we - * aren't holding any page locks and retry *once* - */ - if (ret2 == -ENOSPC && !enospc) { - error = xfs_flush_pages(xip, 0, -1, 0, FI_NONE); - if (error) - goto out_unlock_internal; - enospc = 1; - goto write_retry; - } - ret = ret2; - } - - current->backing_dev_info = NULL; - - isize = i_size_read(inode); - if (unlikely(ret < 0 && ret != -EFAULT && *offset > isize)) - *offset = isize; - - if (*offset > xip->i_size) { - xfs_ilock(xip, XFS_ILOCK_EXCL); - if (*offset > xip->i_size) - xip->i_size = *offset; - xfs_iunlock(xip, XFS_ILOCK_EXCL); - } - - if (ret == -ENOSPC && - DM_EVENT_ENABLED(xip, DM_EVENT_NOSPACE) && !(ioflags & IO_INVIS)) { - xfs_iunlock(xip, iolock); - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); - error = XFS_SEND_NAMESP(xip->i_mount, DM_EVENT_NOSPACE, xip, - DM_RIGHT_NULL, xip, DM_RIGHT_NULL, NULL, NULL, - 0, 0, 0); /* Delay flag intentionally unused */ - if (need_i_mutex) - mutex_lock(&inode->i_mutex); - xfs_ilock(xip, iolock); - if (error) - goto out_unlock_internal; - goto start; - } - - error = -ret; - if (ret <= 0) - goto out_unlock_internal; - - XFS_STATS_ADD(xs_write_bytes, ret); - - /* Handle various SYNC-type writes */ - if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) { - loff_t end = pos + ret - 1; - int error2; - - xfs_iunlock(xip, iolock); - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); - - error2 = filemap_write_and_wait_range(mapping, pos, end); - if (!error) - error = error2; - if (need_i_mutex) - mutex_lock(&inode->i_mutex); - xfs_ilock(xip, iolock); - - error2 = xfs_fsync(xip); - if (!error) - error = error2; - } - - out_unlock_internal: - if (xip->i_new_size) { - xfs_ilock(xip, XFS_ILOCK_EXCL); - xip->i_new_size = 0; - /* - * If this was a direct or synchronous I/O that failed (such - * as ENOSPC) then part of the I/O may have been written to - * disk before the error occured. In this case the on-disk - * file size may have been adjusted beyond the in-memory file - * size and now needs to be truncated back. - */ - if (xip->i_d.di_size > xip->i_size) - xip->i_d.di_size = xip->i_size; - xfs_iunlock(xip, XFS_ILOCK_EXCL); - } - xfs_iunlock(xip, iolock); - out_unlock_mutex: - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); - return -error; -} - -/* - * If the underlying (data/log/rt) device is readonly, there are some - * operations that cannot proceed. - */ -int -xfs_dev_is_read_only( - xfs_mount_t *mp, - char *message) -{ - if (xfs_readonly_buftarg(mp->m_ddev_targp) || - xfs_readonly_buftarg(mp->m_logdev_targp) || - (mp->m_rtdev_targp && xfs_readonly_buftarg(mp->m_rtdev_targp))) { - cmn_err(CE_NOTE, - "XFS: %s required on read-only device.", message); - cmn_err(CE_NOTE, - "XFS: write access unavailable, cannot proceed."); - return EROFS; - } - return 0; -} Index: xfs/fs/xfs/xfs_vnodeops.h =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.h 2010-02-13 22:54:31.837254029 +0100 +++ xfs/fs/xfs/xfs_vnodeops.h 2010-02-13 22:55:36.050005675 +0100 @@ -50,18 +50,6 @@ int xfs_attr_set(struct xfs_inode *dp, c int xfs_attr_remove(struct xfs_inode *dp, const unsigned char *name, int flags); int xfs_attr_list(struct xfs_inode *dp, char *buffer, int bufsize, int flags, struct attrlist_cursor_kern *cursor); -ssize_t xfs_read(struct xfs_inode *ip, struct kiocb *iocb, - const struct iovec *iovp, unsigned int segs, - loff_t *offset, int ioflags); -ssize_t xfs_splice_read(struct xfs_inode *ip, struct file *infilp, - loff_t *ppos, struct pipe_inode_info *pipe, size_t count, - int flags, int ioflags); -ssize_t xfs_splice_write(struct xfs_inode *ip, - struct pipe_inode_info *pipe, struct file *outfilp, - loff_t *ppos, size_t count, int flags, int ioflags); -ssize_t xfs_write(struct xfs_inode *xip, struct kiocb *iocb, - const struct iovec *iovp, unsigned int nsegs, - loff_t *offset, int ioflags); int xfs_bmap(struct xfs_inode *ip, xfs_off_t offset, ssize_t count, int flags, struct xfs_iomap *iomapp, int *niomaps); void xfs_tosspages(struct xfs_inode *inode, xfs_off_t first, Index: xfs/fs/xfs/xfs_mount.c =================================================================== --- xfs.orig/fs/xfs/xfs_mount.c 2010-02-13 22:59:41.984259965 +0100 +++ xfs/fs/xfs/xfs_mount.c 2010-02-13 22:59:47.695254307 +0100 @@ -2052,6 +2052,26 @@ xfs_mount_log_sb( return error; } +/* + * If the underlying (data/log/rt) device is readonly, there are some + * operations that cannot proceed. + */ +int +xfs_dev_is_read_only( + struct xfs_mount *mp, + char *message) +{ + if (xfs_readonly_buftarg(mp->m_ddev_targp) || + xfs_readonly_buftarg(mp->m_logdev_targp) || + (mp->m_rtdev_targp && xfs_readonly_buftarg(mp->m_rtdev_targp))) { + cmn_err(CE_NOTE, + "XFS: %s required on read-only device.", message); + cmn_err(CE_NOTE, + "XFS: write access unavailable, cannot proceed."); + return EROFS; + } + return 0; +} #ifdef HAVE_PERCPU_SB /* From BATV+1d2bc40de82a3f7823ed+2367+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 15 08:46:53 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1FEkppN065600 for ; Mon, 15 Feb 2010 08:46:53 -0600 X-ASG-Debug-ID: 1266245287-2ae8012f0000-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 DDB0114DE1CF; Mon, 15 Feb 2010 06:48:08 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id xSBncJjVV7ZvOLcA; Mon, 15 Feb 2010 06:48:08 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nh2F5-0002p4-E1; Mon, 15 Feb 2010 14:48:07 +0000 Date: Mon, 15 Feb 2010 09:48:07 -0500 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: using the scalable vmapi API again Subject: using the scalable vmapi API again Message-ID: <20100215144807.GA9932@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: 1266245288 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 Alex, I've worked with Nick to make sure the regressions introduced by Nick's scalable vmap API are fixed, so we an start using it again after we had to disable it after a brief period in early 2009. Can you make sure commits d2859751cd0bf586941ffa7308635a293f943c17 and 95f8e302c04c0b0c6de35ab399a5551605eeb006 get re-aplied to the XFS tree, or maybe re-revert their revert commits 3a011a171906a3a51a43bb860fb7c66a64cab140 and cf7dab801796b9ee52a6dc99888a66bf476538ec. From andi@firstfloor.org Mon Feb 15 15:03:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1FL3com087868 for ; Mon, 15 Feb 2010 15:03:40 -0600 X-ASG-Debug-ID: 1266267894-2e43003c0000-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 A072A1CFB09 for ; Mon, 15 Feb 2010 13:04:54 -0800 (PST) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id 70ClrsErW5knoxem for ; Mon, 15 Feb 2010 13:04:54 -0800 (PST) Received: from basil.firstfloor.org (p5B3CB49A.dip0.t-ipconnect.de [91.60.180.154]) by one.firstfloor.org (Postfix) with ESMTP id 8FB101EE801B; Mon, 15 Feb 2010 22:04:52 +0100 (CET) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 226B0B1988; Mon, 15 Feb 2010 22:04:52 +0100 (CET) To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/4] implement optimized fdatasync Subject: Re: [PATCH 0/4] implement optimized fdatasync From: Andi Kleen References: <20100215094445.528696829@bombadil.infradead.org> Date: Mon, 15 Feb 2010 22:04:52 +0100 In-Reply-To: <20100215094445.528696829@bombadil.infradead.org> (Christoph Hellwig's message of "Mon, 15 Feb 2010 04:44:45 -0500") Message-ID: <877hqemcqz.fsf@basil.nowhere.org> User-Agent: Gnus/5.1008 (Gnus v5.10.8) 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: 1266267895 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22633 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: > This series implements a real fdatasync, that is one that is not > simply identical to fdatasync, but one that skips logging the inode ... to fsync? > if there are only timestamp updates. -Andi -- ak@linux.intel.com -- Speaking for myself only. From BATV+1d2bc40de82a3f7823ed+2367+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 15 15:48:36 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1FLmZhC091125 for ; Mon, 15 Feb 2010 15:48:36 -0600 X-ASG-Debug-ID: 1266270592-7f7000690000-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 F06F21CD160F for ; Mon, 15 Feb 2010 13:49:52 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id XEA56RYhhief4mkH for ; Mon, 15 Feb 2010 13:49:52 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nh8pE-0000bH-1z; Mon, 15 Feb 2010 21:49:52 +0000 Date: Mon, 15 Feb 2010 16:49:52 -0500 From: Christoph Hellwig To: Andi Kleen Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/4] implement optimized fdatasync Subject: Re: [PATCH 0/4] implement optimized fdatasync Message-ID: <20100215214951.GA1036@infradead.org> References: <20100215094445.528696829@bombadil.infradead.org> <877hqemcqz.fsf@basil.nowhere.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <877hqemcqz.fsf@basil.nowhere.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: 1266270592 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, Feb 15, 2010 at 10:04:52PM +0100, Andi Kleen wrote: > Christoph Hellwig writes: > > > This series implements a real fdatasync, that is one that is not > > simply identical to fdatasync, but one that skips logging the inode > > > ... to fsync? Yes, Chris Wedgwood also pointed this out privately already. From BATV+1d2bc40de82a3f7823ed+2367+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 15 16:01:03 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_74 autolearn=no version=3.3.0-rupdated 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 o1FM12TN091785 for ; Mon, 15 Feb 2010 16:01:02 -0600 X-ASG-Debug-ID: 1266271340-2e4b02390000-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 6498A1D25D2 for ; Mon, 15 Feb 2010 14:02:20 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id oSvg0jdKviNlgMqZ for ; Mon, 15 Feb 2010 14:02:20 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nh91H-000220-Tm for xfs@oss.sgi.com; Mon, 15 Feb 2010 22:02:19 +0000 Date: Mon, 15 Feb 2010 17:02:19 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: fix xfs_fsblock_t tracing Subject: [PATCH] xfs: fix xfs_fsblock_t tracing Message-ID: <20100215220219.GA4890@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: 1266271340 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 Using a static buffer in xfs_fmtfsblock means we can corrupt traces if multiple CPUs hit this code path at the same. Just remove xfs_fmtfsblock for now and print the block number purely numerical. If we want the NULLFSBLOCK and NULLSTARTBLOCK formatting back the best way would be a decoding plugin in the trace-cmd userspace command. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_trace.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.c 2010-02-15 16:38:56.584022819 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_trace.c 2010-02-15 22:57:41.336004102 +0100 @@ -52,22 +52,6 @@ #include "quota/xfs_dquot.h" /* - * Format fsblock number into a static buffer & return it. - */ -STATIC char *xfs_fmtfsblock(xfs_fsblock_t bno) -{ - static char rval[50]; - - if (bno == NULLFSBLOCK) - sprintf(rval, "NULLFSBLOCK"); - else if (isnullstartblock(bno)) - sprintf(rval, "NULLSTARTBLOCK(%lld)", startblockval(bno)); - else - sprintf(rval, "%lld", (xfs_dfsbno_t)bno); - return rval; -} - -/* * We include this last to have the helpers above available for the trace * event implementations. */ Index: xfs/fs/xfs/linux-2.6/xfs_trace.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.h 2010-02-15 16:38:56.595017231 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_trace.h 2010-02-15 22:57:41.338004172 +0100 @@ -197,13 +197,13 @@ TRACE_EVENT(xfs_iext_insert, __entry->caller_ip = caller_ip; ), TP_printk("dev %d:%d ino 0x%llx state %s idx %ld " - "offset %lld block %s count %lld flag %d caller %pf", + "offset %lld block %lld count %lld flag %d caller %pf", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, __print_flags(__entry->bmap_state, "|", XFS_BMAP_EXT_FLAGS), (long)__entry->idx, __entry->startoff, - xfs_fmtfsblock(__entry->startblock), + (__int64_t)__entry->startblock, __entry->blockcount, __entry->state, (char *)__entry->caller_ip) @@ -241,13 +241,13 @@ DECLARE_EVENT_CLASS(xfs_bmap_class, __entry->caller_ip = caller_ip; ), TP_printk("dev %d:%d ino 0x%llx state %s idx %ld " - "offset %lld block %s count %lld flag %d caller %pf", + "offset %lld block %lld count %lld flag %d caller %pf", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, __print_flags(__entry->bmap_state, "|", XFS_BMAP_EXT_FLAGS), (long)__entry->idx, __entry->startoff, - xfs_fmtfsblock(__entry->startblock), + (__int64_t)__entry->startblock, __entry->blockcount, __entry->state, (char *)__entry->caller_ip) @@ -881,7 +881,7 @@ TRACE_EVENT(name, \ ), \ 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 %s blockcount 0x%llx", \ + "startoff 0x%llx startblock %lld blockcount 0x%llx", \ MAJOR(__entry->dev), MINOR(__entry->dev), \ __entry->ino, \ __entry->size, \ @@ -890,7 +890,7 @@ TRACE_EVENT(name, \ __entry->count, \ __print_flags(__entry->flags, "|", BMAPI_FLAGS), \ __entry->startoff, \ - xfs_fmtfsblock(__entry->startblock), \ + (__int64_t)__entry->startblock, \ __entry->blockcount) \ ) DEFINE_IOMAP_EVENT(xfs_iomap_enter); From BATV+1d2bc40de82a3f7823ed+2367+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 15 16:43:21 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1FMhLcr094289 for ; Mon, 15 Feb 2010 16:43:21 -0600 X-ASG-Debug-ID: 1266273878-0da5012a0000-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 0061C1CD1CA6 for ; Mon, 15 Feb 2010 14:44:38 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Yayu2noKH0K3qGWi for ; Mon, 15 Feb 2010 14:44:38 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nh9gE-0008Rz-2e; Mon, 15 Feb 2010 22:44:38 +0000 Date: Mon, 15 Feb 2010 17:44:38 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] increase readdir buffer size Subject: Re: [PATCH] increase readdir buffer size Message-ID: <20100215224438.GA32335@infradead.org> References: <4B69B755.2030008@sandeen.net> <20100203203110.GA24818@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100203203110.GA24818@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: 1266273879 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, Feb 03, 2010 at 03:31:10PM -0500, Christoph Hellwig wrote: > On Wed, Feb 03, 2010 at 11:50:13AM -0600, Eric Sandeen wrote: > > so the default buffer is 4 * 8192 = 32768 > > (except in the unlikely case of blocks > 32k....) > > > > Signed-off-by: Eric Sandeen > > Looks good, > > > Reviewed-by: Christoph Hellwig Alex, do you plan to pick this one up? From BATV+1d2bc40de82a3f7823ed+2367+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 15 17:33:26 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_42,J_CHICKENPOX_44,J_CHICKENPOX_45, J_CHICKENPOX_46 autolearn=no version=3.3.0-rupdated 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 o1FNXPjT097901 for ; Mon, 15 Feb 2010 17:33:25 -0600 X-ASG-Debug-ID: 1266276882-31ce01ed0000-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 C787F13ABC04 for ; Mon, 15 Feb 2010 15:34:42 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id N7DmpjKAwjeGVRny for ; Mon, 15 Feb 2010 15:34:42 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhASg-0007VZ-55 for xfs@oss.sgi.com; Mon, 15 Feb 2010 23:34:42 +0000 Date: Mon, 15 Feb 2010 18:34:42 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: split xfs_bmap_btalloc Subject: [PATCH] xfs: split xfs_bmap_btalloc Message-ID: <20100215233442.GA28817@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: 1266276882 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 Split out the nullfb case into a separate function to reduce the stack footprint and make the code more readable. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2010-01-17 14:46:43.326254284 +0100 +++ xfs/fs/xfs/xfs_bmap.c 2010-01-17 15:04:47.016005768 +0100 @@ -2550,22 +2550,134 @@ xfs_bmap_rtalloc( } STATIC int +xfs_bmap_btalloc_nullfb( + struct xfs_bmalloca *ap, + struct xfs_alloc_arg *args, + xfs_extlen_t *blen) +{ + 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)) + args->type = XFS_ALLOCTYPE_NEAR_BNO; + else + args->type = XFS_ALLOCTYPE_START_BNO; + args->total = ap->total; + + /* + * Search for an allocation group with a single extent large enough + * for the request. If one isn't found, then adjust the minimum + * allocation size to the largest space found. + */ + startag = ag = XFS_FSB_TO_AGNO(mp, args->fsbno); + if (startag == NULLAGNUMBER) + startag = ag = 0; + + 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; + } + } + + /* + * 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; + + if (xfs_inode_is_filestream(ap->ip)) { + if (*blen >= ap->alen) + break; + + if (ap->userdata) { + /* + * If startag is an invalid AG, we've + * come here once before and + * xfs_filestream_new_ag picked the + * best currently available. + * + * Don't continue looping, since we + * could loop forever. + */ + if (startag == NULLAGNUMBER) + break; + + error = xfs_filestream_new_ag(ap, &ag); + xfs_perag_put(pag); + if (error) + return error; + + /* loop again to set 'blen'*/ + startag = NULLAGNUMBER; + pag = xfs_perag_get(mp, ag); + continue; + } + } + if (++ag == mp->m_sb.sb_agcount) + ag = 0; + if (ag == startag) + break; + xfs_perag_put(pag); + pag = xfs_perag_get(mp, ag); + } + xfs_perag_put(pag); + + /* + * Since the above loop did a BUF_TRYLOCK, it is + * possible that there is space for this request. + */ + if (notinit || *blen < ap->minlen) + args->minlen = ap->minlen; + /* + * If the best seen length is less than the request + * length, use the best as the minimum. + */ + else if (*blen < ap->alen) + args->minlen = *blen; + /* + * Otherwise we've seen an extent as big as alen, + * use that as the minimum. + */ + else + args->minlen = ap->alen; + + /* + * set the failure fallback case to look in the selected + * AG as the stream may have moved. + */ + if (xfs_inode_is_filestream(ap->ip)) + ap->rval = args->fsbno = XFS_AGB_TO_FSB(mp, ag, 0); + + return 0; +} + +STATIC int xfs_bmap_btalloc( xfs_bmalloca_t *ap) /* bmap alloc argument struct */ { xfs_mount_t *mp; /* mount point structure */ xfs_alloctype_t atype = 0; /* type for allocation routines */ xfs_extlen_t align; /* minimum allocation alignment */ - xfs_agnumber_t ag; xfs_agnumber_t fb_agno; /* ag number of ap->firstblock */ - xfs_agnumber_t startag; + xfs_agnumber_t ag; xfs_alloc_arg_t args; xfs_extlen_t blen; xfs_extlen_t nextminlen = 0; - xfs_perag_t *pag; int nullfb; /* true if ap->firstblock isn't set */ int isaligned; - int notinit; int tryagain; int error; @@ -2612,103 +2724,9 @@ xfs_bmap_btalloc( args.firstblock = ap->firstblock; blen = 0; if (nullfb) { - if (ap->userdata && xfs_inode_is_filestream(ap->ip)) - args.type = XFS_ALLOCTYPE_NEAR_BNO; - else - args.type = XFS_ALLOCTYPE_START_BNO; - args.total = ap->total; - - /* - * Search for an allocation group with a single extent - * large enough for the request. - * - * If one isn't found, then adjust the minimum allocation - * size to the largest space found. - */ - startag = ag = XFS_FSB_TO_AGNO(mp, args.fsbno); - if (startag == NULLAGNUMBER) - startag = ag = 0; - notinit = 0; - 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))) { - xfs_perag_put(pag); - return error; - } - /* - * 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; - - if (xfs_inode_is_filestream(ap->ip)) { - if (blen >= ap->alen) - break; - - if (ap->userdata) { - /* - * If startag is an invalid AG, we've - * come here once before and - * xfs_filestream_new_ag picked the - * best currently available. - * - * Don't continue looping, since we - * could loop forever. - */ - if (startag == NULLAGNUMBER) - break; - - error = xfs_filestream_new_ag(ap, &ag); - xfs_perag_put(pag); - if (error) - return error; - - /* loop again to set 'blen'*/ - startag = NULLAGNUMBER; - pag = xfs_perag_get(mp, ag); - continue; - } - } - if (++ag == mp->m_sb.sb_agcount) - ag = 0; - if (ag == startag) - break; - xfs_perag_put(pag); - pag = xfs_perag_get(mp, ag); - } - xfs_perag_put(pag); - /* - * Since the above loop did a BUF_TRYLOCK, it is - * possible that there is space for this request. - */ - if (notinit || blen < ap->minlen) - args.minlen = ap->minlen; - /* - * If the best seen length is less than the request - * length, use the best as the minimum. - */ - else if (blen < ap->alen) - args.minlen = blen; - /* - * Otherwise we've seen an extent as big as alen, - * use that as the minimum. - */ - else - args.minlen = ap->alen; - - /* - * set the failure fallback case to look in the selected - * AG as the stream may have moved. - */ - if (xfs_inode_is_filestream(ap->ip)) - ap->rval = args.fsbno = XFS_AGB_TO_FSB(mp, ag, 0); + error = xfs_bmap_btalloc_nullfb(ap, &args, &blen); + if (error) + return error; } else if (ap->low) { if (xfs_inode_is_filestream(ap->ip)) args.type = XFS_ALLOCTYPE_FIRST_AG; From BATV+1d2bc40de82a3f7823ed+2367+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 15 17:33:38 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_65,J_CHICKENPOX_66,LOCAL_GNU_PATCH autolearn=no version=3.3.0-rupdated 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 o1FNXb17097926 for ; Mon, 15 Feb 2010 17:33:37 -0600 X-ASG-Debug-ID: 1266276895-0da502550000-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 46C901CD1D45 for ; Mon, 15 Feb 2010 15:34:55 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id pbGDsm4z0svwWpvR for ; Mon, 15 Feb 2010 15:34:55 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhASs-0007WY-TH for xfs@oss.sgi.com; Mon, 15 Feb 2010 23:34:54 +0000 Date: Mon, 15 Feb 2010 18:34:54 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: stop passing opaque handles to xfs_log.c routines Subject: [PATCH] xfs: stop passing opaque handles to xfs_log.c routines Message-ID: <20100215233454.GB28817@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: 1266276895 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 Currenly we pass opaque xfs_log_ticket_t handles instead of struct xlog_ticket pointers, and void pointers instead of struct xlog_in_core pointers to various log manager functions. Instead pass properly typed pointers after adding forward declarations for them to xfs_log.h, and adjust the touched function prototypes to the standard XFS style while at it. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_log.c =================================================================== --- xfs.orig/fs/xfs/xfs_log.c 2010-02-15 16:01:08.401004450 +0100 +++ xfs/fs/xfs/xfs_log.c 2010-02-15 16:19:03.710254904 +0100 @@ -60,7 +60,7 @@ STATIC int xlog_space_left(xlog_t *log, STATIC int xlog_sync(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_dealloc_log(xlog_t *log); STATIC int xlog_write(xfs_mount_t *mp, xfs_log_iovec_t region[], - int nentries, xfs_log_ticket_t tic, + int nentries, struct xlog_ticket *tic, xfs_lsn_t *start_lsn, xlog_in_core_t **commit_iclog, uint flags); @@ -243,14 +243,14 @@ xlog_tic_add_region(xlog_ticket_t *tic, * out when the next write occurs. */ xfs_lsn_t -xfs_log_done(xfs_mount_t *mp, - xfs_log_ticket_t xtic, - void **iclog, - uint flags) -{ - xlog_t *log = mp->m_log; - xlog_ticket_t *ticket = (xfs_log_ticket_t) xtic; - xfs_lsn_t lsn = 0; +xfs_log_done( + struct xfs_mount *mp, + struct xlog_ticket *ticket, + struct xlog_in_core **iclog, + uint flags) +{ + struct log *log = mp->m_log; + xfs_lsn_t lsn = 0; if (XLOG_FORCED_SHUTDOWN(log) || /* @@ -258,8 +258,7 @@ xfs_log_done(xfs_mount_t *mp, * If we get an error, just continue and give back the log ticket. */ (((ticket->t_flags & XLOG_TIC_INITED) == 0) && - (xlog_commit_record(mp, ticket, - (xlog_in_core_t **)iclog, &lsn)))) { + (xlog_commit_record(mp, ticket, iclog, &lsn)))) { lsn = (xfs_lsn_t) -1; if (ticket->t_flags & XLOG_TIC_PERM_RESERV) { flags |= XFS_LOG_REL_PERM_RESERV; @@ -289,7 +288,7 @@ xfs_log_done(xfs_mount_t *mp, } return lsn; -} /* xfs_log_done */ +} /* * Attaches a new iclog I/O completion callback routine during @@ -298,11 +297,11 @@ xfs_log_done(xfs_mount_t *mp, * executing the callback at an appropriate time. */ int -xfs_log_notify(xfs_mount_t *mp, /* mount of partition */ - void *iclog_hndl, /* iclog to hang callback off */ - xfs_log_callback_t *cb) +xfs_log_notify( + struct xfs_mount *mp, + struct xlog_in_core *iclog, + xfs_log_callback_t *cb) { - xlog_in_core_t *iclog = (xlog_in_core_t *)iclog_hndl; int abortflg; spin_lock(&iclog->ic_callback_lock); @@ -316,16 +315,14 @@ xfs_log_notify(xfs_mount_t *mp, /* mo } spin_unlock(&iclog->ic_callback_lock); return abortflg; -} /* xfs_log_notify */ +} int -xfs_log_release_iclog(xfs_mount_t *mp, - void *iclog_hndl) +xfs_log_release_iclog( + struct xfs_mount *mp, + struct xlog_in_core *iclog) { - xlog_t *log = mp->m_log; - xlog_in_core_t *iclog = (xlog_in_core_t *)iclog_hndl; - - if (xlog_state_release_iclog(log, iclog)) { + if (xlog_state_release_iclog(mp->m_log, iclog)) { xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); return EIO; } @@ -344,17 +341,18 @@ xfs_log_release_iclog(xfs_mount_t *mp, * reservation, we prevent over allocation problems. */ int -xfs_log_reserve(xfs_mount_t *mp, - int unit_bytes, - int cnt, - xfs_log_ticket_t *ticket, - __uint8_t client, - uint flags, - uint t_type) +xfs_log_reserve( + struct xfs_mount *mp, + int unit_bytes, + int cnt, + struct xlog_ticket **ticket, + __uint8_t client, + uint flags, + uint t_type) { - xlog_t *log = mp->m_log; - xlog_ticket_t *internal_ticket; - int retval = 0; + struct log *log = mp->m_log; + struct xlog_ticket *internal_ticket; + int retval = 0; ASSERT(client == XFS_TRANSACTION || client == XFS_LOG); ASSERT((flags & XFS_LOG_NOSLEEP) == 0); @@ -367,7 +365,7 @@ xfs_log_reserve(xfs_mount_t *mp, if (*ticket != NULL) { ASSERT(flags & XFS_LOG_PERM_RESERV); - internal_ticket = (xlog_ticket_t *)*ticket; + internal_ticket = *ticket; trace_xfs_log_reserve(log, internal_ticket); @@ -519,7 +517,7 @@ xfs_log_unmount_write(xfs_mount_t *mp) xlog_in_core_t *first_iclog; #endif xfs_log_iovec_t reg[1]; - xfs_log_ticket_t tic = NULL; + xlog_ticket_t *tic = NULL; xfs_lsn_t lsn; int error; @@ -656,24 +654,24 @@ xfs_log_unmount(xfs_mount_t *mp) * transaction occur with one call to xfs_log_write(). */ int -xfs_log_write(xfs_mount_t * mp, - xfs_log_iovec_t reg[], - int nentries, - xfs_log_ticket_t tic, - xfs_lsn_t *start_lsn) +xfs_log_write( + struct xfs_mount *mp, + struct xfs_log_iovec reg[], + int nentries, + struct xlog_ticket *tic, + xfs_lsn_t *start_lsn) { - int error; - xlog_t *log = mp->m_log; + struct log *log = mp->m_log; + int error; if (XLOG_FORCED_SHUTDOWN(log)) return XFS_ERROR(EIO); - if ((error = xlog_write(mp, reg, nentries, tic, start_lsn, NULL, 0))) { + error = xlog_write(mp, reg, nentries, tic, start_lsn, NULL, 0); + if (error) xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); - } return error; -} /* xfs_log_write */ - +} void xfs_log_move_tail(xfs_mount_t *mp, @@ -1642,16 +1640,16 @@ xlog_print_tic_res(xfs_mount_t *mp, xlog * bytes have been written out. */ STATIC int -xlog_write(xfs_mount_t * mp, - xfs_log_iovec_t reg[], - int nentries, - xfs_log_ticket_t tic, - xfs_lsn_t *start_lsn, - xlog_in_core_t **commit_iclog, - uint flags) +xlog_write( + struct xfs_mount *mp, + struct xfs_log_iovec reg[], + int nentries, + struct xlog_ticket *ticket, + xfs_lsn_t *start_lsn, + struct xlog_in_core **commit_iclog, + uint flags) { xlog_t *log = mp->m_log; - xlog_ticket_t *ticket = (xlog_ticket_t *)tic; xlog_in_core_t *iclog = NULL; /* ptr to current in-core log */ xlog_op_header_t *logop_head; /* ptr to log operation header */ __psint_t ptr; /* copy address into data region */ @@ -1765,7 +1763,7 @@ xlog_write(xfs_mount_t * mp, default: xfs_fs_cmn_err(CE_WARN, mp, "Bad XFS transaction clientid 0x%x in ticket 0x%p", - logop_head->oh_clientid, tic); + logop_head->oh_clientid, ticket); return XFS_ERROR(EIO); } Index: xfs/fs/xfs/xfs_log.h =================================================================== --- xfs.orig/fs/xfs/xfs_log.h 2010-02-15 16:04:04.821253578 +0100 +++ xfs/fs/xfs/xfs_log.h 2010-02-15 16:17:49.702005288 +0100 @@ -110,8 +110,6 @@ typedef struct xfs_log_iovec { uint i_type; /* type of region */ } xfs_log_iovec_t; -typedef void* xfs_log_ticket_t; - /* * Structure used to pass callback function and the function's argument * to the log manager. @@ -126,10 +124,12 @@ typedef struct xfs_log_callback { #ifdef __KERNEL__ /* Log manager interfaces */ struct xfs_mount; +struct xlog_in_core; struct xlog_ticket; + xfs_lsn_t xfs_log_done(struct xfs_mount *mp, - xfs_log_ticket_t ticket, - void **iclog, + struct xlog_ticket *ticket, + struct xlog_in_core **iclog, uint flags); int _xfs_log_force(struct xfs_mount *mp, uint flags, @@ -151,21 +151,21 @@ int xfs_log_mount_finish(struct xfs_mo void xfs_log_move_tail(struct xfs_mount *mp, xfs_lsn_t tail_lsn); int xfs_log_notify(struct xfs_mount *mp, - void *iclog, + struct xlog_in_core *iclog, xfs_log_callback_t *callback_entry); int xfs_log_release_iclog(struct xfs_mount *mp, - void *iclog_hndl); + struct xlog_in_core *iclog); int xfs_log_reserve(struct xfs_mount *mp, int length, int count, - xfs_log_ticket_t *ticket, + struct xlog_ticket **ticket, __uint8_t clientid, uint flags, uint t_type); int xfs_log_write(struct xfs_mount *mp, xfs_log_iovec_t region[], int nentries, - xfs_log_ticket_t ticket, + struct xlog_ticket *ticket, xfs_lsn_t *start_lsn); int xfs_log_unmount_write(struct xfs_mount *mp); void xfs_log_unmount(struct xfs_mount *mp); Index: xfs/fs/xfs/xfs_trans.h =================================================================== --- xfs.orig/fs/xfs/xfs_trans.h 2010-02-15 16:03:47.325254137 +0100 +++ xfs/fs/xfs/xfs_trans.h 2010-02-15 16:03:58.259255254 +0100 @@ -910,7 +910,7 @@ typedef struct xfs_trans { unsigned int t_blk_res_used; /* # of resvd blocks used */ unsigned int t_rtx_res; /* # of rt extents resvd */ unsigned int t_rtx_res_used; /* # of resvd rt extents used */ - xfs_log_ticket_t t_ticket; /* log mgr ticket */ + struct xlog_ticket *t_ticket; /* log mgr ticket */ xfs_lsn_t t_lsn; /* log seq num of start of * transaction. */ xfs_lsn_t t_commit_lsn; /* log seq num of end of Index: xfs/fs/xfs/xfs_trans.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans.c 2010-02-15 16:00:43.396254066 +0100 +++ xfs/fs/xfs/xfs_trans.c 2010-02-15 16:21:36.924460729 +0100 @@ -796,7 +796,7 @@ _xfs_trans_commit( int sync; #define XFS_TRANS_LOGVEC_COUNT 16 xfs_log_iovec_t log_vector_fast[XFS_TRANS_LOGVEC_COUNT]; - void *commit_iclog; + struct xlog_in_core *commit_iclog; int shutdown; commit_lsn = -1; From BATV+1d2bc40de82a3f7823ed+2367+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 15 17:33:52 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1FNXqXm097963 for ; Mon, 15 Feb 2010 17:33:52 -0600 X-ASG-Debug-ID: 1266276909-591f036c0000-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 286061D27D1 for ; Mon, 15 Feb 2010 15:35:09 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id FTXt3CeXXkNKFOsB for ; Mon, 15 Feb 2010 15:35:09 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhAT7-00083Z-HI for xfs@oss.sgi.com; Mon, 15 Feb 2010 23:35:09 +0000 Date: Mon, 15 Feb 2010 18:35:09 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: factor common xfs_trans_bjoin code Subject: [PATCH] xfs: factor common xfs_trans_bjoin code Message-ID: <20100215233509.GC28817@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: 1266276910 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 Most of xfs_trans_bjoin is duplicated in xfs_trans_get_buf, xfs_trans_getsb and xfs_trans_read_buf. Add a new _xfs_trans_bjoin which can be called by all four functions. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_trans_buf.c =================================================================== --- xfs.orig/fs/xfs/xfs_trans_buf.c 2010-02-15 16:38:55.996025054 +0100 +++ xfs/fs/xfs/xfs_trans_buf.c 2010-02-16 00:31:57.930031479 +0100 @@ -46,6 +46,65 @@ STATIC xfs_buf_t *xfs_trans_buf_item_mat STATIC xfs_buf_t *xfs_trans_buf_item_match_all(xfs_trans_t *, xfs_buftarg_t *, xfs_daddr_t, int); +/* + * Add the locked buffer to the transaction. + * + * The buffer must be locked, and it cannot be associated with any + * transaction. + * + * If the buffer does not yet have a buf log item associated with it, + * then allocate one for it. Then add the buf item to the transaction. + */ +STATIC void +_xfs_trans_bjoin( + struct xfs_trans *tp, + struct xfs_buf *bp, + int reset_recur) +{ + struct xfs_buf_log_item *bip; + + ASSERT(XFS_BUF_ISBUSY(bp)); + ASSERT(XFS_BUF_FSPRIVATE2(bp, void *) == NULL); + + /* + * The xfs_buf_log_item pointer is stored in b_fsprivate. If + * it doesn't have one yet, then allocate one and initialize it. + * The checks to see if one is there are in xfs_buf_item_init(). + */ + 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_flags & XFS_BLI_LOGGED)); + if (reset_recur) + bip->bli_recur = 0; + + /* + * Take a reference for this transaction on the buf item. + */ + atomic_inc(&bip->bli_refcount); + + /* + * Get a log_item_desc to point at the new item. + */ + (void) xfs_trans_add_item(tp, (xfs_log_item_t *)bip); + + /* + * Initialize b_fsprivate2 so we can find it with incore_match() + * in xfs_trans_get_buf() and friends above. + */ + XFS_BUF_SET_FSPRIVATE2(bp, tp); + +} + +void +xfs_trans_bjoin( + struct xfs_trans *tp, + struct xfs_buf *bp) +{ + _xfs_trans_bjoin(tp, bp, 0); + trace_xfs_trans_bjoin(bp->b_fspriv); +} /* * Get and lock the buffer for the caller if it is not already @@ -132,40 +191,8 @@ xfs_trans_get_buf(xfs_trans_t *tp, ASSERT(!XFS_BUF_GETERROR(bp)); - /* - * The xfs_buf_log_item pointer is stored in b_fsprivate. If - * it doesn't have one yet, then allocate one and initialize it. - * The checks to see if one is there are in xfs_buf_item_init(). - */ - xfs_buf_item_init(bp, tp->t_mountp); - - /* - * Set the recursion count for the buffer within this transaction - * to 0. - */ - 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_flags & XFS_BLI_LOGGED)); - bip->bli_recur = 0; - - /* - * Take a reference for this transaction on the buf item. - */ - atomic_inc(&bip->bli_refcount); - - /* - * Get a log_item_desc to point at the new item. - */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)bip); - - /* - * Initialize b_fsprivate2 so we can find it with incore_match() - * above. - */ - XFS_BUF_SET_FSPRIVATE2(bp, tp); - - trace_xfs_trans_get_buf(bip); + _xfs_trans_bjoin(tp, bp, 1); + trace_xfs_trans_get_buf(bp->b_fspriv); return (bp); } @@ -210,44 +237,11 @@ xfs_trans_getsb(xfs_trans_t *tp, } bp = xfs_getsb(mp, flags); - if (bp == NULL) { + if (bp == NULL) return NULL; - } - - /* - * The xfs_buf_log_item pointer is stored in b_fsprivate. If - * it doesn't have one yet, then allocate one and initialize it. - * The checks to see if one is there are in xfs_buf_item_init(). - */ - xfs_buf_item_init(bp, mp); - - /* - * Set the recursion count for the buffer within this transaction - * to 0. - */ - 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_flags & XFS_BLI_LOGGED)); - bip->bli_recur = 0; - - /* - * Take a reference for this transaction on the buf item. - */ - atomic_inc(&bip->bli_refcount); - - /* - * Get a log_item_desc to point at the new item. - */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)bip); - - /* - * Initialize b_fsprivate2 so we can find it with incore_match() - * above. - */ - XFS_BUF_SET_FSPRIVATE2(bp, tp); - trace_xfs_trans_getsb(bip); + _xfs_trans_bjoin(tp, bp, 1); + trace_xfs_trans_getsb(bp->b_fspriv); return (bp); } @@ -425,40 +419,9 @@ xfs_trans_read_buf( if (XFS_FORCED_SHUTDOWN(mp)) goto shutdown_abort; - /* - * The xfs_buf_log_item pointer is stored in b_fsprivate. If - * it doesn't have one yet, then allocate one and initialize it. - * The checks to see if one is there are in xfs_buf_item_init(). - */ - xfs_buf_item_init(bp, tp->t_mountp); + _xfs_trans_bjoin(tp, bp, 1); + trace_xfs_trans_read_buf(bp->b_fspriv); - /* - * Set the recursion count for the buffer within this transaction - * to 0. - */ - 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_flags & XFS_BLI_LOGGED)); - bip->bli_recur = 0; - - /* - * Take a reference for this transaction on the buf item. - */ - atomic_inc(&bip->bli_refcount); - - /* - * Get a log_item_desc to point at the new item. - */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t*)bip); - - /* - * Initialize b_fsprivate2 so we can find it with incore_match() - * above. - */ - XFS_BUF_SET_FSPRIVATE2(bp, tp); - - trace_xfs_trans_read_buf(bip); *bpp = bp; return 0; @@ -623,53 +586,6 @@ xfs_trans_brelse(xfs_trans_t *tp, } /* - * Add the locked buffer to the transaction. - * The buffer must be locked, and it cannot be associated with any - * transaction. - * - * If the buffer does not yet have a buf log item associated with it, - * then allocate one for it. Then add the buf item to the transaction. - */ -void -xfs_trans_bjoin(xfs_trans_t *tp, - xfs_buf_t *bp) -{ - xfs_buf_log_item_t *bip; - - ASSERT(XFS_BUF_ISBUSY(bp)); - ASSERT(XFS_BUF_FSPRIVATE2(bp, void *) == NULL); - - /* - * The xfs_buf_log_item pointer is stored in b_fsprivate. If - * it doesn't have one yet, then allocate one and initialize it. - * The checks to see if one is there are in xfs_buf_item_init(). - */ - 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_flags & XFS_BLI_LOGGED)); - - /* - * Take a reference for this transaction on the buf item. - */ - atomic_inc(&bip->bli_refcount); - - /* - * Get a log_item_desc to point at the new item. - */ - (void) xfs_trans_add_item(tp, (xfs_log_item_t *)bip); - - /* - * Initialize b_fsprivate2 so we can find it with incore_match() - * in xfs_trans_get_buf() and friends above. - */ - XFS_BUF_SET_FSPRIVATE2(bp, tp); - - trace_xfs_trans_bjoin(bip); -} - -/* * Mark the buffer as not needing to be unlocked when the buf item's * IOP_UNLOCK() routine is called. The buffer must already be locked * and associated with the given transaction. From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 02:45:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1G8jbWd132014 for ; Tue, 16 Feb 2010 02:45:40 -0600 X-ASG-Debug-ID: 1266310015-5e4f02950000-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 917871D3895 for ; Tue, 16 Feb 2010 00:46:55 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 41yQygPHsLFmZoaZ for ; Tue, 16 Feb 2010 00:46:55 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhJ52-0007px-2s; Tue, 16 Feb 2010 08:46:52 +0000 Message-Id: <20100216084651.956101538@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 16 Feb 2010 03:44:52 -0500 From: Christoph Hellwig To: jack@suse.cz Cc: swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 06/10] quota: move code from sync_quota_sb into vfs_quota_sync Subject: [PATCH 06/10] quota: move code from sync_quota_sb into vfs_quota_sync References: <20100216084446.377980079@bombadil.infradead.org> Content-Disposition: inline; filename=quota-cleanup-sync 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: 1266310015 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 Currenly sync_quota_sb does a lot of sync and truncate action that only applies to "VFS" style quotas and is actively harmful for the sync performance in XFS. Move it into vfs_quota_sync and add a wait paramter to ->quota_sync to tell if we need it or not. My audit of the GFS2 code says it's also not needed given the way GFS2 implements quotas, but I'd be happy if this can get a detailed review. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/quota/dquot.c =================================================================== --- linux-2.6.orig/fs/quota/dquot.c 2010-02-16 00:13:43.000000000 +0100 +++ linux-2.6/fs/quota/dquot.c 2010-02-16 00:19:51.642255742 +0100 @@ -564,7 +564,7 @@ out: } EXPORT_SYMBOL(dquot_scan_active); -int vfs_quota_sync(struct super_block *sb, int type) +int vfs_quota_sync(struct super_block *sb, int type, int wait) { struct list_head *dirty; struct dquot *dquot; @@ -609,6 +609,33 @@ int vfs_quota_sync(struct super_block *s spin_unlock(&dq_list_lock); mutex_unlock(&dqopt->dqonoff_mutex); + if (!wait || (sb_dqopt(sb)->flags & DQUOT_QUOTA_SYS_FILE)) + return 0; + + /* This is not very clever (and fast) but currently I don't know about + * any other simple way of getting quota data to disk and we must get + * them there for userspace to be visible... */ + if (sb->s_op->sync_fs) + sb->s_op->sync_fs(sb, 1); + sync_blockdev(sb->s_bdev); + + /* + * Now when everything is written we can discard the pagecache so + * that userspace sees the changes. + */ + mutex_lock(&sb_dqopt(sb)->dqonoff_mutex); + for (cnt = 0; cnt < MAXQUOTAS; cnt++) { + if (type != -1 && cnt != type) + continue; + if (!sb_has_quota_active(sb, cnt)) + continue; + mutex_lock_nested(&sb_dqopt(sb)->files[cnt]->i_mutex, + I_MUTEX_QUOTA); + truncate_inode_pages(&sb_dqopt(sb)->files[cnt]->i_data, 0); + mutex_unlock(&sb_dqopt(sb)->files[cnt]->i_mutex); + } + mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex); + return 0; } EXPORT_SYMBOL(vfs_quota_sync); Index: linux-2.6/fs/quota/quota.c =================================================================== --- linux-2.6.orig/fs/quota/quota.c 2010-02-16 00:16:29.030004171 +0100 +++ linux-2.6/fs/quota/quota.c 2010-02-16 00:23:57.795005847 +0100 @@ -48,44 +48,6 @@ static int check_quotactl_permission(str return security_quotactl(cmd, type, id, sb); } -#ifdef CONFIG_QUOTA -void sync_quota_sb(struct super_block *sb, int type) -{ - int cnt; - - if (!sb->s_qcop || !sb->s_qcop->quota_sync) - return; - - sb->s_qcop->quota_sync(sb, type); - - if (sb_dqopt(sb)->flags & DQUOT_QUOTA_SYS_FILE) - return; - /* This is not very clever (and fast) but currently I don't know about - * any other simple way of getting quota data to disk and we must get - * them there for userspace to be visible... */ - if (sb->s_op->sync_fs) - sb->s_op->sync_fs(sb, 1); - sync_blockdev(sb->s_bdev); - - /* - * Now when everything is written we can discard the pagecache so - * that userspace sees the changes. - */ - mutex_lock(&sb_dqopt(sb)->dqonoff_mutex); - for (cnt = 0; cnt < MAXQUOTAS; cnt++) { - if (type != -1 && cnt != type) - continue; - if (!sb_has_quota_active(sb, cnt)) - continue; - mutex_lock_nested(&sb_dqopt(sb)->files[cnt]->i_mutex, - I_MUTEX_QUOTA); - truncate_inode_pages(&sb_dqopt(sb)->files[cnt]->i_data, 0); - mutex_unlock(&sb_dqopt(sb)->files[cnt]->i_mutex); - } - mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex); -} -#endif - static int quota_sync_all(int type) { struct super_block *sb; @@ -101,6 +63,9 @@ static int quota_sync_all(int type) spin_lock(&sb_lock); restart: list_for_each_entry(sb, &super_blocks, s_list) { + if (!sb->s_qcop || !sb->s_qcop->quota_sync) + continue; + /* This test just improves performance so it needn't be * reliable... */ for (cnt = 0; cnt < MAXQUOTAS; cnt++) { @@ -119,7 +84,7 @@ restart: spin_unlock(&sb_lock); down_read(&sb->s_umount); if (sb->s_root) - sync_quota_sb(sb, type); + sb->s_qcop->quota_sync(sb, type, 1); up_read(&sb->s_umount); spin_lock(&sb_lock); if (__put_super_and_need_restart(sb)) @@ -306,8 +271,7 @@ static int do_quotactl(struct super_bloc case Q_SYNC: if (!sb->s_qcop->quota_sync) return -ENOSYS; - sync_quota_sb(sb, type); - return 0; + return sb->s_qcop->quota_sync(sb, type, 1); case Q_XQUOTAON: case Q_XQUOTAOFF: case Q_XQUOTARM: Index: linux-2.6/fs/sync.c =================================================================== --- linux-2.6.orig/fs/sync.c 2010-02-16 00:13:43.000000000 +0100 +++ linux-2.6/fs/sync.c 2010-02-16 00:21:32.283004241 +0100 @@ -34,14 +34,14 @@ static int __sync_filesystem(struct supe if (!sb->s_bdi) return 0; - /* Avoid doing twice syncing and cache pruning for quota sync */ - if (!wait) { - writeout_quota_sb(sb, -1); - writeback_inodes_sb(sb); - } else { - sync_quota_sb(sb, -1); + if (sb->s_qcop && sb->s_qcop->quota_sync) + sb->s_qcop->quota_sync(sb, -1, wait); + + if (wait) sync_inodes_sb(sb); - } + else + writeback_inodes_sb(sb); + if (sb->s_op->sync_fs) sb->s_op->sync_fs(sb, wait); return __sync_blockdev(sb->s_bdev, wait); Index: linux-2.6/include/linux/quotaops.h =================================================================== --- linux-2.6.orig/include/linux/quotaops.h 2010-02-16 00:16:15.361004730 +0100 +++ linux-2.6/include/linux/quotaops.h 2010-02-16 00:19:15.186253926 +0100 @@ -19,13 +19,6 @@ static inline struct quota_info *sb_dqop /* * declaration of quota_function calls in kernel. */ -void sync_quota_sb(struct super_block *sb, int type); -static inline void writeout_quota_sb(struct super_block *sb, int type) -{ - if (sb->s_qcop && sb->s_qcop->quota_sync) - sb->s_qcop->quota_sync(sb, type); -} - int dquot_initialize(struct inode *inode, int type); int dquot_drop(struct inode *inode); struct dquot *dqget(struct super_block *sb, unsigned int id, int type); @@ -64,7 +57,7 @@ int vfs_quota_on_mount(struct super_bloc int format_id, int type); int vfs_quota_off(struct super_block *sb, int type, int remount); int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags); -int vfs_quota_sync(struct super_block *sb, int type); +int vfs_quota_sync(struct super_block *sb, int type, int wait); int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di); @@ -333,14 +326,6 @@ static inline void vfs_dq_free_inode(str { } -static inline void sync_quota_sb(struct super_block *sb, int type) -{ -} - -static inline void writeout_quota_sb(struct super_block *sb, int type) -{ -} - static inline int vfs_dq_off(struct super_block *sb, int remount) { return 0; Index: linux-2.6/include/linux/quota.h =================================================================== --- linux-2.6.orig/include/linux/quota.h 2010-02-16 00:19:54.595004101 +0100 +++ linux-2.6/include/linux/quota.h 2010-02-16 00:20:00.855004381 +0100 @@ -324,7 +324,7 @@ struct dquot_operations { struct quotactl_ops { int (*quota_on)(struct super_block *, int, int, char *, int); int (*quota_off)(struct super_block *, int, int); - int (*quota_sync)(struct super_block *, int); + int (*quota_sync)(struct super_block *, int, int); int (*get_info)(struct super_block *, int, struct if_dqinfo *); int (*set_info)(struct super_block *, int, struct if_dqinfo *); int (*get_dqblk)(struct super_block *, int, qid_t, struct if_dqblk *); From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 02:45:39 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1G8jcTc132018 for ; Tue, 16 Feb 2010 02:45:38 -0600 X-ASG-Debug-ID: 1266310016-070301cf0000-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 430A21CD31F5 for ; Tue, 16 Feb 2010 00:46:56 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ofqlUItUAt8SChHO for ; Tue, 16 Feb 2010 00:46:56 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhJ53-0007sb-1i; Tue, 16 Feb 2010 08:46:53 +0000 Message-Id: <20100216084652.945507392@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 16 Feb 2010 03:44:56 -0500 From: Christoph Hellwig To: jack@suse.cz Cc: swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 10/10] quota: drop permission checks from xfs_fs_set_xstate/xfs_fs_set_xquota Subject: [PATCH 10/10] quota: drop permission checks from xfs_fs_set_xstate/xfs_fs_set_xquota References: <20100216084446.377980079@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-quota-drop-permission-checks 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: 1266310016 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 We already do these checks in the generic code. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/xfs/linux-2.6/xfs_quotaops.c =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_quotaops.c 2010-02-16 00:15:27.709004380 +0100 +++ linux-2.6/fs/xfs/linux-2.6/xfs_quotaops.c 2010-02-16 00:25:10.992007173 +0100 @@ -68,8 +68,6 @@ xfs_fs_set_xstate( return -EROFS; if (op != Q_XQUOTARM && !XFS_IS_QUOTA_RUNNING(mp)) return -ENOSYS; - if (!capable(CAP_SYS_ADMIN)) - return -EPERM; if (uflags & XFS_QUOTA_UDQ_ACCT) flags |= XFS_UQUOTA_ACCT; @@ -130,8 +128,6 @@ xfs_fs_set_xquota( return -ENOSYS; if (!XFS_IS_QUOTA_ON(mp)) return -ESRCH; - if (!capable(CAP_SYS_ADMIN)) - return -EPERM; return -xfs_qm_scall_setqlim(mp, id, xfs_quota_type(type), fdq); } From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 02:45:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1G8jbKf132008 for ; Tue, 16 Feb 2010 02:45:39 -0600 X-ASG-Debug-ID: 1266310015-5e3e02db0000-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 2EAFE1D3898 for ; Tue, 16 Feb 2010 00:46:55 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id LYSgYWPoMfBehEDz for ; Tue, 16 Feb 2010 00:46:55 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhJ52-0007qW-8z; Tue, 16 Feb 2010 08:46:52 +0000 Message-Id: <20100216084652.167390973@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 16 Feb 2010 03:44:53 -0500 From: Christoph Hellwig To: jack@suse.cz Cc: swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 07/10] quota: remove invalid optimization from quota_sync_all Subject: [PATCH 07/10] quota: remove invalid optimization from quota_sync_all References: <20100216084446.377980079@bombadil.infradead.org> Content-Disposition: inline; filename=make-quota_sync_all-generic 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: 1266310015 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 Checking the "VFS" quota enabled and dirty bits from generic code means this code will never get called for other implementations, e.g. XFS and GFS2. Grabbing the reference on the superblock really isn't much overhead for a global Q_SYNC call, so just drop this optimization. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/quota/quota.c =================================================================== --- linux-2.6.orig/fs/quota/quota.c 2010-02-16 00:24:14.432004170 +0100 +++ linux-2.6/fs/quota/quota.c 2010-02-16 00:24:58.589255532 +0100 @@ -51,7 +51,6 @@ static int check_quotactl_permission(str static int quota_sync_all(int type) { struct super_block *sb; - int cnt; int ret; if (type >= MAXQUOTAS) @@ -66,20 +65,6 @@ restart: if (!sb->s_qcop || !sb->s_qcop->quota_sync) continue; - /* This test just improves performance so it needn't be - * reliable... */ - for (cnt = 0; cnt < MAXQUOTAS; cnt++) { - if (type != -1 && type != cnt) - continue; - if (!sb_has_quota_active(sb, cnt)) - continue; - if (!info_dirty(&sb_dqopt(sb)->info[cnt]) && - list_empty(&sb_dqopt(sb)->info[cnt].dqi_dirty_list)) - continue; - break; - } - if (cnt == MAXQUOTAS) - continue; sb->s_count++; spin_unlock(&sb_lock); down_read(&sb->s_umount); From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 02:45:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1G8jaoq131997 for ; Tue, 16 Feb 2010 02:45:40 -0600 X-ASG-Debug-ID: 1266310013-5e5702bf0000-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 766001D3897 for ; Tue, 16 Feb 2010 00:46:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id TjzKjGIpwSr4HVHc for ; Tue, 16 Feb 2010 00:46:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhJ51-0007nd-6P; Tue, 16 Feb 2010 08:46:51 +0000 Message-Id: <20100216084651.117932323@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 16 Feb 2010 03:44:48 -0500 From: Christoph Hellwig To: jack@suse.cz Cc: swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 02/10] quota: clean up checks for supported quota methods Subject: [PATCH 02/10] quota: clean up checks for supported quota methods References: <20100216084446.377980079@bombadil.infradead.org> Content-Disposition: inline; filename=quotactl-cleanup-2 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: 1266310014 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 Move the checks for sb->s_qcop->foo next to the actual calls for them, same for sb_has_quota_active checks where applicable. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/quota/quota.c =================================================================== --- linux-2.6.orig/fs/quota/quota.c 2010-02-09 17:10:31.563263527 +0100 +++ linux-2.6/fs/quota/quota.c 2010-02-09 17:11:23.314004970 +0100 @@ -33,54 +33,6 @@ static int generic_quotactl_valid(struct if (sb && !sb->s_qcop) return -ENOSYS; - switch (cmd) { - case Q_GETFMT: - break; - case Q_QUOTAON: - if (!sb->s_qcop->quota_on) - return -ENOSYS; - break; - case Q_QUOTAOFF: - if (!sb->s_qcop->quota_off) - return -ENOSYS; - break; - case Q_SETINFO: - if (!sb->s_qcop->set_info) - return -ENOSYS; - break; - case Q_GETINFO: - if (!sb->s_qcop->get_info) - return -ENOSYS; - break; - case Q_SETQUOTA: - if (!sb->s_qcop->set_dqblk) - return -ENOSYS; - break; - case Q_GETQUOTA: - if (!sb->s_qcop->get_dqblk) - return -ENOSYS; - break; - case Q_SYNC: - if (sb && !sb->s_qcop->quota_sync) - return -ENOSYS; - break; - default: - return -EINVAL; - } - - /* Is quota turned on for commands which need it? */ - switch (cmd) { - case Q_GETFMT: - case Q_GETINFO: - case Q_SETINFO: - case Q_SETQUOTA: - case Q_GETQUOTA: - /* This is just an informative test so we are satisfied - * without the lock */ - if (!sb_has_quota_active(sb, type)) - return -ESRCH; - } - /* Check privileges */ if (cmd == Q_GETQUOTA) { if (((type == USRQUOTA && current_euid() != id) || @@ -106,33 +58,6 @@ static int xqm_quotactl_valid(struct sup if (!sb->s_qcop) return -ENOSYS; - switch (cmd) { - case Q_XQUOTAON: - case Q_XQUOTAOFF: - case Q_XQUOTARM: - if (!sb->s_qcop->set_xstate) - return -ENOSYS; - break; - case Q_XGETQSTAT: - if (!sb->s_qcop->get_xstate) - return -ENOSYS; - break; - case Q_XSETQLIM: - if (!sb->s_qcop->set_xquota) - return -ENOSYS; - break; - case Q_XGETQUOTA: - if (!sb->s_qcop->get_xquota) - return -ENOSYS; - break; - case Q_XQUOTASYNC: - if (!sb->s_qcop->quota_sync) - return -ENOSYS; - break; - default: - return -EINVAL; - } - /* Check privileges */ if (cmd == Q_XGETQUOTA) { if (((type == XQM_USRQUOTA && current_euid() != id) || @@ -238,12 +163,13 @@ static int quota_quotaon(struct super_bl void __user *addr) { char *pathname; - int ret; + int ret = -ENOSYS; pathname = getname(addr); if (IS_ERR(pathname)) return PTR_ERR(pathname); - ret = sb->s_qcop->quota_on(sb, type, id, pathname, 0); + if (sb->s_qcop->quota_on) + ret = sb->s_qcop->quota_on(sb, type, id, pathname, 0); putname(pathname); return ret; } @@ -269,6 +195,10 @@ static int quota_getinfo(struct super_bl struct if_dqinfo info; int ret; + if (!sb_has_quota_active(sb, type)) + return -ESRCH; + if (!sb->s_qcop->get_info) + return -ENOSYS; ret = sb->s_qcop->get_info(sb, type, &info); if (!ret && copy_to_user(addr, &info, sizeof(info))) return -EFAULT; @@ -281,6 +211,10 @@ static int quota_setinfo(struct super_bl if (copy_from_user(&info, addr, sizeof(info))) return -EFAULT; + if (!sb_has_quota_active(sb, type)) + return -ESRCH; + if (!sb->s_qcop->set_info) + return -ENOSYS; return sb->s_qcop->set_info(sb, type, &info); } @@ -290,6 +224,10 @@ static int quota_getquota(struct super_b struct if_dqblk idq; int ret; + if (!sb_has_quota_active(sb, type)) + return -ESRCH; + if (!sb->s_qcop->get_dqblk) + return -ENOSYS; ret = sb->s_qcop->get_dqblk(sb, type, id, &idq); if (ret) return ret; @@ -305,6 +243,10 @@ static int quota_setquota(struct super_b if (copy_from_user(&idq, addr, sizeof(idq))) return -EFAULT; + if (!sb_has_quota_active(sb, type)) + return -ESRCH; + if (!sb->s_qcop->set_dqblk) + return -ENOSYS; return sb->s_qcop->set_dqblk(sb, type, id, &idq); } @@ -314,6 +256,8 @@ static int quota_setxstate(struct super_ if (copy_from_user(&flags, addr, sizeof(flags))) return -EFAULT; + if (!sb->s_qcop->set_xstate) + return -ENOSYS; return sb->s_qcop->set_xstate(sb, flags, cmd); } @@ -321,7 +265,9 @@ static int quota_getxstate(struct super_ { struct fs_quota_stat fqs; int ret; - + + if (!sb->s_qcop->get_xstate) + return -ENOSYS; ret = sb->s_qcop->get_xstate(sb, &fqs); if (!ret && copy_to_user(addr, &fqs, sizeof(fqs))) return -EFAULT; @@ -335,6 +281,8 @@ static int quota_setxquota(struct super_ if (copy_from_user(&fdq, addr, sizeof(fdq))) return -EFAULT; + if (!sb->s_qcop->set_xquota) + return -ENOSYS; return sb->s_qcop->set_xquota(sb, type, id, &fdq); } @@ -344,6 +292,8 @@ static int quota_getxquota(struct super_ struct fs_disk_quota fdq; int ret; + if (!sb->s_qcop->get_xquota) + return -ENOSYS; ret = sb->s_qcop->get_xquota(sb, type, id, &fdq); if (!ret && copy_to_user(addr, &fdq, sizeof(fdq))) return -EFAULT; @@ -358,6 +308,8 @@ static int do_quotactl(struct super_bloc case Q_QUOTAON: return quota_quotaon(sb, type, cmd, id, addr); case Q_QUOTAOFF: + if (!sb->s_qcop->quota_off) + return -ENOSYS; return sb->s_qcop->quota_off(sb, type, 0); case Q_GETFMT: return quota_getfmt(sb, type, addr); @@ -370,9 +322,11 @@ static int do_quotactl(struct super_bloc case Q_SETQUOTA: return quota_setquota(sb, type, id, addr); case Q_SYNC: - if (sb) + if (sb) { + if (!sb->s_qcop->quota_sync) + return -ENOSYS; sync_quota_sb(sb, type); - else + } else sync_dquots(type); return 0; case Q_XQUOTAON: @@ -386,13 +340,12 @@ static int do_quotactl(struct super_bloc case Q_XGETQUOTA: return quota_getxquota(sb, type, id, addr); case Q_XQUOTASYNC: + if (!sb->s_qcop->quota_sync) + return -ENOSYS; return sb->s_qcop->quota_sync(sb, type); - /* We never reach here unless validity check is broken */ default: - BUG(); + return -EINVAL; } - - return 0; } /* From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 02:45:39 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, SUBJ_NOTIFICATION autolearn=no version=3.3.0-rupdated 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 o1G8jcvZ132017 for ; Tue, 16 Feb 2010 02:45:38 -0600 X-ASG-Debug-ID: 1266310015-77d5028f0000-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 330411CD31F0 for ; Tue, 16 Feb 2010 00:46:56 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id LuAjb0b8ebEl0SNd for ; Tue, 16 Feb 2010 00:46:56 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhJ52-0007rJ-Jd; Tue, 16 Feb 2010 08:46:52 +0000 Message-Id: <20100216084652.418098517@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 16 Feb 2010 03:44:54 -0500 From: Christoph Hellwig To: jack@suse.cz Cc: swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 08/10] quota: split out netlink notification support from quota.c Subject: [PATCH 08/10] quota: split out netlink notification support from quota.c References: <20100216084446.377980079@bombadil.infradead.org> Content-Disposition: inline; filename=split-netlink 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: 1266310016 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 adding ifdefs just split it into a new file. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/quota/Makefile =================================================================== --- linux-2.6.orig/fs/quota/Makefile 2010-02-16 00:02:46.729003262 +0100 +++ linux-2.6/fs/quota/Makefile 2010-02-16 00:25:05.970004101 +0100 @@ -3,3 +3,4 @@ obj-$(CONFIG_QFMT_V1) += quota_v1.o obj-$(CONFIG_QFMT_V2) += quota_v2.o obj-$(CONFIG_QUOTA_TREE) += quota_tree.o obj-$(CONFIG_QUOTACTL) += quota.o +obj-$(CONFIG_QUOTA_NETLINK_INTERFACE) += netlink.o Index: linux-2.6/fs/quota/netlink.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.6/fs/quota/netlink.c 2010-02-16 00:25:05.970004101 +0100 @@ -0,0 +1,95 @@ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* Netlink family structure for quota */ +static struct genl_family quota_genl_family = { + .id = GENL_ID_GENERATE, + .hdrsize = 0, + .name = "VFS_DQUOT", + .version = 1, + .maxattr = QUOTA_NL_A_MAX, +}; + +/** + * quota_send_warning - Send warning to userspace about exceeded quota + * @type: The quota type: USRQQUOTA, GRPQUOTA,... + * @id: The user or group id of the quota that was exceeded + * @dev: The device on which the fs is mounted (sb->s_dev) + * @warntype: The type of the warning: QUOTA_NL_... + * + * This can be used by filesystems (including those which don't use + * dquot) to send a message to userspace relating to quota limits. + * + */ + +void quota_send_warning(short type, unsigned int id, dev_t dev, + const char warntype) +{ + static atomic_t seq; + struct sk_buff *skb; + void *msg_head; + int ret; + int msg_size = 4 * nla_total_size(sizeof(u32)) + + 2 * nla_total_size(sizeof(u64)); + + /* We have to allocate using GFP_NOFS as we are called from a + * filesystem performing write and thus further recursion into + * the fs to free some data could cause deadlocks. */ + skb = genlmsg_new(msg_size, GFP_NOFS); + if (!skb) { + printk(KERN_ERR + "VFS: Not enough memory to send quota warning.\n"); + return; + } + msg_head = genlmsg_put(skb, 0, atomic_add_return(1, &seq), + "a_genl_family, 0, QUOTA_NL_C_WARNING); + if (!msg_head) { + printk(KERN_ERR + "VFS: Cannot store netlink header in quota warning.\n"); + goto err_out; + } + ret = nla_put_u32(skb, QUOTA_NL_A_QTYPE, type); + if (ret) + goto attr_err_out; + ret = nla_put_u64(skb, QUOTA_NL_A_EXCESS_ID, id); + if (ret) + goto attr_err_out; + ret = nla_put_u32(skb, QUOTA_NL_A_WARNING, warntype); + if (ret) + goto attr_err_out; + ret = nla_put_u32(skb, QUOTA_NL_A_DEV_MAJOR, MAJOR(dev)); + if (ret) + goto attr_err_out; + ret = nla_put_u32(skb, QUOTA_NL_A_DEV_MINOR, MINOR(dev)); + if (ret) + goto attr_err_out; + ret = nla_put_u64(skb, QUOTA_NL_A_CAUSED_ID, current_uid()); + if (ret) + goto attr_err_out; + genlmsg_end(skb, msg_head); + + genlmsg_multicast(skb, 0, quota_genl_family.id, GFP_NOFS); + return; +attr_err_out: + printk(KERN_ERR "VFS: Not enough space to compose quota message!\n"); +err_out: + kfree_skb(skb); +} +EXPORT_SYMBOL(quota_send_warning); + +static int __init quota_init(void) +{ + if (genl_register_family("a_genl_family) != 0) + printk(KERN_ERR + "VFS: Failed to create quota netlink interface.\n"); + return 0; +}; + +module_init(quota_init); Index: linux-2.6/fs/quota/quota.c =================================================================== --- linux-2.6.orig/fs/quota/quota.c 2010-02-16 00:24:58.589255532 +0100 +++ linux-2.6/fs/quota/quota.c 2010-02-16 00:25:05.979006127 +0100 @@ -19,8 +19,6 @@ #include #include #include -#include -#include static int check_quotactl_permission(struct super_block *sb, int type, int cmd, qid_t id) @@ -458,94 +456,3 @@ asmlinkage long sys32_quotactl(unsigned return ret; } #endif - - -#ifdef CONFIG_QUOTA_NETLINK_INTERFACE - -/* Netlink family structure for quota */ -static struct genl_family quota_genl_family = { - .id = GENL_ID_GENERATE, - .hdrsize = 0, - .name = "VFS_DQUOT", - .version = 1, - .maxattr = QUOTA_NL_A_MAX, -}; - -/** - * quota_send_warning - Send warning to userspace about exceeded quota - * @type: The quota type: USRQQUOTA, GRPQUOTA,... - * @id: The user or group id of the quota that was exceeded - * @dev: The device on which the fs is mounted (sb->s_dev) - * @warntype: The type of the warning: QUOTA_NL_... - * - * This can be used by filesystems (including those which don't use - * dquot) to send a message to userspace relating to quota limits. - * - */ - -void quota_send_warning(short type, unsigned int id, dev_t dev, - const char warntype) -{ - static atomic_t seq; - struct sk_buff *skb; - void *msg_head; - int ret; - int msg_size = 4 * nla_total_size(sizeof(u32)) + - 2 * nla_total_size(sizeof(u64)); - - /* We have to allocate using GFP_NOFS as we are called from a - * filesystem performing write and thus further recursion into - * the fs to free some data could cause deadlocks. */ - skb = genlmsg_new(msg_size, GFP_NOFS); - if (!skb) { - printk(KERN_ERR - "VFS: Not enough memory to send quota warning.\n"); - return; - } - msg_head = genlmsg_put(skb, 0, atomic_add_return(1, &seq), - "a_genl_family, 0, QUOTA_NL_C_WARNING); - if (!msg_head) { - printk(KERN_ERR - "VFS: Cannot store netlink header in quota warning.\n"); - goto err_out; - } - ret = nla_put_u32(skb, QUOTA_NL_A_QTYPE, type); - if (ret) - goto attr_err_out; - ret = nla_put_u64(skb, QUOTA_NL_A_EXCESS_ID, id); - if (ret) - goto attr_err_out; - ret = nla_put_u32(skb, QUOTA_NL_A_WARNING, warntype); - if (ret) - goto attr_err_out; - ret = nla_put_u32(skb, QUOTA_NL_A_DEV_MAJOR, MAJOR(dev)); - if (ret) - goto attr_err_out; - ret = nla_put_u32(skb, QUOTA_NL_A_DEV_MINOR, MINOR(dev)); - if (ret) - goto attr_err_out; - ret = nla_put_u64(skb, QUOTA_NL_A_CAUSED_ID, current_uid()); - if (ret) - goto attr_err_out; - genlmsg_end(skb, msg_head); - - genlmsg_multicast(skb, 0, quota_genl_family.id, GFP_NOFS); - return; -attr_err_out: - printk(KERN_ERR "VFS: Not enough space to compose quota message!\n"); -err_out: - kfree_skb(skb); -} -EXPORT_SYMBOL(quota_send_warning); - -static int __init quota_init(void) -{ - if (genl_register_family("a_genl_family) != 0) - printk(KERN_ERR - "VFS: Failed to create quota netlink interface.\n"); - return 0; -}; - -module_init(quota_init); -#endif - From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 02:45:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1G8jahc132001 for ; Tue, 16 Feb 2010 02:45:40 -0600 X-ASG-Debug-ID: 1266310014-070201bd0000-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 B2EE41CD31F0 for ; Tue, 16 Feb 2010 00:46:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id LuK94dln2C3UFxmA for ; Tue, 16 Feb 2010 00:46:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhJ50-0007mV-Lx; Tue, 16 Feb 2010 08:46:50 +0000 Message-Id: <20100216084446.377980079@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 16 Feb 2010 03:44:46 -0500 From: Christoph Hellwig To: jack@suse.cz Cc: swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 00/10] quotactl fixed and cleanups Subject: [PATCH 00/10] quotactl fixed and cleanups 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: 1266310014 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 is a first large batch of refactoring the generic quotactl code. I started looking at this for merging the FS interfaces for "VFS" and "XFS" style quotas now that we grow more filesystems wanting to support quota in a more advanced way than the generic implementation can, e.g. GFS2 and cifs. There will be another couple of patches do do the actual work which are not quite ready, but this is a large and useful enough batch to get review and possibly included first. From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 02:45:39 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1G8jboP132007 for ; Tue, 16 Feb 2010 02:45:39 -0600 X-ASG-Debug-ID: 1266310013-38da015c0000-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 EBD8313ACA26 for ; Tue, 16 Feb 2010 00:46:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id WHtFqXbJDDmcrXSS for ; Tue, 16 Feb 2010 00:46:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhJ51-0007os-L7; Tue, 16 Feb 2010 08:46:51 +0000 Message-Id: <20100216084651.550580191@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 16 Feb 2010 03:44:50 -0500 From: Christoph Hellwig To: jack@suse.cz Cc: swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 04/10] quota: simplify permission checking Subject: [PATCH 04/10] quota: simplify permission checking References: <20100216084446.377980079@bombadil.infradead.org> Content-Disposition: inline; filename=quotactl-cleanup-4 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: 1266310014 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 having complicated different routines for checking permissions for XQM vs "VFS" quotas. Instead do the checks for having sb->s_qcop and a valid type diretly in do_quotactl, and munge the *quotactl_valid functions into a check_quotactl_permission helper that only checks for permissions. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/quota/quota.c =================================================================== --- linux-2.6.orig/fs/quota/quota.c 2010-02-11 15:54:40.313002736 +0100 +++ linux-2.6/fs/quota/quota.c 2010-02-11 16:11:22.005254866 +0100 @@ -21,69 +21,30 @@ #include #include -/* Check validity of generic quotactl commands */ -static int generic_quotactl_valid(struct super_block *sb, int type, int cmd, - qid_t id) +static int check_quotactl_permission(struct super_block *sb, int type, int cmd, + qid_t id) { - if (type >= MAXQUOTAS) - return -EINVAL; - if (!sb && cmd != Q_SYNC) - return -ENODEV; - /* Is operation supported? */ - if (sb && !sb->s_qcop) - return -ENOSYS; - - /* Check privileges */ - if (cmd == Q_GETQUOTA) { - if (((type == USRQUOTA && current_euid() != id) || - (type == GRPQUOTA && !in_egroup_p(id))) && - !capable(CAP_SYS_ADMIN)) - return -EPERM; - } - else if (cmd != Q_GETFMT && cmd != Q_SYNC && cmd != Q_GETINFO) - if (!capable(CAP_SYS_ADMIN)) - return -EPERM; - - return 0; -} - -/* Check validity of XFS Quota Manager commands */ -static int xqm_quotactl_valid(struct super_block *sb, int type, int cmd, - qid_t id) -{ - if (type >= XQM_MAXQUOTAS) - return -EINVAL; - if (!sb) - return -ENODEV; - if (!sb->s_qcop) - return -ENOSYS; - - /* Check privileges */ - if (cmd == Q_XGETQUOTA) { - if (((type == XQM_USRQUOTA && current_euid() != id) || - (type == XQM_GRPQUOTA && !in_egroup_p(id))) && - !capable(CAP_SYS_ADMIN)) - return -EPERM; - } else if (cmd != Q_XGETQSTAT && cmd != Q_XQUOTASYNC) { - if (!capable(CAP_SYS_ADMIN)) + switch (cmd) { + /* these commands do not require any special privilegues */ + case Q_GETFMT: + case Q_SYNC: + case Q_GETINFO: + case Q_XGETQSTAT: + case Q_XQUOTASYNC: + break; + /* allow to query information for dquots we "own" */ + case Q_GETQUOTA: + case Q_XGETQUOTA: + if ((type == USRQUOTA && current_euid() == id) || + (type == GRPQUOTA && in_egroup_p(id))) + break; + /*FALLTHROUGH*/ + default: + if (!capable(CAP_SYS_ADMIN)) return -EPERM; } - return 0; -} - -static int check_quotactl_valid(struct super_block *sb, int type, int cmd, - qid_t id) -{ - int error; - - if (XQM_COMMAND(cmd)) - error = xqm_quotactl_valid(sb, type, cmd, id); - else - error = generic_quotactl_valid(sb, type, cmd, id); - if (!error) - error = security_quotactl(cmd, type, id, sb); - return error; + return security_quotactl(cmd, type, id, sb); } #ifdef CONFIG_QUOTA @@ -313,6 +274,17 @@ static int quota_getxquota(struct super_ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, void __user *addr) { + int ret; + + if (type >= (XQM_COMMAND(cmd) ? XQM_MAXQUOTAS : MAXQUOTAS)) + return -EINVAL; + if (!sb->s_qcop) + return -ENOSYS; + + ret = check_quotactl_permission(sb, type, cmd, id); + if (ret < 0) + return ret; + switch (cmd) { case Q_QUOTAON: return quota_quotaon(sb, type, cmd, id, addr); @@ -413,9 +385,7 @@ SYSCALL_DEFINE4(quotactl, unsigned int, if (IS_ERR(sb)) return PTR_ERR(sb); - ret = check_quotactl_valid(sb, type, cmds, id); - if (ret >= 0) - ret = do_quotactl(sb, type, cmds, id, addr); + ret = do_quotactl(sb, type, cmds, id, addr); drop_super(sb); return ret; From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 02:45:39 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_66 autolearn=no version=3.3.0-rupdated 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 o1G8jcmq132016 for ; Tue, 16 Feb 2010 02:45:38 -0600 X-ASG-Debug-ID: 1266310015-38da015d0000-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 38B5813ACA25 for ; Tue, 16 Feb 2010 00:46:55 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id yLdDaW3TpyyzBXxw for ; Tue, 16 Feb 2010 00:46:55 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhJ52-0007rz-Qj; Tue, 16 Feb 2010 08:46:52 +0000 Message-Id: <20100216084652.729908437@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 16 Feb 2010 03:44:55 -0500 From: Christoph Hellwig To: jack@suse.cz Cc: swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 09/10] quota: split out compat_sys_quotactl support from quota.c Subject: [PATCH 09/10] quota: split out compat_sys_quotactl support from quota.c References: <20100216084446.377980079@bombadil.infradead.org> Content-Disposition: inline; filename=split-compat 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: 1266310016 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 adding ifdefs just split it into a new file. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/quota/Kconfig =================================================================== --- linux-2.6.orig/fs/quota/Kconfig 2010-02-11 16:54:42.891004202 +0100 +++ linux-2.6/fs/quota/Kconfig 2010-02-16 00:25:09.291253507 +0100 @@ -59,3 +59,8 @@ config QUOTACTL bool depends on XFS_QUOTA || QUOTA default y + +config QUOTACTL_COMPAT + bool + depends on QUOTACTL && COMPAT_FOR_U64_ALIGNMENT + default y Index: linux-2.6/fs/quota/Makefile =================================================================== --- linux-2.6.orig/fs/quota/Makefile 2010-02-16 00:25:05.970004101 +0100 +++ linux-2.6/fs/quota/Makefile 2010-02-16 00:25:09.292297927 +0100 @@ -3,4 +3,5 @@ obj-$(CONFIG_QFMT_V1) += quota_v1.o obj-$(CONFIG_QFMT_V2) += quota_v2.o obj-$(CONFIG_QUOTA_TREE) += quota_tree.o obj-$(CONFIG_QUOTACTL) += quota.o +obj-$(CONFIG_QUOTACTL_COMPAT) += compat.o obj-$(CONFIG_QUOTA_NETLINK_INTERFACE) += netlink.o Index: linux-2.6/fs/quota/compat.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.6/fs/quota/compat.c 2010-02-16 00:25:09.301004031 +0100 @@ -0,0 +1,118 @@ + +#include +#include +#include + +/* + * This code works only for 32 bit quota tools over 64 bit OS (x86_64, ia64) + * and is necessary due to alignment problems. + */ +struct compat_if_dqblk { + compat_u64 dqb_bhardlimit; + compat_u64 dqb_bsoftlimit; + compat_u64 dqb_curspace; + compat_u64 dqb_ihardlimit; + compat_u64 dqb_isoftlimit; + compat_u64 dqb_curinodes; + compat_u64 dqb_btime; + compat_u64 dqb_itime; + compat_uint_t dqb_valid; +}; + +/* XFS structures */ +struct compat_fs_qfilestat { + compat_u64 dqb_bhardlimit; + compat_u64 qfs_nblks; + compat_uint_t qfs_nextents; +}; + +struct compat_fs_quota_stat { + __s8 qs_version; + __u16 qs_flags; + __s8 qs_pad; + struct compat_fs_qfilestat qs_uquota; + struct compat_fs_qfilestat qs_gquota; + compat_uint_t qs_incoredqs; + compat_int_t qs_btimelimit; + compat_int_t qs_itimelimit; + compat_int_t qs_rtbtimelimit; + __u16 qs_bwarnlimit; + __u16 qs_iwarnlimit; +}; + +asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special, + qid_t id, void __user *addr) +{ + unsigned int cmds; + struct if_dqblk __user *dqblk; + struct compat_if_dqblk __user *compat_dqblk; + struct fs_quota_stat __user *fsqstat; + struct compat_fs_quota_stat __user *compat_fsqstat; + compat_uint_t data; + u16 xdata; + long ret; + + cmds = cmd >> SUBCMDSHIFT; + + switch (cmds) { + case Q_GETQUOTA: + dqblk = compat_alloc_user_space(sizeof(struct if_dqblk)); + compat_dqblk = addr; + ret = sys_quotactl(cmd, special, id, dqblk); + if (ret) + break; + if (copy_in_user(compat_dqblk, dqblk, sizeof(*compat_dqblk)) || + get_user(data, &dqblk->dqb_valid) || + put_user(data, &compat_dqblk->dqb_valid)) + ret = -EFAULT; + break; + case Q_SETQUOTA: + dqblk = compat_alloc_user_space(sizeof(struct if_dqblk)); + compat_dqblk = addr; + ret = -EFAULT; + if (copy_in_user(dqblk, compat_dqblk, sizeof(*compat_dqblk)) || + get_user(data, &compat_dqblk->dqb_valid) || + put_user(data, &dqblk->dqb_valid)) + break; + ret = sys_quotactl(cmd, special, id, dqblk); + break; + case Q_XGETQSTAT: + fsqstat = compat_alloc_user_space(sizeof(struct fs_quota_stat)); + compat_fsqstat = addr; + ret = sys_quotactl(cmd, special, id, fsqstat); + if (ret) + break; + ret = -EFAULT; + /* Copying qs_version, qs_flags, qs_pad */ + if (copy_in_user(compat_fsqstat, fsqstat, + offsetof(struct compat_fs_quota_stat, qs_uquota))) + break; + /* Copying qs_uquota */ + if (copy_in_user(&compat_fsqstat->qs_uquota, + &fsqstat->qs_uquota, + sizeof(compat_fsqstat->qs_uquota)) || + get_user(data, &fsqstat->qs_uquota.qfs_nextents) || + put_user(data, &compat_fsqstat->qs_uquota.qfs_nextents)) + break; + /* Copying qs_gquota */ + if (copy_in_user(&compat_fsqstat->qs_gquota, + &fsqstat->qs_gquota, + sizeof(compat_fsqstat->qs_gquota)) || + get_user(data, &fsqstat->qs_gquota.qfs_nextents) || + put_user(data, &compat_fsqstat->qs_gquota.qfs_nextents)) + break; + /* Copying the rest */ + if (copy_in_user(&compat_fsqstat->qs_incoredqs, + &fsqstat->qs_incoredqs, + sizeof(struct compat_fs_quota_stat) - + offsetof(struct compat_fs_quota_stat, qs_incoredqs)) || + get_user(xdata, &fsqstat->qs_iwarnlimit) || + put_user(xdata, &compat_fsqstat->qs_iwarnlimit)) + break; + ret = 0; + break; + default: + ret = sys_quotactl(cmd, special, id, addr); + } + return ret; +} Index: linux-2.6/fs/quota/quota.c =================================================================== --- linux-2.6.orig/fs/quota/quota.c 2010-02-16 00:25:05.979006127 +0100 +++ linux-2.6/fs/quota/quota.c 2010-02-16 00:25:09.312256301 +0100 @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -340,119 +339,3 @@ SYSCALL_DEFINE4(quotactl, unsigned int, drop_super(sb); return ret; } - -#if defined(CONFIG_COMPAT_FOR_U64_ALIGNMENT) -/* - * This code works only for 32 bit quota tools over 64 bit OS (x86_64, ia64) - * and is necessary due to alignment problems. - */ -struct compat_if_dqblk { - compat_u64 dqb_bhardlimit; - compat_u64 dqb_bsoftlimit; - compat_u64 dqb_curspace; - compat_u64 dqb_ihardlimit; - compat_u64 dqb_isoftlimit; - compat_u64 dqb_curinodes; - compat_u64 dqb_btime; - compat_u64 dqb_itime; - compat_uint_t dqb_valid; -}; - -/* XFS structures */ -struct compat_fs_qfilestat { - compat_u64 dqb_bhardlimit; - compat_u64 qfs_nblks; - compat_uint_t qfs_nextents; -}; - -struct compat_fs_quota_stat { - __s8 qs_version; - __u16 qs_flags; - __s8 qs_pad; - struct compat_fs_qfilestat qs_uquota; - struct compat_fs_qfilestat qs_gquota; - compat_uint_t qs_incoredqs; - compat_int_t qs_btimelimit; - compat_int_t qs_itimelimit; - compat_int_t qs_rtbtimelimit; - __u16 qs_bwarnlimit; - __u16 qs_iwarnlimit; -}; - -asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special, - qid_t id, void __user *addr) -{ - unsigned int cmds; - struct if_dqblk __user *dqblk; - struct compat_if_dqblk __user *compat_dqblk; - struct fs_quota_stat __user *fsqstat; - struct compat_fs_quota_stat __user *compat_fsqstat; - compat_uint_t data; - u16 xdata; - long ret; - - cmds = cmd >> SUBCMDSHIFT; - - switch (cmds) { - case Q_GETQUOTA: - dqblk = compat_alloc_user_space(sizeof(struct if_dqblk)); - compat_dqblk = addr; - ret = sys_quotactl(cmd, special, id, dqblk); - if (ret) - break; - if (copy_in_user(compat_dqblk, dqblk, sizeof(*compat_dqblk)) || - get_user(data, &dqblk->dqb_valid) || - put_user(data, &compat_dqblk->dqb_valid)) - ret = -EFAULT; - break; - case Q_SETQUOTA: - dqblk = compat_alloc_user_space(sizeof(struct if_dqblk)); - compat_dqblk = addr; - ret = -EFAULT; - if (copy_in_user(dqblk, compat_dqblk, sizeof(*compat_dqblk)) || - get_user(data, &compat_dqblk->dqb_valid) || - put_user(data, &dqblk->dqb_valid)) - break; - ret = sys_quotactl(cmd, special, id, dqblk); - break; - case Q_XGETQSTAT: - fsqstat = compat_alloc_user_space(sizeof(struct fs_quota_stat)); - compat_fsqstat = addr; - ret = sys_quotactl(cmd, special, id, fsqstat); - if (ret) - break; - ret = -EFAULT; - /* Copying qs_version, qs_flags, qs_pad */ - if (copy_in_user(compat_fsqstat, fsqstat, - offsetof(struct compat_fs_quota_stat, qs_uquota))) - break; - /* Copying qs_uquota */ - if (copy_in_user(&compat_fsqstat->qs_uquota, - &fsqstat->qs_uquota, - sizeof(compat_fsqstat->qs_uquota)) || - get_user(data, &fsqstat->qs_uquota.qfs_nextents) || - put_user(data, &compat_fsqstat->qs_uquota.qfs_nextents)) - break; - /* Copying qs_gquota */ - if (copy_in_user(&compat_fsqstat->qs_gquota, - &fsqstat->qs_gquota, - sizeof(compat_fsqstat->qs_gquota)) || - get_user(data, &fsqstat->qs_gquota.qfs_nextents) || - put_user(data, &compat_fsqstat->qs_gquota.qfs_nextents)) - break; - /* Copying the rest */ - if (copy_in_user(&compat_fsqstat->qs_incoredqs, - &fsqstat->qs_incoredqs, - sizeof(struct compat_fs_quota_stat) - - offsetof(struct compat_fs_quota_stat, qs_incoredqs)) || - get_user(xdata, &fsqstat->qs_iwarnlimit) || - put_user(xdata, &compat_fsqstat->qs_iwarnlimit)) - break; - ret = 0; - break; - default: - ret = sys_quotactl(cmd, special, id, addr); - } - return ret; -} -#endif From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 02:45:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,LOCAL_GNU_PATCH autolearn=no version=3.3.0-rupdated 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 o1G8jaia132005 for ; Tue, 16 Feb 2010 02:45:39 -0600 X-ASG-Debug-ID: 1266310013-403400d10000-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 C592813ACA25 for ; Tue, 16 Feb 2010 00:46:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id qWodOkUQzHs9bQwi for ; Tue, 16 Feb 2010 00:46:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhJ51-0007oG-Dh; Tue, 16 Feb 2010 08:46:51 +0000 Message-Id: <20100216084651.315955655@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 16 Feb 2010 03:44:49 -0500 From: Christoph Hellwig To: jack@suse.cz Cc: swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 03/10] quota: special case Q_SYNC without device name Subject: [PATCH 03/10] quota: special case Q_SYNC without device name References: <20100216084446.377980079@bombadil.infradead.org> Content-Disposition: inline; filename=quotactl-cleanup-3 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: 1266310014 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 Q_SYNC command can be called without the path to a device, in which case it iterates over all superblocks. Special case this variant directly in sys_quotactl so that the other code always gets a superblock and doesn't need to deal with this case. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/quota/quota.c =================================================================== --- linux-2.6.orig/fs/quota/quota.c 2010-02-10 13:19:42.247004063 +0100 +++ linux-2.6/fs/quota/quota.c 2010-02-10 13:21:01.300003435 +0100 @@ -124,10 +124,17 @@ void sync_quota_sb(struct super_block *s } #endif -static void sync_dquots(int type) +static int quota_sync_all(int type) { struct super_block *sb; int cnt; + int ret; + + if (type >= MAXQUOTAS) + return -EINVAL; + ret = security_quotactl(Q_SYNC, type, 0, NULL); + if (ret) + return ret; spin_lock(&sb_lock); restart: @@ -157,6 +164,8 @@ restart: goto restart; } spin_unlock(&sb_lock); + + return 0; } static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id, @@ -322,12 +331,9 @@ static int do_quotactl(struct super_bloc case Q_SETQUOTA: return quota_setquota(sb, type, id, addr); case Q_SYNC: - if (sb) { - if (!sb->s_qcop->quota_sync) - return -ENOSYS; - sync_quota_sb(sb, type); - } else - sync_dquots(type); + if (!sb->s_qcop->quota_sync) + return -ENOSYS; + sync_quota_sb(sb, type); return 0; case Q_XQUOTAON: case Q_XQUOTAOFF: @@ -392,18 +398,26 @@ SYSCALL_DEFINE4(quotactl, unsigned int, cmds = cmd >> SUBCMDSHIFT; type = cmd & SUBCMDMASK; - if (cmds != Q_SYNC || special) { - sb = quotactl_block(special); - if (IS_ERR(sb)) - return PTR_ERR(sb); + /* + * As a special case Q_SYNC can be called without a specific device. + * It will iterate all superblocks that have quota enabled and call + * the sync action on each of them. + */ + if (!special) { + if (cmds == Q_SYNC) + return quota_sync_all(type); + return -ENODEV; } + sb = quotactl_block(special); + if (IS_ERR(sb)) + return PTR_ERR(sb); + ret = check_quotactl_valid(sb, type, cmds, id); if (ret >= 0) ret = do_quotactl(sb, type, cmds, id, addr); - if (sb) - drop_super(sb); + drop_super(sb); return ret; } From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 02:45:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1G8ja5V131998 for ; Tue, 16 Feb 2010 02:45:39 -0600 X-ASG-Debug-ID: 1266310014-5ab403170000-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 8142F1D3898 for ; Tue, 16 Feb 2010 00:46:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id YqMNTbmHek3HCPhy for ; Tue, 16 Feb 2010 00:46:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhJ51-0007n6-0U; Tue, 16 Feb 2010 08:46:51 +0000 Message-Id: <20100216084650.910278747@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 16 Feb 2010 03:44:47 -0500 From: Christoph Hellwig To: jack@suse.cz Cc: swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 01/10] quota: split do_quotactl Subject: [PATCH 01/10] quota: split do_quotactl References: <20100216084446.377980079@bombadil.infradead.org> Content-Disposition: inline; filename=quotactl-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: 1266310014 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 Split out a helper for each non-trivial command from do_quotactl. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/quota/quota.c =================================================================== --- linux-2.6.orig/fs/quota/quota.c 2010-02-08 19:26:09.316003867 +0100 +++ linux-2.6/fs/quota/quota.c 2010-02-08 19:28:14.176005193 +0100 @@ -234,122 +234,164 @@ restart: spin_unlock(&sb_lock); } -/* Copy parameters and call proper function */ -static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, - void __user *addr) +static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id, + void __user *addr) { + char *pathname; int ret; - switch (cmd) { - case Q_QUOTAON: { - char *pathname; + pathname = getname(addr); + if (IS_ERR(pathname)) + return PTR_ERR(pathname); + ret = sb->s_qcop->quota_on(sb, type, id, pathname, 0); + putname(pathname); + return ret; +} + +static int quota_getfmt(struct super_block *sb, int type, void __user *addr) +{ + __u32 fmt; + + down_read(&sb_dqopt(sb)->dqptr_sem); + if (!sb_has_quota_active(sb, type)) { + up_read(&sb_dqopt(sb)->dqptr_sem); + return -ESRCH; + } + fmt = sb_dqopt(sb)->info[type].dqi_format->qf_fmt_id; + up_read(&sb_dqopt(sb)->dqptr_sem); + if (copy_to_user(addr, &fmt, sizeof(fmt))) + return -EFAULT; + return 0; +} + +static int quota_getinfo(struct super_block *sb, int type, void __user *addr) +{ + struct if_dqinfo info; + int ret; + + ret = sb->s_qcop->get_info(sb, type, &info); + if (!ret && copy_to_user(addr, &info, sizeof(info))) + return -EFAULT; + return ret; +} + +static int quota_setinfo(struct super_block *sb, int type, void __user *addr) +{ + struct if_dqinfo info; + + if (copy_from_user(&info, addr, sizeof(info))) + return -EFAULT; + return sb->s_qcop->set_info(sb, type, &info); +} + +static int quota_getquota(struct super_block *sb, int type, qid_t id, + void __user *addr) +{ + struct if_dqblk idq; + int ret; + + ret = sb->s_qcop->get_dqblk(sb, type, id, &idq); + if (ret) + return ret; + if (copy_to_user(addr, &idq, sizeof(idq))) + return -EFAULT; + return 0; +} + +static int quota_setquota(struct super_block *sb, int type, qid_t id, + void __user *addr) +{ + struct if_dqblk idq; - pathname = getname(addr); - if (IS_ERR(pathname)) - return PTR_ERR(pathname); - ret = sb->s_qcop->quota_on(sb, type, id, pathname, 0); - putname(pathname); - return ret; - } - case Q_QUOTAOFF: - return sb->s_qcop->quota_off(sb, type, 0); - - case Q_GETFMT: { - __u32 fmt; - - down_read(&sb_dqopt(sb)->dqptr_sem); - if (!sb_has_quota_active(sb, type)) { - up_read(&sb_dqopt(sb)->dqptr_sem); - return -ESRCH; - } - fmt = sb_dqopt(sb)->info[type].dqi_format->qf_fmt_id; - up_read(&sb_dqopt(sb)->dqptr_sem); - if (copy_to_user(addr, &fmt, sizeof(fmt))) - return -EFAULT; - return 0; - } - case Q_GETINFO: { - struct if_dqinfo info; - - ret = sb->s_qcop->get_info(sb, type, &info); - if (ret) - return ret; - if (copy_to_user(addr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - case Q_SETINFO: { - struct if_dqinfo info; - - if (copy_from_user(&info, addr, sizeof(info))) - return -EFAULT; - return sb->s_qcop->set_info(sb, type, &info); - } - case Q_GETQUOTA: { - struct if_dqblk idq; - - ret = sb->s_qcop->get_dqblk(sb, type, id, &idq); - if (ret) - return ret; - if (copy_to_user(addr, &idq, sizeof(idq))) - return -EFAULT; - return 0; - } - case Q_SETQUOTA: { - struct if_dqblk idq; - - if (copy_from_user(&idq, addr, sizeof(idq))) - return -EFAULT; - return sb->s_qcop->set_dqblk(sb, type, id, &idq); - } - case Q_SYNC: - if (sb) - sync_quota_sb(sb, type); - else - sync_dquots(type); - return 0; - - case Q_XQUOTAON: - case Q_XQUOTAOFF: - case Q_XQUOTARM: { - __u32 flags; - - if (copy_from_user(&flags, addr, sizeof(flags))) - return -EFAULT; - return sb->s_qcop->set_xstate(sb, flags, cmd); - } - case Q_XGETQSTAT: { - struct fs_quota_stat fqs; + if (copy_from_user(&idq, addr, sizeof(idq))) + return -EFAULT; + return sb->s_qcop->set_dqblk(sb, type, id, &idq); +} + +static int quota_setxstate(struct super_block *sb, int cmd, void __user *addr) +{ + __u32 flags; + + if (copy_from_user(&flags, addr, sizeof(flags))) + return -EFAULT; + return sb->s_qcop->set_xstate(sb, flags, cmd); +} + +static int quota_getxstate(struct super_block *sb, void __user *addr) +{ + struct fs_quota_stat fqs; + int ret; - if ((ret = sb->s_qcop->get_xstate(sb, &fqs))) - return ret; - if (copy_to_user(addr, &fqs, sizeof(fqs))) - return -EFAULT; - return 0; - } - case Q_XSETQLIM: { - struct fs_disk_quota fdq; - - if (copy_from_user(&fdq, addr, sizeof(fdq))) - return -EFAULT; - return sb->s_qcop->set_xquota(sb, type, id, &fdq); - } - case Q_XGETQUOTA: { - struct fs_disk_quota fdq; - - ret = sb->s_qcop->get_xquota(sb, type, id, &fdq); - if (ret) - return ret; - if (copy_to_user(addr, &fdq, sizeof(fdq))) - return -EFAULT; - return 0; - } - case Q_XQUOTASYNC: - return sb->s_qcop->quota_sync(sb, type); - /* We never reach here unless validity check is broken */ - default: - BUG(); + ret = sb->s_qcop->get_xstate(sb, &fqs); + if (!ret && copy_to_user(addr, &fqs, sizeof(fqs))) + return -EFAULT; + return ret; +} + +static int quota_setxquota(struct super_block *sb, int type, qid_t id, + void __user *addr) +{ + struct fs_disk_quota fdq; + + if (copy_from_user(&fdq, addr, sizeof(fdq))) + return -EFAULT; + return sb->s_qcop->set_xquota(sb, type, id, &fdq); +} + +static int quota_getxquota(struct super_block *sb, int type, qid_t id, + void __user *addr) +{ + struct fs_disk_quota fdq; + int ret; + + ret = sb->s_qcop->get_xquota(sb, type, id, &fdq); + if (!ret && copy_to_user(addr, &fdq, sizeof(fdq))) + return -EFAULT; + return ret; +} + +/* Copy parameters and call proper function */ +static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, + void __user *addr) +{ + switch (cmd) { + case Q_QUOTAON: + return quota_quotaon(sb, type, cmd, id, addr); + case Q_QUOTAOFF: + return sb->s_qcop->quota_off(sb, type, 0); + case Q_GETFMT: + return quota_getfmt(sb, type, addr); + case Q_GETINFO: + return quota_getinfo(sb, type, addr); + case Q_SETINFO: + return quota_setinfo(sb, type, addr); + case Q_GETQUOTA: + return quota_getquota(sb, type, id, addr); + case Q_SETQUOTA: + return quota_setquota(sb, type, id, addr); + case Q_SYNC: + if (sb) + sync_quota_sb(sb, type); + else + sync_dquots(type); + return 0; + case Q_XQUOTAON: + case Q_XQUOTAOFF: + case Q_XQUOTARM: + return quota_setxstate(sb, cmd, addr); + case Q_XGETQSTAT: + return quota_getxstate(sb, addr); + case Q_XSETQLIM: + return quota_setxquota(sb, type, id, addr); + case Q_XGETQUOTA: + return quota_getxquota(sb, type, id, addr); + case Q_XQUOTASYNC: + return sb->s_qcop->quota_sync(sb, type); + /* We never reach here unless validity check is broken */ + default: + BUG(); } + return 0; } From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 02:45:39 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,LOCAL_GNU_PATCH autolearn=no version=3.3.0-rupdated 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 o1G8jbIT132009 for ; Tue, 16 Feb 2010 02:45:38 -0600 X-ASG-Debug-ID: 1266310014-1f1303990000-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 2C28013ACA25 for ; Tue, 16 Feb 2010 00:46:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id wkjDyDGTkYsU7h44 for ; Tue, 16 Feb 2010 00:46:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhJ51-0007pP-Qt; Tue, 16 Feb 2010 08:46:51 +0000 Message-Id: <20100216084651.741574957@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 16 Feb 2010 03:44:51 -0500 From: Christoph Hellwig To: jack@suse.cz Cc: swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 05/10] quota: clean up Q_XQUOTASYNC Subject: [PATCH 05/10] quota: clean up Q_XQUOTASYNC References: <20100216084446.377980079@bombadil.infradead.org> Content-Disposition: inline; filename=cleanup-Q_XQUOTASYNC 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: 1266310015 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 Q_XQUOTASYNC calls into the quota_sync method, but XFS does something entirely different in it than the rest of the filesystems. xfs_quota which calls Q_XQUOTASYNC expects an asynchronous data writeout to flush delayed allocations, while the "VFS" quota support wants to flush changes to the quota file. So make Q_XQUOTASYNC call into the writeback code directly and make the quota_sync method optional as XFS doesn't need in the sense expected by the rest of the quota code. GFS2 was using limited XFS-style quota and has a quota_sync method fitting neither the style used by vfs_quota_sync nor xfs_fs_quota_sync. I left it in for now as per discussion with Steve it expects to be called from the sync path this way. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/quota/quota.c =================================================================== --- linux-2.6.orig/fs/quota/quota.c 2010-02-16 00:15:27.136003612 +0100 +++ linux-2.6/fs/quota/quota.c 2010-02-16 00:16:03.263004031 +0100 @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -52,7 +53,7 @@ void sync_quota_sb(struct super_block *s { int cnt; - if (!sb->s_qcop->quota_sync) + if (!sb->s_qcop || !sb->s_qcop->quota_sync) return; sb->s_qcop->quota_sync(sb, type); @@ -318,9 +319,11 @@ static int do_quotactl(struct super_bloc case Q_XGETQUOTA: return quota_getxquota(sb, type, id, addr); case Q_XQUOTASYNC: - if (!sb->s_qcop->quota_sync) - return -ENOSYS; - return sb->s_qcop->quota_sync(sb, type); + /* caller already holds s_umount */ + if (sb->s_flags & MS_RDONLY) + return -EROFS; + writeback_inodes_sb(sb); + return 0; default: return -EINVAL; } Index: linux-2.6/fs/xfs/linux-2.6/xfs_quotaops.c =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_quotaops.c 2010-02-16 00:13:44.399004869 +0100 +++ linux-2.6/fs/xfs/linux-2.6/xfs_quotaops.c 2010-02-16 00:15:27.709004380 +0100 @@ -44,20 +44,6 @@ xfs_quota_type(int type) } STATIC int -xfs_fs_quota_sync( - struct super_block *sb, - int type) -{ - struct xfs_mount *mp = XFS_M(sb); - - if (sb->s_flags & MS_RDONLY) - return -EROFS; - if (!XFS_IS_QUOTA_RUNNING(mp)) - return -ENOSYS; - return -xfs_sync_data(mp, 0); -} - -STATIC int xfs_fs_get_xstate( struct super_block *sb, struct fs_quota_stat *fqs) @@ -151,7 +137,6 @@ xfs_fs_set_xquota( } const struct quotactl_ops xfs_quotactl_operations = { - .quota_sync = xfs_fs_quota_sync, .get_xstate = xfs_fs_get_xstate, .set_xstate = xfs_fs_set_xstate, .get_xquota = xfs_fs_get_xquota, Index: linux-2.6/include/linux/quotaops.h =================================================================== --- linux-2.6.orig/include/linux/quotaops.h 2010-02-16 00:16:06.788003612 +0100 +++ linux-2.6/include/linux/quotaops.h 2010-02-16 00:16:15.361004730 +0100 @@ -22,7 +22,7 @@ static inline struct quota_info *sb_dqop void sync_quota_sb(struct super_block *sb, int type); static inline void writeout_quota_sb(struct super_block *sb, int type) { - if (sb->s_qcop->quota_sync) + if (sb->s_qcop && sb->s_qcop->quota_sync) sb->s_qcop->quota_sync(sb, type); } From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 02:47:25 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1G8lOpD132271 for ; Tue, 16 Feb 2010 02:47:25 -0600 X-ASG-Debug-ID: 1266310122-38d7017a0000-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 B441713ACA4F for ; Tue, 16 Feb 2010 00:48:42 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 7X6lnVosILDvdzq2 for ; Tue, 16 Feb 2010 00:48:42 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhJ6l-0008GN-C6; Tue, 16 Feb 2010 08:48:39 +0000 Date: Tue, 16 Feb 2010 03:48:39 -0500 From: Christoph Hellwig To: jack@suse.cz Cc: swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 00/10] quotactl fixed and cleanups Subject: Re: [PATCH 00/10] quotactl fixed and cleanups Message-ID: <20100216084839.GA31523@infradead.org> References: <20100216084446.377980079@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100216084446.377980079@bombadil.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: 1266310122 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 err, the subject should read fixes of course. From swhiteho@redhat.com Tue Feb 16 04:32:50 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1GAWnNj138887 for ; Tue, 16 Feb 2010 04:32:49 -0600 X-ASG-Debug-ID: 1266316446-637b01610000-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 7D4B21CD393D for ; Tue, 16 Feb 2010 02:34:06 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gAxSnBeInh9Rh8lp for ; Tue, 16 Feb 2010 02:34:06 -0800 (PST) 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 o1GAXwWb008210 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 16 Feb 2010 05:33:59 -0500 Received: from [10.36.10.157] (vpn2-10-157.ams2.redhat.com [10.36.10.157]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o1GAXuJR000870; Tue, 16 Feb 2010 05:33:57 -0500 X-ASG-Orig-Subj: Re: [PATCH 00/10] quotactl fixed and cleanups Subject: Re: [PATCH 00/10] quotactl fixed and cleanups From: Steven Whitehouse To: Christoph Hellwig Cc: jack@suse.cz, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com In-Reply-To: <20100216084446.377980079@bombadil.infradead.org> References: <20100216084446.377980079@bombadil.infradead.org> Content-Type: text/plain; charset="UTF-8" Organization: Red Hat UK Ltd Date: Tue, 16 Feb 2010 10:37:20 +0000 Message-ID: <1266316640.2738.0.camel@localhost> Mime-Version: 1.0 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: 1266316447 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22677 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, On Tue, 2010-02-16 at 03:44 -0500, Christoph Hellwig wrote: > This is a first large batch of refactoring the generic quotactl code. > I started looking at this for merging the FS interfaces for "VFS" and "XFS" > style quotas now that we grow more filesystems wanting to support quota > in a more advanced way than the generic implementation can, e.g. GFS2 > and cifs. There will be another couple of patches do do the actual > work which are not quite ready, but this is a large and useful enough batch > to get review and possibly included first. Looks good from a GFS2 PoV, so: Acked-by: Steven Whitehouse Steve. From jack@suse.cz Tue Feb 16 12:35:02 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1GIZ14j172951 for ; Tue, 16 Feb 2010 12:35:02 -0600 X-ASG-Debug-ID: 1266345379-791d021a0000-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 353291D5E00 for ; Tue, 16 Feb 2010 10:36:19 -0800 (PST) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id hwyZmGMmptt124sc for ; Tue, 16 Feb 2010 10:36:19 -0800 (PST) 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 0A0298D893; Tue, 16 Feb 2010 19:36:18 +0100 (CET) Received: by quack.suse.cz (Postfix, from userid 10005) id 6B9D42B178F; Tue, 16 Feb 2010 19:36:28 +0100 (CET) Date: Tue, 16 Feb 2010 19:36:28 +0100 From: Jan Kara To: Christoph Hellwig Cc: jack@suse.cz, swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 00/10] quotactl fixed and cleanups Subject: Re: [PATCH 00/10] quotactl fixed and cleanups Message-ID: <20100216183627.GC3153@quack.suse.cz> References: <20100216084446.377980079@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100216084446.377980079@bombadil.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: 1266345380 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 16-02-10 03:44:46, Christoph Hellwig wrote: > This is a first large batch of refactoring the generic quotactl code. > I started looking at this for merging the FS interfaces for "VFS" and "XFS" > style quotas now that we grow more filesystems wanting to support quota > in a more advanced way than the generic implementation can, e.g. GFS2 > and cifs. There will be another couple of patches do do the actual > work which are not quite ready, but this is a large and useful enough batch > to get review and possibly included first. Thanks for the cleanups. Upto a few fixed typos and whitespace errors I've merged your patchset into my tree. As a side note, OCFS2 implements XFS-style clustered quotas using current VFS quota subsystem (and quota file format) so my naive feeling is that at least GFS2 should fit in there as well. But maybe I'm wrong. Honza -- Jan Kara SUSE Labs, CR From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 13:10:53 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1GJArR2174931 for ; Tue, 16 Feb 2010 13:10:53 -0600 X-ASG-Debug-ID: 1266347530-53b402ae0000-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 4D3F91CD69AA for ; Tue, 16 Feb 2010 11:12:10 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id szLI9HHtrIkLDA85 for ; Tue, 16 Feb 2010 11:12:10 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhSq7-0001rI-LM; Tue, 16 Feb 2010 19:12:07 +0000 Date: Tue, 16 Feb 2010 14:12:07 -0500 From: Christoph Hellwig To: Jan Kara Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, swhiteho@redhat.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 00/10] quotactl fixed and cleanups Subject: Re: [PATCH 00/10] quotactl fixed and cleanups Message-ID: <20100216191207.GA3856@infradead.org> References: <20100216084446.377980079@bombadil.infradead.org> <20100216183627.GC3153@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100216183627.GC3153@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: 1266347531 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, Feb 16, 2010 at 07:36:28PM +0100, Jan Kara wrote: > Thanks for the cleanups. Upto a few fixed typos and whitespace errors > I've merged your patchset into my tree. > As a side note, OCFS2 implements XFS-style clustered quotas using current > VFS quota subsystem (and quota file format) so my naive feeling is that at > least GFS2 should fit in there as well. But maybe I'm wrong. The file format is one big difference. The other is that having the quota code in the filesystem allows much nicer integration with the transaction code. Anyway, my next step is to support both the current "VFS" and the "XFS" quota interface independent of the underlying implementation, at least for the runtime calls. The quota on/off bits are a bit too different, but it might be a good idea to handle those everywhere primarily via mount options and deprecate most of the old calls, but keep supporting them for a long time. After that I plan to look a bit more in the quota implementation and look for sharing opportunities, but it might take a while until I get to that. From bpm@sgi.com Tue Feb 16 15:02:54 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1GL2rLC180998 for ; Tue, 16 Feb 2010 15:02:53 -0600 Received: from snoot.americas.sgi.com (case.americas.sgi.com [128.162.244.182]) by relay1.corp.sgi.com (Postfix) with ESMTP id D21E88F8037; Tue, 16 Feb 2010 13:04:08 -0800 (PST) Received: from [127.0.0.2] (localhost [127.0.0.1]) by snoot.americas.sgi.com (Postfix) with ESMTP id 1D6474975FBD; Tue, 16 Feb 2010 15:04:08 -0600 (CST) Subject: [PATCH 0/2] commit_metadata export operation v5 To: bfields@fieldses.org From: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 16 Feb 2010 15:04:08 -0600 Message-ID: <20100216210026.5694.14423.stgit@case> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 Hey Bruce, Here is the latest version of the knfsd sync changes that I've been spamming you with. I have addressed the latest suggestions provided by Christoph, Trond, Dave, and Alex. This version of the commit_metadata export operation takes only one inode as suggested by Christoph and it turns out to be much cleaner this way. Now we've gone back to committing all of the time in nfsd_create_setattr and don't bother with the added argument. A couple extra comments to explain the commit ordering. Thanks, Ben --- Ben Myers (2): commit_metadata export operation replacing nfsd_sync_dir xfs_export_operations.commit_metadata fs/nfsd/nfs4recover.c | 4 -- fs/nfsd/vfs.c | 109 ++++++++++++++++++++--------------------- fs/xfs/linux-2.6/xfs_export.c | 24 +++++++++ include/linux/exportfs.h | 5 ++ 4 files changed, 83 insertions(+), 59 deletions(-) -- From bpm@sgi.com Tue Feb 16 15:02:59 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,LOCAL_GNU_PATCH autolearn=no version=3.3.0-rupdated 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 o1GL2wo7181011 for ; Tue, 16 Feb 2010 15:02:59 -0600 Received: from snoot.americas.sgi.com (case.americas.sgi.com [128.162.244.182]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0DD8DAC008; Tue, 16 Feb 2010 13:04:13 -0800 (PST) Received: from [127.0.0.2] (localhost [127.0.0.1]) by snoot.americas.sgi.com (Postfix) with ESMTP id 3BB7C4975FBD; Tue, 16 Feb 2010 15:04:13 -0600 (CST) Subject: [PATCH 1/2] commit_metadata export operation replacing nfsd_sync_dir To: bfields@fieldses.org From: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 16 Feb 2010 15:04:13 -0600 Message-ID: <20100216210413.5694.88826.stgit@case> In-Reply-To: <20100216210026.5694.14423.stgit@case> References: <20100216210026.5694.14423.stgit@case> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 - Add commit_metadata export_operation to allow the underlying filesystem to decide how to commit an inode most efficiently. - Usage of nfsd_sync_dir and write_inode_now has been replaced with the commit_metadata function that takes a svc_fh. - The commit_metadata function calls the commit_metadata export_op if it's there, or else falls back to sync_inode instead of fsync and write_inode_now because only metadata need be synced here. - nfsd4_sync_rec_dir now uses vfs_fsync so that commit_metadata can be static Signed-off-by: Ben Myers --- fs/nfsd/nfs4recover.c | 4 -- fs/nfsd/vfs.c | 109 ++++++++++++++++++++++------------------------ include/linux/exportfs.h | 5 ++ 3 files changed, 59 insertions(+), 59 deletions(-) diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index 5a754f7..98fb98e 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c @@ -119,9 +119,7 @@ out_no_tfm: static void nfsd4_sync_rec_dir(void) { - mutex_lock(&rec_dir.dentry->d_inode->i_mutex); - nfsd_sync_dir(rec_dir.dentry); - mutex_unlock(&rec_dir.dentry->d_inode->i_mutex); + vfs_fsync(NULL, rec_dir.dentry, 0); } int diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index ed024d3..cde275b 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include #ifdef CONFIG_NFSD_V3 #include "xdr3.h" @@ -271,6 +273,31 @@ out: return err; } +/* + * Commit metadata changes to stable storage. You pay pass NULL for dchild. + */ +static int +commit_metadata(struct svc_fh *fhp) +{ + struct inode *inode = fhp->fh_dentry->d_inode; + const struct export_operations *export_ops = inode->i_sb->s_export_op; + struct writeback_control wbc = { + .sync_mode = WB_SYNC_ALL, + .nr_to_write = 0, /* metadata only */ + }; + int error = 0; + + if (!EX_ISSYNC(fhp->fh_export)) + return 0; + + if (export_ops->commit_metadata) { + error = export_ops->commit_metadata(inode); + } else { + error = sync_inode(inode, &wbc); + } + + return error; +} /* * Set various file attributes. @@ -769,28 +796,6 @@ nfsd_close(struct file *filp) } /* - * Sync a directory to disk. - * - * We can't just call vfs_fsync because our requirements are slightly odd: - * - * a) we do not have a file struct available - * b) we expect to have i_mutex already held by the caller - */ -int -nfsd_sync_dir(struct dentry *dentry) -{ - struct inode *inode = dentry->d_inode; - int error; - - WARN_ON(!mutex_is_locked(&inode->i_mutex)); - - error = filemap_write_and_wait(inode->i_mapping); - if (!error && inode->i_fop->fsync) - error = inode->i_fop->fsync(NULL, dentry, 0); - return error; -} - -/* * Obtain the readahead parameters for the file * specified by (dev, ino). */ @@ -1199,7 +1204,7 @@ nfsd_create_setattr(struct svc_rqst *rqstp, struct svc_fh *resfhp, if (current_fsuid() != 0) iap->ia_valid &= ~(ATTR_UID|ATTR_GID); if (iap->ia_valid) - return nfsd_setattr(rqstp, resfhp, iap, 0, (time_t)0); + return nfsd_setattr(rqstp, resfhp, iap, 0, 0); return 0; } @@ -1331,13 +1336,15 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, goto out_nfserr; } - if (EX_ISSYNC(fhp->fh_export)) { - err = nfserrno(nfsd_sync_dir(dentry)); - write_inode_now(dchild->d_inode, 1); - } + err = nfsd_create_setattr(rqstp, resfhp, iap); - err2 = nfsd_create_setattr(rqstp, resfhp, iap); - if (err2) + /* + * nfsd_setattr already committed the child. Transactional filesystems + * had a chance to commit changes for both parent and child + * simultaneously making the following commit_metadata a noop. + */ + err2 = nfserrno(commit_metadata(fhp)); + if (err2) err = err2; mnt_drop_write(fhp->fh_export->ex_path.mnt); /* @@ -1368,7 +1375,6 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, struct dentry *dentry, *dchild = NULL; struct inode *dirp; __be32 err; - __be32 err2; int host_err; __u32 v_mtime=0, v_atime=0; @@ -1463,11 +1469,6 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, if (created) *created = 1; - if (EX_ISSYNC(fhp->fh_export)) { - err = nfserrno(nfsd_sync_dir(dentry)); - /* setattr will sync the child (or not) */ - } - nfsd_check_ignore_resizing(iap); if (createmode == NFS3_CREATE_EXCLUSIVE) { @@ -1482,9 +1483,13 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, } set_attr: - err2 = nfsd_create_setattr(rqstp, resfhp, iap); - if (err2) - err = err2; + err = nfsd_create_setattr(rqstp, resfhp, iap); + + /* + * nfsd_setattr already committed the child (and possibly also the parent). + */ + if (!err) + err = nfserrno(commit_metadata(fhp)); mnt_drop_write(fhp->fh_export->ex_path.mnt); /* @@ -1599,12 +1604,9 @@ nfsd_symlink(struct svc_rqst *rqstp, struct svc_fh *fhp, } } else host_err = vfs_symlink(dentry->d_inode, dnew, path); - - if (!host_err) { - if (EX_ISSYNC(fhp->fh_export)) - host_err = nfsd_sync_dir(dentry); - } err = nfserrno(host_err); + if (!err) + err = nfserrno(commit_metadata(fhp)); fh_unlock(fhp); mnt_drop_write(fhp->fh_export->ex_path.mnt); @@ -1666,11 +1668,9 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp, } host_err = vfs_link(dold, dirp, dnew); if (!host_err) { - if (EX_ISSYNC(ffhp->fh_export)) { - err = nfserrno(nfsd_sync_dir(ddir)); - write_inode_now(dest, 1); - } - err = 0; + err = nfserrno(commit_metadata(ffhp)); + if (!err) + err = nfserrno(commit_metadata(tfhp)); } else { if (host_err == -EXDEV && rqstp->rq_vers == 2) err = nfserr_acces; @@ -1766,10 +1766,10 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen, goto out_dput_new; host_err = vfs_rename(fdir, odentry, tdir, ndentry); - if (!host_err && EX_ISSYNC(tfhp->fh_export)) { - host_err = nfsd_sync_dir(tdentry); + if (!host_err) { + host_err = commit_metadata(tfhp); if (!host_err) - host_err = nfsd_sync_dir(fdentry); + host_err = commit_metadata(ffhp); } mnt_drop_write(ffhp->fh_export->ex_path.mnt); @@ -1850,12 +1850,9 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, dput(rdentry); - if (host_err) - goto out_drop; - if (EX_ISSYNC(fhp->fh_export)) - host_err = nfsd_sync_dir(dentry); + if (!host_err) + host_err = commit_metadata(fhp); -out_drop: mnt_drop_write(fhp->fh_export->ex_path.mnt); out_nfserr: err = nfserrno(host_err); diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index dc12f41..a9cd507 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -96,6 +96,7 @@ struct fid { * @fh_to_parent: find the implied object's parent and get a dentry for it * @get_name: find the name for a given inode in a given directory * @get_parent: find the parent of a given directory + * @commit_metadata: commit metadata changes to stable storage * * See Documentation/filesystems/nfs/Exporting for details on how to use * this interface correctly. @@ -137,6 +138,9 @@ struct fid { * is also a directory. In the event that it cannot be found, or storage * space cannot be allocated, a %ERR_PTR should be returned. * + * commit_metadata: + * @commit_metadata should commit metadata changes to stable storage. + * * Locking rules: * get_parent is called with child->d_inode->i_mutex down * get_name is not (which is possibly inconsistent) @@ -152,6 +156,7 @@ struct export_operations { int (*get_name)(struct dentry *parent, char *name, struct dentry *child); struct dentry * (*get_parent)(struct dentry *child); + int (*commit_metadata)(struct inode *inode); }; extern int exportfs_encode_fh(struct dentry *dentry, struct fid *fid, From bpm@sgi.com Tue Feb 16 15:03:01 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1GL30EV181026 for ; Tue, 16 Feb 2010 15:03:01 -0600 Received: from snoot.americas.sgi.com (case.americas.sgi.com [128.162.244.182]) by relay3.corp.sgi.com (Postfix) with ESMTP id 38426AC011; Tue, 16 Feb 2010 13:04:19 -0800 (PST) Received: from [127.0.0.2] (localhost [127.0.0.1]) by snoot.americas.sgi.com (Postfix) with ESMTP id 550604975FBD; Tue, 16 Feb 2010 15:04:18 -0600 (CST) Subject: [PATCH 2/2] xfs_export_operations.commit_metadata To: bfields@fieldses.org From: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 16 Feb 2010 15:04:18 -0600 Message-ID: <20100216210418.5694.48417.stgit@case> In-Reply-To: <20100216210026.5694.14423.stgit@case> References: <20100216210026.5694.14423.stgit@case> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 This is the commit_metadata export operation for XFS. - Takes one inode to be committed. - Forces the log up to the lsn of the inode. - Doesn't force the log if the inode doesn't have a pincount. Signed-off-by: Ben Myers --- fs/xfs/linux-2.6/xfs_export.c | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+), 0 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index 87b8cbd..47a8d1f 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c @@ -29,6 +29,7 @@ #include "xfs_vnodeops.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" +#include "xfs_inode_item.h" /* * Note that we only accept fileids which are long enough rather than allow @@ -215,9 +216,32 @@ xfs_fs_get_parent( return d_obtain_alias(VFS_I(cip)); } +STATIC int +xfs_fs_nfs_commit_metadata( + struct inode *inode) +{ + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + xfs_lsn_t force_lsn = NULLCOMMITLSN; + int error = 0; + + xfs_ilock(ip, XFS_ILOCK_SHARED); + if (xfs_ipincount(ip)) { + force_lsn = ip->i_itemp->ili_last_lsn; + } + if (force_lsn != NULLCOMMITLSN) { + error = _xfs_log_force(mp, force_lsn, + XFS_LOG_FORCE | XFS_LOG_SYNC, NULL); + } + xfs_iunlock(ip, XFS_ILOCK_SHARED); + + return error; +} + const struct export_operations xfs_export_operations = { .encode_fh = xfs_fs_encode_fh, .fh_to_dentry = xfs_fs_fh_to_dentry, .fh_to_parent = xfs_fs_fh_to_parent, .get_parent = xfs_fs_get_parent, + .commit_metadata = xfs_fs_nfs_commit_metadata, }; From jack@suse.cz Tue Feb 16 15:25:08 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1GLP8nN182271 for ; Tue, 16 Feb 2010 15:25:08 -0600 X-ASG-Debug-ID: 1266355584-167e01af0000-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 32DB31D6948 for ; Tue, 16 Feb 2010 13:26:25 -0800 (PST) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id vGPpgkeiUv74tcoR for ; Tue, 16 Feb 2010 13:26:25 -0800 (PST) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 257C24844E; Tue, 16 Feb 2010 22:26:24 +0100 (CET) Received: by quack.suse.cz (Postfix, from userid 10005) id 42C682B178F; Tue, 16 Feb 2010 22:26:34 +0100 (CET) Date: Tue, 16 Feb 2010 22:26:34 +0100 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , linux-fsdevel@vger.kernel.org, swhiteho@redhat.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 00/10] quotactl fixed and cleanups Subject: Re: [PATCH 00/10] quotactl fixed and cleanups Message-ID: <20100216212634.GI3153@quack.suse.cz> References: <20100216084446.377980079@bombadil.infradead.org> <20100216183627.GC3153@quack.suse.cz> <20100216191207.GA3856@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100216191207.GA3856@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: 1266355586 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22715 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 16-02-10 14:12:07, Christoph Hellwig wrote: > On Tue, Feb 16, 2010 at 07:36:28PM +0100, Jan Kara wrote: > > Thanks for the cleanups. Upto a few fixed typos and whitespace errors > > I've merged your patchset into my tree. > > As a side note, OCFS2 implements XFS-style clustered quotas using current > > VFS quota subsystem (and quota file format) so my naive feeling is that at > > least GFS2 should fit in there as well. But maybe I'm wrong. > > The file format is one big difference. The other is that having the > quota code in the filesystem allows much nicer integration with the > transaction code. Anyway, my next step is to support both the > current "VFS" and the "XFS" quota interface independent of the > underlying implementation, at least for the runtime calls. The > quota on/off bits are a bit too different, but it might be a good > idea to handle those everywhere primarily via mount options and > deprecate most of the old calls, but keep supporting them for a long > time. After that I plan to look a bit more in the quota implementation > and look for sharing opportunities, but it might take a while until I > get to that. The semantics I've chosen for OCFS2 is that if "USRQUOTA" filesystem feature is enabled, we always do accounting of users' usage (as this is essntially filesystem metadata). 'usrquota' mount option is just ignored and used only to make life easier to quota-tools (so that they don't have to parse superblock to find whether quota is supported or not). Enforcement is enabled / disabled by quotactl call. I'd eventually love to convert ext3/4 to this behavior as well (and move quota files to be invisible "system" inodes) so if XFS would be consistent with this, it would be nice. Honza -- Jan Kara SUSE Labs, CR From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 15:53:23 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1GLrNG4183789 for ; Tue, 16 Feb 2010 15:53:23 -0600 X-ASG-Debug-ID: 1266357280-6b6301ec0000-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 5B04B1CD7399 for ; Tue, 16 Feb 2010 13:54:40 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id bEYF2tm7IImQhkXJ for ; Tue, 16 Feb 2010 13:54:40 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhVNO-0002tS-8B; Tue, 16 Feb 2010 21:54:38 +0000 Date: Tue, 16 Feb 2010 16:54:38 -0500 From: Christoph Hellwig To: Jan Kara Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, swhiteho@redhat.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 00/10] quotactl fixed and cleanups Subject: Re: [PATCH 00/10] quotactl fixed and cleanups Message-ID: <20100216215438.GA23628@infradead.org> References: <20100216084446.377980079@bombadil.infradead.org> <20100216183627.GC3153@quack.suse.cz> <20100216191207.GA3856@infradead.org> <20100216212634.GI3153@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100216212634.GI3153@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: 1266357281 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, Feb 16, 2010 at 10:26:34PM +0100, Jan Kara wrote: > The semantics I've chosen for OCFS2 is that if "USRQUOTA" filesystem > feature is enabled, we always do accounting of users' usage (as this is > essntially filesystem metadata). 'usrquota' mount option is just ignored > and used only to make life easier to quota-tools (so that they don't have > to parse superblock to find whether quota is supported or not). Enforcement > is enabled / disabled by quotactl call. > I'd eventually love to convert ext3/4 to this behavior as well (and move > quota files to be invisible "system" inodes) so if XFS would be consistent > with this, it would be nice. XFS is almost but not quite consistant with that. XFS has mount options for accounting and enforcement, but no superblock bit yet. Accounting always needs to be enabled at mount time, and enforcement can be enabled/disabled with quotactl / xfs_quota in addition to the mount option. We have been thinking about optionally also adding the superblock flag as that would make a lof of things easier, especially for quotas on the root filesystem. From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 16:05:28 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1GM5RCJ184516 for ; Tue, 16 Feb 2010 16:05:28 -0600 X-ASG-Debug-ID: 1266358006-139e037b0000-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 3FBAA1D6C0E; Tue, 16 Feb 2010 14:06:46 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id kBwAjivoG0tDQALJ; Tue, 16 Feb 2010 14:06:46 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhVZ7-0006gW-Da; Tue, 16 Feb 2010 22:06:45 +0000 Date: Tue, 16 Feb 2010 17:06:45 -0500 From: Christoph Hellwig To: Ben Myers Cc: bfields@fieldses.org, linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] commit_metadata export operation replacing nfsd_sync_dir Subject: Re: [PATCH 1/2] commit_metadata export operation replacing nfsd_sync_dir Message-ID: <20100216220645.GA24735@infradead.org> References: <20100216210026.5694.14423.stgit@case> <20100216210413.5694.88826.stgit@case> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100216210413.5694.88826.stgit@case> 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: 1266358006 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 looks very good to me. A couple of tiny nitpicks below: > +/* > + * Commit metadata changes to stable storage. You pay pass NULL for dchild. > + */ The dchild argument is gone in this version. > + struct writeback_control wbc = { > + .sync_mode = WB_SYNC_ALL, > + .nr_to_write = 0, /* metadata only */ > + }; > + int error = 0; > + > + if (!EX_ISSYNC(fhp->fh_export)) > + return 0; > + > + if (export_ops->commit_metadata) { > + error = export_ops->commit_metadata(inode); > + } else { > + error = sync_inode(inode, &wbc); > + } Maybe move the wbc declaration into the else branch here to keep variables in the smallest possible scope. > @@ -1199,7 +1204,7 @@ nfsd_create_setattr(struct svc_rqst *rqstp, struct svc_fh *resfhp, > if (current_fsuid() != 0) > iap->ia_valid &= ~(ATTR_UID|ATTR_GID); > if (iap->ia_valid) > - return nfsd_setattr(rqstp, resfhp, iap, 0, (time_t)0); > + return nfsd_setattr(rqstp, resfhp, iap, 0, 0); While this is a worthwhile cleanup I'd not put it into a patch that is now entirely unrelated. > + err = nfsd_create_setattr(rqstp, resfhp, iap); > > + /* > + * nfsd_setattr already committed the child. Transactional filesystems > + * had a chance to commit changes for both parent and child > + * simultaneously making the following commit_metadata a noop. > + */ > + err2 = nfserrno(commit_metadata(fhp)); > + if (err2) > err = err2; The if statement above seems rather minindented, possibly due to the partial use of spaces instead of tabs. From BATV+2a3aff06858e6c22cbdd+2368+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 16 16:06:30 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, TVD_SPACE_RATIO autolearn=no version=3.3.0-rupdated 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 o1GM6URj184566 for ; Tue, 16 Feb 2010 16:06:30 -0600 X-ASG-Debug-ID: 1266358068-166e03800000-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 65C131D6A05; Tue, 16 Feb 2010 14:07:48 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ybAAQ6R4YdPNwKkv; Tue, 16 Feb 2010 14:07:48 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhVa8-0008Cw-3a; Tue, 16 Feb 2010 22:07:48 +0000 Date: Tue, 16 Feb 2010 17:07:48 -0500 From: Christoph Hellwig To: Ben Myers Cc: bfields@fieldses.org, linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Subject: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Message-ID: <20100216220748.GB24735@infradead.org> References: <20100216210026.5694.14423.stgit@case> <20100216210418.5694.48417.stgit@case> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100216210418.5694.48417.stgit@case> 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: 1266358068 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 From SRS0+8qpr+77+fromorbit.com=david@internode.on.net Tue Feb 16 18:28:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H0SVLI192750 for ; Tue, 16 Feb 2010 18:28:32 -0600 X-ASG-Debug-ID: 1266366586-7dbb00c80000-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 362F213AFF63 for ; Tue, 16 Feb 2010 16:29:47 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id DlW0Gq53nWs70lYv for ; Tue, 16 Feb 2010 16:29:47 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13991040-1927428 for multiple; Wed, 17 Feb 2010 10:59:45 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NhXnT-0001n7-Em; Wed, 17 Feb 2010 11:29:43 +1100 Date: Wed, 17 Feb 2010 11:29:43 +1100 From: Dave Chinner To: Ben Myers Cc: bfields@fieldses.org, linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Subject: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Message-ID: <20100217002943.GG28392@discord.disaster> References: <20100216210026.5694.14423.stgit@case> <20100216210418.5694.48417.stgit@case> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100216210418.5694.48417.stgit@case> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1266366589 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22725 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, Feb 16, 2010 at 03:04:18PM -0600, Ben Myers wrote: > This is the commit_metadata export operation for XFS. > > - Takes one inode to be committed. > > - Forces the log up to the lsn of the inode. > > - Doesn't force the log if the inode doesn't have a pincount. > > Signed-off-by: Ben Myers > --- > fs/xfs/linux-2.6/xfs_export.c | 24 ++++++++++++++++++++++++ > 1 files changed, 24 insertions(+), 0 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c > index 87b8cbd..47a8d1f 100644 > --- a/fs/xfs/linux-2.6/xfs_export.c > +++ b/fs/xfs/linux-2.6/xfs_export.c > @@ -29,6 +29,7 @@ > #include "xfs_vnodeops.h" > #include "xfs_bmap_btree.h" > #include "xfs_inode.h" > +#include "xfs_inode_item.h" > > /* > * Note that we only accept fileids which are long enough rather than allow > @@ -215,9 +216,32 @@ xfs_fs_get_parent( > return d_obtain_alias(VFS_I(cip)); > } > > +STATIC int > +xfs_fs_nfs_commit_metadata( > + struct inode *inode) > +{ > + struct xfs_inode *ip = XFS_I(inode); > + struct xfs_mount *mp = ip->i_mount; > + xfs_lsn_t force_lsn = NULLCOMMITLSN; > + int error = 0; > + > + xfs_ilock(ip, XFS_ILOCK_SHARED); > + if (xfs_ipincount(ip)) { > + force_lsn = ip->i_itemp->ili_last_lsn; > + } > + if (force_lsn != NULLCOMMITLSN) { > + error = _xfs_log_force(mp, force_lsn, > + XFS_LOG_FORCE | XFS_LOG_SYNC, NULL); > + } That could be simplified to: if (xfs_ipincount(ip)) _xfs_log_force(mp, ip->i_itemp->ili_last_lsn XFS_LOG_FORCE | XFS_LOG_SYNC, NULL); Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfields@fieldses.org Tue Feb 16 20:37:52 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H2bp57199183 for ; Tue, 16 Feb 2010 20:37:52 -0600 X-ASG-Debug-ID: 1266374349-43d602c60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from fieldses.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0E6E21D76EB; Tue, 16 Feb 2010 18:39:09 -0800 (PST) Received: from fieldses.org (fieldses.org [174.143.236.118]) by cuda.sgi.com with ESMTP id 8UkQSxvC5HNN6qFO; Tue, 16 Feb 2010 18:39:09 -0800 (PST) Received: from bfields by fieldses.org with local (Exim 4.69) (envelope-from ) id 1NhZpM-000074-TY; Tue, 16 Feb 2010 21:39:48 -0500 Date: Tue, 16 Feb 2010 21:39:48 -0500 From: "J. Bruce Fields" To: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/2] commit_metadata export operation v5 Subject: Re: [PATCH 0/2] commit_metadata export operation v5 Message-ID: <20100217023948.GB32315@fieldses.org> References: <20100216210026.5694.14423.stgit@case> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100216210026.5694.14423.stgit@case> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: fieldses.org[174.143.236.118] X-Barracuda-Start-Time: 1266374350 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22734 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, Feb 16, 2010 at 03:04:08PM -0600, Ben Myers wrote: > Here is the latest version of the knfsd sync changes that I've been spamming > you with. Don't worry about spamming--it's good that people have lots of comments! --b. > I have addressed the latest suggestions provided by Christoph, > Trond, Dave, and Alex. This version of the commit_metadata export operation > takes only one inode as suggested by Christoph and it turns out to be much > cleaner this way. Now we've gone back to committing all of the time in > nfsd_create_setattr and don't bother with the added argument. A couple extra > comments to explain the commit ordering. > > Thanks, > Ben > > --- > > Ben Myers (2): > commit_metadata export operation replacing nfsd_sync_dir > xfs_export_operations.commit_metadata > > > fs/nfsd/nfs4recover.c | 4 -- > fs/nfsd/vfs.c | 109 ++++++++++++++++++++--------------------- > fs/xfs/linux-2.6/xfs_export.c | 24 +++++++++ > include/linux/exportfs.h | 5 ++ > 4 files changed, 83 insertions(+), 59 deletions(-) > > -- From SRS0+ffTR+77+fromorbit.com=david@internode.on.net Tue Feb 16 21:35:13 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H3ZDJI201959 for ; Tue, 16 Feb 2010 21:35:13 -0600 X-ASG-Debug-ID: 1266377789-259f02480000-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 184DD1D7807 for ; Tue, 16 Feb 2010 19:36:29 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id LLMKeRyushGDAj1P for ; Tue, 16 Feb 2010 19:36:29 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14127391-1927428 for multiple; Wed, 17 Feb 2010 14:06:28 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NhaiA-0001x0-V7; Wed, 17 Feb 2010 14:36:27 +1100 Date: Wed, 17 Feb 2010 14:36:26 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/4] [PATCH 1/4] xfs: merge xfs_lrw.c into xfs_file.c Subject: Re: [PATCH 1/4] [PATCH 1/4] xfs: merge xfs_lrw.c into xfs_file.c Message-ID: <20100217033626.GI28392@discord.disaster> References: <20100215094445.528696829@bombadil.infradead.org> <20100215094603.932254045@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100215094603.932254045@bombadil.infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1266377791 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22737 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, Feb 15, 2010 at 04:44:46AM -0500, Christoph Hellwig wrote: > Currently the code to implement the file operations is split over two small > files. Merge the content of xfs_lrw.c into xfs_file.c to have it in one > place. Note that I haven't done various cleanups that are possible after > this yet, they will follow in the next patch. Also the function > xfs_dev_is_read_only which was in xfs_lrw.c before really doesn't fit in > here at all and was moved to xfs_mount.c. > > Signed-off-by: Christoph Hellwig Looks good to me, so: Reviewed-by: Dave Chinner As an additional step, perhaps it be a good idea to get rid of xfs_lrw.h as well? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+ffTR+77+fromorbit.com=david@internode.on.net Tue Feb 16 21:53:58 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H3rw5a202745 for ; Tue, 16 Feb 2010 21:53:58 -0600 X-ASG-Debug-ID: 1266378914-1d8b03dc0000-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 154481CD8178 for ; Tue, 16 Feb 2010 19:55:14 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id BK4vKfnp1DkQ2txx for ; Tue, 16 Feb 2010 19:55:14 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14129599-1927428 for multiple; Wed, 17 Feb 2010 14:25:13 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Nhb0J-0001xv-Up; Wed, 17 Feb 2010 14:55:11 +1100 Date: Wed, 17 Feb 2010 14:55:11 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/4] [PATCH 2/4] xfs: remove wrappers for read/write file operations Subject: Re: [PATCH 2/4] [PATCH 2/4] xfs: remove wrappers for read/write file operations Message-ID: <20100217035511.GJ28392@discord.disaster> References: <20100215094445.528696829@bombadil.infradead.org> <20100215094604.318261333@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100215094604.318261333@bombadil.infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1266378916 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22738 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, Feb 15, 2010 at 04:44:47AM -0500, Christoph Hellwig wrote: > Currently the aio_read, aio_write, splice_read and splice_write file > operations are divided into a low-level routine doing all the work and > one that implements the Linux file operations and does minimal argument > wrapping. This is a leftover from the days of the vnode operations layer > and can be removed to simplify the code a lot. > > Signed-off-by: Christoph Hellwig One main issue I see: .... > -ssize_t /* bytes written, or (-) error */ > -xfs_write( > - struct xfs_inode *xip, > +STATIC ssize_t > +xfs_file_aio_write( > struct kiocb *iocb, > const struct iovec *iovp, > - unsigned int nsegs, > - loff_t *offset, > - int ioflags) > + unsigned long nr_segs, > + loff_t pos) > { > struct file *file = iocb->ki_filp; > struct address_space *mapping = file->f_mapping; > struct inode *inode = mapping->host; > - unsigned long segs = nsegs; > - xfs_mount_t *mp; > + struct xfs_inode *ip = XFS_I(inode); > + struct xfs_mount *mp = ip->i_mount; > ssize_t ret = 0, error = 0; > + int ioflags = 0; > xfs_fsize_t isize, new_size; > int iolock; > int eventsent = 0; > size_t ocount = 0, count; > - loff_t pos; > int need_i_mutex; > > XFS_STATS_INC(xs_write_calls); > > - error = generic_segment_checks(iovp, &segs, &ocount, VERIFY_READ); > + BUG_ON(iocb->ki_pos != pos); You've changed a local variable "pos" which had the value iocb->ki_pos to a function parameter of the same name which has a different value. Given this, all the existing uses of "pos" in this function need to be converted to "iocb->ki_pos" as the old xfs_write() never saw the original "pos" variable passed to xfs_file_aio_write(). ..... > @@ -535,30 +550,30 @@ relock: > mutex_lock(&inode->i_mutex); > } > > - xfs_ilock(xip, XFS_ILOCK_EXCL|iolock); > + xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); > > start: > error = -generic_write_checks(file, &pos, &count, > S_ISBLK(inode->i_mode)); Such as here. Actually, I'm surprised the compiler let you take the address of a function parameter considering parameters may be passed in registers.... > if (error) { > - xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); > + xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); > goto out_unlock_mutex; > } > > - if ((DM_EVENT_ENABLED(xip, DM_EVENT_WRITE) && > + 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(xip, XFS_ILOCK_EXCL); > - error = XFS_SEND_DATA(xip->i_mount, DM_EVENT_WRITE, xip, > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + error = XFS_SEND_DATA(ip->i_mount, DM_EVENT_WRITE, ip, > pos, count, dmflags, &iolock); And here. There's lots of others that haven't been converted - can you make sure you get them all? > @@ -642,16 +657,16 @@ start: > > if (need_i_mutex) { > /* demote the lock now the cached pages are gone */ > - xfs_ilock_demote(xip, XFS_IOLOCK_EXCL); > + xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); > mutex_unlock(&inode->i_mutex); > > iolock = XFS_IOLOCK_SHARED; > need_i_mutex = 0; > } > > - trace_xfs_file_direct_write(xip, count, *offset, ioflags); > + trace_xfs_file_direct_write(ip, count, iocb->ki_pos, ioflags); > ret = generic_file_direct_write(iocb, iovp, > - &segs, pos, offset, count, ocount); > + &nr_segs, pos, &iocb->ki_pos, count, ocount); But you did convert some ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+8qpr+77+fromorbit.com=david@internode.on.net Tue Feb 16 22:08:31 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H48VtH203576 for ; Tue, 16 Feb 2010 22:08:31 -0600 X-ASG-Debug-ID: 1266379787-27ed018f0000-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 00B3013B0837 for ; Tue, 16 Feb 2010 20:09:47 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id ill065K79ETxcKIq for ; Tue, 16 Feb 2010 20:09:47 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14000956-1927428 for multiple; Wed, 17 Feb 2010 14:39:46 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NhbEO-0001yo-Sg; Wed, 17 Feb 2010 15:09:44 +1100 Date: Wed, 17 Feb 2010 15:09:44 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/4] [PATCH 3/4] xfs: remove wrapper for the fsync file operation Subject: Re: [PATCH 3/4] [PATCH 3/4] xfs: remove wrapper for the fsync file operation Message-ID: <20100217040944.GK28392@discord.disaster> References: <20100215094445.528696829@bombadil.infradead.org> <20100215094604.640912740@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100215094604.640912740@bombadil.infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1266379789 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22739 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, Feb 15, 2010 at 04:44:48AM -0500, Christoph Hellwig wrote: > Currently the fsync file operation is divided into a low-level routine doing > all the work and one that implements the Linux file operation and does minimal > argument wrapping. This is a leftover from the days of the vnode operations > layer and can be removed to simplify the code a bit, as well as preparing for > the implementation of an optimized fdatasync which needs to look at the > Linux inode state. > > Signed-off-by: Christoph Hellwig Looks good, one minor thing: > > Index: xfs/fs/xfs/linux-2.6/xfs_file.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_file.c 2010-02-15 10:18:58.640023657 +0100 > +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-02-15 10:28:07.311260422 +0100 > @@ -35,6 +35,7 @@ > #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" > @@ -96,6 +97,120 @@ xfs_iozero( > return (-status); > } > > +/* > + * We ignore the datasync flag here because a datasync is effectively > + * identical to an fsync. That is, datasync implies that we need to write > + * only the metadata needed to be able to access the data that is written > + * if we crash after the call completes. Hence if we are writing beyond > + * EOF we have to log the inode size change as well, which makes it a > + * full fsync. If we don't write beyond EOF, the inode core will be > + * clean in memory and so we don't need to log the inode, just like > + * fsync. > + */ > +STATIC int > +xfs_file_fsync( > + struct file *file, > + struct dentry *dentry, > + int datasync) > +{ > + struct xfs_inode *ip = XFS_I(dentry->d_inode); > + struct xfs_trans *tp; > + int error = 0; > + int log_flushed = 0; > + > + xfs_itrace_entry(ip); > + > + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) > + return -XFS_ERROR(EIO); > + > + xfs_iflags_clear(ip, XFS_ITRUNCATED); > + > + /* > + * We always need to make sure that the required inode state is safe on > + * disk. The inode might be clean but we still might need to force the > + * log because of committed transactions that haven't hit the disk yet. > + * Likewise, there could be unflushed non-transactional changes to the > + * inode core that have to go to disk and this requires us to issue > + * a synchronous transaction to capture these changes correctly. > + * > + * This code relies on the assumption that if the i_update_core field > + * of the inode is clear and the inode is unpinned then it is clean > + * and no action is required. > + */ > + xfs_ilock(ip, XFS_ILOCK_SHARED); > + > + if (ip->i_update_core) { > + /* > + * Kick off a transaction to log the inode core to get the > + * updates. The sync transaction will also force the log. > + */ > + xfs_iunlock(ip, XFS_ILOCK_SHARED); > + tp = xfs_trans_alloc(ip->i_mount, XFS_TRANS_FSYNC_TS); > + error = xfs_trans_reserve(tp, 0, > + XFS_FSYNC_TS_LOG_RES(ip->i_mount), 0, 0, 0); > + if (error) { > + xfs_trans_cancel(tp, 0); > + return -error; > + } > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + > + /* > + * Note - it's possible that we might have pushed ourselves out > + * of the way during trans_reserve which would flush the inode. > + * But there's no guarantee that the inode buffer has actually > + * gone out yet (it's delwri). Plus the buffer could be pinned > + * anyway if it's part of an inode in another recent > + * transaction. So we play it safe and fire off the > + * transaction anyway. > + */ > + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > + xfs_trans_ihold(tp, ip); > + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > + xfs_trans_set_sync(tp); > + error = _xfs_trans_commit(tp, 0, &log_flushed); > + > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + } else { > + /* > + * Timestamps/size haven't changed since last inode flush or > + * inode transaction commit. That means either nothing got > + * written or a transaction committed which caught the updates. > + * If the latter happened and the transaction hasn't hit the > + * disk yet, the inode will be still be pinned. If it is, > + * force the log. > + */ > + xfs_iunlock(ip, XFS_ILOCK_SHARED); > + if (xfs_ipincount(ip)) { > + if (ip->i_itemp->ili_last_lsn) { > + error = _xfs_log_force_lsn(ip->i_mount, > + ip->i_itemp->ili_last_lsn, > + XFS_LOG_SYNC, &log_flushed); > + } else { > + error = _xfs_log_force(ip->i_mount, > + XFS_LOG_SYNC, &log_flushed); > + } > + } To be technically correct, the ilock should be held over the pincount check and log force, as is done in xfs_iunpin_wait(). That way we can guarantee the inode was correctly forced and not unpinned between the unlock/check/log force being issued. I know this is just a copy of the existing fsync code, but I think that the existing code is wrong, too. ;) Also, if the inode is pinned while we have it locked, then ip->i_itemp->ili_last_lsn is guaranteed to be set as it is updated in IOP_COMMITTING() which is called during transaction commit. As it is, ili_last_lsn is never reset to zero after a transaction, so i think the _xfs_log_force() branch will never be executed, either. Other than that, the change looks ok. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+8qpr+77+fromorbit.com=david@internode.on.net Tue Feb 16 22:15:47 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H4FlxZ203940 for ; Tue, 16 Feb 2010 22:15:47 -0600 X-ASG-Debug-ID: 1266380223-60df00db0000-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 856351CD8226 for ; Tue, 16 Feb 2010 20:17:04 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id Wx4kEhsvXIwk9W9c for ; Tue, 16 Feb 2010 20:17:04 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 2421323-1927428 for multiple; Wed, 17 Feb 2010 14:47:02 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NhbLQ-0001zF-VI; Wed, 17 Feb 2010 15:17:01 +1100 Date: Wed, 17 Feb 2010 15:17:00 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/4] [PATCH 4/4] xfs: implement optimized fdatasync Subject: Re: [PATCH 4/4] [PATCH 4/4] xfs: implement optimized fdatasync Message-ID: <20100217041700.GL28392@discord.disaster> References: <20100215094445.528696829@bombadil.infradead.org> <20100215094605.009247071@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100215094605.009247071@bombadil.infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1266380225 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22738 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, Feb 15, 2010 at 04:44:49AM -0500, Christoph Hellwig wrote: > Allow us to track the difference between timestamp and size updates by using > mark_inode_dirty from the I/O completion code, and checking the VFS inode > flags in xfs_file_fsync. > > Signed-off-by: Christoph Hellwig Looks sane. Reviewed-by: Dave Chinner Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+ffTR+77+fromorbit.com=david@internode.on.net Tue Feb 16 22:17:57 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H4HuOd204041 for ; Tue, 16 Feb 2010 22:17:56 -0600 X-ASG-Debug-ID: 1266380353-317000ec0000-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 DC27713B0879 for ; Tue, 16 Feb 2010 20:19:13 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id 3JKyEVULZwPrmNIh for ; Tue, 16 Feb 2010 20:19:13 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14132713-1927428 for multiple; Wed, 17 Feb 2010 14:49:12 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NhbNW-0001zU-M2; Wed, 17 Feb 2010 15:19:10 +1100 Date: Wed, 17 Feb 2010 15:19:10 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: fix xfs_fsblock_t tracing Subject: Re: [PATCH] xfs: fix xfs_fsblock_t tracing Message-ID: <20100217041910.GM28392@discord.disaster> References: <20100215220219.GA4890@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100215220219.GA4890@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1266380354 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.22739 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, Feb 15, 2010 at 05:02:19PM -0500, Christoph Hellwig wrote: > Using a static buffer in xfs_fmtfsblock means we can corrupt traces if > multiple CPUs hit this code path at the same. Just remove xfs_fmtfsblock > for now and print the block number purely numerical. If we want the > NULLFSBLOCK and NULLSTARTBLOCK formatting back the best way would be > a decoding plugin in the trace-cmd userspace command. > > Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+ffTR+77+fromorbit.com=david@internode.on.net Tue Feb 16 22:36:08 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H4a8wA205028 for ; Tue, 16 Feb 2010 22:36:08 -0600 X-ASG-Debug-ID: 1266381444-66e9006e0000-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 D5C011D799B for ; Tue, 16 Feb 2010 20:37:24 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id WmNxHxKfipwenWWF for ; Tue, 16 Feb 2010 20:37:24 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14134961-1927428 for multiple; Wed, 17 Feb 2010 15:07:23 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Nhbf7-00020L-Tx; Wed, 17 Feb 2010 15:37:21 +1100 Date: Wed, 17 Feb 2010 15:37:21 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: split xfs_bmap_btalloc Subject: Re: [PATCH] xfs: split xfs_bmap_btalloc Message-ID: <20100217043721.GN28392@discord.disaster> References: <20100215233442.GA28817@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100215233442.GA28817@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1266381445 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22740 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, Feb 15, 2010 at 06:34:42PM -0500, Christoph Hellwig wrote: > Split out the nullfb case into a separate function to reduce the stack > footprint and make the code more readable. > > Signed-off-by: Christoph Hellwig I'm not sure this does reduce stack footprint - whenever we allocate the first block of a file we hit the nullfb case, and this adds another function call to that stack. However, from the cleanup POV, I can't complain ;) > > Index: xfs/fs/xfs/xfs_bmap.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_bmap.c 2010-01-17 14:46:43.326254284 +0100 > +++ xfs/fs/xfs/xfs_bmap.c 2010-01-17 15:04:47.016005768 +0100 > @@ -2550,22 +2550,134 @@ xfs_bmap_rtalloc( > } > > STATIC int > +xfs_bmap_btalloc_nullfb( > + struct xfs_bmalloca *ap, > + struct xfs_alloc_arg *args, > + xfs_extlen_t *blen) > +{ > + 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)) > + args->type = XFS_ALLOCTYPE_NEAR_BNO; > + else > + args->type = XFS_ALLOCTYPE_START_BNO; > + args->total = ap->total; > + > + /* > + * Search for an allocation group with a single extent large enough > + * for the request. If one isn't found, then adjust the minimum > + * allocation size to the largest space found. > + */ > + startag = ag = XFS_FSB_TO_AGNO(mp, args->fsbno); > + if (startag == NULLAGNUMBER) > + startag = ag = 0; > + > + 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; > + } > + } > + > + /* > + * See xfs_alloc_fix_freelist... > + */ This comment is pretty much useless - if we are changing code then I'd say kill it. Also the other comments in this function could be reformatted as the indent has changed and so might be a bit more readable with longer lines. This is not really that critical, though, so it's good as it stands. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+8qpr+77+fromorbit.com=david@internode.on.net Tue Feb 16 22:41:13 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H4fDtY205323 for ; Tue, 16 Feb 2010 22:41:13 -0600 X-ASG-Debug-ID: 1266381749-2e41024a0000-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 4B77C13B08D0 for ; Tue, 16 Feb 2010 20:42:30 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id H0I4P7qpQtCDTu0p for ; Tue, 16 Feb 2010 20:42:30 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14004910-1927428 for multiple; Wed, 17 Feb 2010 15:12:29 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Nhbk3-00020v-Jh; Wed, 17 Feb 2010 15:42:27 +1100 Date: Wed, 17 Feb 2010 15:42:27 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: stop passing opaque handles to xfs_log.c routines Subject: Re: [PATCH] xfs: stop passing opaque handles to xfs_log.c routines Message-ID: <20100217044227.GO28392@discord.disaster> References: <20100215233454.GB28817@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100215233454.GB28817@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1266381751 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22741 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, Feb 15, 2010 at 06:34:54PM -0500, Christoph Hellwig wrote: > Currenly we pass opaque xfs_log_ticket_t handles instead of struct > xlog_ticket pointers, and void pointers instead of struct xlog_in_core > pointers to various log manager functions. Instead pass properly > typed pointers after adding forward declarations for them to > xfs_log.h, and adjust the touched function prototypes to the standard > XFS style while at it. > > Signed-off-by: Christoph Hellwig This is almost identical to a patch I've got in my stack ATM :) Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+poNH+77+fromorbit.com=david@internode.on.net Tue Feb 16 23:11:23 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H5BMdX207022 for ; Tue, 16 Feb 2010 23:11:22 -0600 X-ASG-Debug-ID: 1266383558-31e503c00000-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 C95AF13B09AF for ; Tue, 16 Feb 2010 21:12:39 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id sBKr3JR0MErSYjaq for ; Tue, 16 Feb 2010 21:12:39 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 13914783-1927428 for multiple; Wed, 17 Feb 2010 15:42:38 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NhcDE-00022H-TI; Wed, 17 Feb 2010 16:12:36 +1100 Date: Wed, 17 Feb 2010 16:12:36 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: factor common xfs_trans_bjoin code Subject: Re: [PATCH] xfs: factor common xfs_trans_bjoin code Message-ID: <20100217051236.GP28392@discord.disaster> References: <20100215233509.GC28817@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100215233509.GC28817@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1266383560 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22743 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, Feb 15, 2010 at 06:35:09PM -0500, Christoph Hellwig wrote: > Most of xfs_trans_bjoin is duplicated in xfs_trans_get_buf, xfs_trans_getsb > and xfs_trans_read_buf. Add a new _xfs_trans_bjoin which can be called > by all four functions. > > Signed-off-by: Christoph Hellwig Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+V/5D+77+fromorbit.com=dave@internode.on.net Tue Feb 16 23:35:27 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H5ZQuv208335 for ; Tue, 16 Feb 2010 23:35:27 -0600 X-ASG-Debug-ID: 1266385002-5d2101ad0000-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 E013513B0A66 for ; Tue, 16 Feb 2010 21:36:43 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id AQ8nqAllGJB6Y6cA for ; Tue, 16 Feb 2010 21:36:43 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14010713-1927428 for ; Wed, 17 Feb 2010 16:06:42 +1030 (CDT) Received: from disturbed ([192.168.1.9]) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NhcaM-000246-M7 for xfs@oss.sgi.com; Wed, 17 Feb 2010 16:36:30 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NhcaL-0007X8-8Q for xfs@oss.sgi.com; Wed, 17 Feb 2010 16:36:29 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: Non-blocking inode locking in IO completion Subject: [PATCH] xfs: Non-blocking inode locking in IO completion Date: Wed, 17 Feb 2010 16:36:29 +1100 Message-Id: <1266384989-28928-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1266385004 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22745 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 introduction of barriers to DM loop devices (e.g. dm-crypt) has created a new IO order completion dependency that XFS does not handle. That is, the completion of log IOs (which have barriers) in the loop filesystem are now dependent on completion of data IO in the backing filesystem. This can cause deadlocks when a flush daemon issues a log force with an inode locked because the IO completion of IO on the inode is blocked by the inode lock. This in turn prevents further data IO completion from occuring, which prevents the log IO from completing because DM is waiting for data Io completion as well. The fix for this new completion order dependency issue is to make the IO completion inode locking non-blocking. If the inode lock can't be grabbed, simply requeue the IO completion back to the work queue so that it can be processed later. This prevents the completion queue from being blocked and allows data IO completion on other inodes to proceed, hence avoiding completion order dependent deadlocks. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_aops.c | 93 ++++++++++++++++++++++++++----------------- 1 files changed, 56 insertions(+), 37 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 66abe36..1c65a2b 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c @@ -163,14 +163,17 @@ xfs_ioend_new_eof( } /* - * Update on-disk file size now that data has been written to disk. - * The current in-memory file size is i_size. If a write is beyond - * eof i_new_size will be the intended file size until i_size is - * updated. If this write does not extend all the way to the valid - * file size then restrict this update to the end of the write. + * Update on-disk file size now that data has been written to disk. The + * current in-memory file size is i_size. If a write is beyond eof i_new_size + * will be the intended file size until i_size is updated. If this write does + * not extend all the way to the valid file size then restrict this update to + * the end of the write. + * + * This function does not block as blocking on the inode lock in IO completion + * can lead to IO completion order dependency deadlocks.. If it can't get the + * inode ilock it will return EAGAIN. Callers must handle this. */ - -STATIC void +STATIC int xfs_setfilesize( xfs_ioend_t *ioend) { @@ -181,9 +184,11 @@ xfs_setfilesize( ASSERT(ioend->io_type != IOMAP_READ); if (unlikely(ioend->io_error)) - return; + return 0; + + if (!xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) + return EAGAIN; - xfs_ilock(ip, XFS_ILOCK_EXCL); isize = xfs_ioend_new_eof(ioend); if (isize) { ip->i_d.di_size = isize; @@ -191,6 +196,28 @@ xfs_setfilesize( } xfs_iunlock(ip, XFS_ILOCK_EXCL); + return 0; +} + +/* + * Schedule IO completion handling on a xfsdatad if this was + * the final hold on this ioend. If we are asked to wait, + * flush the workqueue. + */ +STATIC void +xfs_finish_ioend( + xfs_ioend_t *ioend, + int wait) +{ + if (atomic_dec_and_test(&ioend->io_remaining)) { + struct workqueue_struct *wq; + + wq = (ioend->io_type == IOMAP_UNWRITTEN) ? + xfsconvertd_workqueue : xfsdatad_workqueue; + queue_work(wq, &ioend->io_work); + if (wait) + flush_workqueue(wq); + } } /* @@ -198,11 +225,11 @@ xfs_setfilesize( */ STATIC void xfs_end_io( - struct work_struct *work) + struct work_struct *work) { - xfs_ioend_t *ioend = - container_of(work, xfs_ioend_t, io_work); - struct xfs_inode *ip = XFS_I(ioend->io_inode); + xfs_ioend_t *ioend = container_of(work, xfs_ioend_t, io_work); + struct xfs_inode *ip = XFS_I(ioend->io_inode); + int error; /* * For unwritten extents we need to issue transactions to convert a @@ -210,7 +237,6 @@ xfs_end_io( */ if (ioend->io_type == IOMAP_UNWRITTEN && likely(!ioend->io_error && !XFS_FORCED_SHUTDOWN(ip->i_mount))) { - int error; error = xfs_iomap_write_unwritten(ip, ioend->io_offset, ioend->io_size); @@ -222,30 +248,23 @@ xfs_end_io( * We might have to update the on-disk file size after extending * writes. */ - if (ioend->io_type != IOMAP_READ) - xfs_setfilesize(ioend); - xfs_destroy_ioend(ioend); -} - -/* - * Schedule IO completion handling on a xfsdatad if this was - * the final hold on this ioend. If we are asked to wait, - * flush the workqueue. - */ -STATIC void -xfs_finish_ioend( - xfs_ioend_t *ioend, - int wait) -{ - if (atomic_dec_and_test(&ioend->io_remaining)) { - struct workqueue_struct *wq; - - wq = (ioend->io_type == IOMAP_UNWRITTEN) ? - xfsconvertd_workqueue : xfsdatad_workqueue; - queue_work(wq, &ioend->io_work); - if (wait) - flush_workqueue(wq); + if (ioend->io_type != IOMAP_READ) { + error = xfs_setfilesize(ioend); + ASSERT(!error || error == EAGAIN); } + + /* + * If we didn't complete processing of the ioend, requeue it to the + * tail of the workqueue for another attempt later. Otherwise destroy + * it. + */ + if (error == EAGAIN) { + atomic_inc(&ioend->io_remaining); + xfs_finish_ioend(ioend, 0); + /* ensure we don't spin on blocked ioends */ + delay(1); + } else + xfs_destroy_ioend(ioend); } /* -- 1.6.5 From BATV+f0e3f32b8d1f4c7fe1fa+2369+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 17 02:12:49 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H8ClPM218734 for ; Wed, 17 Feb 2010 02:12:49 -0600 X-ASG-Debug-ID: 1266394445-642200690000-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 5E77213B0FE5 for ; Wed, 17 Feb 2010 00:14:05 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id iPHWCdZJ9hUkGbjt for ; Wed, 17 Feb 2010 00:14:05 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nhf2p-0002Jj-OB; Wed, 17 Feb 2010 08:14:03 +0000 Date: Wed, 17 Feb 2010 03:14:03 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/4] [PATCH 1/4] xfs: merge xfs_lrw.c into xfs_file.c Subject: Re: [PATCH 1/4] [PATCH 1/4] xfs: merge xfs_lrw.c into xfs_file.c Message-ID: <20100217081403.GA19943@infradead.org> References: <20100215094445.528696829@bombadil.infradead.org> <20100215094603.932254045@bombadil.infradead.org> <20100217033626.GI28392@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217033626.GI28392@discord.disaster> 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: 1266394446 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, Feb 17, 2010 at 02:36:26PM +1100, Dave Chinner wrote: > On Mon, Feb 15, 2010 at 04:44:46AM -0500, Christoph Hellwig wrote: > > Currently the code to implement the file operations is split over two small > > files. Merge the content of xfs_lrw.c into xfs_file.c to have it in one > > place. Note that I haven't done various cleanups that are possible after > > this yet, they will follow in the next patch. Also the function > > xfs_dev_is_read_only which was in xfs_lrw.c before really doesn't fit in > > here at all and was moved to xfs_mount.c. > > > > Signed-off-by: Christoph Hellwig > > Looks good to me, so: > > Reviewed-by: Dave Chinner > > As an additional step, perhaps it be a good idea to get rid of > xfs_lrw.h as well? Yes, that's a good idea, I'll prepare a patch to do that. From BATV+f0e3f32b8d1f4c7fe1fa+2369+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 17 02:29:48 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H8TmLJ219623 for ; Wed, 17 Feb 2010 02:29:48 -0600 X-ASG-Debug-ID: 1266395466-5ee001700000-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 98DD213B107C for ; Wed, 17 Feb 2010 00:31:06 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id bDr4t0pUDU6dZl5s for ; Wed, 17 Feb 2010 00:31:06 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhfJK-0006OY-1P; Wed, 17 Feb 2010 08:31:06 +0000 Date: Wed, 17 Feb 2010 03:31:06 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/4] [PATCH 2/4] xfs: remove wrappers for read/write file operations Subject: Re: [PATCH 2/4] [PATCH 2/4] xfs: remove wrappers for read/write file operations Message-ID: <20100217083105.GB19943@infradead.org> References: <20100215094445.528696829@bombadil.infradead.org> <20100215094604.318261333@bombadil.infradead.org> <20100217035511.GJ28392@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217035511.GJ28392@discord.disaster> 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: 1266395466 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, Feb 17, 2010 at 02:55:11PM +1100, Dave Chinner wrote: > You've changed a local variable "pos" which had the value > iocb->ki_pos to a function parameter of the same name which has a > different value. Given this, all the existing uses of "pos" in this > function need to be converted to "iocb->ki_pos" as the old > xfs_write() never saw the original "pos" variable passed to > xfs_file_aio_write(). Oh, I should have explained this in more detail. The aio_read/aio_write ABI both has a pos argument and the file position in iocb->ki_pos. They were added for allowing aio that does partial I/O in each method call using retries, but we don't actually use the anywhere. Thus these two are always these same and we even enforce that with a BUG_ON(iocb->ki_pos != pos); in the code (both old and new). Now how does the old pos local variable come in play? The old code didn't want to pass the kiocb to the low-level xfs-write function, but as want the offset it passes a pointer to iocb->ki_pos, which is called offset. We take a local copy of it before we might start modifying it, which we call pos. pos gets updated early in generic_write_checks if this is an O_APPEND write, but otherwise stays immutable and marks the position where this write started, while iocb->ki_pos (aka the old offset) gets updated by generic_file_direct_write / generic_file_buffered_write to the new file position after the I/O was done. > Such as here. Actually, I'm surprised the compiler let you take > the address of a function parameter considering parameters may be > passed in registers.... Taking the address of arguments is perfectly valid in C, the only thing you can't take addresses of are "register" variables. This code is the same as mm/filemap.c:__generic_file_aio_write, btw. > > - trace_xfs_file_direct_write(xip, count, *offset, ioflags); > > + trace_xfs_file_direct_write(ip, count, iocb->ki_pos, ioflags); > > ret = generic_file_direct_write(iocb, iovp, > > - &segs, pos, offset, count, ocount); > > + &nr_segs, pos, &iocb->ki_pos, count, ocount); > > But you did convert some ;) I did carefull convert all offset references to ki->ki_pos, but all uses of pos stay the same. From BATV+f0e3f32b8d1f4c7fe1fa+2369+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 17 02:32:16 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1H8WGH0219771 for ; Wed, 17 Feb 2010 02:32:16 -0600 X-ASG-Debug-ID: 1266395614-237c03120000-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 EC9551D7FFF for ; Wed, 17 Feb 2010 00:33:34 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 4KsBqZNboC2vOUuf for ; Wed, 17 Feb 2010 00:33:34 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhfLi-0006XT-LL; Wed, 17 Feb 2010 08:33:34 +0000 Date: Wed, 17 Feb 2010 03:33:34 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/4] [PATCH 3/4] xfs: remove wrapper for the fsync file operation Subject: Re: [PATCH 3/4] [PATCH 3/4] xfs: remove wrapper for the fsync file operation Message-ID: <20100217083334.GC19943@infradead.org> References: <20100215094445.528696829@bombadil.infradead.org> <20100215094604.640912740@bombadil.infradead.org> <20100217040944.GK28392@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217040944.GK28392@discord.disaster> 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: 1266395614 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, Feb 17, 2010 at 03:09:44PM +1100, Dave Chinner wrote: > > + xfs_iunlock(ip, XFS_ILOCK_SHARED); > > + if (xfs_ipincount(ip)) { > > + if (ip->i_itemp->ili_last_lsn) { > > + error = _xfs_log_force_lsn(ip->i_mount, > > + ip->i_itemp->ili_last_lsn, > > + XFS_LOG_SYNC, &log_flushed); > > + } else { > > + error = _xfs_log_force(ip->i_mount, > > + XFS_LOG_SYNC, &log_flushed); > > + } > > + } > > To be technically correct, the ilock should be held over the > pincount check and log force, as is done in xfs_iunpin_wait(). > That way we can guarantee the inode was correctly forced and not > unpinned between the unlock/check/log force being issued. I know > this is just a copy of the existing fsync code, but I think that > the existing code is wrong, too. ;) Yes, no changes to the code semantics here. But that ipincount check is a relatively recent addition from me, too - so thanks for the slightly delayed review as the comment is absolutely correct. I'll prepare a patch for it > Also, if the inode is pinned while we have it locked, then > ip->i_itemp->ili_last_lsn is guaranteed to be set as it is updated > in IOP_COMMITTING() which is called during transaction commit. > > As it is, ili_last_lsn is never reset to zero after a transaction, > so i think the _xfs_log_force() branch will never be executed, > either. True, the same also applies to __xfs_iunpit_wait, I'll look into that in another patch. This will also apply to Ben's nfsd commit_metadata patch. From sandeen@redhat.com Wed Feb 17 11:11:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.2 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HHBepB247691 for ; Wed, 17 Feb 2010 11:11:40 -0600 X-ASG-Debug-ID: 1266426777-2c0e00e90000-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 D73011DBA338 for ; Wed, 17 Feb 2010 09:12:58 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bCWq0HPsCdCB0hsp for ; Wed, 17 Feb 2010 09:12:58 -0800 (PST) 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 o1HHCvDH009553 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 17 Feb 2010 12:12:57 -0500 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o1HHCta0025604 for ; Wed, 17 Feb 2010 12:12:56 -0500 Message-ID: <4B7C2397.90406@redhat.com> Date: Wed, 17 Feb 2010 11:12:55 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH] xfstests: 077 should require fsgqa user Subject: [PATCH] xfstests: 077 should require fsgqa user 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: 1266426778 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0003 1.0000 -2.0193 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22784 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 Running on a newly-provisioned box: 077 - output mismatch (see 077.out.bad) --- 077.out 2010-02-17 11:22:35.275052872 -0500 +++ 077.out.bad 2010-02-17 11:59:48.979053106 -0500 @@ -1,6 +1,7 @@ QA output created by 077 *** create filesystem *** set default ACL +setfacl: Option -m: Invalid argument near character 3 *** populate filesystem, pass #1 *** populate filesystem, pass #2 *** all done because we didn't have the fsgqa user, and tried: # setfacl -R -dm u:fsgqa:rwx,g::rwx,o::r-x,m::rwx ... instead should have had: 077 [not run] fsgqa user not defined. Signed-off-by: Eric Sandeen --- diff --git a/077 b/077 index ea81c07..72f1b2a 100755 --- a/077 +++ b/077 @@ -54,6 +54,7 @@ _supported_os Linux _require_scratch _require_acls +_require_user echo "*** create filesystem" From sandeen@sandeen.net Wed Feb 17 13:11:16 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HJBFBD254215 for ; Wed, 17 Feb 2010 13:11:16 -0600 X-ASG-Debug-ID: 1266433947-745d03690000-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 0597C13B3D7A for ; Wed, 17 Feb 2010 11:12:27 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wrDdfGNZlzPsynlP for ; Wed, 17 Feb 2010 11:12:27 -0800 (PST) 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 o1HJCQV9007324 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 17 Feb 2010 14:12:26 -0500 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 o1HJCOtj032374 for ; Wed, 17 Feb 2010 14:12:25 -0500 Message-ID: <4B7C3F98.50303@sandeen.net> Date: Wed, 17 Feb 2010 13:12:24 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH] xfstests: mount xfs with a context when selinux is on Subject: [PATCH] xfstests: mount xfs with a context when selinux is on 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: 1266433954 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22792 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 selinux is on, we get tons of new xattrs, which messes up all kinds of output. The simplest way out of this, for now, seems to be to just mount with a global context instead and skip writing the extra xattrs. I've been using this internally on Fedora and RHEL for a while now. Signed-off-by: Eric Sandeen --- diff --git a/189 b/189 index 8f1c0e1..e91d5cd 100755 --- a/189 +++ b/189 @@ -45,7 +45,8 @@ _cleanup() _scratch_filter() { sed -e "s#$SCRATCH_DEV#SCRATCH_DEV#" \ - -e "s#$SCRATCH_MNT#SCRATCH_MNT#" + -e "s#$SCRATCH_MNT#SCRATCH_MNT#" \ + -e "s#,context.*s0\"##" } _check_mount() diff --git a/common.rc b/common.rc index c76bcde..ca2cd2c 100644 --- a/common.rc +++ b/common.rc @@ -47,8 +47,16 @@ _ls_l() _mount_opts() { + # SELinux adds extra xattrs which can mess up our expected output. + # So, mount with a context, and they won't be created + # nfs_t is a "liberal" context so we can use it. + if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then + SELINUX_MOUNT_OPTIONS="-o context=system_u:object_r:nfs_t:s0" + fi + case $FSTYP in xfs) + export SELINUX_MOUNT_OPTIONS export MOUNT_OPTIONS=$XFS_MOUNT_OPTIONS ;; udf) @@ -214,7 +222,7 @@ _scratch_mount_options() { _scratch_options mount - echo $SCRATCH_OPTIONS $MOUNT_OPTIONS $* $SCRATCH_DEV $SCRATCH_MNT + echo $SCRATCH_OPTIONS $MOUNT_OPTIONS $SELINUX_MOUNT_OPTIONS $* $SCRATCH_DEV $SCRATCH_MNT } _scratch_mount() @@ -236,7 +244,7 @@ _scratch_remount() _test_mount() { _test_options mount - _mount -t $FSTYP $TEST_OPTIONS $TEST_FS_MOUNT_OPTS $* $TEST_DEV $TEST_DIR + _mount -t $FSTYP $TEST_OPTIONS $TEST_FS_MOUNT_OPTS $SELINUX_MOUNT_OPTIONS $* $TEST_DEV $TEST_DIR } _scratch_mkfs_options() From BATV+f0e3f32b8d1f4c7fe1fa+2369+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 17 13:28:23 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HJSLJW255077 for ; Wed, 17 Feb 2010 13:28:23 -0600 X-ASG-Debug-ID: 1266434979-3b2c002d0000-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 3F9501DA64A for ; Wed, 17 Feb 2010 11:29:39 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 24GL81T2I6wXiBD3 for ; Wed, 17 Feb 2010 11:29:39 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nhpac-0004fw-3K; Wed, 17 Feb 2010 19:29:38 +0000 Date: Wed, 17 Feb 2010 14:29:38 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: Non-blocking inode locking in IO completion Subject: Re: [PATCH] xfs: Non-blocking inode locking in IO completion Message-ID: <20100217192938.GA14015@infradead.org> References: <1266384989-28928-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1266384989-28928-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: 1266434980 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, Feb 17, 2010 at 04:36:29PM +1100, Dave Chinner wrote: > The introduction of barriers to DM loop devices (e.g. dm-crypt) has > created a new IO order completion dependency that XFS does not > handle. That is, the completion of log IOs (which have barriers) in > the loop filesystem are now dependent on completion of data IO in > the backing filesystem. I don't think dm belongs into the picture here at all. The problem is simply with the loop device, which sits below dm-crypt in the bugzilla reports. The loop device in SuSE (and for a short time in mainline until we saw unexplainable XFS lockups) implements barriers using fsync. Now that fsync turns a log I/O that issues a barrier in the XFS filesystem inside the loop device into a data I/O the backing filesystem. With this the rest of your description applies again. The patch looks good to me - while I hate introducing random delay() calls I don't really see a way around this. Reviewed-by: Christoph Hellwig From BATV+f0e3f32b8d1f4c7fe1fa+2369+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 17 13:28:34 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HJSYTu255095 for ; Wed, 17 Feb 2010 13:28:34 -0600 X-ASG-Debug-ID: 1266434993-2a2001470000-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 6B8201DA64D for ; Wed, 17 Feb 2010 11:29:53 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id mNaw0mbyYpE0FQMk for ; Wed, 17 Feb 2010 11:29:53 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nhpaq-0004m1-OL; Wed, 17 Feb 2010 19:29:52 +0000 Date: Wed, 17 Feb 2010 14:29:52 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: 077 should require fsgqa user Subject: Re: [PATCH] xfstests: 077 should require fsgqa user Message-ID: <20100217192952.GB14015@infradead.org> References: <4B7C2397.90406@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B7C2397.90406@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: 1266434993 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 From BATV+f0e3f32b8d1f4c7fe1fa+2369+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 17 13:33:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HJXdbZ255379 for ; Wed, 17 Feb 2010 13:33:40 -0600 X-ASG-Debug-ID: 1266435298-445100c50000-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 90CF813B4276 for ; Wed, 17 Feb 2010 11:34:58 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id XJMhgCj3zlCWsRL8 for ; Wed, 17 Feb 2010 11:34:58 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nhpfm-0005hF-0L for xfs@oss.sgi.com; Wed, 17 Feb 2010 19:34:58 +0000 Date: Wed, 17 Feb 2010 14:34:57 -0500 From: Christoph Hellwig , Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: fix inode pincount check in fsync Subject: [PATCH] xfs: fix inode pincount check in fsync Message-ID: <20100217193457.GA21840@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) Sender: Christoph Hellwig 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: 1266435298 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 We need to hold the ilock to check the inode pincount safely. While we're at it also remove the check for ip->i_itemp->ili_last_lsn, a pinned inode always has it set. 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-02-17 10:46:24.440003402 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-02-17 10:47:25.499028406 +0100 @@ -180,17 +180,12 @@ xfs_file_fsync( * disk yet, the inode will be still be pinned. If it is, * force the log. */ - xfs_iunlock(ip, XFS_ILOCK_SHARED); if (xfs_ipincount(ip)) { - if (ip->i_itemp->ili_last_lsn) { - error = _xfs_log_force_lsn(ip->i_mount, - ip->i_itemp->ili_last_lsn, - XFS_LOG_SYNC, &log_flushed); - } else { - error = _xfs_log_force(ip->i_mount, - XFS_LOG_SYNC, &log_flushed); - } + error = _xfs_log_force_lsn(ip->i_mount, + ip->i_itemp->ili_last_lsn, + XFS_LOG_SYNC, &log_flushed); } + xfs_iunlock(ip, XFS_ILOCK_SHARED); } if (ip->i_mount->m_flags & XFS_MOUNT_BARRIER) { From BATV+f0e3f32b8d1f4c7fe1fa+2369+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 17 13:34:55 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HJYtdk255596 for ; Wed, 17 Feb 2010 13:34:55 -0600 X-ASG-Debug-ID: 1266435373-2a3f02710000-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 0A0BB1CDAB0B for ; Wed, 17 Feb 2010 11:36:13 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id UIFGbBfwHhsGRwMe for ; Wed, 17 Feb 2010 11:36:13 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nhpgz-0006KH-9M for xfs@oss.sgi.com; Wed, 17 Feb 2010 19:36:13 +0000 Date: Wed, 17 Feb 2010 14:36:13 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: kill xfs_lrw.h Subject: [PATCH] xfs: kill xfs_lrw.h Message-ID: <20100217193613.GB21840@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: 1266435374 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 Move the two declarations to better fitting headers now that xfs_lrw.c is gone. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_linux.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_linux.h 2010-02-17 11:02:16.540004170 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_linux.h 2010-02-17 11:02:27.898006405 +0100 @@ -88,7 +88,6 @@ #include #include #include -#include #include /* Index: xfs/fs/xfs/linux-2.6/xfs_lrw.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_lrw.h 2010-02-17 11:01:12.235003823 +0100 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +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 - */ -#ifndef __XFS_LRW_H__ -#define __XFS_LRW_H__ - -struct xfs_mount; -struct xfs_inode; -struct xfs_buf; - -extern int xfs_dev_is_read_only(struct xfs_mount *, char *); - -extern int xfs_zero_eof(struct xfs_inode *, xfs_off_t, xfs_fsize_t); - -#endif /* __XFS_LRW_H__ */ Index: xfs/fs/xfs/xfs_mount.h =================================================================== --- xfs.orig/fs/xfs/xfs_mount.h 2010-02-17 11:01:12.247003962 +0100 +++ xfs/fs/xfs/xfs_mount.h 2010-02-17 11:01:26.692256092 +0100 @@ -436,6 +436,8 @@ extern void xfs_freesb(xfs_mount_t *); extern int xfs_fs_writable(xfs_mount_t *); extern int xfs_sb_validate_fsb_count(struct xfs_sb *, __uint64_t); +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 *); Index: xfs/fs/xfs/xfs_vnodeops.h =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.h 2010-02-17 11:01:52.290253576 +0100 +++ xfs/fs/xfs/xfs_vnodeops.h 2010-02-17 11:02:04.977005288 +0100 @@ -59,4 +59,6 @@ int xfs_flush_pages(struct xfs_inode *ip xfs_off_t last, uint64_t flags, int fiopt); int xfs_wait_on_pages(struct xfs_inode *ip, xfs_off_t first, xfs_off_t last); +int xfs_zero_eof(struct xfs_inode *, xfs_off_t, xfs_fsize_t); + #endif /* _XFS_VNODEOPS_H */ From BATV+f0e3f32b8d1f4c7fe1fa+2369+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 17 13:36:05 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HJa4Ob255664 for ; Wed, 17 Feb 2010 13:36:04 -0600 X-ASG-Debug-ID: 1266435443-3b3000600000-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 79B511DA6B3 for ; Wed, 17 Feb 2010 11:37:23 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 22BTaFhP3GWTCR4i for ; Wed, 17 Feb 2010 11:37:23 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nhpi3-0006Oa-U5; Wed, 17 Feb 2010 19:37:19 +0000 Date: Wed, 17 Feb 2010 14:37:19 -0500 From: Christoph Hellwig To: Jan Kara Cc: Christoph Hellwig , swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 00/10] quotactl fixed and cleanups Subject: Re: [PATCH 00/10] quotactl fixed and cleanups Message-ID: <20100217193719.GC21840@infradead.org> References: <20100216084446.377980079@bombadil.infradead.org> <20100216183627.GC3153@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100216183627.GC3153@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: 1266435443 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, Feb 16, 2010 at 07:36:28PM +0100, Jan Kara wrote: > Thanks for the cleanups. Upto a few fixed typos and whitespace errors > I've merged your patchset into my tree. Where is your tree located? I can't find anything with these patches on git.kernel.org. From BATV+f0e3f32b8d1f4c7fe1fa+2369+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 17 13:42:38 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HJgb6E255999 for ; Wed, 17 Feb 2010 13:42:38 -0600 X-ASG-Debug-ID: 1266435836-0f1e036b0000-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 B88B31DA838 for ; Wed, 17 Feb 2010 11:43:56 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id dpKmhI0vBSZs3TxM for ; Wed, 17 Feb 2010 11:43:56 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NhpoS-0007W6-Et for xfs@oss.sgi.com; Wed, 17 Feb 2010 19:43:56 +0000 Date: Wed, 17 Feb 2010 14:43:56 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/2] xfs: cleanup xfs_iunpin_wait/xfs_iunpin_nowait Subject: [PATCH 1/2] xfs: cleanup xfs_iunpin_wait/xfs_iunpin_nowait Message-ID: <20100217194356.GA28758@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: 1266435836 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 Remove the inode item pointer and ili_last_lsn checks in __xfs_iunpin_wait as any pinned inode is guaranteed to have them valid. After this the xfs_iunpin_nowait case is nothing more than a xfs_log_force_lsn, as we know that the caller has already checked the pincount. Make xfs_iunpin_nowait the new low-level routine just doing the log force and rewrite xfs_iunpin_wait around it. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-02-17 10:47:39.141254207 +0100 +++ xfs/fs/xfs/xfs_inode.c 2010-02-17 10:55:24.505255043 +0100 @@ -2467,47 +2467,31 @@ xfs_iunpin( } /* - * This is called to unpin an inode. It can be directed to wait or to return - * immediately without waiting for the inode to be unpinned. The caller must - * have the inode locked in at least shared mode so that the buffer cannot be - * subsequently pinned once someone is waiting for it to be unpinned. + * This is called to unpin an inode. The caller must have the inode locked + * in at least shared mode so that the buffer cannot be subsequently pinned + * once someone is waiting for it to be unpinned. */ -STATIC void -__xfs_iunpin_wait( - xfs_inode_t *ip, - int wait) +static void +xfs_iunpin_nowait( + struct xfs_inode *ip) { - xfs_inode_log_item_t *iip = ip->i_itemp; - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); - if (atomic_read(&ip->i_pincount) == 0) - return; /* Give the log a push to start the unpinning I/O */ - if (iip && iip->ili_last_lsn) - xfs_log_force_lsn(ip->i_mount, iip->ili_last_lsn, 0); - else - xfs_log_force(ip->i_mount, 0); + xfs_log_force_lsn(ip->i_mount, ip->i_itemp->ili_last_lsn, 0); - if (wait) - wait_event(ip->i_ipin_wait, (atomic_read(&ip->i_pincount) == 0)); } void xfs_iunpin_wait( - xfs_inode_t *ip) + struct xfs_inode *ip) { - __xfs_iunpin_wait(ip, 1); -} - -static inline void -xfs_iunpin_nowait( - xfs_inode_t *ip) -{ - __xfs_iunpin_wait(ip, 0); + if (xfs_ipincount(ip)) { + xfs_iunpin_nowait(ip); + wait_event(ip->i_ipin_wait, (xfs_ipincount(ip) == 0)); + } } - /* * xfs_iextents_copy() * From BATV+f0e3f32b8d1f4c7fe1fa+2369+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 17 13:42:50 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HJgnVo256020 for ; Wed, 17 Feb 2010 13:42:49 -0600 X-ASG-Debug-ID: 1266435847-412e013b0000-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 559CE13B40D9 for ; Wed, 17 Feb 2010 11:44:08 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id EhfSDjDZTgjTat9I for ; Wed, 17 Feb 2010 11:44:08 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Nhpod-0007X4-Qm for xfs@oss.sgi.com; Wed, 17 Feb 2010 19:44:07 +0000 Date: Wed, 17 Feb 2010 14:44:07 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/2] xfs: remove xfs_ipin/xfs_iunpin Subject: [PATCH 2/2] xfs: remove xfs_ipin/xfs_iunpin Message-ID: <20100217194407.GB28758@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: 1266435848 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 Inodes are only pinned/unpinned via the inode item methods, and lots of code relies on that fact. So remove the separate xfs_ipin/xfs_iunpin helpers and merge them into their only callers. This also fixes up various duplicate and/or incorrect comments. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-02-17 10:56:31.726003891 +0100 +++ xfs/fs/xfs/xfs_inode.c 2010-02-17 11:00:21.126005288 +0100 @@ -2439,34 +2439,6 @@ xfs_idestroy_fork( } /* - * Increment the pin count of the given buffer. - * This value is protected by ipinlock spinlock in the mount structure. - */ -void -xfs_ipin( - xfs_inode_t *ip) -{ - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - - atomic_inc(&ip->i_pincount); -} - -/* - * Decrement the pin count of the given inode, and wake up - * anyone in xfs_iwait_unpin() if the count goes to 0. The - * inode must have been previously pinned with a call to xfs_ipin(). - */ -void -xfs_iunpin( - xfs_inode_t *ip) -{ - ASSERT(atomic_read(&ip->i_pincount) > 0); - - if (atomic_dec_and_test(&ip->i_pincount)) - wake_up(&ip->i_ipin_wait); -} - -/* * This is called to unpin an inode. The caller must have the inode locked * in at least shared mode so that the buffer cannot be subsequently pinned * once someone is waiting for it to be unpinned. Index: xfs/fs/xfs/xfs_inode.h =================================================================== --- xfs.orig/fs/xfs/xfs_inode.h 2010-02-17 10:56:31.740273062 +0100 +++ xfs/fs/xfs/xfs_inode.h 2010-02-17 11:00:00.410005428 +0100 @@ -471,8 +471,6 @@ int xfs_itruncate_finish(struct xfs_tra int xfs_iunlink(struct xfs_trans *, xfs_inode_t *); void xfs_iext_realloc(xfs_inode_t *, int, int); -void xfs_ipin(xfs_inode_t *); -void xfs_iunpin(xfs_inode_t *); void xfs_iunpin_wait(xfs_inode_t *); int xfs_iflush(xfs_inode_t *, uint); void xfs_ichgtime(xfs_inode_t *, int); Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-02-17 10:56:31.713003821 +0100 +++ xfs/fs/xfs/xfs_inode_item.c 2010-02-17 10:59:38.341005499 +0100 @@ -535,23 +535,23 @@ xfs_inode_item_format( /* * This is called to pin the inode associated with the inode log - * item in memory so it cannot be written out. Do this by calling - * xfs_ipin() to bump the pin count in the inode while holding the - * inode pin lock. + * item in memory so it cannot be written out. */ STATIC void xfs_inode_item_pin( xfs_inode_log_item_t *iip) { ASSERT(xfs_isilocked(iip->ili_inode, XFS_ILOCK_EXCL)); - xfs_ipin(iip->ili_inode); + + atomic_inc(&iip->ili_inode->i_pincount); } /* * This is called to unpin the inode associated with the inode log * item which was previously pinned with a call to xfs_inode_item_pin(). - * Just call xfs_iunpin() on the inode to do this. + * + * Also wake up anyone in xfs_iunpin_wait() if the count goes to 0. */ /* ARGSUSED */ STATIC void @@ -559,7 +559,11 @@ xfs_inode_item_unpin( xfs_inode_log_item_t *iip, int stale) { - xfs_iunpin(iip->ili_inode); + struct xfs_inode *ip = iip->ili_inode; + + ASSERT(atomic_read(&->i_pincount) > 0); + if (atomic_dec_and_test(&ip->i_pincount)) + wake_up(&ip->i_ipin_wait); } /* ARGSUSED */ @@ -568,7 +572,7 @@ xfs_inode_item_unpin_remove( xfs_inode_log_item_t *iip, xfs_trans_t *tp) { - xfs_iunpin(iip->ili_inode); + xfs_inode_item_unpin(iip, 0); } /* From bpm@sgi.com Wed Feb 17 14:03:51 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HK3oD8257198 for ; Wed, 17 Feb 2010 14:03:50 -0600 Received: from snoot.americas.sgi.com (case.americas.sgi.com [128.162.244.182]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9C0E88F8071; Wed, 17 Feb 2010 12:05:06 -0800 (PST) Received: from [127.0.0.2] (localhost [127.0.0.1]) by snoot.americas.sgi.com (Postfix) with ESMTP id ECD34491986C; Wed, 17 Feb 2010 14:05:05 -0600 (CST) Subject: [PATCH 0/2] commit_metadata export operation v6 To: bfields@fieldses.org From: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com Date: Wed, 17 Feb 2010 14:05:05 -0600 Message-ID: <20100217200426.13409.32688.stgit@case> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 Hey Bruce, Here is the latest version of the knfsd sync changes. I have addressed the suggestions provided by Christoph, Trond, Dave, and Alex. In this latest version I have fixed up the few nits in the nfsd patch that Christoph pointed out yesterday. I also have simplified the xfs patch as suggested by Dave. Thanks, Ben --- Ben Myers (2): commit_metadata export operation replacing nfsd_sync_dir xfs_export_operations.commit_metadata fs/nfsd/nfs4recover.c | 4 -- fs/nfsd/vfs.c | 106 ++++++++++++++++++++--------------------- fs/xfs/linux-2.6/xfs_export.c | 20 ++++++++ include/linux/exportfs.h | 5 ++ 4 files changed, 78 insertions(+), 57 deletions(-) -- Signature From bpm@sgi.com Wed Feb 17 14:03:56 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HK3uYQ257206 for ; Wed, 17 Feb 2010 14:03:56 -0600 Received: from snoot.americas.sgi.com (case.americas.sgi.com [128.162.244.182]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5A09AC004; Wed, 17 Feb 2010 12:05:11 -0800 (PST) Received: from [127.0.0.2] (localhost [127.0.0.1]) by snoot.americas.sgi.com (Postfix) with ESMTP id 104D3491986C; Wed, 17 Feb 2010 14:05:11 -0600 (CST) Subject: [PATCH 1/2] commit_metadata export operation replacing nfsd_sync_dir To: bfields@fieldses.org From: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com Date: Wed, 17 Feb 2010 14:05:11 -0600 Message-ID: <20100217200511.13409.75530.stgit@case> In-Reply-To: <20100217200426.13409.32688.stgit@case> References: <20100217200426.13409.32688.stgit@case> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 - Add commit_metadata export_operation to allow the underlying filesystem to decide how to commit an inode most efficiently. - Usage of nfsd_sync_dir and write_inode_now has been replaced with the commit_metadata function that takes a svc_fh. - The commit_metadata function calls the commit_metadata export_op if it's there, or else falls back to sync_inode instead of fsync and write_inode_now because only metadata need be synced here. - nfsd4_sync_rec_dir now uses vfs_fsync so that commit_metadata can be static Signed-off-by: Ben Myers --- fs/nfsd/nfs4recover.c | 4 -- fs/nfsd/vfs.c | 106 +++++++++++++++++++++++----------------------- include/linux/exportfs.h | 5 ++ 3 files changed, 58 insertions(+), 57 deletions(-) diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index 5a754f7..98fb98e 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c @@ -119,9 +119,7 @@ out_no_tfm: static void nfsd4_sync_rec_dir(void) { - mutex_lock(&rec_dir.dentry->d_inode->i_mutex); - nfsd_sync_dir(rec_dir.dentry); - mutex_unlock(&rec_dir.dentry->d_inode->i_mutex); + vfs_fsync(NULL, rec_dir.dentry, 0); } int diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index ed024d3..8afdba5 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include #ifdef CONFIG_NFSD_V3 #include "xdr3.h" @@ -271,6 +273,32 @@ out: return err; } +/* + * Commit metadata changes to stable storage. + */ +static int +commit_metadata(struct svc_fh *fhp) +{ + struct inode *inode = fhp->fh_dentry->d_inode; + const struct export_operations *export_ops = inode->i_sb->s_export_op; + int error = 0; + + if (!EX_ISSYNC(fhp->fh_export)) + return 0; + + if (export_ops->commit_metadata) { + error = export_ops->commit_metadata(inode); + } else { + struct writeback_control wbc = { + .sync_mode = WB_SYNC_ALL, + .nr_to_write = 0, /* metadata only */ + }; + + error = sync_inode(inode, &wbc); + } + + return error; +} /* * Set various file attributes. @@ -769,28 +797,6 @@ nfsd_close(struct file *filp) } /* - * Sync a directory to disk. - * - * We can't just call vfs_fsync because our requirements are slightly odd: - * - * a) we do not have a file struct available - * b) we expect to have i_mutex already held by the caller - */ -int -nfsd_sync_dir(struct dentry *dentry) -{ - struct inode *inode = dentry->d_inode; - int error; - - WARN_ON(!mutex_is_locked(&inode->i_mutex)); - - error = filemap_write_and_wait(inode->i_mapping); - if (!error && inode->i_fop->fsync) - error = inode->i_fop->fsync(NULL, dentry, 0); - return error; -} - -/* * Obtain the readahead parameters for the file * specified by (dev, ino). */ @@ -1331,12 +1337,14 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, goto out_nfserr; } - if (EX_ISSYNC(fhp->fh_export)) { - err = nfserrno(nfsd_sync_dir(dentry)); - write_inode_now(dchild->d_inode, 1); - } + err = nfsd_create_setattr(rqstp, resfhp, iap); - err2 = nfsd_create_setattr(rqstp, resfhp, iap); + /* + * nfsd_setattr already committed the child. Transactional filesystems + * had a chance to commit changes for both parent and child + * simultaneously making the following commit_metadata a noop. + */ + err2 = nfserrno(commit_metadata(fhp)); if (err2) err = err2; mnt_drop_write(fhp->fh_export->ex_path.mnt); @@ -1368,7 +1376,6 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, struct dentry *dentry, *dchild = NULL; struct inode *dirp; __be32 err; - __be32 err2; int host_err; __u32 v_mtime=0, v_atime=0; @@ -1463,11 +1470,6 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, if (created) *created = 1; - if (EX_ISSYNC(fhp->fh_export)) { - err = nfserrno(nfsd_sync_dir(dentry)); - /* setattr will sync the child (or not) */ - } - nfsd_check_ignore_resizing(iap); if (createmode == NFS3_CREATE_EXCLUSIVE) { @@ -1482,9 +1484,13 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, } set_attr: - err2 = nfsd_create_setattr(rqstp, resfhp, iap); - if (err2) - err = err2; + err = nfsd_create_setattr(rqstp, resfhp, iap); + + /* + * nfsd_setattr already committed the child (and possibly also the parent). + */ + if (!err) + err = nfserrno(commit_metadata(fhp)); mnt_drop_write(fhp->fh_export->ex_path.mnt); /* @@ -1599,12 +1605,9 @@ nfsd_symlink(struct svc_rqst *rqstp, struct svc_fh *fhp, } } else host_err = vfs_symlink(dentry->d_inode, dnew, path); - - if (!host_err) { - if (EX_ISSYNC(fhp->fh_export)) - host_err = nfsd_sync_dir(dentry); - } err = nfserrno(host_err); + if (!err) + err = nfserrno(commit_metadata(fhp)); fh_unlock(fhp); mnt_drop_write(fhp->fh_export->ex_path.mnt); @@ -1666,11 +1669,9 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp, } host_err = vfs_link(dold, dirp, dnew); if (!host_err) { - if (EX_ISSYNC(ffhp->fh_export)) { - err = nfserrno(nfsd_sync_dir(ddir)); - write_inode_now(dest, 1); - } - err = 0; + err = nfserrno(commit_metadata(ffhp)); + if (!err) + err = nfserrno(commit_metadata(tfhp)); } else { if (host_err == -EXDEV && rqstp->rq_vers == 2) err = nfserr_acces; @@ -1766,10 +1767,10 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen, goto out_dput_new; host_err = vfs_rename(fdir, odentry, tdir, ndentry); - if (!host_err && EX_ISSYNC(tfhp->fh_export)) { - host_err = nfsd_sync_dir(tdentry); + if (!host_err) { + host_err = commit_metadata(tfhp); if (!host_err) - host_err = nfsd_sync_dir(fdentry); + host_err = commit_metadata(ffhp); } mnt_drop_write(ffhp->fh_export->ex_path.mnt); @@ -1850,12 +1851,9 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, dput(rdentry); - if (host_err) - goto out_drop; - if (EX_ISSYNC(fhp->fh_export)) - host_err = nfsd_sync_dir(dentry); + if (!host_err) + host_err = commit_metadata(fhp); -out_drop: mnt_drop_write(fhp->fh_export->ex_path.mnt); out_nfserr: err = nfserrno(host_err); diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index dc12f41..a9cd507 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -96,6 +96,7 @@ struct fid { * @fh_to_parent: find the implied object's parent and get a dentry for it * @get_name: find the name for a given inode in a given directory * @get_parent: find the parent of a given directory + * @commit_metadata: commit metadata changes to stable storage * * See Documentation/filesystems/nfs/Exporting for details on how to use * this interface correctly. @@ -137,6 +138,9 @@ struct fid { * is also a directory. In the event that it cannot be found, or storage * space cannot be allocated, a %ERR_PTR should be returned. * + * commit_metadata: + * @commit_metadata should commit metadata changes to stable storage. + * * Locking rules: * get_parent is called with child->d_inode->i_mutex down * get_name is not (which is possibly inconsistent) @@ -152,6 +156,7 @@ struct export_operations { int (*get_name)(struct dentry *parent, char *name, struct dentry *child); struct dentry * (*get_parent)(struct dentry *child); + int (*commit_metadata)(struct inode *inode); }; extern int exportfs_encode_fh(struct dentry *dentry, struct fid *fid, From bpm@sgi.com Wed Feb 17 14:04:00 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HK40Dv257241 for ; Wed, 17 Feb 2010 14:04:00 -0600 Received: from snoot.americas.sgi.com (case.americas.sgi.com [128.162.244.182]) by relay2.corp.sgi.com (Postfix) with ESMTP id A2FB630408E; Wed, 17 Feb 2010 12:05:16 -0800 (PST) Received: from [127.0.0.2] (localhost [127.0.0.1]) by snoot.americas.sgi.com (Postfix) with ESMTP id 2D90D491986C; Wed, 17 Feb 2010 14:05:16 -0600 (CST) Subject: [PATCH 2/2] xfs_export_operations.commit_metadata To: bfields@fieldses.org From: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com Date: Wed, 17 Feb 2010 14:05:16 -0600 Message-ID: <20100217200516.13409.97524.stgit@case> In-Reply-To: <20100217200426.13409.32688.stgit@case> References: <20100217200426.13409.32688.stgit@case> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 This is the commit_metadata export operation for XFS. - Takes one inode to be committed. - Forces the log up to the lsn of the inode. - Doesn't force the log if the inode doesn't have a pincount. Signed-off-by: Ben Myers Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_export.c | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index 87b8cbd..8615d99 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c @@ -29,6 +29,7 @@ #include "xfs_vnodeops.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" +#include "xfs_inode_item.h" /* * Note that we only accept fileids which are long enough rather than allow @@ -215,9 +216,28 @@ xfs_fs_get_parent( return d_obtain_alias(VFS_I(cip)); } +STATIC int +xfs_fs_nfs_commit_metadata( + struct inode *inode) +{ + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + int error = 0; + + xfs_ilock(ip, XFS_ILOCK_SHARED); + if (xfs_ipincount(ip)) { + error = _xfs_log_force(mp, ip->i_itemp->ili_last_lsn, + XFS_LOG_FORCE | XFS_LOG_SYNC, NULL); + } + xfs_iunlock(ip, XFS_ILOCK_SHARED); + + return error; +} + const struct export_operations xfs_export_operations = { .encode_fh = xfs_fs_encode_fh, .fh_to_dentry = xfs_fs_fh_to_dentry, .fh_to_parent = xfs_fs_fh_to_parent, .get_parent = xfs_fs_get_parent, + .commit_metadata = xfs_fs_nfs_commit_metadata, }; From sandeen@sandeen.net Wed Feb 17 14:28:23 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HKSMxK258959 for ; Wed, 17 Feb 2010 14:28:23 -0600 X-ASG-Debug-ID: 1266438580-412402d40000-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 68A5E13B46ED for ; Wed, 17 Feb 2010 12:29:41 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Ui1r4HekrWWY3Aur for ; Wed, 17 Feb 2010 12:29:41 -0800 (PST) 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 o1HKTehs011639 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 17 Feb 2010 15:29:40 -0500 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 o1HKTc6c022692 for ; Wed, 17 Feb 2010 15:29:39 -0500 Message-ID: <4B7C51B2.9080908@sandeen.net> Date: Wed, 17 Feb 2010 14:29:38 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH] xfstests: don't delete scratch loop device w/ umount -d Subject: [PATCH] xfstests: don't delete scratch loop device w/ umount -d 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: 1266438581 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22795 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 Recent fixes to 073 added umount -d, but if we happen to be using a scratch device on loopback, subsequent tests get very, very unhappy when their loopback block device goes away! Signed-off-by: Eric Sandeen --- diff --git a/073 b/073 index 90fa1f0..7ce6efb 100755 --- a/073 +++ b/073 @@ -119,7 +119,8 @@ _verify_copy() diff -u $tmp.geometry1 $tmp.geometry2 echo unmounting and removing new image - umount -d $source_dir $target_dir + umount $source_dir + umount -d $target_dir rm -f $target } From SRS0+8qpr+77+fromorbit.com=david@internode.on.net Wed Feb 17 15:11:59 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HLBwxt261909 for ; Wed, 17 Feb 2010 15:11:58 -0600 X-ASG-Debug-ID: 1266441195-4fcb01f00000-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 D247E1DAC0F for ; Wed, 17 Feb 2010 13:13:15 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id m8pTAJH0o0kmflj2 for ; Wed, 17 Feb 2010 13:13:15 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14104059-1927428 for multiple; Thu, 18 Feb 2010 07:43:14 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NhrCq-0002xu-MY; Thu, 18 Feb 2010 08:13:12 +1100 Date: Thu, 18 Feb 2010 08:13:12 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: Non-blocking inode locking in IO completion Subject: Re: [PATCH] xfs: Non-blocking inode locking in IO completion Message-ID: <20100217211312.GQ28392@discord.disaster> References: <1266384989-28928-1-git-send-email-david@fromorbit.com> <20100217192938.GA14015@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217192938.GA14015@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1266441196 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22797 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, Feb 17, 2010 at 02:29:38PM -0500, Christoph Hellwig wrote: > On Wed, Feb 17, 2010 at 04:36:29PM +1100, Dave Chinner wrote: > > The introduction of barriers to DM loop devices (e.g. dm-crypt) has > > created a new IO order completion dependency that XFS does not > > handle. That is, the completion of log IOs (which have barriers) in > > the loop filesystem are now dependent on completion of data IO in > > the backing filesystem. > > I don't think dm belongs into the picture here at all. The problem > is simply with the loop device, which sits below dm-crypt in the > bugzilla reports. The loop device in SuSE (and for a short time in > mainline until we saw unexplainable XFS lockups) implements barriers > using fsync. Now that fsync turns a log I/O that issues a barrier > in the XFS filesystem inside the loop device into a data I/O the > backing filesystem. With this the rest of your description applies > again. Fair point. I'll change the description to be more accurate. > The patch looks good to me - while I hate introducing random delay() > calls I don't really see a way around this. I thought about using queue_delayed_work(), but then the change became much bigger and has other side effects like increasing the size of the ioend structure. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+ffTR+77+fromorbit.com=david@internode.on.net Wed Feb 17 16:39:56 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HMdu7B004915 for ; Wed, 17 Feb 2010 16:39:56 -0600 X-ASG-Debug-ID: 1266446471-547d00ec0000-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 B691C1DB260 for ; Wed, 17 Feb 2010 14:41:11 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id 2tWFX0EQtBQFoeka for ; Wed, 17 Feb 2010 14:41:11 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14230456-1927428 for multiple; Thu, 18 Feb 2010 09:11:10 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NhsZw-00034c-6c; Thu, 18 Feb 2010 09:41:08 +1100 Date: Thu, 18 Feb 2010 09:41:08 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/4] [PATCH 2/4] xfs: remove wrappers for read/write file operations Subject: Re: [PATCH 2/4] [PATCH 2/4] xfs: remove wrappers for read/write file operations Message-ID: <20100217224108.GS28392@discord.disaster> References: <20100215094445.528696829@bombadil.infradead.org> <20100215094604.318261333@bombadil.infradead.org> <20100217035511.GJ28392@discord.disaster> <20100217083105.GB19943@infradead.org> <20100217211355.GR28392@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217211355.GR28392@discord.disaster> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1266446474 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22802 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, Feb 18, 2010 at 08:13:55AM +1100, Dave Chinner wrote: > On Wed, Feb 17, 2010 at 03:31:06AM -0500, Christoph Hellwig wrote: > > On Wed, Feb 17, 2010 at 02:55:11PM +1100, Dave Chinner wrote: > > > You've changed a local variable "pos" which had the value > > > iocb->ki_pos to a function parameter of the same name which has a > > > different value. Given this, all the existing uses of "pos" in this > > > function need to be converted to "iocb->ki_pos" as the old > > > xfs_write() never saw the original "pos" variable passed to > > > xfs_file_aio_write(). > > > > Oh, I should have explained this in more detail. The aio_read/aio_write > > ABI both has a pos argument and the file position in iocb->ki_pos. > > They were added for allowing aio that does partial I/O in each method > > call using retries, but we don't actually use the anywhere. Thus these > > two are always these same and we even enforce that with a > > > > BUG_ON(iocb->ki_pos != pos); > > > > in the code (both old and new). Now how does the old pos local variable > > come in play? The old code didn't want to pass the kiocb to the > > low-level xfs-write function, but as want the offset it passes a pointer > > to iocb->ki_pos, which is called offset. We take a local copy of it > > before we might start modifying it, which we call pos. pos gets updated > > early in generic_write_checks if this is an O_APPEND write, but > > otherwise stays immutable and marks the position where this write > > started, while iocb->ki_pos (aka the old offset) gets updated by > > generic_file_direct_write / generic_file_buffered_write to the new > > file position after the I/O was done. > > Ok, my misunderstanding. I'll go back and review it again with this > in mind. It looks ok having taken this into account. I think I originally read the BUG_ON(iocb->ki_pos != pos) as meaning the two values were not equivalent because that is what an ASSERT(iocb->ki_pos != pos) would mean. Anyway: Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+ffTR+77+fromorbit.com=david@internode.on.net Wed Feb 17 16:52:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HMqVUJ005652 for ; Wed, 17 Feb 2010 16:52:31 -0600 X-ASG-Debug-ID: 1266447228-5893025d0000-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 519E51CDB5EE for ; Wed, 17 Feb 2010 14:53:48 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id tr5oXY2Fj8XjCIRw for ; Wed, 17 Feb 2010 14:53:48 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14232138-1927428 for multiple; Thu, 18 Feb 2010 09:23:47 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Nhsm9-000367-DU; Thu, 18 Feb 2010 09:53:45 +1100 Date: Thu, 18 Feb 2010 09:53:45 +1100 From: Dave Chinner To: Christoph Hellwig , Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: fix inode pincount check in fsync Subject: Re: [PATCH] xfs: fix inode pincount check in fsync Message-ID: <20100217225345.GT28392@discord.disaster> References: <20100217193457.GA21840@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217193457.GA21840@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1266447230 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22803 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, Feb 17, 2010 at 02:34:57PM -0500, Christoph Hellwig wrote: > We need to hold the ilock to check the inode pincount safely. While > we're at it also remove the check for ip->i_itemp->ili_last_lsn, a > pinned inode always has it set. > > Signed-off-by: Christoph Hellwig Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+8qpr+77+fromorbit.com=david@internode.on.net Wed Feb 17 16:54:15 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HMsEiv005750 for ; Wed, 17 Feb 2010 16:54:15 -0600 X-ASG-Debug-ID: 1266447331-7bb500120000-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 4944213B5077 for ; Wed, 17 Feb 2010 14:55:32 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id BGEqjJU2BGJLu5As for ; Wed, 17 Feb 2010 14:55:32 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14097364-1927428 for multiple; Thu, 18 Feb 2010 09:25:30 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Nhsnp-00036Q-JM; Thu, 18 Feb 2010 09:55:29 +1100 Date: Thu, 18 Feb 2010 09:55:29 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: kill xfs_lrw.h Subject: Re: [PATCH] xfs: kill xfs_lrw.h Message-ID: <20100217225529.GU28392@discord.disaster> References: <20100217193613.GB21840@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217193613.GB21840@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1266447333 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22802 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, Feb 17, 2010 at 02:36:13PM -0500, Christoph Hellwig wrote: > Move the two declarations to better fitting headers now that xfs_lrw.c > is gone. > > Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+8qpr+77+fromorbit.com=david@internode.on.net Wed Feb 17 16:56:02 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HMu1NZ005842 for ; Wed, 17 Feb 2010 16:56:02 -0600 X-ASG-Debug-ID: 1266447438-0a6e007f0000-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 A7A141CDB618 for ; Wed, 17 Feb 2010 14:57:19 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id 0o78sDY7tDYgrUoq for ; Wed, 17 Feb 2010 14:57:19 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14310945-1927428 for multiple; Thu, 18 Feb 2010 09:27:18 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NhspY-00036a-Se; Thu, 18 Feb 2010 09:57:16 +1100 Date: Thu, 18 Feb 2010 09:57:16 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: cleanup xfs_iunpin_wait/xfs_iunpin_nowait Subject: Re: [PATCH 1/2] xfs: cleanup xfs_iunpin_wait/xfs_iunpin_nowait Message-ID: <20100217225716.GV28392@discord.disaster> References: <20100217194356.GA28758@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217194356.GA28758@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1266447440 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22803 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, Feb 17, 2010 at 02:43:56PM -0500, Christoph Hellwig wrote: > Remove the inode item pointer and ili_last_lsn checks in __xfs_iunpin_wait > as any pinned inode is guaranteed to have them valid. After this the > xfs_iunpin_nowait case is nothing more than a xfs_log_force_lsn, as we > know that the caller has already checked the pincount. > > Make xfs_iunpin_nowait the new low-level routine just doing the log force > and rewrite xfs_iunpin_wait around it. > > > Signed-off-by: Christoph Hellwig Nice cleanup. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+8qpr+77+fromorbit.com=david@internode.on.net Wed Feb 17 17:02:43 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HN2gBN007101 for ; Wed, 17 Feb 2010 17:02:43 -0600 X-ASG-Debug-ID: 1266447839-4d6103260000-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 A0D4D13B52F1 for ; Wed, 17 Feb 2010 15:04:00 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id Kmue6O3xC68YtGop for ; Wed, 17 Feb 2010 15:04:00 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14098749-1927428 for multiple; Thu, 18 Feb 2010 09:33:59 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Nhsw2-00037A-CE; Thu, 18 Feb 2010 10:03:58 +1100 Date: Thu, 18 Feb 2010 10:03:58 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: mount xfs with a context when selinux is on Subject: Re: [PATCH] xfstests: mount xfs with a context when selinux is on Message-ID: <20100217230358.GX28392@discord.disaster> References: <4B7C3F98.50303@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B7C3F98.50303@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1266447841 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22802 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, Feb 17, 2010 at 01:12:24PM -0600, Eric Sandeen wrote: > When selinux is on, we get tons of new xattrs, which messes > up all kinds of output. > > The simplest way out of this, for now, seems to be to just mount > with a global context instead and skip writing the extra xattrs. > > I've been using this internally on Fedora and RHEL for a while now. > > Signed-off-by: Eric Sandeen I know very little about selinux, so while the code changes look OK I have no idea if the context change is All Goodness. > --- a/common.rc > +++ b/common.rc > @@ -47,8 +47,16 @@ _ls_l() > > _mount_opts() > { > + # SELinux adds extra xattrs which can mess up our expected output. > + # So, mount with a context, and they won't be created > + # nfs_t is a "liberal" context so we can use it. > + if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then > + SELINUX_MOUNT_OPTIONS="-o context=system_u:object_r:nfs_t:s0" > + fi > + i.e. is t_nfs a context specific to a RHEL/Fedora setup, or is it a generic context that other distro's also define? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+8qpr+77+fromorbit.com=david@internode.on.net Wed Feb 17 17:04:30 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HN4TQR007404 for ; Wed, 17 Feb 2010 17:04:29 -0600 X-ASG-Debug-ID: 1266447946-6f37018a0000-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 BEBE713B5116 for ; Wed, 17 Feb 2010 15:05:46 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id iawJDBdsAWqRFfuf for ; Wed, 17 Feb 2010 15:05:46 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14099091-1927428 for multiple; Thu, 18 Feb 2010 09:35:45 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Nhsxk-00037X-1q; Thu, 18 Feb 2010 10:05:44 +1100 Date: Thu, 18 Feb 2010 10:05:44 +1100 From: Dave Chinner To: Ben Myers Cc: bfields@fieldses.org, linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Subject: Re: [PATCH 2/2] xfs_export_operations.commit_metadata Message-ID: <20100217230544.GY28392@discord.disaster> References: <20100217200426.13409.32688.stgit@case> <20100217200516.13409.97524.stgit@case> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217200516.13409.97524.stgit@case> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1266447947 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22804 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, Feb 17, 2010 at 02:05:16PM -0600, Ben Myers wrote: > This is the commit_metadata export operation for XFS. > > - Takes one inode to be committed. > > - Forces the log up to the lsn of the inode. > > - Doesn't force the log if the inode doesn't have a pincount. > > Signed-off-by: Ben Myers > Reviewed-by: Christoph Hellwig Looks good, Ben. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From jack@suse.cz Wed Feb 17 17:32:46 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1HNWjx5008744 for ; Wed, 17 Feb 2010 17:32:46 -0600 X-ASG-Debug-ID: 1266449644-4bee03990000-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 EA01D1DB62B for ; Wed, 17 Feb 2010 15:34:04 -0800 (PST) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id FE9FnCJz090iVpRL for ; Wed, 17 Feb 2010 15:34:04 -0800 (PST) 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 679146CB00; Thu, 18 Feb 2010 00:34:03 +0100 (CET) Received: by quack.suse.cz (Postfix, from userid 10005) id 7B07C2B178C; Thu, 18 Feb 2010 00:34:12 +0100 (CET) Date: Thu, 18 Feb 2010 00:34:12 +0100 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 00/10] quotactl fixed and cleanups Subject: Re: [PATCH 00/10] quotactl fixed and cleanups Message-ID: <20100217233411.GB11632@quack.suse.cz> References: <20100216084446.377980079@bombadil.infradead.org> <20100216183627.GC3153@quack.suse.cz> <20100217193719.GC21840@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217193719.GC21840@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: 1266449644 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 17-02-10 14:37:19, Christoph Hellwig wrote: > On Tue, Feb 16, 2010 at 07:36:28PM +0100, Jan Kara wrote: > > Thanks for the cleanups. Upto a few fixed typos and whitespace errors > > I've merged your patchset into my tree. > > Where is your tree located? I can't find anything with these patches on > git.kernel.org. Oops, sorry, I forgot to push. It's at git.kernel.org/linux/kernel/git/jack/linux-fs-2.6.git for_next Honza -- Jan Kara SUSE Labs, CR From aluno3@poczta.onet.pl Thu Feb 18 02:06:14 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.2 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, HTML_MESSAGE,KB_DATE_CONTAINS_TAB,RCVD_IN_BRBL autolearn=no version=3.3.0-rupdated 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 o1I86DxC036206 for ; Thu, 18 Feb 2010 02:06:14 -0600 X-ASG-Debug-ID: 1266480448-29c2002d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtpout7.poczta.onet.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6662C13B623A for ; Thu, 18 Feb 2010 00:07:29 -0800 (PST) Received: from smtpout7.poczta.onet.pl (smtpout7.poczta.onet.pl [213.180.147.167]) by cuda.sgi.com with ESMTP id EgNpdoS0Fg3KzpDk for ; Thu, 18 Feb 2010 00:07:29 -0800 (PST) Received: from ip-83-238-22-2.netia.com.pl ([83.238.22.2]:46342 "EHLO [192.168.242.3]" rhost-flags-OK-FAIL-OK-FAIL) by ps3.m5r2.onet with ESMTPA id S134218505Ab0BRIH21tX7i (ORCPT ); Thu, 18 Feb 2010 09:07:28 +0100 Message-ID: <4B7CF542.6090501@poczta.onet.pl> Date: Thu, 18 Feb 2010 09:07:30 +0100 From: "aluno3@poczta.onet.pl" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20100111 Lightning/1.0b1 Thunderbird/3.0.1 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS problems with 2.6.27 Subject: Re: XFS problems with 2.6.27 References: <4B717CCD.3040008@poczta.onet.pl> In-Reply-To: <4B717CCD.3040008@poczta.onet.pl> X-Enigmail-Version: 1.0.1 Content-Type: multipart/alternative; boundary="------------010709070209000402040409" X-Barracuda-Connect: smtpout7.poczta.onet.pl[213.180.147.167] X-Barracuda-Start-Time: 1266480451 X-Barracuda-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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.22828 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 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 This is a multi-part message in MIME format. --------------010709070209000402040409 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Can somebody help with this problem? If you need more details, please let me know. > Hello! > > We"ve got two different systems running with XFS, one of them is > publishing shares via NFS, the other via Samba. We've recently > encountered filesystem issues on both servers, and received the > following call traces. They look very much alike. > > Are these something you are familiar with? We'd like to at least > establish that the problem really is with XFS... We don't really have > the possibility to update the kernels (2.6.27.10) on those machines, but > we can possibly apply patches etc. These systems are usually under a > fairly high load and host a large number of files. > > > Filesystem "dm-16": Disabling barriers, trial barrier write failed > XFS mounting filesystem dm-16 > Starting XFS recovery on filesystem: dm-16 (logdev: internal) > XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1590 of file > fs/xfs/xfs_alloc.c. Caller 0xffffffff80398ca7 > Pid: 15745, comm: mount Not tainted 2.6.27.10 > #24 > > Call Trace: > [] xfs_free_ag_extent+0x378/0x740 > [] xfs_free_extent+0xc7/0x110 > [] xlog_recover_process_efi+0x122/0x1a0 > [] xlog_recover_process_efis+0x67/0x90 > [] xlog_recover_finish+0x1c/0xd0 > [] xfs_log_mount_finish+0x20/0x30 > [] xfs_mountfs+0x2bd/0x640 > [] xfs_fstrm_free_func+0x0/0x90 > [] xfs_mru_cache_create+0x15a/0x1c0 > [] xfs_fs_fill_super+0x214/0x450 > [] set_bdev_super+0x0/0x10 > [] get_sb_bdev+0x13f/0x180 > [] xfs_fs_fill_super+0x0/0x450 > [] vfs_kern_mount+0x81/0x160 > [] do_kern_mount+0x4d/0x110 > [] do_new_mount+0x9b/0xe0 > [] do_mount+0x209/0x220 > [] __alloc_pages_internal+0x92/0x430 > [] __get_free_pages+0x17/0x80 > [] compat_sys_mount+0xa4/0x270 > [] ia32_sysret+0x0/0xa > > Failed to recover EFIs on filesystem: dm-16 > XFS: log mount finish failed > NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory > NFSD: starting 90-second grace period > bootsplash: status on console 0 changed to off > usb 3-2: USB disconnect, address 2 > 00000000: 00 00 00 00 00 28 00 e0 00 00 00 00 00 00 00 00 .....(.......... > Filesystem "dm-20": XFS internal error xfs_da_do_buf(2) at line 2112 of > file fs/xfs/xfs_da_btree.c. Caller 0xffffffff803b34b4 > Pid: 23023, comm: smbd Not tainted 2.6.27.10 > #24 > > > Call Trace: > [] xfs_da_do_buf+0x626/0x6b0 > [] xfs_da_read_buf+0x24/0x30 > [] try_to_del_timer_sync+0x4f/0x60 > [] xfs_da_read_buf+0x24/0x30 > [] xfs_dir2_block_lookup_int+0x45/0x1a0 > [] xfs_dir2_block_lookup_int+0x45/0x1a0 > [] xfs_dir2_block_lookup+0x18/0xc0 > [] xfs_dir2_isblock+0x1f/0x60 > [] xfs_dir_lookup+0x19d/0x1c0 > [] xfs_lookup+0x57/0xd0 > [] _spin_lock_bh+0x9/0x20 > [] xfs_vn_lookup+0x64/0xc0 > [] d_alloc+0x125/0x1b0 > [] do_lookup+0x175/0x220 > [] generic_permission+0x69/0x130 > [] __link_path_walk+0x801/0xdb0 > [] sock_aio_read+0x163/0x170 > [] path_walk+0x57/0xb0 > [] do_path_lookup+0x123/0x1b0 > [] user_path_at+0x44/0x80 > [] autoremove_wake_function+0x0/0x30 > [] mntput_no_expire+0x21/0x120 > [] vfs_stat_fd+0x23/0x80 > [] sys32_stat64+0x1f/0x70 > [] ia32_sysret+0x0/0xa > > 00000000: 00 00 00 00 00 28 00 e0 00 00 00 00 00 00 00 00 .....(.......... > Filesystem "dm-20": XFS internal error xfs_da_do_buf(2) at line 2112 of > file fs/xfs/xfs_da_btree.c. Caller 0xffffffff803b34b4 > Pid: 23023, comm: smbd Not tainted 2.6.27.10 > #24 > > > Call Trace: > [] xfs_da_do_buf+0x626/0x6b0 > [] xfs_da_read_buf+0x24/0x30 > [] try_to_del_timer_sync+0x4f/0x60 > [] xfs_da_read_buf+0x24/0x30 > [] xfs_dir2_block_lookup_int+0x45/0x1a0 > [] xfs_dir2_block_lookup_int+0x45/0x1a0 > [] xfs_dir2_block_lookup+0x18/0xc0 > [] xfs_dir2_isblock+0x1f/0x60 > [] xfs_dir_lookup+0x19d/0x1c0 > [] xfs_lookup+0x57/0xd0 > [] _spin_lock_bh+0x9/0x20 > [] xfs_vn_lookup+0x64/0xc0 > [] d_alloc+0x125/0x1b0 > [] do_lookup+0x175/0x220 > [] generic_permission+0x69/0x130 > [] __link_path_walk+0x801/0xdb0 > [] sock_aio_read+0x163/0x170 > [] path_walk+0x57/0xb0 > [] do_path_lookup+0x123/0x1b0 > [] user_path_at+0x44/0x80 > [] autoremove_wake_function+0x0/0x30 > [] mntput_no_expire+0x21/0x120 > [] vfs_stat_fd+0x23/0x80 > [] sys32_stat64+0x1f/0x70 > [] ia32_sysret+0x0/0xa > > > >From the other system we only have these logs: > > 2010/01/27 00:22:07|Pid: 17209, comm: nfsd Not tainted 2.6.27.10 #12 > 2010/01/27 00:22:07| > 2010/01/27 00:22:07|Call Trace: > 2010/01/27 00:22:07|[] xfs_da_do_buf+0x626/0x6b0 > 2010/01/27 00:22:07|[] xfs_da_read_buf+0x24/0x30 > 2010/01/27 00:22:07|[] xfs_buf_read_flags+0x67/0x90 > 2010/01/27 00:22:07|[] xfs_trans_read_buf+0x147/0x310 > 2010/01/27 00:22:07|[] xfs_da_read_buf+0x24/0x30 > 2010/01/27 00:22:07|[] xfs_da_node_lookup_int+0x88/0x2a0 > 2010/01/27 00:22:07|[] xfs_da_node_lookup_int+0x88/0x2a0 > 2010/01/27 00:22:07|[] xfs_dir2_node_lookup+0x48/0x120 > 2010/01/27 00:22:07|[] xfs_dir_lookup+0x1aa/0x1c0 > 2010/01/27 00:22:07|[] xfs_lookup+0x57/0xd0 > 2010/01/27 00:22:07|[] nfsd_permission+0x7e/0x130 > 2010/01/27 00:22:07|[] xfs_vn_lookup+0x64/0xc0 > 2010/01/27 00:22:07|[] d_alloc+0x125/0x1b0 > 2010/01/27 00:22:07|[] __lookup_hash+0xec/0x180 > 2010/01/27 00:22:07|[] lookup_one_len+0x59/0x60 > 2010/01/27 00:22:07|[] nfsd_lookup_dentry+0x12c/0x4d0 > 2010/01/27 00:22:07|[] nfsd_lookup+0x30/0x100 > 2010/01/27 00:22:07|[] nfsd3_proc_lookup+0xa7/0x100 > 2010/01/27 00:22:07|[] nfsd_dispatch+0xae/0x260 > 2010/01/27 00:22:07|[] svc_process+0x307/0x740 > 2010/01/27 00:22:07|[] nfsd+0x172/0x2a0 > 2010/01/27 00:22:07|[] nfsd+0x0/0x2a0 > 2010/01/27 00:22:07|[] kthread+0x6c/0xa0 > 2010/01/27 00:22:07|[] child_rip+0xa/0x11 > 2010/01/27 00:22:07|[] kthread+0x0/0xa0 > 2010/01/27 00:22:07|[] child_rip+0x0/0x11 > 2010/01/27 00:22:07| > 2010/01/27 00:22:09|Pid: 17189, comm: nfsd Not tainted 2.6.27.10 #12 > 2010/01/27 00:22:09| > 2010/01/27 00:22:09|Call Trace: > 2010/01/27 00:22:09|[] xfs_da_do_buf+0x626/0x6b0 > 2010/01/27 00:22:09|[] xfs_da_read_buf+0x24/0x30 > 2010/01/27 00:22:09|[] xfs_da_buf_make+0x13d/0x150 > 2010/01/27 00:22:09|[] xfs_trans_read_buf+0x147/0x310 > 2010/01/27 00:22:09|[] xfs_da_read_buf+0x24/0x30 > 2010/01/27 00:22:09|[] xfs_dir2_leafn_lookup_for_entry+0x16b/0x350 > 2010/01/27 00:22:09|[] xfs_dir2_leafn_lookup_for_entry+0x16b/0x350 > 2010/01/27 00:22:09|[] xfs_da_node_lookup_int+0x237/0x2a0 > 2010/01/27 00:22:09|[] xfs_dir2_node_lookup+0x48/0x120 > 2010/01/27 00:22:09|[] xfs_dir_lookup+0x1aa/0x1c0 > 2010/01/27 00:22:09|[] xfs_lookup+0x57/0xd0 > 2010/01/27 00:22:09|[] nfsd_permission+0x7e/0x130 > 2010/01/27 00:22:09|[] xfs_vn_lookup+0x64/0xc0 > 2010/01/27 00:22:09|[] d_alloc+0x125/0x1b0 > 2010/01/27 00:22:09|[] __lookup_hash+0xec/0x180 > 2010/01/27 00:22:09|[] lookup_one_len+0x59/0x60 > 2010/01/27 00:22:09|[] nfsd_lookup_dentry+0x12c/0x4d0 > 2010/01/27 00:22:09|[] nfsd_lookup+0x30/0x100 > 2010/01/27 00:22:09|[] nfsd3_proc_lookup+0xa7/0x100 > 2010/01/27 00:22:09|[] nfsd_dispatch+0xae/0x260 > 2010/01/27 00:22:09|[] svc_process+0x307/0x740 > 2010/01/27 00:22:09|[] nfsd+0x172/0x2a0 > 2010/01/27 00:22:09|[] nfsd+0x0/0x2a0 > 2010/01/27 00:22:09|[] kthread+0x6c/0xa0 > 2010/01/27 00:22:09|[] child_rip+0xa/0x11 > 2010/01/27 00:22:09|[] kthread+0x0/0xa0 > 2010/01/27 00:22:09|[] child_rip+0x0/0x11 > > > --------------010709070209000402040409 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit Can somebody help with this problem? If you need more details, please let me know.
Hello!

We"ve got two different systems running with XFS, one of them is
publishing shares via NFS, the other via Samba. We've recently
encountered filesystem issues on both servers, and received the
following call traces. They look very much alike.

Are these something you are familiar with? We'd like to at least
establish that the problem really is with XFS... We don't really have
the possibility to update the kernels (2.6.27.10) on those machines, but
we can possibly apply patches etc. These systems are usually under a
fairly high load and host a large number of files.


Filesystem "dm-16": Disabling barriers, trial barrier write failed        
XFS mounting filesystem dm-16                                             
Starting XFS recovery on filesystem: dm-16 (logdev: internal)             
XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1590 of file
fs/xfs/xfs_alloc.c.  Caller 0xffffffff80398ca7
Pid: 15745, comm: mount Not tainted 2.6.27.10
#24                                                            

Call Trace:
 [<ffffffff80396fb8>] xfs_free_ag_extent+0x378/0x740
 [<ffffffff80398ca7>] xfs_free_extent+0xc7/0x110   
 [<ffffffff803d7642>] xlog_recover_process_efi+0x122/0x1a0
 [<ffffffff803d7727>] xlog_recover_process_efis+0x67/0x90
 [<ffffffff803d87dc>] xlog_recover_finish+0x1c/0xd0      
 [<ffffffff803d0790>] xfs_log_mount_finish+0x20/0x30     
 [<ffffffff803dac3d>] xfs_mountfs+0x2bd/0x640            
 [<ffffffff803c0440>] xfs_fstrm_free_func+0x0/0x90       
 [<ffffffff803dbaca>] xfs_mru_cache_create+0x15a/0x1c0   
 [<ffffffff803f2c04>] xfs_fs_fill_super+0x214/0x450      
 [<ffffffff80299100>] set_bdev_super+0x0/0x10            
 [<ffffffff8029925f>] get_sb_bdev+0x13f/0x180            
 [<ffffffff803f29f0>] xfs_fs_fill_super+0x0/0x450        
 [<ffffffff802994f1>] vfs_kern_mount+0x81/0x160          
 [<ffffffff8029961d>] do_kern_mount+0x4d/0x110           
 [<ffffffff802b0fbb>] do_new_mount+0x9b/0xe0             
 [<ffffffff802b1849>] do_mount+0x209/0x220               
 [<ffffffff80274ea2>] __alloc_pages_internal+0x92/0x430  
 [<ffffffff802752d7>] __get_free_pages+0x17/0x80         
 [<ffffffff802cbdf4>] compat_sys_mount+0xa4/0x270        
 [<ffffffff80228282>] ia32_sysret+0x0/0xa                

Failed to recover EFIs on filesystem: dm-16
XFS: log mount finish failed              
NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory
NFSD: starting 90-second grace period                                   
bootsplash: status on console 0 changed to off                          
usb 3-2: USB disconnect, address 2                                      
00000000: 00 00 00 00 00 28 00 e0 00 00 00 00 00 00 00 00  .....(..........
Filesystem "dm-20": XFS internal error xfs_da_do_buf(2) at line 2112 of
file fs/xfs/xfs_da_btree.c.  Caller 0xffffffff803b34b4
Pid: 23023, comm: smbd Not tainted 2.6.27.10
#24                                                                             


Call Trace:
 [<ffffffff803b33b6>] xfs_da_do_buf+0x626/0x6b0
 [<ffffffff803b34b4>] xfs_da_read_buf+0x24/0x30
 [<ffffffff8023ee0f>] try_to_del_timer_sync+0x4f/0x60
 [<ffffffff803b34b4>] xfs_da_read_buf+0x24/0x30     
 [<ffffffff803b77e5>] xfs_dir2_block_lookup_int+0x45/0x1a0
 [<ffffffff803b77e5>] xfs_dir2_block_lookup_int+0x45/0x1a0
 [<ffffffff803b7958>] xfs_dir2_block_lookup+0x18/0xc0    
 [<ffffffff803b624f>] xfs_dir2_isblock+0x1f/0x60         
 [<ffffffff803b696d>] xfs_dir_lookup+0x19d/0x1c0         
 [<ffffffff803e3267>] xfs_lookup+0x57/0xd0               
 [<ffffffff8069dfd9>] _spin_lock_bh+0x9/0x20             
 [<ffffffff803ee6e4>] xfs_vn_lookup+0x64/0xc0            
 [<ffffffff802a9f95>] d_alloc+0x125/0x1b0                
 [<ffffffff8029f155>] do_lookup+0x175/0x220              
 [<ffffffff8029ea79>] generic_permission+0x69/0x130      
 [<ffffffff8029fa01>] __link_path_walk+0x801/0xdb0       
 [<ffffffff805de663>] sock_aio_read+0x163/0x170          
 [<ffffffff802a0007>] path_walk+0x57/0xb0                
 [<ffffffff802a0183>] do_path_lookup+0x123/0x1b0         
 [<ffffffff802a06f4>] user_path_at+0x44/0x80             
 [<ffffffff8024a450>] autoremove_wake_function+0x0/0x30  
 [<ffffffff802af5c1>] mntput_no_expire+0x21/0x120        
 [<ffffffff8029a1f3>] vfs_stat_fd+0x23/0x80              
 [<ffffffff8022879f>] sys32_stat64+0x1f/0x70             
 [<ffffffff80228282>] ia32_sysret+0x0/0xa                

00000000: 00 00 00 00 00 28 00 e0 00 00 00 00 00 00 00 00  .....(..........
Filesystem "dm-20": XFS internal error xfs_da_do_buf(2) at line 2112 of
file fs/xfs/xfs_da_btree.c.  Caller 0xffffffff803b34b4
Pid: 23023, comm: smbd Not tainted 2.6.27.10
#24                                                                             


Call Trace:
 [<ffffffff803b33b6>] xfs_da_do_buf+0x626/0x6b0
 [<ffffffff803b34b4>] xfs_da_read_buf+0x24/0x30
 [<ffffffff8023ee0f>] try_to_del_timer_sync+0x4f/0x60
 [<ffffffff803b34b4>] xfs_da_read_buf+0x24/0x30     
 [<ffffffff803b77e5>] xfs_dir2_block_lookup_int+0x45/0x1a0
 [<ffffffff803b77e5>] xfs_dir2_block_lookup_int+0x45/0x1a0
 [<ffffffff803b7958>] xfs_dir2_block_lookup+0x18/0xc0    
 [<ffffffff803b624f>] xfs_dir2_isblock+0x1f/0x60         
 [<ffffffff803b696d>] xfs_dir_lookup+0x19d/0x1c0         
 [<ffffffff803e3267>] xfs_lookup+0x57/0xd0               
 [<ffffffff8069dfd9>] _spin_lock_bh+0x9/0x20             
 [<ffffffff803ee6e4>] xfs_vn_lookup+0x64/0xc0            
 [<ffffffff802a9f95>] d_alloc+0x125/0x1b0                
 [<ffffffff8029f155>] do_lookup+0x175/0x220              
 [<ffffffff8029ea79>] generic_permission+0x69/0x130      
 [<ffffffff8029fa01>] __link_path_walk+0x801/0xdb0       
 [<ffffffff805de663>] sock_aio_read+0x163/0x170          
 [<ffffffff802a0007>] path_walk+0x57/0xb0                
 [<ffffffff802a0183>] do_path_lookup+0x123/0x1b0         
 [<ffffffff802a06f4>] user_path_at+0x44/0x80             
 [<ffffffff8024a450>] autoremove_wake_function+0x0/0x30  
 [<ffffffff802af5c1>] mntput_no_expire+0x21/0x120        
 [<ffffffff8029a1f3>] vfs_stat_fd+0x23/0x80              
 [<ffffffff8022879f>] sys32_stat64+0x1f/0x70             
 [<ffffffff80228282>] ia32_sysret+0x0/0xa


>From the other system we only have these logs:

2010/01/27 00:22:07|Pid: 17209, comm: nfsd Not tainted 2.6.27.10 #12
2010/01/27 00:22:07|
2010/01/27 00:22:07|Call Trace:
2010/01/27 00:22:07|[<ffffffff803b33b6>] xfs_da_do_buf+0x626/0x6b0
2010/01/27 00:22:07|[<ffffffff803b34b4>] xfs_da_read_buf+0x24/0x30
2010/01/27 00:22:07|[<ffffffff803ead07>] xfs_buf_read_flags+0x67/0x90
2010/01/27 00:22:07|[<ffffffff803df247>] xfs_trans_read_buf+0x147/0x310
2010/01/27 00:22:07|[<ffffffff803b34b4>] xfs_da_read_buf+0x24/0x30
2010/01/27 00:22:07|[<ffffffff803b3748>] xfs_da_node_lookup_int+0x88/0x2a0
2010/01/27 00:22:07|[<ffffffff803b3748>] xfs_da_node_lookup_int+0x88/0x2a0
2010/01/27 00:22:07|[<ffffffff803bd2f8>] xfs_dir2_node_lookup+0x48/0x120
2010/01/27 00:22:07|[<ffffffff803b697a>] xfs_dir_lookup+0x1aa/0x1c0
2010/01/27 00:22:07|[<ffffffff803e3267>] xfs_lookup+0x57/0xd0
2010/01/27 00:22:07|[<ffffffff8035279e>] nfsd_permission+0x7e/0x130
2010/01/27 00:22:07|[<ffffffff803ee6e4>] xfs_vn_lookup+0x64/0xc0
2010/01/27 00:22:07|[<ffffffff802a9f95>] d_alloc+0x125/0x1b0
2010/01/27 00:22:07|[<ffffffff802a048c>] __lookup_hash+0xec/0x180
2010/01/27 00:22:07|[<ffffffff802a0629>] lookup_one_len+0x59/0x60
2010/01/27 00:22:07|[<ffffffff8035023c>] nfsd_lookup_dentry+0x12c/0x4d0
2010/01/27 00:22:07|[<ffffffff80350610>] nfsd_lookup+0x30/0x100
2010/01/27 00:22:07|[<ffffffff803599a7>] nfsd3_proc_lookup+0xa7/0x100
2010/01/27 00:22:07|[<ffffffff8034ca6e>] nfsd_dispatch+0xae/0x260
2010/01/27 00:22:07|[<ffffffff80669a87>] svc_process+0x307/0x740
2010/01/27 00:22:07|[<ffffffff8034c892>] nfsd+0x172/0x2a0
2010/01/27 00:22:07|[<ffffffff8034c720>] nfsd+0x0/0x2a0
2010/01/27 00:22:07|[<ffffffff80249d3c>] kthread+0x6c/0xa0
2010/01/27 00:22:07|[<ffffffff8020d1c9>] child_rip+0xa/0x11
2010/01/27 00:22:07|[<ffffffff80249cd0>] kthread+0x0/0xa0
2010/01/27 00:22:07|[<ffffffff8020d1bf>] child_rip+0x0/0x11
2010/01/27 00:22:07|
2010/01/27 00:22:09|Pid: 17189, comm: nfsd Not tainted 2.6.27.10 #12
2010/01/27 00:22:09|
2010/01/27 00:22:09|Call Trace:
2010/01/27 00:22:09|[<ffffffff803b33b6>] xfs_da_do_buf+0x626/0x6b0
2010/01/27 00:22:09|[<ffffffff803b34b4>] xfs_da_read_buf+0x24/0x30
2010/01/27 00:22:09|[<ffffffff803b2bed>] xfs_da_buf_make+0x13d/0x150
2010/01/27 00:22:09|[<ffffffff803df247>] xfs_trans_read_buf+0x147/0x310
2010/01/27 00:22:09|[<ffffffff803b34b4>] xfs_da_read_buf+0x24/0x30
2010/01/27 00:22:09|[<ffffffff803bbd5b>] xfs_dir2_leafn_lookup_for_entry+0x16b/0x350
2010/01/27 00:22:09|[<ffffffff803bbd5b>] xfs_dir2_leafn_lookup_for_entry+0x16b/0x350
2010/01/27 00:22:09|[<ffffffff803b38f7>] xfs_da_node_lookup_int+0x237/0x2a0
2010/01/27 00:22:09|[<ffffffff803bd2f8>] xfs_dir2_node_lookup+0x48/0x120
2010/01/27 00:22:09|[<ffffffff803b697a>] xfs_dir_lookup+0x1aa/0x1c0
2010/01/27 00:22:09|[<ffffffff803e3267>] xfs_lookup+0x57/0xd0
2010/01/27 00:22:09|[<ffffffff8035279e>] nfsd_permission+0x7e/0x130
2010/01/27 00:22:09|[<ffffffff803ee6e4>] xfs_vn_lookup+0x64/0xc0
2010/01/27 00:22:09|[<ffffffff802a9f95>] d_alloc+0x125/0x1b0
2010/01/27 00:22:09|[<ffffffff802a048c>] __lookup_hash+0xec/0x180
2010/01/27 00:22:09|[<ffffffff802a0629>] lookup_one_len+0x59/0x60
2010/01/27 00:22:09|[<ffffffff8035023c>] nfsd_lookup_dentry+0x12c/0x4d0
2010/01/27 00:22:09|[<ffffffff80350610>] nfsd_lookup+0x30/0x100
2010/01/27 00:22:09|[<ffffffff803599a7>] nfsd3_proc_lookup+0xa7/0x100
2010/01/27 00:22:09|[<ffffffff8034ca6e>] nfsd_dispatch+0xae/0x260
2010/01/27 00:22:09|[<ffffffff80669a87>] svc_process+0x307/0x740
2010/01/27 00:22:09|[<ffffffff8034c892>] nfsd+0x172/0x2a0
2010/01/27 00:22:09|[<ffffffff8034c720>] nfsd+0x0/0x2a0
2010/01/27 00:22:09|[<ffffffff80249d3c>] kthread+0x6c/0xa0
2010/01/27 00:22:09|[<ffffffff8020d1c9>] child_rip+0xa/0x11
2010/01/27 00:22:09|[<ffffffff80249cd0>] kthread+0x0/0xa0
2010/01/27 00:22:09|[<ffffffff8020d1bf>] child_rip+0x0/0x11


  

--------------010709070209000402040409-- From SRS0+I+72+78+fromorbit.com=david@internode.on.net Thu Feb 18 02:43:33 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1I8hW8U038179 for ; Thu, 18 Feb 2010 02:43:33 -0600 X-ASG-Debug-ID: 1266482689-233f01ca0000-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 E00E613B67E5 for ; Thu, 18 Feb 2010 00:44:49 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id RyqVUUytWa8Cyurq for ; Thu, 18 Feb 2010 00:44:49 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14087257-1927428 for multiple; Thu, 18 Feb 2010 19:14:48 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Ni206-0003cE-Vb; Thu, 18 Feb 2010 19:44:47 +1100 Date: Thu, 18 Feb 2010 19:44:46 +1100 From: Dave Chinner To: "aluno3@poczta.onet.pl" Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS problems with 2.6.27 Subject: Re: XFS problems with 2.6.27 Message-ID: <20100218084446.GZ28392@discord.disaster> References: <4B717CCD.3040008@poczta.onet.pl> <4B7CF542.6090501@poczta.onet.pl> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B7CF542.6090501@poczta.onet.pl> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1266482690 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22830 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, Feb 18, 2010 at 09:07:30AM +0100, aluno3@poczta.onet.pl wrote: > Can somebody help with this problem? If you need more details, please > let me know. You've got lots of problems. > > Hello! > > > > We"ve got two different systems running with XFS, one of them is > > publishing shares via NFS, the other via Samba. We've recently > > encountered filesystem issues on both servers, and received the > > following call traces. They look very much alike. > > > > Are these something you are familiar with? We'd like to at least > > establish that the problem really is with XFS... We don't really have > > the possibility to update the kernels (2.6.27.10) on those machines, but > > we can possibly apply patches etc. These systems are usually under a > > fairly high load and host a large number of files. > > > > > > Filesystem "dm-16": Disabling barriers, trial barrier write failed > > XFS mounting filesystem dm-16 > > Starting XFS recovery on filesystem: dm-16 (logdev: internal) > > XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1590 of file > > fs/xfs/xfs_alloc.c. Caller 0xffffffff80398ca7 > > Pid: 15745, comm: mount Not tainted 2.6.27.10 > > #24 That's a corrupt free space tree => xfs_repair. > > NFSD: starting 90-second grace period > > bootsplash: status on console 0 changed to off > > usb 3-2: USB disconnect, address 2 > > 00000000: 00 00 00 00 00 28 00 e0 00 00 00 00 00 00 00 00 .....(.......... > > Filesystem "dm-20": XFS internal error xfs_da_do_buf(2) at line 2112 of > > file fs/xfs/xfs_da_btree.c. Caller 0xffffffff803b34b4 > > Pid: 23023, comm: smbd Not tainted 2.6.27.10 > > #24 That's a corrupt directory block. The output there bears no resemblance to an XFS directory header - you might be hitting the problem where DM fails to mark a cancelled readahead bio correctly and XFS detects it in xfs_da_do_buf() as an uninitialised buffer and shuts down the filesystem. I'd say run repair and if it doesn't find any directory corruption, you need to get the DM and XFS fixes for the cancelled readhead bios backported. Cheers, Dave. -- Dave Chinner david@fromorbit.com From p.lason@cyfronet.pl Thu Feb 18 04:05:37 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1IA5ZYb042238 for ; Thu, 18 Feb 2010 04:05:36 -0600 X-ASG-Debug-ID: 1266487612-6dc7017c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from srv.cyf-kr.edu.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8D02713B6AA0 for ; Thu, 18 Feb 2010 02:06:52 -0800 (PST) Received: from srv.cyf-kr.edu.pl (srv.cyf-kr.edu.pl [149.156.2.11]) by cuda.sgi.com with ESMTP id sXxCkkRavar2uXIl for ; Thu, 18 Feb 2010 02:06:52 -0800 (PST) Received: from kinga.cyf-kr.edu.pl (kinga.cyf-kr.edu.pl [149.156.2.32]) by srv.cyf-kr.edu.pl (8.12.11.20060308/8.12.8) with ESMTP id o1IA47xl018688 for ; Thu, 18 Feb 2010 11:04:07 +0100 Received: from pl.localnet (pl.cyf-kr.edu.pl [149.156.9.188]) by kinga.cyf-kr.edu.pl (8.12.11/8.12.11) with ESMTP id o1IA6gLv014747 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT) for ; Thu, 18 Feb 2010 11:06:43 +0100 (MET) From: Patryk Lason Reply-To: p.lason@cyfronet.pl Organization: ACK CYFRONET AGH To: xfs@oss.sgi.com X-ASG-Orig-Subj: XFS + LVM + quota = disk quota exceeded Subject: XFS + LVM + quota = disk quota exceeded Date: Thu, 18 Feb 2010 11:06:36 +0100 User-Agent: KMail/1.12.4 (Linux/2.6.30-gentoo-r8; KDE/4.3.5; i686; ; ) MIME-Version: 1.0 Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Message-Id: <201002181106.36672.p.lason@cyfronet.pl> X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: by amavisd-new X-Barracuda-Connect: srv.cyf-kr.edu.pl[149.156.2.11] X-Barracuda-Start-Time: 1266487613 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean Hello, I'm not able to touch a file on an XFS filesystem with quotas created on an= LVM=20 volume. Even if I set limits to 10TB on 2TB device. OS: CentOS release 5.4 (Final) Kernel: Linux nfs 2.6.18-164.11.1.el5 #1 SMP Wed Jan 20 07:32:21 EST 2010=20 x86_64 x86_64 x86_64 GNU/Linux Path to xfs: /lib/modules/2.6.18-164.11.1.el5/kernel/fs/xfs/xfs.ko Device: /dev/mapper/lvm--people-people on /people type xfs=20 (rw,noatime,usrquota,grpquota) --- Volume group --- VG Name lvm-people System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 2 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 1 Act PV 1 VG Size 2.00 TB PE Size 4.00 MB Total PE 524031 Alloc PE / Size 524031 / 2.00 TB Free PE / Size 0 / 0 VG UUID XYOrZr-6Pqv-JPKP-cuKU-xcbO-vfet-rbRgkO --- Logical volume --- LV Name /dev/lvm-people/people VG Name lvm-people LV UUID X766hc-NkTy-TGFb-3FJE-syOg-uwwk-LrbYyc LV Write Access read/write LV Status available # open 1 LV Size 2.00 TB Current LE 524031 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:12 # xfs_info /people/ meta-data=3D/dev/mapper/lvm--people-people isize=3D256 agcount=3D32,=20 agsize=3D16768992 blks =3D sectsz=3D512 attr=3D0 data =3D bsize=3D4096 blocks=3D536607744, imaxp= ct=3D25 =3D sunit=3D0 swidth=3D0 blks, unwritte= n=3D1 naming =3Dversion 2 bsize=3D4096 log =3Dinternal bsize=3D4096 blocks=3D32768, version= =3D1 =3D sectsz=3D512 sunit=3D0 blks, lazy-coun= t=3D0 realtime =3Dnone extsz=3D4096 blocks=3D0, rtextents=3D0 =46rom xfs_quota: Disk quotas for User xxx (1111) =46ilesystem Blocks Quota Limit Warn/Time Moun= ted=20 on /dev/mapper/lvm--people-people 742740 10737418240 10737418240 00 [--------] /peo= ple # su - xxx $ pwd /people/xxx $ touch a touch: cannot touch `a': Disk quota exceeded What may be wrong and where? Regards, Patryk From BATV+f808717ef25d34a0292f+2370+infradead.org+hch@bombadil.srs.infradead.org Thu Feb 18 06:34:01 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1ICXwYO050440 for ; Thu, 18 Feb 2010 06:34:01 -0600 X-ASG-Debug-ID: 1266496514-5216007d0000-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 4865C1DD224 for ; Thu, 18 Feb 2010 04:35:17 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id CLZEiU3iwanPm9gl for ; Thu, 18 Feb 2010 04:35:17 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Ni5b7-0004m3-3J; Thu, 18 Feb 2010 12:35:13 +0000 Date: Thu, 18 Feb 2010 07:35:13 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: Non-blocking inode locking in IO completion Subject: Re: [PATCH] xfs: Non-blocking inode locking in IO completion Message-ID: <20100218123512.GA6016@infradead.org> References: <1266384989-28928-1-git-send-email-david@fromorbit.com> <20100217192938.GA14015@infradead.org> <20100217211312.GQ28392@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217211312.GQ28392@discord.disaster> 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: 1266496518 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, Feb 18, 2010 at 08:13:12AM +1100, Dave Chinner wrote: > > The patch looks good to me - while I hate introducing random delay() > > calls I don't really see a way around this. > > I thought about using queue_delayed_work(), but then the change > became much bigger and has other side effects like increasing the > size of the ioend structure. Yes, now that the normal work struct and the delayed work struct are different it would be a pain, agreed. From BATV+f808717ef25d34a0292f+2370+infradead.org+hch@bombadil.srs.infradead.org Thu Feb 18 06:42:04 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1ICg3Ox050916 for ; Thu, 18 Feb 2010 06:42:04 -0600 X-ASG-Debug-ID: 1266497002-748f030d0000-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 301D41CDD6C3 for ; Thu, 18 Feb 2010 04:43:22 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id oB9HjTFLeopD2SWy for ; Thu, 18 Feb 2010 04:43:22 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1Ni5j0-0001uU-G7; Thu, 18 Feb 2010 12:43:22 +0000 Date: Thu, 18 Feb 2010 07:43:22 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: remove xfs_ipin/xfs_iunpin Subject: Re: [PATCH 2/2] xfs: remove xfs_ipin/xfs_iunpin Message-ID: <20100218124322.GB6016@infradead.org> References: <20100217194407.GB28758@infradead.org> <20100217230033.GW28392@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217230033.GW28392@discord.disaster> 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: 1266497003 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, Feb 18, 2010 at 10:00:33AM +1100, Dave Chinner wrote: > > + ASSERT(atomic_read(&->i_pincount) > 0); > > I don't think that compiles. ;) It does in fact compile for non-debug builds, but here's an updated version that also compiles in a debug build: --- From: Christoph Hellwig Subject: [PATCH 2/2] xfs: remove xfs_ipin/xfs_iunpin Inodes are only pinned/unpinned via the inode item methods, and lots of code relies on that fact. So remove the separate xfs_ipin/xfs_iunpin helpers and merge them into their only callers. This also fixes up various duplicate and/or incorrect comments. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2010-02-17 10:56:31.726003891 +0100 +++ xfs/fs/xfs/xfs_inode.c 2010-02-17 11:00:21.126005288 +0100 @@ -2439,34 +2439,6 @@ xfs_idestroy_fork( } /* - * Increment the pin count of the given buffer. - * This value is protected by ipinlock spinlock in the mount structure. - */ -void -xfs_ipin( - xfs_inode_t *ip) -{ - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - - atomic_inc(&ip->i_pincount); -} - -/* - * Decrement the pin count of the given inode, and wake up - * anyone in xfs_iwait_unpin() if the count goes to 0. The - * inode must have been previously pinned with a call to xfs_ipin(). - */ -void -xfs_iunpin( - xfs_inode_t *ip) -{ - ASSERT(atomic_read(&ip->i_pincount) > 0); - - if (atomic_dec_and_test(&ip->i_pincount)) - wake_up(&ip->i_ipin_wait); -} - -/* * This is called to unpin an inode. The caller must have the inode locked * in at least shared mode so that the buffer cannot be subsequently pinned * once someone is waiting for it to be unpinned. Index: xfs/fs/xfs/xfs_inode.h =================================================================== --- xfs.orig/fs/xfs/xfs_inode.h 2010-02-17 10:56:31.740273062 +0100 +++ xfs/fs/xfs/xfs_inode.h 2010-02-17 11:00:00.410005428 +0100 @@ -471,8 +471,6 @@ int xfs_itruncate_finish(struct xfs_tra int xfs_iunlink(struct xfs_trans *, xfs_inode_t *); void xfs_iext_realloc(xfs_inode_t *, int, int); -void xfs_ipin(xfs_inode_t *); -void xfs_iunpin(xfs_inode_t *); void xfs_iunpin_wait(xfs_inode_t *); int xfs_iflush(xfs_inode_t *, uint); void xfs_ichgtime(xfs_inode_t *, int); Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-02-17 10:56:31.713003821 +0100 +++ xfs/fs/xfs/xfs_inode_item.c 2010-02-18 13:39:35.888276695 +0100 @@ -535,23 +535,23 @@ xfs_inode_item_format( /* * This is called to pin the inode associated with the inode log - * item in memory so it cannot be written out. Do this by calling - * xfs_ipin() to bump the pin count in the inode while holding the - * inode pin lock. + * item in memory so it cannot be written out. */ STATIC void xfs_inode_item_pin( xfs_inode_log_item_t *iip) { ASSERT(xfs_isilocked(iip->ili_inode, XFS_ILOCK_EXCL)); - xfs_ipin(iip->ili_inode); + + atomic_inc(&iip->ili_inode->i_pincount); } /* * This is called to unpin the inode associated with the inode log * item which was previously pinned with a call to xfs_inode_item_pin(). - * Just call xfs_iunpin() on the inode to do this. + * + * Also wake up anyone in xfs_iunpin_wait() if the count goes to 0. */ /* ARGSUSED */ STATIC void @@ -559,7 +559,11 @@ xfs_inode_item_unpin( xfs_inode_log_item_t *iip, int stale) { - xfs_iunpin(iip->ili_inode); + struct xfs_inode *ip = iip->ili_inode; + + ASSERT(atomic_read(&ip->i_pincount) > 0); + if (atomic_dec_and_test(&ip->i_pincount)) + wake_up(&ip->i_ipin_wait); } /* ARGSUSED */ @@ -568,7 +572,7 @@ xfs_inode_item_unpin_remove( xfs_inode_log_item_t *iip, xfs_trans_t *tp) { - xfs_iunpin(iip->ili_inode); + xfs_inode_item_unpin(iip, 0); } /* From SRS0+cg7x+78+fromorbit.com=david@internode.on.net Thu Feb 18 15:18:53 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1ILIpJu077400 for ; Thu, 18 Feb 2010 15:18:52 -0600 X-ASG-Debug-ID: 1266528008-470b02160000-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 610E21CDF6FE for ; Thu, 18 Feb 2010 13:20:08 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id zk2qumP0dHzH0EGd for ; Thu, 18 Feb 2010 13:20:08 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14233037-1927428 for ; Fri, 19 Feb 2010 07:50:06 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NiDXu-0004NL-By; Fri, 19 Feb 2010 08:04:26 +1100 Date: Fri, 19 Feb 2010 08:04:26 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: remove xfs_ipin/xfs_iunpin Subject: Re: [PATCH 2/2] xfs: remove xfs_ipin/xfs_iunpin Message-ID: <20100218210426.GA28392@discord.disaster> References: <20100217194407.GB28758@infradead.org> <20100217230033.GW28392@discord.disaster> <20100218124322.GB6016@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100218124322.GB6016@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1266528010 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22873 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, Feb 18, 2010 at 07:43:22AM -0500, Christoph Hellwig wrote: > On Thu, Feb 18, 2010 at 10:00:33AM +1100, Dave Chinner wrote: > > > + ASSERT(atomic_read(&->i_pincount) > 0); > > > > I don't think that compiles. ;) > > It does in fact compile for non-debug builds, but here's an updated Very true... > version that also compiles in a debug build: > > --- > > From: Christoph Hellwig > Subject: [PATCH 2/2] xfs: remove xfs_ipin/xfs_iunpin > > Inodes are only pinned/unpinned via the inode item methods, and lots of > code relies on that fact. So remove the separate xfs_ipin/xfs_iunpin > helpers and merge them into their only callers. This also fixes up > various duplicate and/or incorrect comments. > > Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Feb 18 16:02:53 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1IM2qOh079171 for ; Thu, 18 Feb 2010 16:02:52 -0600 X-ASG-Debug-ID: 1266530651-71b101db0000-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 32C901CDFBB7 for ; Thu, 18 Feb 2010 14:04:11 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id AFlS7MnQDWcFI4iW for ; Thu, 18 Feb 2010 14:04:11 -0800 (PST) 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 32DE812764B6; Thu, 18 Feb 2010 16:04:11 -0600 (CST) Message-ID: <4B7DB95B.4060506@sandeen.net> Date: Thu, 18 Feb 2010 16:04:11 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Dave Chinner CC: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: mount xfs with a context when selinux is on Subject: Re: [PATCH] xfstests: mount xfs with a context when selinux is on References: <4B7C3F98.50303@sandeen.net> <20100217230358.GX28392@discord.disaster> In-Reply-To: <20100217230358.GX28392@discord.disaster> 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: 1266530652 X-Barracuda-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.22874 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: > On Wed, Feb 17, 2010 at 01:12:24PM -0600, Eric Sandeen wrote: >> When selinux is on, we get tons of new xattrs, which messes >> up all kinds of output. >> >> The simplest way out of this, for now, seems to be to just mount >> with a global context instead and skip writing the extra xattrs. >> >> I've been using this internally on Fedora and RHEL for a while now. >> >> Signed-off-by: Eric Sandeen > > I know very little about selinux, so while the code changes look OK > I have no idea if the context change is All Goodness. > >> --- a/common.rc >> +++ b/common.rc >> @@ -47,8 +47,16 @@ _ls_l() >> >> _mount_opts() >> { >> + # SELinux adds extra xattrs which can mess up our expected output. >> + # So, mount with a context, and they won't be created >> + # nfs_t is a "liberal" context so we can use it. >> + if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then >> + SELINUX_MOUNT_OPTIONS="-o context=system_u:object_r:nfs_t:s0" >> + fi >> + > > i.e. is t_nfs a context specific to a RHEL/Fedora setup, or is it a > generic context that other distro's also define? I'll ask; I think this is what they told me to use last time, but I didn't ask if it was policy-specific... -Eric > Cheers, > > Dave. From sandeen@sandeen.net Thu Feb 18 16:09:17 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1IM9HU7079494 for ; Thu, 18 Feb 2010 16:09:17 -0600 X-ASG-Debug-ID: 1266531036-59e0027c0000-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 C0B3113BA53B for ; Thu, 18 Feb 2010 14:10:36 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id mkksuQPYcyxvaxaX for ; Thu, 18 Feb 2010 14:10:36 -0800 (PST) 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 60AFB1883A96; Thu, 18 Feb 2010 16:10:35 -0600 (CST) Message-ID: <4B7DBADB.5020409@sandeen.net> Date: Thu, 18 Feb 2010 16:10:35 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: p.lason@cyfronet.pl CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS + LVM + quota = disk quota exceeded Subject: Re: XFS + LVM + quota = disk quota exceeded References: <201002181106.36672.p.lason@cyfronet.pl> In-Reply-To: <201002181106.36672.p.lason@cyfronet.pl> 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: 1266531036 X-Barracuda-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.22875 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 Patryk Lason wrote: > Hello, > > I'm not able to touch a file on an XFS filesystem with quotas created on an LVM > volume. > Even if I set limits to 10TB on 2TB device. ... > From xfs_quota: > Disk quotas for User xxx (1111) > Filesystem Blocks Quota Limit Warn/Time Mounted > on > /dev/mapper/lvm--people-people > 742740 10737418240 10737418240 00 [--------] /people > > > # su - xxx > $ pwd > /people/xxx > $ touch a > touch: cannot touch `a': Disk quota exceeded > > > What may be wrong and where? file quota maybe, not block quota; quota -i ? -Eric From sandeen@sandeen.net Thu Feb 18 16:49:01 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_12 autolearn=no version=3.3.0-rupdated 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 o1IMn1Ce081241 for ; Thu, 18 Feb 2010 16:49:01 -0600 X-ASG-Debug-ID: 1266533418-79ef039a0000-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 4130B1CDFE61 for ; Thu, 18 Feb 2010 14:50:18 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id gjWf13sho9hcmU55 for ; Thu, 18 Feb 2010 14:50:18 -0800 (PST) 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 97AFC9E7248 for ; Thu, 18 Feb 2010 16:50:18 -0600 (CST) Message-ID: <4B7DC42A.1030401@sandeen.net> Date: Thu, 18 Feb 2010 16:50:18 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH] xfstests 125: don't traverse through fs for su command Subject: [PATCH] xfstests 125: don't traverse through fs for su command 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: 1266533420 X-Barracuda-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.22877 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 I often have xfstests in /root, and 125 fails for me like this: --- 125.out 2009-08-05 20:19:40.380978986 -0500 +++ 125.out.bad 2010-02-18 16:48:57.507473627 -0600 @@ -1,4 +1,6 @@ QA output created by 125 +bash: /root/git/xfstests-dev/src/ftrunc: Permission denied +src/ftrunc returned non 0 status! direct write of 1's into file buffered write of 2's into file truncate file I think this is becuase $here/src ... means going through /root/git/xfstests-dev/src/ ... and the qa user can't do that. The below fixes it for me... Signed-off-by: Eric Sandeen --- diff --git a/125 b/125 index e84109a..9a29941 100755 --- a/125 +++ b/125 @@ -61,7 +61,7 @@ touch $TESTFILE chmod a+rw $TESTDIR chmod a+rw $TESTFILE -su $qa_user -c "$here/src/ftrunc -f $TESTFILE" +su $qa_user -c "./src/ftrunc -f $TESTFILE" if [ "$?" != "0" ]; then echo src/ftrunc returned non 0 status! From sandeen@sandeen.net Thu Feb 18 16:52:47 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1IMqkxS081402 for ; Thu, 18 Feb 2010 16:52:46 -0600 X-ASG-Debug-ID: 1266533645-1b0302480000-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 F17A21CDFEA1 for ; Thu, 18 Feb 2010 14:54:05 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id VfCPDFZVZnK9aC5l for ; Thu, 18 Feb 2010 14:54:05 -0800 (PST) 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 802FA1883A99; Thu, 18 Feb 2010 16:54:05 -0600 (CST) Message-ID: <4B7DC50D.7070507@sandeen.net> Date: Thu, 18 Feb 2010 16:54:05 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Dave Chinner CC: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: mount xfs with a context when selinux is on Subject: Re: [PATCH] xfstests: mount xfs with a context when selinux is on References: <4B7C3F98.50303@sandeen.net> <20100217230358.GX28392@discord.disaster> <4B7DB95B.4060506@sandeen.net> In-Reply-To: <4B7DB95B.4060506@sandeen.net> 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: 1266533645 X-Barracuda-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.22877 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: > Dave Chinner wrote: >> On Wed, Feb 17, 2010 at 01:12:24PM -0600, Eric Sandeen wrote: >>> When selinux is on, we get tons of new xattrs, which messes >>> up all kinds of output. >>> >>> The simplest way out of this, for now, seems to be to just mount >>> with a global context instead and skip writing the extra xattrs. >>> >>> I've been using this internally on Fedora and RHEL for a while now. >>> >>> Signed-off-by: Eric Sandeen >> I know very little about selinux, so while the code changes look OK >> I have no idea if the context change is All Goodness. >> >>> --- a/common.rc >>> +++ b/common.rc >>> @@ -47,8 +47,16 @@ _ls_l() >>> >>> _mount_opts() >>> { >>> + # SELinux adds extra xattrs which can mess up our expected output. >>> + # So, mount with a context, and they won't be created >>> + # nfs_t is a "liberal" context so we can use it. >>> + if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then >>> + SELINUX_MOUNT_OPTIONS="-o context=system_u:object_r:nfs_t:s0" >>> + fi >>> + >> i.e. is t_nfs a context specific to a RHEL/Fedora setup, or is it a >> generic context that other distro's also define? > > I'll ask; I think this is what they told me to use last time, but I > didn't ask if it was policy-specific... our selinux guys still recommend this context as suitably generic. -Eric From SRS0+cg7x+78+fromorbit.com=david@internode.on.net Thu Feb 18 17:31:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1INVVFP084859 for ; Thu, 18 Feb 2010 17:31:32 -0600 X-ASG-Debug-ID: 1266535969-76de01250000-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 EEDA61DFD04 for ; Thu, 18 Feb 2010 15:32:49 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id 1MO7uDHRuG90HsQh for ; Thu, 18 Feb 2010 15:32:49 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14249391-1927428 for multiple; Fri, 19 Feb 2010 10:02:48 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NiFrS-0004WX-Qj; Fri, 19 Feb 2010 10:32:46 +1100 Date: Fri, 19 Feb 2010 10:32:46 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: mount xfs with a context when selinux is on Subject: Re: [PATCH] xfstests: mount xfs with a context when selinux is on Message-ID: <20100218233246.GC28392@discord.disaster> References: <4B7C3F98.50303@sandeen.net> <20100217230358.GX28392@discord.disaster> <4B7DB95B.4060506@sandeen.net> <4B7DC50D.7070507@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B7DC50D.7070507@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1266535970 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22879 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, Feb 18, 2010 at 04:54:05PM -0600, Eric Sandeen wrote: > Eric Sandeen wrote: > > Dave Chinner wrote: > >> On Wed, Feb 17, 2010 at 01:12:24PM -0600, Eric Sandeen wrote: > >>> When selinux is on, we get tons of new xattrs, which messes > >>> up all kinds of output. > >>> > >>> The simplest way out of this, for now, seems to be to just mount > >>> with a global context instead and skip writing the extra xattrs. > >>> > >>> I've been using this internally on Fedora and RHEL for a while now. > >>> > >>> Signed-off-by: Eric Sandeen > >> I know very little about selinux, so while the code changes look OK > >> I have no idea if the context change is All Goodness. > >> > >>> --- a/common.rc > >>> +++ b/common.rc > >>> @@ -47,8 +47,16 @@ _ls_l() > >>> > >>> _mount_opts() > >>> { > >>> + # SELinux adds extra xattrs which can mess up our expected output. > >>> + # So, mount with a context, and they won't be created > >>> + # nfs_t is a "liberal" context so we can use it. > >>> + if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then > >>> + SELINUX_MOUNT_OPTIONS="-o context=system_u:object_r:nfs_t:s0" > >>> + fi > >>> + > >> i.e. is t_nfs a context specific to a RHEL/Fedora setup, or is it a > >> generic context that other distro's also define? > > > > I'll ask; I think this is what they told me to use last time, but I > > didn't ask if it was policy-specific... > > our selinux guys still recommend this context as suitably generic. OK. Consider it: Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From p.lason@cyfronet.pl Fri Feb 19 00:41:38 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1J6fblX114869 for ; Fri, 19 Feb 2010 00:41:38 -0600 X-ASG-Debug-ID: 1266561775-5160001d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from srv.cyf-kr.edu.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A7D611CDC255 for ; Thu, 18 Feb 2010 22:42:55 -0800 (PST) Received: from srv.cyf-kr.edu.pl (srv.cyf-kr.edu.pl [149.156.2.11]) by cuda.sgi.com with ESMTP id KhkFYBr5AgzAzLsr for ; Thu, 18 Feb 2010 22:42:55 -0800 (PST) Received: from kinga.cyf-kr.edu.pl (kinga.cyf-kr.edu.pl [149.156.2.32]) by srv.cyf-kr.edu.pl (8.12.11.20060308/8.12.8) with ESMTP id o1J6e8G8028792; Fri, 19 Feb 2010 07:40:08 +0100 Received: from pl.localnet (pl.cyf-kr.edu.pl [149.156.9.188]) by kinga.cyf-kr.edu.pl (8.12.11/8.12.11) with ESMTP id o1J6gk9b016249 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Fri, 19 Feb 2010 07:42:47 +0100 (MET) From: Patryk Lason Reply-To: p.lason@cyfronet.pl Organization: ACK CYFRONET AGH To: Eric Sandeen X-ASG-Orig-Subj: Re: XFS + LVM + quota = disk quota exceeded Subject: Re: XFS + LVM + quota = disk quota exceeded Date: Fri, 19 Feb 2010 07:42:38 +0100 User-Agent: KMail/1.12.4 (Linux/2.6.30-gentoo-r8; KDE/4.3.5; i686; ; ) Cc: xfs@oss.sgi.com References: <201002181106.36672.p.lason@cyfronet.pl> <4B7DBADB.5020409@sandeen.net> In-Reply-To: <4B7DBADB.5020409@sandeen.net> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201002190742.39041.p.lason@cyfronet.pl> X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: by amavisd-new X-Barracuda-Connect: srv.cyf-kr.edu.pl[149.156.2.11] X-Barracuda-Start-Time: 1266561776 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.22903 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean On Thursday 18 of February 2010, Eric Sandeen wrote: > Patryk Lason wrote: > > Hello, > > > > I'm not able to touch a file on an XFS filesystem with quotas created on > > an LVM volume. > > Even if I set limits to 10TB on 2TB device. > > ... > > > From xfs_quota: > > Disk quotas for User xxx (1111) > > Filesystem Blocks Quota Limit Warn/Time > > Mounted on > > /dev/mapper/lvm--people-people > > 742740 10737418240 10737418240 00 [--------] > > /people > > > > > > # su - xxx > > $ pwd > > /people/xxx > > $ touch a > > touch: cannot touch `a': Disk quota exceeded > > > > > > What may be wrong and where? > > file quota maybe, not block quota; quota -i ? Looks like I've found it. I played with "-d" parameter for "limit" in xfs_quota. I wanted to set default quota for users, but using the following command: limit -u bsoft=5g bhard=7g isoft=0 ihard=0 -d the limit is set also for groups. That's why I couldn't created any file. I have xfsprogs-2.9.4. Regards, Patryk From BATV+599e655f3312cde1a760+2371+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 19 04:29:21 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1JATIBp126281 for ; Fri, 19 Feb 2010 04:29:20 -0600 X-ASG-Debug-ID: 1266575438-3d87032b0000-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 7C71F1E0FC1 for ; Fri, 19 Feb 2010 02:30:38 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id XTXwOQtufT98JqWK for ; Fri, 19 Feb 2010 02:30:38 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NiQ85-0006DU-Eo; Fri, 19 Feb 2010 10:30:37 +0000 Date: Fri, 19 Feb 2010 05:30:37 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: don't delete scratch loop device w/ umount -d Subject: Re: [PATCH] xfstests: don't delete scratch loop device w/ umount -d Message-ID: <20100219103037.GA21674@infradead.org> References: <4B7C51B2.9080908@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B7C51B2.9080908@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: 1266575438 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, Feb 17, 2010 at 02:29:38PM -0600, Eric Sandeen wrote: > Recent fixes to 073 added umount -d, but if we happen > to be using a scratch device on loopback, subsequent > tests get very, very unhappy when their loopback block > device goes away! True, we only need -d for the loop devices created in the test. Reviewed-by: Christoph Hellwig From BATV+599e655f3312cde1a760+2371+infradead.org+hch@bombadil.srs.infradead.org Fri Feb 19 04:29:53 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1JATrKM126329 for ; Fri, 19 Feb 2010 04:29:53 -0600 X-ASG-Debug-ID: 1266575472-169a03620000-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 EB5F713BC3A9; Fri, 19 Feb 2010 02:31:12 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id S9mlmPQeYAO3uzOj; Fri, 19 Feb 2010 02:31:12 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NiQ8d-0006Eq-Qq; Fri, 19 Feb 2010 10:31:11 +0000 Date: Fri, 19 Feb 2010 05:31:11 -0500 From: Christoph Hellwig To: Ben Myers Cc: bfields@fieldses.org, linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/2] commit_metadata export operation v6 Subject: Re: [PATCH 0/2] commit_metadata export operation v6 Message-ID: <20100219103111.GB21674@infradead.org> References: <20100217200426.13409.32688.stgit@case> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217200426.13409.32688.stgit@case> 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: 1266575472 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, Feb 17, 2010 at 02:05:05PM -0600, Ben Myers wrote: > Hey Bruce, > > Here is the latest version of the knfsd sync changes. I have addressed the > suggestions provided by Christoph, Trond, Dave, and Alex. > > In this latest version I have fixed up the few nits in the nfsd patch that > Christoph pointed out yesterday. I also have simplified the xfs patch as > suggested by Dave. Both patches looks good to me, Reviewed-by: Christoph Hellwig From Kendra@smico.com Sat Feb 20 09:34:48 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.6 required=5.0 tests=BAYES_50,FH_DATE_PAST_20XX, URI_HEX autolearn=no version=3.3.0-rupdated 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 o1KFYlLq229713 for ; Sat, 20 Feb 2010 09:34:48 -0600 X-ASG-Debug-ID: 1266680166-63c9032a0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from wifi133-240.pubaccess.auth.gr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 2BA0D13C2497 for ; Sat, 20 Feb 2010 07:36:06 -0800 (PST) Received: from wifi133-240.pubaccess.auth.gr (wifi133-240.pubaccess.auth.gr [155.207.133.240]) by cuda.sgi.com with SMTP id IHRaTV9lP44oVWMv for ; Sat, 20 Feb 2010 07:36:06 -0800 (PST) X-ASG-Orig-Subj: Hmm Subject: Hmm Message-ID: <29AFDF17D156AA92685F9E@smico.com> Date: Sat, 20 Feb 2010 15:36:03 GMT To: From: "Kendra Lyons" MIME-Version: 1.0 Content-Type: text/plain; X-Barracuda-Connect: wifi133-240.pubaccess.auth.gr[155.207.133.240] X-Barracuda-Start-Time: 1266680168 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0925 1.0000 -1.4376 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.12 X-Barracuda-Spam-Status: No, SCORE=-1.12 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=URI_HEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.23024 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.32 URI_HEX URI: URI hostname has long hexadecimal sequence X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Cheap Pharmacutical Service http://cid-33eb824743d08ee8.spaces.live.com me, and said, "Are you satisfied now?" From bfields@fieldses.org Sat Feb 20 17:35:57 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1KNZukf257487 for ; Sat, 20 Feb 2010 17:35:56 -0600 X-ASG-Debug-ID: 1266709035-337202270000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from fieldses.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F1CCA13C2C7D; Sat, 20 Feb 2010 15:37:15 -0800 (PST) Received: from fieldses.org (fieldses.org [174.143.236.118]) by cuda.sgi.com with ESMTP id BDApV9AhkI3ykPOc; Sat, 20 Feb 2010 15:37:15 -0800 (PST) Received: from bfields by fieldses.org with local (Exim 4.69) (envelope-from ) id 1Niytg-00041F-KY; Sat, 20 Feb 2010 18:38:04 -0500 Date: Sat, 20 Feb 2010 18:38:04 -0500 From: "J. Bruce Fields" To: Ben Myers Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/2] commit_metadata export operation v6 Subject: Re: [PATCH 0/2] commit_metadata export operation v6 Message-ID: <20100220233804.GA15015@fieldses.org> References: <20100217200426.13409.32688.stgit@case> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100217200426.13409.32688.stgit@case> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: fieldses.org[174.143.236.118] X-Barracuda-Start-Time: 1266709036 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23056 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, Feb 17, 2010 at 02:05:05PM -0600, Ben Myers wrote: > Hey Bruce, > > Here is the latest version of the knfsd sync changes. I have addressed the > suggestions provided by Christoph, Trond, Dave, and Alex. > > In this latest version I have fixed up the few nits in the nfsd patch that > Christoph pointed out yesterday. I also have simplified the xfs patch as > suggested by Dave. Thanks, applying. (Do you the second (xfs) patch to go in through the nfsd tree as well, or should that go in through xfs maintainers after the nfsd merge?) --b. > > Thanks, > Ben > --- > > Ben Myers (2): > commit_metadata export operation replacing nfsd_sync_dir > xfs_export_operations.commit_metadata > > > fs/nfsd/nfs4recover.c | 4 -- > fs/nfsd/vfs.c | 106 ++++++++++++++++++++--------------------- > fs/xfs/linux-2.6/xfs_export.c | 20 ++++++++ > include/linux/exportfs.h | 5 ++ > 4 files changed, 78 insertions(+), 57 deletions(-) > > -- > Signature From buchner.johannes@gmx.at Sun Feb 21 13:47:09 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated 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 o1LJl86Y059936 for ; Sun, 21 Feb 2010 13:47:09 -0600 X-ASG-Debug-ID: 1266781706-4d3902800000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.gmx.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 79F6B13C4477 for ; Sun, 21 Feb 2010 11:48:26 -0800 (PST) Received: from mail.gmx.net (mail.gmx.net [213.165.64.20]) by cuda.sgi.com with SMTP id 3RK17TEpaIRJgXP9 for ; Sun, 21 Feb 2010 11:48:26 -0800 (PST) Received: (qmail invoked by alias); 21 Feb 2010 19:48:10 -0000 Received: from static.77.154.40.188.clients.your-server.de (EHLO zauberer) [188.40.154.77] by mail.gmx.net (mp021) with SMTP; 21 Feb 2010 20:48:10 +0100 X-Authenticated: #25574588 X-Provags-ID: V01U2FsdGVkX1/zbH4MoSHzgMsIR7URNmMiTTPJ8d7aVAVIfN0YOz aJLFcvgiQOr1ur Date: Mon, 22 Feb 2010 08:47:53 +1300 From: Johannes Buchner To: Edward Shishkin Cc: Ronni Holm-Nielsen , Jens Axboe , Christoph Hellwig , Andrew Morton , ReiserFS Development List , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Artem Bityutskiy X-ASG-Orig-Subj: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 Subject: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 Message-Id: <20100222084753.0a5d613c.buchner.johannes@gmx.at> In-Reply-To: <4B68A68C.6030001@gmail.com> References: <201002020255.46920.edward.shishkin@gmail.com> <20100202081728.GA2384@infradead.org> <4B6843E9.9070600@gmail.com> <20100202194208.GD5733@kernel.dk> <5e2ec5ac1002021345g569c743dtc5ccf77cde6738ae@mail.gmail.com> <4B68A68C.6030001@gmail.com> X-Mailer: Sylpheed 2.6.0 (GTK+ 2.16.6; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; protocol="application/pgp-signature"; micalg="PGP-SHA1"; boundary="Signature=_Mon__22_Feb_2010_08_47_53_+1300__Sx+aOQ/8.uWm8.0" X-Y-GMX-Trusted: 0 X-FuHaFi: 0.57999999999999996 X-Barracuda-Connect: mail.gmx.net[213.165.64.20] X-Barracuda-Start-Time: 1266781709 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23127 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 --Signature=_Mon__22_Feb_2010_08_47_53_+1300__Sx+aOQ/8.uWm8.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi. Thank you Edward. The related bug was/is http://bugzilla.kernel.org/show_bug.cgi?id=3D14915 It'd be great if someone could solve this, as the reiser4 patch is not usable in its current state, with or without my illfated attempts to fix it. Kind regards, Johannes On Tue, 02 Feb 2010 23:26:20 +0100 Edward Shishkin wrote: > Hello everyone. >=20 > The patches 1-3 are reverses for the following -mm stuff: >=20 > http://userweb.kernel.org/~akpm/mmotm/broken-out/reiser4-fixed-null-point= er-dereference.patch > http://userweb.kernel.org/~akpm/mmotm/broken-out/reiser4-generic_sync_sb_= inodes-doesnt-exist-anymore.patch > http://userweb.kernel.org/~akpm/mmotm/broken-out/reiser4-vfs-add-super_op= erationssync_inodes-2.patch >=20 > This is incorrect attempts to adjust reiser4 to the new per-bdi > flushing model. > The authors are cc-ed, > any comments, suggestions are welcome. >=20 > Thanks, > Edward. >=20 >=20 > Ronni Holm-Nielsen wrote: > > To clarify (being a ReiserFS subscriber): > > > > patch 0, 4-6 sent to Andrew, ReiserFS, linux-fsdevel, linux-kernel, > > xfs, jens.axboe > > patch 1-3, 7 sent to Andrew, ReiserFS > > > > - Ronni > > > > On Tue, Feb 2, 2010 at 11:42 PM, Jens Axboe > > wrote: > > > > =20 > >> On Tue, Feb 02 2010, Edward Shishkin wrote: > >> =20 > >>> Christoph Hellwig wrote: > >>> =20 > >>>> I got this introduction twice, but patches 1-3 didn't make it to > >>>> any of the lists. > >>>> > >>>> > >>>> > >>>> =20 > >>> done > >>> =20 > >> Where? > >> > >> -- > >> Jens Axboe > >> > >> -- > >> To unsubscribe from this list: send the line "unsubscribe > >> reiserfs-devel" in > >> the body of a message to majordomo@vger.kernel.org > >> More majordomo info at http://vger.kernel.org/majordomo-info.html > >> > >> =20 > > > > > > > > =20 --=20 Emails k=F6nnen ge=E4ndert, gef=E4lscht und eingesehen werden. Signiere oder versch=FCssele deine Mails mit GPG. http://web.student.tuwien.ac.at/~e0625457/pgp.html --Signature=_Mon__22_Feb_2010_08_47_53_+1300__Sx+aOQ/8.uWm8.0 Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.14 (GNU/Linux) iEYEARECAAYFAkuBje4ACgkQ7X1+MfqVcr0wLgCeOJ7XVuqYHjy4twdFtIiBA82l v6MAoJSr/2YiUOOLKnaAfONO7YbTKGUc =1YuB -----END PGP SIGNATURE----- --Signature=_Mon__22_Feb_2010_08_47_53_+1300__Sx+aOQ/8.uWm8.0-- From edward.shishkin@gmail.com Sun Feb 21 14:06:00 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated 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 o1LK5xpa061101 for ; Sun, 21 Feb 2010 14:05:59 -0600 X-ASG-Debug-ID: 1266782839-0e0d00f20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-fx0-f228.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8E18C1E6603 for ; Sun, 21 Feb 2010 12:07:19 -0800 (PST) Received: from mail-fx0-f228.google.com (mail-fx0-f228.google.com [209.85.220.228]) by cuda.sgi.com with ESMTP id aZmMhCD5dfWynfCD for ; Sun, 21 Feb 2010 12:07:19 -0800 (PST) Received: by fxm28 with SMTP id 28so913086fxm.19 for ; Sun, 21 Feb 2010 12:07:18 -0800 (PST) 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:cc:subject:references:in-reply-to :content-type:content-transfer-encoding; bh=zy6v9oYvGggiB52dBovvVMZvpdTt1+Go/R5OCZMGZYk=; b=O6zMqScxS8PjciA0A9Uxd3FOp9txTzcXeVo9vnulOyj6yofDmx76bUUWgvZdVqqLmx P0Ki8R8Nc1IbX0qUMcDAVKLDMbdKBEwTQZF1PYWcg7dOViTVdaBjMRuGf5C37ysLX7Sj ZJb8ESmqNFekzlPPP77ojrbUymC26Rk2DZERg= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; b=aOCApUw2enox0oEcItRW24ZvOUydYhFMlkqaRtajshtUgR5RRI9J7DsSsFfQeNSzIQ 0As0Zxa+m8bEA089XSydZ4H7vLNT0AZOUY4L6oMcRR0Ah1qLBn36LPoJvdEo6KcHoQGC hB6+mtnBa3LOAhG1jV5BIq/ftp0OuitXdwvTw= Received: by 10.223.28.156 with SMTP id m28mr4749855fac.41.1266782835147; Sun, 21 Feb 2010 12:07:15 -0800 (PST) Received: from ?85.93.118.129? ([85.93.118.129]) by mx.google.com with ESMTPS id h2sm3582481fkh.25.2010.02.21.12.07.12 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sun, 21 Feb 2010 12:07:12 -0800 (PST) Message-ID: <4B8197FA.2080402@gmail.com> Date: Sun, 21 Feb 2010 21:30:50 +0100 From: Edward Shishkin User-Agent: Thunderbird 2.0.0.6 (X11/20070801) MIME-Version: 1.0 To: Johannes Buchner CC: Ronni Holm-Nielsen , Jens Axboe , Christoph Hellwig , Andrew Morton , ReiserFS Development List , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Artem Bityutskiy X-ASG-Orig-Subj: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 Subject: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 References: <201002020255.46920.edward.shishkin@gmail.com> <20100202081728.GA2384@infradead.org> <4B6843E9.9070600@gmail.com> <20100202194208.GD5733@kernel.dk> <5e2ec5ac1002021345g569c743dtc5ccf77cde6738ae@mail.gmail.com> <4B68A68C.6030001@gmail.com> <20100222084753.0a5d613c.buchner.johannes@gmx.at> In-Reply-To: <20100222084753.0a5d613c.buchner.johannes@gmx.at> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-fx0-f228.google.com[209.85.220.228] X-Barracuda-Start-Time: 1266782840 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.23128 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. Everything should work now (at least it works for me). Please check the latest -mm or reiser4-for-2.6.32 stuff If no problems then let's close this BZ.. Thanks, Edward. Johannes Buchner wrote: > Hi. > > Thank you Edward. The related bug was/is > http://bugzilla.kernel.org/show_bug.cgi?id=14915 > It'd be great if someone could solve this, as the reiser4 patch is > not usable in its current state, with or without my illfated attempts > to fix it. > > Kind regards, > Johannes > > On Tue, 02 Feb 2010 23:26:20 +0100 > Edward Shishkin wrote: > > >> Hello everyone. >> >> The patches 1-3 are reverses for the following -mm stuff: >> >> http://userweb.kernel.org/~akpm/mmotm/broken-out/reiser4-fixed-null-pointer-dereference.patch >> http://userweb.kernel.org/~akpm/mmotm/broken-out/reiser4-generic_sync_sb_inodes-doesnt-exist-anymore.patch >> http://userweb.kernel.org/~akpm/mmotm/broken-out/reiser4-vfs-add-super_operationssync_inodes-2.patch >> >> This is incorrect attempts to adjust reiser4 to the new per-bdi >> flushing model. >> The authors are cc-ed, >> any comments, suggestions are welcome. >> >> Thanks, >> Edward. >> >> >> Ronni Holm-Nielsen wrote: >> >>> To clarify (being a ReiserFS subscriber): >>> >>> patch 0, 4-6 sent to Andrew, ReiserFS, linux-fsdevel, linux-kernel, >>> xfs, jens.axboe >>> patch 1-3, 7 sent to Andrew, ReiserFS >>> >>> - Ronni >>> >>> On Tue, Feb 2, 2010 at 11:42 PM, Jens Axboe >>> wrote: >>> >>> >>> >>>> On Tue, Feb 02 2010, Edward Shishkin wrote: >>>> >>>> >>>>> Christoph Hellwig wrote: >>>>> >>>>> >>>>>> I got this introduction twice, but patches 1-3 didn't make it to >>>>>> any of the lists. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>> done >>>>> >>>>> >>>> Where? >>>> >>>> -- >>>> Jens Axboe >>>> >>>> -- >>>> To unsubscribe from this list: send the line "unsubscribe >>>> reiserfs-devel" in >>>> the body of a message to majordomo@vger.kernel.org >>>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>>> >>>> >>>> >>> >>> >>> > > > From bpm@sgi.com Mon Feb 22 13:51:45 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1MJpjEa150835 for ; Mon, 22 Feb 2010 13:51:45 -0600 Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 55F193040BB; Mon, 22 Feb 2010 11:53:04 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id EA4434266A1; Mon, 22 Feb 2010 13:53:53 -0600 (CST) Date: Mon, 22 Feb 2010 13:53:53 -0600 From: bpm@sgi.com To: "J. Bruce Fields" Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com, aelder@sgi.com Subject: Re: [PATCH 0/2] commit_metadata export operation v6 Message-ID: <20100222195353.GD10942@sgi.com> References: <20100217200426.13409.32688.stgit@case> <20100220233804.GA15015@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100220233804.GA15015@fieldses.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hey Bruce, On Sat, Feb 20, 2010 at 06:38:04PM -0500, J. Bruce Fields wrote: > On Wed, Feb 17, 2010 at 02:05:05PM -0600, Ben Myers wrote: > > Hey Bruce, > > > > Here is the latest version of the knfsd sync changes. I have addressed the > > suggestions provided by Christoph, Trond, Dave, and Alex. > > > > In this latest version I have fixed up the few nits in the nfsd patch that > > Christoph pointed out yesterday. I also have simplified the xfs patch as > > suggested by Dave. > > Thanks, applying. > > (Do you the second (xfs) patch to go in through the nfsd tree as well, > or should that go in through xfs maintainers after the nfsd merge?) I chatted with Alex. It sounds like the best thing is for both patches to go in through the nfsd tree since they need to go in order. Thanks, Ben From bfields@fieldses.org Mon Feb 22 19:12:11 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1N1CARt170471 for ; Mon, 22 Feb 2010 19:12:11 -0600 X-ASG-Debug-ID: 1266887612-36ea00650000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from fieldses.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ADD7E1CEB66A; Mon, 22 Feb 2010 17:13:32 -0800 (PST) Received: from fieldses.org (fieldses.org [174.143.236.118]) by cuda.sgi.com with ESMTP id NpBBdJHMkZPsnCJY; Mon, 22 Feb 2010 17:13:32 -0800 (PST) Received: from bfields by fieldses.org with local (Exim 4.69) (envelope-from ) id 1NjjM1-0004e2-H6; Mon, 22 Feb 2010 20:14:25 -0500 Date: Mon, 22 Feb 2010 20:14:25 -0500 From: "J. Bruce Fields" To: bpm@sgi.com Cc: linux-nfs@vger.kernel.org, xfs@oss.sgi.com, aelder@sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/2] commit_metadata export operation v6 Subject: Re: [PATCH 0/2] commit_metadata export operation v6 Message-ID: <20100223011425.GD17409@fieldses.org> References: <20100217200426.13409.32688.stgit@case> <20100220233804.GA15015@fieldses.org> <20100222195353.GD10942@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100222195353.GD10942@sgi.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: fieldses.org[174.143.236.118] X-Barracuda-Start-Time: 1266887612 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23221 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, Feb 22, 2010 at 01:53:53PM -0600, bpm@sgi.com wrote: > Hey Bruce, > > On Sat, Feb 20, 2010 at 06:38:04PM -0500, J. Bruce Fields wrote: > > On Wed, Feb 17, 2010 at 02:05:05PM -0600, Ben Myers wrote: > > > Hey Bruce, > > > > > > Here is the latest version of the knfsd sync changes. I have addressed the > > > suggestions provided by Christoph, Trond, Dave, and Alex. > > > > > > In this latest version I have fixed up the few nits in the nfsd patch that > > > Christoph pointed out yesterday. I also have simplified the xfs patch as > > > suggested by Dave. > > > > Thanks, applying. > > > > (Do you the second (xfs) patch to go in through the nfsd tree as well, > > or should that go in through xfs maintainers after the nfsd merge?) > > I chatted with Alex. It sounds like the best thing is for both patches > to go in through the nfsd tree since they need to go in order. OK, thanks, committed.--b. From lists@nerdbynature.de Wed Feb 24 01:11:36 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,RCVD_IN_BRBL autolearn=no version=3.3.0-rupdated 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 o1O7BafJ009688 for ; Wed, 24 Feb 2010 01:11:36 -0600 X-ASG-Debug-ID: 1266995576-030c025d0000-NocioJ 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 B62081CF4217 for ; Tue, 23 Feb 2010 23:12:56 -0800 (PST) Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.186]) by cuda.sgi.com with ESMTP id E3SEMh6wrgPOswKq for ; Tue, 23 Feb 2010 23:12:56 -0800 (PST) Received: from bogon.housecafe.de (ppp-88-217-31-131.dynamic.mnet-online.de [88.217.31.131]) by mrelayeu.kundenserver.de (node=mreu1) with ESMTP (Nemesis) id 0Mefts-1O8Iuv0LX6-00OOkJ; Wed, 24 Feb 2010 08:12:42 +0100 Received: from localhost ([127.0.0.1]) by bogon.housecafe.de with esmtp (Exim 4.69) (envelope-from ) id 1NkBQG-0000RC-JG; Wed, 24 Feb 2010 08:12:40 +0100 Date: Tue, 23 Feb 2010 23:12:40 -0800 (PST) From: Christian Kujau To: Johannes Buchner cc: Edward Shishkin , Ronni Holm-Nielsen , Jens Axboe , Christoph Hellwig , Andrew Morton , ReiserFS Development List , linux-fsdevel@vger.kernel.org, LKML , xfs@oss.sgi.com, Artem Bityutskiy X-ASG-Orig-Subj: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 Subject: Re: [patch 0/7] per-bdi flushing model improvements. reiser4 In-Reply-To: <20100222084753.0a5d613c.buchner.johannes@gmx.at> Message-ID: References: <201002020255.46920.edward.shishkin@gmail.com> <20100202081728.GA2384@infradead.org> <4B6843E9.9070600@gmail.com> <20100202194208.GD5733@kernel.dk> <5e2ec5ac1002021345g569c743dtc5ccf77cde6738ae@mail.gmail.com> <4B68A68C.6030001@gmail.com> <20100222084753.0a5d613c.buchner.johannes@gmx.at> User-Agent: Alpine 2.01 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Provags-ID: V01U2FsdGVkX1+eAgy56R7OxOgd4MeQ6vxeXV00fmmWo+wELGD j8hWreUcnyMuuoe2Jrd+oSNb6Epza+ewvOCp3gqf0Dw0kA9vVI PJXeAB6svDEqxCTEsTVlQ== X-Barracuda-Connect: moutng.kundenserver.de[212.227.126.186] X-Barracuda-Start-Time: 1266995577 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23323 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, 22 Feb 2010 at 08:47, Johannes Buchner wrote: > It'd be great if someone could solve this, as the reiser4 patch is > not usable in its current state, with or without my illfated attempts > to fix it. FWIW, I'm running Linus' latest -git with refs/heads/reiser4 on top[0], no issues during 2.6.33-git so far. Try it, if you don't like manually applying patches either :-) Christian. [0] http://git.zen-kernel.org/?p=kernel/zen.git;a=shortlog;h=refs/heads/reiser4 -- BOFH excuse #275: Bit rot From Joe.Allen@citrix.com Wed Feb 24 04:43:21 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX, HTML_MESSAGE autolearn=no version=3.3.0-rupdated 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 o1OAhLSA019723 for ; Wed, 24 Feb 2010 04:43:21 -0600 X-ASG-Debug-ID: 1267008282-3a01027e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from SBAPEXCH05.ad.corp.expertcity.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3DAFB1CF4BE1 for ; Wed, 24 Feb 2010 02:44:42 -0800 (PST) Received: from SBAPEXCH05.ad.corp.expertcity.com (sbapexch05.ad.corp.expertcity.com [216.219.126.165]) by cuda.sgi.com with ESMTP id 60avyxrmpe2kmCbZ for ; Wed, 24 Feb 2010 02:44:42 -0800 (PST) Received: from SBAPEXCH05.ad.corp.expertcity.com ([10.1.6.25]) by sbapexch05 ([10.1.6.25]) with mapi; Wed, 24 Feb 2010 02:45:02 -0800 From: Joe Allen To: "xfs@oss.sgi.com" Date: Wed, 24 Feb 2010 02:44:37 -0800 X-ASG-Orig-Subj: xfs_growfs failure.... Subject: xfs_growfs failure.... Thread-Topic: xfs_growfs failure.... Thread-Index: Acq1PlxOfPAzeVG5SamHV/cX/Lni0A== Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US x-ems-proccessed: oXeMnjjQeARSDE4UqeV8aA== x-ems-stamp: 3N3Mb4xuI2aNDcU5okLv+g== Content-Type: multipart/alternative; boundary="_000_E51793F9F4FAD54A8C1774933D8E500006B64A2687sbapexch05_" MIME-Version: 1.0 X-Barracuda-Connect: sbapexch05.ad.corp.expertcity.com[216.219.126.165] X-Barracuda-Start-Time: 1267008283 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.23334 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_E51793F9F4FAD54A8C1774933D8E500006B64A2687sbapexch05_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable I am in some difficulty here over a 100TB filesystem that Is now unusable after a xfs_growfs command. Is there someone that might help assist? #mount: /dev/logfs-sessions/sessions: can't read superblock Filesystem "dm-61": Disabling barriers, not supported with external log dev= ice attempt to access beyond end of device dm-61: rw=3D0, want=3D238995038208, limit=3D215943192576 I/O error in filesystem ("dm-61") meta-data dev dm-61 block 0x37a536dfff = ("xfs_read_buf") error 5 buf count 512 XFS: size check 2 failed Filesystem "dm-61": Disabling barriers, not supported with external log dev= ice attempt to access beyond end of device xfs_repair -n basically looks for superblocks (phase 1 I guess ) f= or a long time. I'm letting it run, but not much hope. I'm hesitant to run xfs_repair -L or without the -n flag for fear of makin= g it worse. I've run the following command to try to inspect please let me know if there's anything else that might help determine if th= ere's anything I can do to recover... -bash-3.1# xfs_check -l /dev/logfs-sessions/logdev /dev/logfs-sessions/sess= ions ERROR: The filesystem has valuable metadata changes in a log which needs to be replayed. Mount the filesystem to replay the log, and unmount it before re-running xfs_check. If you are unable to mount the filesystem, then use the xfs_repair -L option to destroy the log and attempt a repair. Note that destroying the log may cause corruption -- please attempt a mount of the filesystem before doing this. -bash-3.1# xfs_db -r -c 'sb 0' -c p /dev/logfs-sessions/sessions magicnum =3D 0x58465342 blocksize =3D 4096 dblocks =3D 29874379776 rblocks =3D 0 rextents =3D 0 uuid =3D fc8bdf76-d962-43c1-ae60-b85f378978a6 logstart =3D 0 rootino =3D 2048 rbmino =3D 2049 rsumino =3D 2050 rextsize =3D 384 agblocks =3D 268435328 agcount =3D 112 rbmblocks =3D 0 logblocks =3D 32000 versionnum =3D 0x3184 sectsize =3D 512 inodesize =3D 256 inopblock =3D 16 fname =3D "\000\000\000\000\000\000\000\000\000\000\000\000" blocklog =3D 12 sectlog =3D 9 inodelog =3D 8 inopblog =3D 4 agblklog =3D 28 rextslog =3D 0 inprogress =3D 0 imax_pct =3D 25 icount =3D 7291520 ifree =3D 8514 fdblocks =3D 6623185597 frextents =3D 0 uquotino =3D 0 gquotino =3D 0 qflags =3D 0 flags =3D 0 shared_vn =3D 0 inoalignmt =3D 2 unit =3D 128 width =3D 384 dirblklog =3D 0 logsectlog =3D 0 logsectsize =3D 0 logsunit =3D 0 features2 =3D 0 -bash-3.1# xfs_db -r -c 'sb 2' -c p /dev/logfs-sessions/sessions magicnum =3D 0x58465342 blocksize =3D 4096 dblocks =3D 24111418368 rblocks =3D 0 rextents =3D 0 uuid =3D fc8bdf76-d962-43c1-ae60-b85f378978a6 logstart =3D 0 rootino =3D 2048 rbmino =3D 2049 rsumino =3D 2050 rextsize =3D 384 agblocks =3D 268435328 agcount =3D 90 rbmblocks =3D 0 logblocks =3D 32000 versionnum =3D 0x3184 sectsize =3D 512 inodesize =3D 256 inopblock =3D 16 fname =3D "\000\000\000\000\000\000\000\000\000\000\000\000" blocklog =3D 12 sectlog =3D 9 inodelog =3D 8 inopblog =3D 4 agblklog =3D 28 rextslog =3D 0 inprogress =3D 0 imax_pct =3D 25 icount =3D 7291008 ifree =3D 8765 fdblocks =3D 862328436 frextents =3D 0 uquotino =3D 0 gquotino =3D 0 qflags =3D 0 flags =3D 0 shared_vn =3D 0 inoalignmt =3D 2 unit =3D 128 width =3D 384 dirblklog =3D 0 logsectlog =3D 0 logsectsize =3D 0 logsunit =3D 0 features2 =3D 0 --_000_E51793F9F4FAD54A8C1774933D8E500006B64A2687sbapexch05_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

I am in some difficulty here over a 100TB filesystem t= hat

Is now unusable after a xfs_growfs command.

 

Is there someone that might help assist?

 

#mount: /dev/logfs-sessions/sessions: can't read super= block

 

Filesystem "dm-61": Disabling barriers, not supported with external log device

attempt to access beyond end of device

dm-61: rw=3D0, want=3D238995038208, limit=3D2159431925= 76

 

I/O error in filesystem ("dm-61") meta-data = dev dm-61 block 0x37a536dfff       ("xfs_read_buf") error 5 buf count 512

XFS: size check 2 failed

Filesystem "dm-61": Disabling barriers, not supported with external log device

attempt to access beyond end of device

 

xfs_repair –n <device> basically looks for superblocks (phase 1 I guess ) for a long time. I’m letting it run, b= ut not much hope.

 

I’m hesitant to run xfs_repair –L  or= without the –n flag for fear of making it worse.

 

I’ve run the following command to try to inspect=

 

please let me know if there’s anything else that= might help determine if there’s anything I can do to recover…

 

-bash-3.1# xfs_check -l /dev/logfs-sessions/logdev /dev/logfs-sessions/sessions

ERROR: The filesystem has valuable metadata changes in= a log which needs to

be replayed.  Mount the filesystem to replay the = log, and unmount it before

re-running xfs_check.  If you are unable to mount= the filesystem, then use

the xfs_repair -L option to destroy the log and attemp= t a repair.

Note that destroying the log may cause corruption -- p= lease attempt a mount

of the filesystem before doing this.

 

-bash-3.1# xfs_db -r -c 'sb 0' -c p /dev/logfs-sessions/sessions

magicnum =3D 0x58465342

blocksize =3D 4096

dblocks =3D 29874379776

rblocks =3D 0

rextents =3D 0

uuid =3D fc8bdf76-d962-43c1-ae60-b85f378978a6

logstart =3D 0

rootino =3D 2048

rbmino =3D 2049

rsumino =3D 2050

rextsize =3D 384

agblocks =3D 268435328

agcount =3D 112

rbmblocks =3D 0

logblocks =3D 32000

versionnum =3D 0x3184

sectsize =3D 512

inodesize =3D 256

inopblock =3D 16

fname =3D "\000\000\000\000\000\000\000\000\000\000\000\000"

blocklog =3D 12

sectlog =3D 9

inodelog =3D 8

inopblog =3D 4

agblklog =3D 28

rextslog =3D 0

inprogress =3D 0

imax_pct =3D 25

icount =3D 7291520

ifree =3D 8514

fdblocks =3D 6623185597

frextents =3D 0

uquotino =3D 0

gquotino =3D 0

qflags =3D 0

flags =3D 0

shared_vn =3D 0

inoalignmt =3D 2

unit =3D 128

width =3D 384

dirblklog =3D 0

logsectlog =3D 0

logsectsize =3D 0

logsunit =3D 0

features2 =3D 0

 

-bash-3.1# xfs_db -r -c 'sb 2' -c p /dev/logfs-sessions/sessions

magicnum =3D 0x58465342

blocksize =3D 4096

dblocks =3D 24111418368

rblocks =3D 0

rextents =3D 0

uuid =3D fc8bdf76-d962-43c1-ae60-b85f378978a6

logstart =3D 0

rootino =3D 2048

rbmino =3D 2049

rsumino =3D 2050

rextsize =3D 384

agblocks =3D 268435328

agcount =3D 90

rbmblocks =3D 0

logblocks =3D 32000

versionnum =3D 0x3184

sectsize =3D 512

inodesize =3D 256

inopblock =3D 16

fname =3D "\000\000\000\000\000\000\000\000\000\000\000\000"

blocklog =3D 12

sectlog =3D 9

inodelog =3D 8

inopblog =3D 4

agblklog =3D 28

rextslog =3D 0

inprogress =3D 0

imax_pct =3D 25

icount =3D 7291008

ifree =3D 8765

fdblocks =3D 862328436

frextents =3D 0

uquotino =3D 0

gquotino =3D 0

qflags =3D 0

flags =3D 0

shared_vn =3D 0

inoalignmt =3D 2

unit =3D 128

width =3D 384

dirblklog =3D 0

logsectlog =3D 0

logsectsize =3D 0

logsunit =3D 0

features2 =3D 0

 

 

 

 

--_000_E51793F9F4FAD54A8C1774933D8E500006B64A2687sbapexch05_-- From SRS0+uv1J+84+fromorbit.com=david@internode.on.net Wed Feb 24 05:53:02 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1OBr2vU022669 for ; Wed, 24 Feb 2010 05:53:02 -0600 X-ASG-Debug-ID: 1267012463-768a029d0000-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 DF6731F0BAF for ; Wed, 24 Feb 2010 03:54:23 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id VasPI3vmdJbZhuSP for ; Wed, 24 Feb 2010 03:54:23 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14750856-1927428 for multiple; Wed, 24 Feb 2010 22:24:22 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NkFoq-0002jN-Io; Wed, 24 Feb 2010 22:54:20 +1100 Date: Wed, 24 Feb 2010 22:54:20 +1100 From: Dave Chinner To: Joe Allen Cc: "xfs@oss.sgi.com" X-ASG-Orig-Subj: Re: xfs_growfs failure.... Subject: Re: xfs_growfs failure.... Message-ID: <20100224115420.GK16175@discord.disaster> References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1267012464 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23339 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, Feb 24, 2010 at 02:44:37AM -0800, Joe Allen wrote: > I am in some difficulty here over a 100TB filesystem that > Is now unusable after a xfs_growfs command. > > Is there someone that might help assist? > > #mount: /dev/logfs-sessions/sessions: can't read superblock > > Filesystem "dm-61": Disabling barriers, not supported with external log device > attempt to access beyond end of device > dm-61: rw=0, want=238995038208, limit=215943192576 You've grown the filesystem to 238995038208 ѕectors (111.3TiB), but the underlying device is only 215943192576 sectors (100.5TiB) in size. I'm assuming that you're trying to mount the filesystem after a reboot? I make this assumption as growfs is an online operation and won't grow if the underlying block device has not already been grown. For a subsequent mount to fail with the underlying device being too small, something about the underlying block device had to change.... What kernel version and xfsprogs version are you using? > xfs_repair -n basically looks for superblocks (phase 1 I > guess ) for a long time. I'm letting it run, but not much hope. Don't repair the filesystem - there is nothing wrong with it unless you start modifying stuff. What you need to do is fix the underlying device to bring it back to the size it was supposed to be at when the grow operation was run. What does /proc/partitions tell you about the size of dm-61? does that report the correct size, and if it does, what is it? > I'm hesitant to run xfs_repair -L or without the -n flag for fear of making it worse. Good - don't run anything like that until you sort out whether the underlying device is correctly sized or not. > -bash-3.1# xfs_db -r -c 'sb 0' -c p /dev/logfs-sessions/sessions > magicnum = 0x58465342 > blocksize = 4096 > dblocks = 29874379776 XFS definitely thinks it is 111.3TiB in size. > rblocks = 0 > rextents = 0 > uuid = fc8bdf76-d962-43c1-ae60-b85f378978a6 > logstart = 0 > rootino = 2048 > rbmino = 2049 > rsumino = 2050 > rextsize = 384 > agblocks = 268435328 > agcount = 112 112 AGs of 1TiB each - that confirms the grow succeeded and it was able to write metadata to disk between 100 and 111 TiB without errors being reported. That implies the block device must have been that big at some point... > rbmblocks = 0 > logblocks = 32000 > versionnum = 0x3184 > 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 = 28 > rextslog = 0 > inprogress = 0 > imax_pct = 25 > icount = 7291520 > ifree = 8514 > fdblocks = 6623185597 With 24.5TiB of free space > -bash-3.1# xfs_db -r -c 'sb 2' -c p /dev/logfs-sessions/sessions > magicnum = 0x58465342 > blocksize = 4096 > dblocks = 24111418368 That's 89.9TiB... > rblocks = 0 > rextents = 0 > uuid = fc8bdf76-d962-43c1-ae60-b85f378978a6 > logstart = 0 > rootino = 2048 > rbmino = 2049 > rsumino = 2050 > rextsize = 384 > agblocks = 268435328 > agcount = 90 And 90 AGs. That tells me the filesystem was created as a 90TiB filesystem. Can you tell me if you attempted to grow from 90TiB to 100TiB or from 100TiB to 110TiB? There were bugs at one point in both the userspace grow code and the kernel code that resulted in bad grows (hence the need to know the versions this occurred on and what you were actually attempting to do), but these problems can usually be fixed up with some xfs_db magic. Cheers, Dave. -- Dave Chinner david@fromorbit.com From pg_mh@sabi.co.UK Wed Feb 24 11:09:35 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.2 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1OH9Y82036890 for ; Wed, 24 Feb 2010 11:09:35 -0600 X-ASG-Debug-ID: 1267031453-136703470000-ps1ADW X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ty.sabi.co.UK (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C3D5B1523A9B for ; Wed, 24 Feb 2010 09:10:54 -0800 (PST) Received: from ty.sabi.co.UK (82-69-39-138.dsl.in-addr.zen.co.uk [82.69.39.138]) by cuda.sgi.com with ESMTP id L35Gu4yseTlBHj7M for ; Wed, 24 Feb 2010 09:10:54 -0800 (PST) Received: from from [127.0.0.1] (helo=tree.ty.sabi.co.uk) by ty.sabi.co.UK with esmtp(Exim 4.63 #1) id 1NkKkn-0001bX-Nx for ; Wed, 24 Feb 2010 17:10:29 +0000 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <19333.23937.956036.716@tree.ty.sabi.co.uk> Date: Wed, 24 Feb 2010 17:10:25 +0000 X-Face: SMJE]JPYVBO-9UR%/8d'mG.F!@.,l@c[f'[%S8'BZIcbQc3/">GrXDwb#;fTRGNmHr^JFb SAptvwWc,0+z+~p~"Gdr4H$(|N(yF(wwCM2bW0~U?HPEE^fkPGx^u[*[yV.gyB!hDOli}EF[\cW*S H&spRGFL}{`bj1TaD^l/"[ msn( /TH#THs{Hpj>)]f> X-ASG-Orig-Subj: Re: xfs_growfs failure.... Subject: Re: xfs_growfs failure.... In-Reply-To: References: X-Mailer: VM 8.0.12-devo-585 under 21.5 (beta27) XEmacs Lucid (i686-redhat-linux) From: pg_xf2@xf2.for.sabi.co.UK (Peter Grandi) X-Disclaimer: This message contains only personal opinions X-Barracuda-Connect: 82-69-39-138.dsl.in-addr.zen.co.uk[82.69.39.138] X-Barracuda-Start-Time: 1267031456 X-Barracuda-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.23359 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 > I am in some difficulty here over a 100TB filesystem Shrewd idea! Because 'fsck' takes no time and memory, so the bigger the filesystem the better! ;-). > that Is now unusable after a xfs_growfs command. [ ... ] Wondering how long it took to backup 100TB; but of course doing a 'grow' is guaranteed to be error free, so there :-). > attempt to access beyond end of device dm-61: rw=0, > want=238995038208, limit=215943192576 It looks like the underlying DM logical volume is smaller than the new size of the filesystem, which is strange as 'xfs_growfs' is supposed to fetch the size of the underlying block device if none is specified explicitly on the command line. The different is about 10% or 10TB, so it is far from trivial. Looking at the superblock dumps there are some pretty huge discrepancies, -bash-3.1# xfs_db -r -c 'sb 0' -c p /dev/logfs-sessions/sessions magicnum = 0x58465342 blocksize = 4096 dblocks = 29874379776 rblocks = 0 rextents = 0 uuid = fc8bdf76-d962-43c1-ae60-b85f378978a6 logstart = 0 rootino = 2048 rbmino = 2049 rsumino = 2050 rextsize = 384 agblocks = 268435328 agcount = 112 [ ... ] -bash-3.1# xfs_db -r -c 'sb 2' -c p /dev/logfs-sessions/sessions magicnum = 0x58465342 blocksize = 4096 dblocks = 24111418368 rblocks = 0 rextents = 0 uuid = fc8bdf76-d962-43c1-ae60-b85f378978a6 logstart = 0 rootino = 2048 rbmino = 2049 rsumino = 2050 rextsize = 384 agblocks = 268435328 agcount = 90 [ ... ] The 'dblocks' field is rather different, even if the 'uuid' and 'agblocks' is the same, and 'agcount' is also rather different. In SB 0 'dblocks' 29874379776 means size 238995038208, which is value of 'want' above. The products of 'agcount' and 'agblocks' fit with the sizes. It looks like that the filesystem was "grown" from ~92TiB to ~114TiB on a storage device that is reported as ~103TiB long. Again, very strange. My impression is that not enough history/context has been provided to enable a good guess at what has happened and how to undo the consequent damage. From Jason.Vagalatos@citrixonline.com Wed Feb 24 11:55:03 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX, HTML_MESSAGE autolearn=no version=3.3.0-rupdated 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 o1OHt342038815 for ; Wed, 24 Feb 2010 11:55:03 -0600 X-ASG-Debug-ID: 1267034184-4dc3004a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from SBAPEXCH05.ad.corp.expertcity.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C93BE1F20C7 for ; Wed, 24 Feb 2010 09:56:25 -0800 (PST) Received: from SBAPEXCH05.ad.corp.expertcity.com (sbapexch05.ad.corp.expertcity.com [216.219.126.165]) by cuda.sgi.com with ESMTP id 6iEfGcr6WiJIVpdX for ; Wed, 24 Feb 2010 09:56:25 -0800 (PST) Received: from SBAPEXCH05.ad.corp.expertcity.com ([10.1.6.25]) by sbapexch05 ([10.1.6.25]) with mapi; Wed, 24 Feb 2010 09:56:44 -0800 From: Jason Vagalatos To: "david@fromorbit.com" CC: "xfs@oss.sgi.com" , Joe Allen Date: Wed, 24 Feb 2010 09:56:40 -0800 X-ASG-Orig-Subj: RE: xfs_growfs failure.... Subject: RE: xfs_growfs failure.... Thread-Topic: xfs_growfs failure.... Thread-Index: Acq1dQcNWxvN0I7rQVKCkqd4cDXmogAAt4kw Message-ID: References: <20100224115420.GK16175@discord.disaster> <5A88945F-EAA8-4678-8ADA-7700E3FF607B@citrixonline.com> In-Reply-To: <5A88945F-EAA8-4678-8ADA-7700E3FF607B@citrixonline.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US x-ems-proccessed: oXeMnjjQeARSDE4UqeV8aA== x-ems-stamp: gn3dKra+ollpjqLWgbux4Q== Content-Type: multipart/alternative; boundary="_000_DD534F7C25BFA14FB18E6D603135D7EA0A11DAC21Csbapexch05_" MIME-Version: 1.0 X-Barracuda-Connect: sbapexch05.ad.corp.expertcity.com[216.219.126.165] X-Barracuda-Start-Time: 1267034185 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.23362 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_DD534F7C25BFA14FB18E6D603135D7EA0A11DAC21Csbapexch05_ Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 DQpIaSBEYXZpZCwNCknigJltIHBpY2tpbmcgdGhpcyB1cCBmcm9tIEpvZS4gIEnigJlsbCBhdHRl bXB0IHRvIGFuc3dlciB5b3VyIHF1ZXN0aW9ucy4NCg0KVGhlIHVuZGVybHlpbmcgZGV2aWNlIHdh cyBncm93biBmcm9tIDg5VEIgdG8gMTAwVEIuICBUaGUgeGZzIGZpbGVzeXN0ZW0gdXRpbGl6ZXMg YW4gZXh0ZXJuYWwgbG9nZGV2LiAgQWZ0ZXIgdGhlIHVuZGVybHlpbmcgZGV2aWNlIHdhcyBncm93 biBieSBhcHByb3ggMTFUQiwgd2UgcmFuIHhmc19ncm93ZnMg4oCTZCA8ZmlsZXN5c3RlbV9tb3Vu dF9wb2ludD4uICBUaGlzIGNvbW1hbmQgY29tcGxldGVkIHdpdGhvdXQgZXJyb3JzLCBidXQgdGhl IGZpbGVzeXN0ZW0gaW1tZWRpYXRlbHkgd2VudCBpbnRvIGEgYmFkIHN0YXRlLg0KDQpXZSBhcmUg cnVubmluZyB4ZnNwcm9ncy0yLjguMjAtMS5lbDUuY2VudG9zIG9uIFJIRUwgS2VybmVsIExpbnV4 IDIuNi4xOC01My4xLjE5LmVsNSAjMSBTTVAgVHVlIEFwciAyMiAwMzowMToxMCBFRFQgMjAwOCB4 ODZfNjQgeDg2XzY0IHg4Nl82NCBHTlUvTGludXgNCg0KV2Uga2lsbGVkIHRoZSB4ZnNfcmVwYWly IGJlZm9yZSBpdCB3YXMgYWJsZSB0byBmaW5kIGEgc2Vjb25kYXJ5IHN1cGVyYmxvY2sgYW5kIG1h a2UgdGhpbmdzIHdvcnNlLg0KDQpDdXJyZW50bHkgdGhlIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNl IGlzOg0KDQotLS0gTG9naWNhbCB2b2x1bWUgLS0tDQogIExWIE5hbWUgICAgICAgICAgICAgICAg L2Rldi9sb2dmcy1zZXNzaW9ucy9zZXNzaW9ucw0KICBWRyBOYW1lICAgICAgICAgICAgICAgIGxv Z2ZzLXNlc3Npb25zDQogIExWIFVVSUQgICAgICAgICAgICAgICAgMzJUUmJlLU9JRHctdTRhSC1m VW1ELUZMbVUtNWpSdi1NYVZZRGcNCiAgTFYgV3JpdGUgQWNjZXNzICAgICAgICByZWFkL3dyaXRl DQogIExWIFN0YXR1cyAgICAgICAgICAgICAgYXZhaWxhYmxlDQogICMgb3BlbiAgICAgICAgICAg ICAgICAgMA0KICBMViBTaXplICAgICAgICAgICAgICAgIDEwMC41NiBUQg0KICBDdXJyZW50IExF ICAgICAgICAgICAgIDI2MzYwMjUzDQogIFNlZ21lbnRzICAgICAgICAgICAgICAgMTgNCiAgQWxs b2NhdGlvbiAgICAgICAgICAgICBpbmhlcml0DQogIFJlYWQgYWhlYWQgc2VjdG9ycyAgICAgMA0K ICBCbG9jayBkZXZpY2UgICAgICAgICAgIDI1Mzo2MQ0KDQpBdCB0aGlzIHBvaW50IHdoYXQgYXJl IG91ciBvcHRpb25zIHRvIHJlY292ZXIgdGhpcyBmaWxlc3lzdGVtPw0KDQpUaGFuayB5b3UgZm9y IGFueSBoZWxwIHlvdSBtYXkgYmUgYWJsZSB0byBwcm92aWRlLg0KDQpKYXNvbiBWYWdhbGF0b3MN Cg0KRnJvbTogSm9lIEFsbGVuDQpTZW50OiBXZWRuZXNkYXksIEZlYnJ1YXJ5IDI0LCAyMDEwIDk6 MTUgQU0NClRvOiBKYXNvbiBWYWdhbGF0b3MNClN1YmplY3Q6IEZ3ZDogeGZzX2dyb3dmcyBmYWls dXJlLi4uLg0KDQoNCndpZXJkLiBoZSBzZWVtcyB0byBiZSBpbXBseWluZyB3ZSB3ZXJlIGF0IDEx MHRiIGFuZCBzdHVmZiBpcyB3cml0dGVuIHRoZXJlLiBJIGd1ZXNzIHdlIG5lZWQgdG8gYmUgMTAw JSBzdXJlIG9mIHRoZSBzcGFjZSBhbGxvY2F0ZWQuIHdlcmUgdGhlIG90aGVyIEx1bnMgZXZlciBh dHRhY2hlZCA/DQoNCg0KDQoNCkJlZ2luIGZvcndhcmRlZCBtZXNzYWdlOg0KRnJvbTogRGF2ZSBD aGlubmVyIDxkYXZpZEBmcm9tb3JiaXQuY29tPG1haWx0bzpkYXZpZEBmcm9tb3JiaXQuY29tPj5u Zw0KRGF0ZTogRmVicnVhcnkgMjQsIDIwMTAgMzo1NDoyMCBBTSBQU1QNClRvOiBKb2UgQWxsZW4g PEpvZS5BbGxlbkBjaXRyaXguY29tPG1haWx0bzpKb2UuQWxsZW5AY2l0cml4LmNvbT4+DQpDYzog Inhmc0Bvc3Muc2dpLmNvbTxtYWlsdG86eGZzQG9zcy5zZ2kuY29tPiIgPHhmc0Bvc3Muc2dpLmNv bTxtYWlsdG86eGZzQG9zcy5zZ2kuY29tPj4NClN1YmplY3Q6IFJlOiB4ZnNfZ3Jvd2ZzIGZhaWx1 cmUuLi4uDQpPbiBXZWQsIEZlYiAyNCwgMjAxMCBhdCAwMjo0NDozN0FNIC0wODAwLCBKb2UgQWxs ZW4gd3JvdGU6DQoNCkkgYW0gaW4gc29tZSBkaWZmaWN1bHR5IGhlcmUgb3ZlciBhIDEwMFRCIGZp bGVzeXN0ZW0gdGhhdA0KSXMgbm93IHVudXNhYmxlIGFmdGVyIGEgeGZzX2dyb3dmcyBjb21tYW5k Lg0KDQpJcyB0aGVyZSBzb21lb25lIHRoYXQgbWlnaHQgaGVscCBhc3Npc3Q/DQoNCiNtb3VudDog L2Rldi9sb2dmcy1zZXNzaW9ucy9zZXNzaW9uczogY2FuJ3QgcmVhZCBzdXBlcmJsb2NrDQoNCkZp bGVzeXN0ZW0gImRtLTYxIjogRGlzYWJsaW5nIGJhcnJpZXJzLCBub3Qgc3VwcG9ydGVkIHdpdGgg ZXh0ZXJuYWwgbG9nIGRldmljZQ0KYXR0ZW1wdCB0byBhY2Nlc3MgYmV5b25kIGVuZCBvZiBkZXZp Y2UNCmRtLTYxOiBydz0wLCB3YW50PTIzODk5NTAzODIwOCwgbGltaXQ9MjE1OTQzMTkyNTc2DQoN CllvdSd2ZSBncm93biB0aGUgZmlsZXN5c3RlbSB0byAyMzg5OTUwMzgyMDgg0ZVlY3RvcnMgKDEx MS4zVGlCKSwNCmJ1dCB0aGUgdW5kZXJseWluZyBkZXZpY2UgaXMgb25seSAyMTU5NDMxOTI1NzYg c2VjdG9ycyAoMTAwLjVUaUIpDQppbiBzaXplLg0KDQpJJ20gYXNzdW1pbmcgdGhhdCB5b3UncmUg dHJ5aW5nIHRvIG1vdW50IHRoZSBmaWxlc3lzdGVtIGFmdGVyIGENCnJlYm9vdD8gSSBtYWtlIHRo aXMgYXNzdW1wdGlvbiBhcyBncm93ZnMgaXMgYW4gb25saW5lIG9wZXJhdGlvbiBhbmQNCndvbid0 IGdyb3cgaWYgdGhlIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNlIGhhcyBub3QgYWxyZWFkeSBiZWVu DQpncm93bi4gRm9yIGEgc3Vic2VxdWVudCBtb3VudCB0byBmYWlsIHdpdGggdGhlIHVuZGVybHlp bmcgZGV2aWNlDQpiZWluZyB0b28gc21hbGwsIHNvbWV0aGluZyBhYm91dCB0aGUgdW5kZXJseWlu ZyBibG9jaw0KZGV2aWNlIGhhZCB0byBjaGFuZ2UuLi4uDQoNCldoYXQga2VybmVsIHZlcnNpb24g YW5kIHhmc3Byb2dzIHZlcnNpb24gYXJlIHlvdSB1c2luZz8NCg0KDQp4ZnNfcmVwYWlyIC1uIDxk ZXZpY2U+IGJhc2ljYWxseSBsb29rcyBmb3Igc3VwZXJibG9ja3MgKHBoYXNlIDEgSQ0KZ3Vlc3Mg KSBmb3IgYSBsb25nIHRpbWUuIEknbSBsZXR0aW5nIGl0IHJ1biwgYnV0IG5vdCBtdWNoIGhvcGUu DQoNCkRvbid0IHJlcGFpciB0aGUgZmlsZXN5c3RlbSAtIHRoZXJlIGlzIG5vdGhpbmcgd3Jvbmcg d2l0aCBpdA0KdW5sZXNzIHlvdSBzdGFydCBtb2RpZnlpbmcgc3R1ZmYuIFdoYXQgeW91IG5lZWQg dG8gZG8gaXMgZml4IHRoZQ0KdW5kZXJseWluZyBkZXZpY2UgdG8gYnJpbmcgaXQgYmFjayB0byB0 aGUgc2l6ZSBpdCB3YXMgc3VwcG9zZWQgdG8NCmJlIGF0IHdoZW4gdGhlIGdyb3cgb3BlcmF0aW9u IHdhcyBydW4uDQoNCldoYXQgZG9lcyAvcHJvYy9wYXJ0aXRpb25zIHRlbGwgeW91IGFib3V0IHRo ZSBzaXplIG9mIGRtLTYxPyBkb2VzDQp0aGF0IHJlcG9ydCB0aGUgY29ycmVjdCBzaXplLCBhbmQg aWYgaXQgZG9lcywgd2hhdCBpcyBpdD8NCg0KDQpJJ20gaGVzaXRhbnQgdG8gcnVuIHhmc19yZXBh aXIgLUwgIG9yIHdpdGhvdXQgdGhlIC1uIGZsYWcgZm9yIGZlYXIgb2YgbWFraW5nIGl0IHdvcnNl Lg0KDQpHb29kIC0gZG9uJ3QgcnVuIGFueXRoaW5nIGxpa2UgdGhhdCB1bnRpbCB5b3Ugc29ydCBv dXQgd2hldGhlciB0aGUNCnVuZGVybHlpbmcgZGV2aWNlIGlzIGNvcnJlY3RseSBzaXplZCBvciBu b3QuDQoNCg0KLWJhc2gtMy4xIyB4ZnNfZGIgLXIgLWMgJ3NiIDAnIC1jIHAgL2Rldi9sb2dmcy1z ZXNzaW9ucy9zZXNzaW9ucw0KbWFnaWNudW0gPSAweDU4NDY1MzQyDQpibG9ja3NpemUgPSA0MDk2 DQpkYmxvY2tzID0gMjk4NzQzNzk3NzYNCg0KWEZTIGRlZmluaXRlbHkgdGhpbmtzIGl0IGlzIDEx MS4zVGlCIGluIHNpemUuDQoNCg0KcmJsb2NrcyA9IDANCnJleHRlbnRzID0gMA0KdXVpZCA9IGZj OGJkZjc2LWQ5NjItNDNjMS1hZTYwLWI4NWYzNzg5NzhhNg0KbG9nc3RhcnQgPSAwDQpyb290aW5v ID0gMjA0OA0KcmJtaW5vID0gMjA0OQ0KcnN1bWlubyA9IDIwNTANCnJleHRzaXplID0gMzg0DQph Z2Jsb2NrcyA9IDI2ODQzNTMyOA0KYWdjb3VudCA9IDExMg0KDQoxMTIgQUdzIG9mIDFUaUIgZWFj aCAtIHRoYXQgY29uZmlybXMgdGhlIGdyb3cgc3VjY2VlZGVkIGFuZCBpdCB3YXMNCmFibGUgdG8g d3JpdGUgbWV0YWRhdGEgdG8gZGlzayBiZXR3ZWVuIDEwMCBhbmQgMTExIFRpQiB3aXRob3V0DQpl cnJvcnMgYmVpbmcgcmVwb3J0ZWQuIFRoYXQgaW1wbGllcyB0aGUgYmxvY2sgZGV2aWNlIG11c3Qg aGF2ZSBiZWVuDQp0aGF0IGJpZyBhdCBzb21lIHBvaW50Li4uDQoNCg0KcmJtYmxvY2tzID0gMA0K bG9nYmxvY2tzID0gMzIwMDANCnZlcnNpb25udW0gPSAweDMxODQNCnNlY3RzaXplID0gNTEyDQpp bm9kZXNpemUgPSAyNTYNCmlub3BibG9jayA9IDE2DQpmbmFtZSA9ICJcMDAwXDAwMFwwMDBcMDAw XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiDQpibG9ja2xvZyA9IDEyDQpzZWN0bG9n ID0gOQ0KaW5vZGVsb2cgPSA4DQppbm9wYmxvZyA9IDQNCmFnYmxrbG9nID0gMjgNCnJleHRzbG9n ID0gMA0KaW5wcm9ncmVzcyA9IDANCmltYXhfcGN0ID0gMjUNCmljb3VudCA9IDcyOTE1MjANCmlm cmVlID0gODUxNA0KZmRibG9ja3MgPSA2NjIzMTg1NTk3DQoNCldpdGggMjQuNVRpQiBvZiBmcmVl IHNwYWNlDQoNCg0KLWJhc2gtMy4xIyB4ZnNfZGIgLXIgLWMgJ3NiIDInIC1jIHAgL2Rldi9sb2dm cy1zZXNzaW9ucy9zZXNzaW9ucw0KbWFnaWNudW0gPSAweDU4NDY1MzQyDQpibG9ja3NpemUgPSA0 MDk2DQpkYmxvY2tzID0gMjQxMTE0MTgzNjgNCg0KVGhhdCdzIDg5LjlUaUIuLi4NCg0KDQpyYmxv Y2tzID0gMA0KcmV4dGVudHMgPSAwDQp1dWlkID0gZmM4YmRmNzYtZDk2Mi00M2MxLWFlNjAtYjg1 ZjM3ODk3OGE2DQpsb2dzdGFydCA9IDANCnJvb3Rpbm8gPSAyMDQ4DQpyYm1pbm8gPSAyMDQ5DQpy c3VtaW5vID0gMjA1MA0KcmV4dHNpemUgPSAzODQNCmFnYmxvY2tzID0gMjY4NDM1MzI4DQphZ2Nv dW50ID0gOTANCg0KQW5kIDkwIEFHcy4gVGhhdCB0ZWxscyBtZSB0aGUgZmlsZXN5c3RlbSB3YXMg Y3JlYXRlZCBhcyBhIDkwVGlCDQpmaWxlc3lzdGVtLiBDYW4geW91IHRlbGwgbWUgaWYgeW91IGF0 dGVtcHRlZCB0byBncm93IGZyb20gOTBUaUIgdG8NCjEwMFRpQiBvciBmcm9tIDEwMFRpQiB0byAx MTBUaUI/ICBUaGVyZSB3ZXJlIGJ1Z3MgYXQgb25lIHBvaW50IGluDQpib3RoIHRoZSB1c2Vyc3Bh Y2UgZ3JvdyBjb2RlIGFuZCB0aGUga2VybmVsIGNvZGUgdGhhdCByZXN1bHRlZCBpbg0KYmFkIGdy b3dzIChoZW5jZSB0aGUgbmVlZCB0byBrbm93IHRoZSB2ZXJzaW9ucyB0aGlzIG9jY3VycmVkIG9u DQphbmQgd2hhdCB5b3Ugd2VyZSBhY3R1YWxseSBhdHRlbXB0aW5nIHRvIGRvKSwgYnV0IHRoZXNl IHByb2JsZW1zDQpjYW4gdXN1YWxseSBiZSBmaXhlZCB1cCB3aXRoIHNvbWUgeGZzX2RiIG1hZ2lj Lg0KDQpDaGVlcnMsDQoNCkRhdmUuDQotLQ0KRGF2ZSBDaGlubmVyDQpkYXZpZEBmcm9tb3JiaXQu Y29tPG1haWx0bzpkYXZpZEBmcm9tb3JiaXQuY29tPg0K --_000_DD534F7C25BFA14FB18E6D603135D7EA0A11DAC21Csbapexch05_ Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6eD0idXJuOnNjaGVtYXMtbWljcm9z b2Z0LWNvbTpvZmZpY2U6ZXhjZWwiIHhtbG5zOnA9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206 b2ZmaWNlOnBvd2VycG9pbnQiIHhtbG5zOmE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2Zm aWNlOmFjY2VzcyIgeG1sbnM6ZHQ9InV1aWQ6QzJGNDEwMTAtNjVCMy0xMWQxLUEyOUYtMDBBQTAw QzE0ODgyIiB4bWxuczpzPSJ1dWlkOkJEQzZFM0YwLTZEQTMtMTFkMS1BMkEzLTAwQUEwMEMxNDg4 MiIgeG1sbnM6cnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206cm93c2V0IiB4bWxuczp6PSIj Um93c2V0U2NoZW1hIiB4bWxuczpiPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpw dWJsaXNoZXIiIHhtbG5zOnNzPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpzcHJl YWRzaGVldCIgeG1sbnM6Yz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6Y29tcG9u ZW50OnNwcmVhZHNoZWV0IiB4bWxuczpvZGM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2Zm aWNlOm9kYyIgeG1sbnM6b2E9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOmFjdGl2 YXRpb24iIHhtbG5zOmh0bWw9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiIHhtbG5z OnE9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiB4bWxuczpydGM9 Imh0dHA6Ly9taWNyb3NvZnQuY29tL29mZmljZW5ldC9jb25mZXJlbmNpbmciIHhtbG5zOkQ9IkRB VjoiIHhtbG5zOlJlcGw9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vcmVwbC8iIHhtbG5z Om10PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3NoYXJlcG9pbnQvc29hcC9tZWV0aW5n cy8iIHhtbG5zOngyPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9leGNlbC8y MDAzL3htbCIgeG1sbnM6cHBkYT0iaHR0cDovL3d3dy5wYXNzcG9ydC5jb20vTmFtZVNwYWNlLnhz ZCIgeG1sbnM6b2lzPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3NoYXJlcG9pbnQvc29h cC9vaXMvIiB4bWxuczpkaXI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vc2hhcmVwb2lu dC9zb2FwL2RpcmVjdG9yeS8iIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3ht bGRzaWcjIiB4bWxuczpkc3A9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vc2hhcmVwb2lu dC9kc3AiIHhtbG5zOnVkYz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kYXRhL3VkYyIg eG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6c3ViPSJo dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3NoYXJlcG9pbnQvc29hcC8yMDAyLzEvYWxlcnRz LyIgeG1sbnM6ZWM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jIyIgeG1sbnM6c3A9 Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vc2hhcmVwb2ludC8iIHhtbG5zOnNwcz0iaHR0 cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9zaGFyZXBvaW50L3NvYXAvIiB4bWxuczp4c2k9Imh0 dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp1ZGNzPSJodHRw Oi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RhdGEvdWRjL3NvYXAiIHhtbG5zOnVkY3hmPSJodHRw Oi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RhdGEvdWRjL3htbGZpbGUiIHhtbG5zOnVkY3AycD0i aHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kYXRhL3VkYy9wYXJ0dG9wYXJ0IiB4bWxuczp3 Zj0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9zaGFyZXBvaW50L3NvYXAvd29ya2Zsb3cv IiB4bWxuczpkc3NzPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L2Rp Z3NpZy1zZXR1cCIgeG1sbnM6ZHNzaT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZp Y2UvMjAwNi9kaWdzaWciIHhtbG5zOm1kc3NpPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0 cy5vcmcvcGFja2FnZS8yMDA2L2RpZ2l0YWwtc2lnbmF0dXJlIiB4bWxuczptdmVyPSJodHRwOi8v c2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvbWFya3VwLWNvbXBhdGliaWxpdHkvMjAwNiIgeG1s bnM6bT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4 bWxuczptcmVscz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAw Ni9yZWxhdGlvbnNoaXBzIiB4bWxuczpzcHdwPSJodHRwOi8vbWljcm9zb2Z0LmNvbS9zaGFyZXBv aW50L3dlYnBhcnRwYWdlcyIgeG1sbnM6ZXgxMnQ9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5j b20vZXhjaGFuZ2Uvc2VydmljZXMvMjAwNi90eXBlcyIgeG1sbnM6ZXgxMm09Imh0dHA6Ly9zY2hl bWFzLm1pY3Jvc29mdC5jb20vZXhjaGFuZ2Uvc2VydmljZXMvMjAwNi9tZXNzYWdlcyIgeG1sbnM6 cHB0c2w9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vc2hhcmVwb2ludC9zb2FwL1NsaWRl TGlicmFyeS8iIHhtbG5zOnNwc2w9Imh0dHA6Ly9taWNyb3NvZnQuY29tL3dlYnNlcnZpY2VzL1No YXJlUG9pbnRQb3J0YWxTZXJ2ZXIvUHVibGlzaGVkTGlua3NTZXJ2aWNlIiB4bWxuczpaPSJ1cm46 c2NoZW1hcy1taWNyb3NvZnQtY29tOiIgeG1sbnM6c3Q9IiYjMTsiIHhtbG5zPSJodHRwOi8vd3d3 LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCg0KPGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PUNvbnRl bnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPG1ldGEgbmFtZT1H ZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTIgKGZpbHRlcmVkIG1lZGl1bSkiPg0K PHN0eWxlPg0KPCEtLQ0KIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8NCiBAZm9udC1mYWNlDQoJe2Zv bnQtZmFtaWx5OiJDYW1icmlhIE1hdGgiOw0KCXBhbm9zZS0xOjIgNCA1IDMgNSA0IDYgMyAyIDQ7 fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseTpDYWxpYnJpOw0KCXBhbm9zZS0xOjIgMTUgNSAy IDIgMiA0IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6VGFob21hOw0KCXBhbm9z ZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0O30NCiAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLw0KIHAu TXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwNCgl7bWFyZ2luOjBpbjsNCglt YXJnaW4tYm90dG9tOi4wMDAxcHQ7DQoJZm9udC1zaXplOjEyLjBwdDsNCglmb250LWZhbWlseToi VGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30NCmE6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsNCgl7 bXNvLXN0eWxlLXByaW9yaXR5Ojk5Ow0KCWNvbG9yOmJsdWU7DQoJdGV4dC1kZWNvcmF0aW9uOnVu ZGVybGluZTt9DQphOnZpc2l0ZWQsIHNwYW4uTXNvSHlwZXJsaW5rRm9sbG93ZWQNCgl7bXNvLXN0 eWxlLXByaW9yaXR5Ojk5Ow0KCWNvbG9yOnB1cnBsZTsNCgl0ZXh0LWRlY29yYXRpb246dW5kZXJs aW5lO30NCnNwYW4uRW1haWxTdHlsZTE3DQoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsLXJlcGx5 Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQoJY29sb3I6IzFGNDk3RDt9 DQouTXNvQ2hwRGVmYXVsdA0KCXttc28tc3R5bGUtdHlwZTpleHBvcnQtb25seTsNCglmb250LXNp emU6MTAuMHB0O30NCkBwYWdlIFNlY3Rpb24xDQoJe3NpemU6OC41aW4gMTEuMGluOw0KCW1hcmdp bjoxLjBpbiAxLjBpbiAxLjBpbiAxLjBpbjt9DQpkaXYuU2VjdGlvbjENCgl7cGFnZTpTZWN0aW9u MTt9DQotLT4NCjwvc3R5bGU+DQo8IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4NCiA8bzpzaGFwZWRl ZmF1bHRzIHY6ZXh0PSJlZGl0IiBzcGlkbWF4PSIxMDI2IiAvPg0KPC94bWw+PCFbZW5kaWZdLS0+ PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+DQogPG86c2hhcGVsYXlvdXQgdjpleHQ9ImVkaXQiPg0K ICA8bzppZG1hcCB2OmV4dD0iZWRpdCIgZGF0YT0iMSIgLz4NCiA8L286c2hhcGVsYXlvdXQ+PC94 bWw+PCFbZW5kaWZdLS0+DQo8L2hlYWQ+DQoNCjxib2R5IGJnY29sb3I9d2hpdGUgbGFuZz1FTi1V UyBsaW5rPWJsdWUgdmxpbms9cHVycGxlPg0KDQo8ZGl2IGNsYXNzPVNlY3Rpb24xPg0KDQo8cCBj bGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6 IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPjxvOnA+Jm5ic3A7PC9vOnA+ PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6 MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQpjb2xvcjojMUY0OTdE Jz5IaSBEYXZpZCw8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48 c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMt c2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+SeKAmW0gcGlja2luZyB0aGlzIHVwIGZyb20gSm9lLsKg IEnigJlsbCBhdHRlbXB0IHRvIGFuc3dlciB5b3VyDQpxdWVzdGlvbnMuPG86cD48L286cD48L3Nw YW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4w cHQ7Zm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPjxv OnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0 eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7 DQpjb2xvcjojMUY0OTdEJz5UaGUgdW5kZXJseWluZyBkZXZpY2Ugd2FzIGdyb3duIGZyb20gODlU QiB0byAxMDBUQi7CoCBUaGUgeGZzDQpmaWxlc3lzdGVtIHV0aWxpemVzIGFuIGV4dGVybmFsIGxv Z2Rldi7CoCBBZnRlciB0aGUgdW5kZXJseWluZyBkZXZpY2Ugd2FzIGdyb3duDQpieSBhcHByb3gg MTFUQiwgd2UgcmFuIHhmc19ncm93ZnMg4oCTZCAmbHQ7ZmlsZXN5c3RlbV9tb3VudF9wb2ludCZn dDsuwqAgVGhpcw0KY29tbWFuZCBjb21wbGV0ZWQgd2l0aG91dCBlcnJvcnMsIGJ1dCB0aGUgZmls ZXN5c3RlbSBpbW1lZGlhdGVseSB3ZW50IGludG8gYQ0KYmFkIHN0YXRlLjxvOnA+PC9vOnA+PC9z cGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTEu MHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQpjb2xvcjojMUY0OTdEJz48 bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBz dHlsZT0nZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYi Ow0KY29sb3I6IzFGNDk3RCc+V2UgYXJlIHJ1bm5pbmcgeGZzcHJvZ3MtMi44LjIwLTEuZWw1LmNl bnRvcyBvbiBSSEVMIEtlcm5lbCBMaW51eA0KMi42LjE4LTUzLjEuMTkuZWw1ICMxIFNNUCBUdWUg QXByIDIyIDAzOjAxOjEwIEVEVCAyMDA4IHg4Nl82NCB4ODZfNjQgeDg2XzY0DQpHTlUvTGludXg8 bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0n Zm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29s b3I6IzFGNDk3RCc+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29O b3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6IkNhbGlicmki LCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPldlIGtpbGxlZCB0aGUgeGZzX3JlcGFpciBi ZWZvcmUgaXQgd2FzIGFibGUgdG8gZmluZCBhIHNlY29uZGFyeSBzdXBlcmJsb2NrDQphbmQgbWFr ZSB0aGluZ3Mgd29yc2UuPG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3Jt YWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6IkNhbGlicmkiLCJz YW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4N Cg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQt ZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQpjb2xvcjojMUY0OTdEJz5DdXJyZW50bHkg dGhlIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNlIGlzOjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0K PHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFt aWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQpjb2xvcjojMUY0OTdEJz48bzpwPiZuYnNwOzwv bzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1z aXplOjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFG NDk3RCc+LS0tIExvZ2ljYWwgdm9sdW1lIC0tLTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAg Y2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5 OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQpjb2xvcjojMUY0OTdEJz7CoCBMViBOYW1lwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC9kZXYvbG9nZnMtc2Vzc2lvbnMvc2Vzc2lvbnM8bzpw PjwvbzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9u dC1zaXplOjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6 IzFGNDk3RCc+wqAgVkcgTmFtZcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsb2dmcy1z ZXNzaW9uczxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFu IHN0eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJp ZiI7DQpjb2xvcjojMUY0OTdEJz7CoCBMViBVVUlEwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIDMyVFJiZS1PSUR3LXU0YUgtZlVtRC1GTG1VLTVqUnYtTWFWWURnPG86cD48L286cD48L3Nw YW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4w cHQ7Zm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPsKg IExWIFdyaXRlIEFjY2Vzc8KgwqDCoMKgwqDCoMKgIHJlYWQvd3JpdGU8bzpwPjwvbzpwPjwvc3Bh bj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBw dDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+wqAg TFYgU3RhdHVzwqDCoCDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYXZhaWxhYmxlPG86cD48L286cD48 L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTox MS4wcHQ7Zm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0Qn PsKgICMgb3BlbsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDA8bzpwPjwvbzpwPjwv c3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEx LjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+ wqAgTFYgU2l6ZcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAxMDAuNTYgVEI8bzpwPjwv bzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1z aXplOjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFG NDk3RCc+wqAgQ3VycmVudCBMRcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAyNjM2MDI1MzxvOnA+ PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdmb250 LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQpjb2xvcjoj MUY0OTdEJz7CoCBTZWdtZW50c8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMTg8bzpwPjwv bzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1z aXplOjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFG NDk3RCc+wqAgQWxsb2NhdGlvbsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbmhlcml0PG86cD48 L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQt c2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMx RjQ5N0QnPsKgIFJlYWQgYWhlYWQgc2VjdG9yc8KgwqDCoMKgIDA8bzpwPjwvbzpwPjwvc3Bhbj48 L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBwdDtm b250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+wqAgQmxv Y2sgZGV2aWNlwqDCoMKgwqDCoMKgwqDCoMKgwqAgMjUzOjYxPG86cD48L286cD48L3NwYW4+PC9w Pg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9u dC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPjxvOnA+Jm5i c3A7PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdm b250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQpjb2xv cjojMUY0OTdEJz5BdCB0aGlzIHBvaW50IHdoYXQgYXJlIG91ciBvcHRpb25zIHRvIHJlY292ZXIg dGhpcyBmaWxlc3lzdGVtPzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9y bWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwi c2Fucy1zZXJpZiI7DQpjb2xvcjojMUY0OTdEJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+ DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBwdDtmb250 LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+VGhhbmsgeW91 IGZvciBhbnkgaGVscCB5b3UgbWF5IGJlIGFibGUgdG8gcHJvdmlkZS48bzpwPjwvbzpwPjwvc3Bh bj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBw dDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+PG86 cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KDQo8ZGl2Pg0KDQo8ZGl2Pg0KDQo8cCBjbGFzcz1N c29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9t LWFsdDphdXRvJz48Yj48c3Bhbg0Kc3R5bGU9J2ZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2Vy aWYiO2NvbG9yOiM0RDRGNTMnPkphc29uIFZhZ2FsYXRvczxvOnA+PC9vOnA+PC9zcGFuPjwvYj48 L3A+DQoNCjwvZGl2Pg0KDQo8L2Rpdj4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxl PSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQpj b2xvcjojMUY0OTdEJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQoNCjxkaXY+DQoNCjxk aXYgc3R5bGU9J2JvcmRlcjpub25lO2JvcmRlci10b3A6c29saWQgI0I1QzRERiAxLjBwdDtwYWRk aW5nOjMuMHB0IDBpbiAwaW4gMGluJz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxiPjxzcGFuIHN0 eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJUYWhvbWEiLCJzYW5zLXNlcmlmIic+ RnJvbTo8L3NwYW4+PC9iPjxzcGFuDQpzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWls eToiVGFob21hIiwic2Fucy1zZXJpZiInPiBKb2UgQWxsZW4gPGJyPg0KPGI+U2VudDo8L2I+IFdl ZG5lc2RheSwgRmVicnVhcnkgMjQsIDIwMTAgOToxNSBBTTxicj4NCjxiPlRvOjwvYj4gSmFzb24g VmFnYWxhdG9zPGJyPg0KPGI+U3ViamVjdDo8L2I+IEZ3ZDogeGZzX2dyb3dmcyBmYWlsdXJlLi4u LjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0KPC9kaXY+DQoNCjwvZGl2Pg0KDQo8cCBjbGFzcz1N c29Ob3JtYWw+PG86cD4mbmJzcDs8L286cD48L3A+DQoNCjxkaXY+DQoNCjxwIGNsYXNzPU1zb05v cm1hbD48YnI+DQp3aWVyZC4gaGUgc2VlbXMgdG8gYmUgaW1wbHlpbmcgd2Ugd2VyZSBhdCAxMTB0 YiBhbmQgc3R1ZmYgaXMgd3JpdHRlbiB0aGVyZS4gSQ0KZ3Vlc3Mgd2UgbmVlZCB0byBiZSAxMDAl IHN1cmUgb2YgdGhlIHNwYWNlIGFsbG9jYXRlZC4gd2VyZSB0aGUgb3RoZXIgTHVucyBldmVyDQph dHRhY2hlZCA/PG86cD48L286cD48L3A+DQoNCjwvZGl2Pg0KDQo8ZGl2Pg0KDQo8cCBjbGFzcz1N c29Ob3JtYWw+PG86cD4mbmJzcDs8L286cD48L3A+DQoNCjxkaXY+DQoNCjxwIGNsYXNzPU1zb05v cm1hbD48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCg0KPC9kaXY+DQoNCjxkaXY+DQoNCjxwIGNsYXNz PU1zb05vcm1hbD48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCg0KPC9kaXY+DQoNCjwvZGl2Pg0KDQo8 ZGl2Pg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1ib3R0b206MTIuMHB0Jz48 YnI+DQpCZWdpbiBmb3J3YXJkZWQgbWVzc2FnZTo8bzpwPjwvbzpwPjwvcD4NCg0KPC9kaXY+DQoN CjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQn Pg0KDQo8ZGl2Pg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1ib3R0b206MTIu MHB0Jz48Yj5Gcm9tOjwvYj4gRGF2ZSBDaGlubmVyICZsdDs8YQ0KaHJlZj0ibWFpbHRvOmRhdmlk QGZyb21vcmJpdC5jb20iPmRhdmlkQGZyb21vcmJpdC5jb208L2E+Jmd0O25nJm5ic3A7PGJyPg0K PGI+RGF0ZTo8L2I+IEZlYnJ1YXJ5IDI0LCAyMDEwIDM6NTQ6MjAgQU0gUFNUPGJyPg0KPGI+VG86 PC9iPiBKb2UgQWxsZW4gJmx0OzxhIGhyZWY9Im1haWx0bzpKb2UuQWxsZW5AY2l0cml4LmNvbSI+ Sm9lLkFsbGVuQGNpdHJpeC5jb208L2E+Jmd0Ozxicj4NCjxiPkNjOjwvYj4gJnF1b3Q7PGEgaHJl Zj0ibWFpbHRvOnhmc0Bvc3Muc2dpLmNvbSI+eGZzQG9zcy5zZ2kuY29tPC9hPiZxdW90Ow0KJmx0 OzxhIGhyZWY9Im1haWx0bzp4ZnNAb3NzLnNnaS5jb20iPnhmc0Bvc3Muc2dpLmNvbTwvYT4mZ3Q7 PGJyPg0KPGI+U3ViamVjdDo8L2I+IDxiPlJlOiB4ZnNfZ3Jvd2ZzIGZhaWx1cmUuLi4uPC9iPjxv OnA+PC9vOnA+PC9wPg0KDQo8L2Rpdj4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBz dHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPGRpdj4NCg0K PHAgY2xhc3M9TXNvTm9ybWFsPk9uIFdlZCwgRmViIDI0LCAyMDEwIGF0IDAyOjQ0OjM3QU0gLTA4 MDAsIEpvZSBBbGxlbiB3cm90ZTo8YnI+DQo8YnI+DQo8bzpwPjwvbzpwPjwvcD4NCg0KPHAgY2xh c3M9TXNvTm9ybWFsPkkgYW0gaW4gc29tZSBkaWZmaWN1bHR5IGhlcmUgb3ZlciBhIDEwMFRCIGZp bGVzeXN0ZW0gdGhhdDxvOnA+PC9vOnA+PC9wPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2lu LXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPklz IG5vdyB1bnVzYWJsZSBhZnRlciBhIHhmc19ncm93ZnMgY29tbWFuZC48bzpwPjwvbzpwPjwvcD4N Cg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDtt YXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxvOnA+Jm5ic3A7PC9v OnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9w OjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+SXMgdGhl cmUgc29tZW9uZSB0aGF0IG1pZ2h0IGhlbHAgYXNzaXN0PzxvOnA+PC9vOnA+PC9wPg0KDQo8L2Js b2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1i b3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PG86cD4mbmJzcDs8L286cD48L3A+ DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7 bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD4jbW91bnQ6IC9kZXYv bG9nZnMtc2Vzc2lvbnMvc2Vzc2lvbnM6IGNhbid0IHJlYWQgc3VwZXJibG9jazxvOnA+PC9vOnA+ PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUu MHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PG86cD4mbmJz cDs8L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdp bi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5G aWxlc3lzdGVtICZxdW90O2RtLTYxJnF1b3Q7OiBEaXNhYmxpbmcgYmFycmllcnMsIG5vdA0Kc3Vw cG9ydGVkIHdpdGggZXh0ZXJuYWwgbG9nIGRldmljZTxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2Nr cXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0 b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+YXR0ZW1wdCB0byBhY2Nlc3MgYmV5b25k IGVuZCBvZiBkZXZpY2U8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2tx dW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAg Y2xhc3M9TXNvTm9ybWFsPmRtLTYxOiBydz0wLCB3YW50PTIzODk5NTAzODIwOCwgbGltaXQ9MjE1 OTQzMTkyNTc2PG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPHAgY2xhc3M9TXNv Tm9ybWFsPjxicj4NCllvdSd2ZSBncm93biB0aGUgZmlsZXN5c3RlbSB0byAyMzg5OTUwMzgyMDgg 0ZVlY3RvcnMgKDExMS4zVGlCKSw8YnI+DQpidXQgdGhlIHVuZGVybHlpbmcgZGV2aWNlIGlzIG9u bHkgMjE1OTQzMTkyNTc2IHNlY3RvcnMgKDEwMC41VGlCKTxicj4NCmluIHNpemUuPGJyPg0KPGJy Pg0KSSdtIGFzc3VtaW5nIHRoYXQgeW91J3JlIHRyeWluZyB0byBtb3VudCB0aGUgZmlsZXN5c3Rl bSBhZnRlciBhPGJyPg0KcmVib290PyBJIG1ha2UgdGhpcyBhc3N1bXB0aW9uIGFzIGdyb3dmcyBp cyBhbiBvbmxpbmUgb3BlcmF0aW9uIGFuZDxicj4NCndvbid0IGdyb3cgaWYgdGhlIHVuZGVybHlp bmcgYmxvY2sgZGV2aWNlIGhhcyBub3QgYWxyZWFkeSBiZWVuPGJyPg0KZ3Jvd24uIEZvciBhIHN1 YnNlcXVlbnQgbW91bnQgdG8gZmFpbCB3aXRoIHRoZSB1bmRlcmx5aW5nIGRldmljZTxicj4NCmJl aW5nIHRvbyBzbWFsbCwgc29tZXRoaW5nIGFib3V0IHRoZSB1bmRlcmx5aW5nIGJsb2NrPGJyPg0K ZGV2aWNlIGhhZCB0byBjaGFuZ2UuLi4uPGJyPg0KPGJyPg0KV2hhdCBrZXJuZWwgdmVyc2lvbiBh bmQgeGZzcHJvZ3MgdmVyc2lvbiBhcmUgeW91IHVzaW5nPzxicj4NCjxicj4NCjxicj4NCjxvOnA+ PC9vOnA+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+eGZzX3JlcGFpciAtbiAmbHQ7ZGV2aWNl Jmd0OyBiYXNpY2FsbHkgbG9va3MgZm9yIHN1cGVyYmxvY2tzDQoocGhhc2UgMSBJPG86cD48L286 cD48L3A+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0 b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+Z3Vlc3MgKSBmb3IgYSBsb25nIHRpbWUu IEknbSBsZXR0aW5nIGl0IHJ1biwgYnV0IG5vdCBtdWNoDQpob3BlLjxvOnA+PC9vOnA+PC9wPg0K DQo8L2Jsb2NrcXVvdGU+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48YnI+DQpEb24ndCByZXBhaXIg dGhlIGZpbGVzeXN0ZW0gLSB0aGVyZSBpcyBub3RoaW5nIHdyb25nIHdpdGggaXQ8YnI+DQp1bmxl c3MgeW91IHN0YXJ0IG1vZGlmeWluZyBzdHVmZi4gV2hhdCB5b3UgbmVlZCB0byBkbyBpcyBmaXgg dGhlPGJyPg0KdW5kZXJseWluZyBkZXZpY2UgdG8gYnJpbmcgaXQgYmFjayB0byB0aGUgc2l6ZSBp dCB3YXMgc3VwcG9zZWQgdG88YnI+DQpiZSBhdCB3aGVuIHRoZSBncm93IG9wZXJhdGlvbiB3YXMg cnVuLjxicj4NCjxicj4NCldoYXQgZG9lcyAvcHJvYy9wYXJ0aXRpb25zIHRlbGwgeW91IGFib3V0 IHRoZSBzaXplIG9mIGRtLTYxPyBkb2VzPGJyPg0KdGhhdCByZXBvcnQgdGhlIGNvcnJlY3Qgc2l6 ZSwgYW5kIGlmIGl0IGRvZXMsIHdoYXQgaXMgaXQ/PGJyPg0KPGJyPg0KPGJyPg0KPG86cD48L286 cD48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5JJ20gaGVzaXRhbnQgdG8gcnVuIHhmc19yZXBh aXIgLUwgJm5ic3A7b3Igd2l0aG91dCB0aGUgLW4NCmZsYWcgZm9yIGZlYXIgb2YgbWFraW5nIGl0 IHdvcnNlLjxvOnA+PC9vOnA+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PGJyPg0KR29vZCAt IGRvbid0IHJ1biBhbnl0aGluZyBsaWtlIHRoYXQgdW50aWwgeW91IHNvcnQgb3V0IHdoZXRoZXIg dGhlPGJyPg0KdW5kZXJseWluZyBkZXZpY2UgaXMgY29ycmVjdGx5IHNpemVkIG9yIG5vdC48YnI+ DQo8YnI+DQo8YnI+DQo8bzpwPjwvbzpwPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPi1iYXNo LTMuMSMgeGZzX2RiIC1yIC1jICdzYiAwJyAtYyBwDQovZGV2L2xvZ2ZzLXNlc3Npb25zL3Nlc3Np b25zPG86cD48L286cD48L3A+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0 O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+bWFnaWNudW0gPSAw eDU4NDY1MzQyPG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUg c3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNz PU1zb05vcm1hbD5ibG9ja3NpemUgPSA0MDk2PG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90 ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1 LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5kYmxvY2tzID0gMjk4NzQzNzk3NzY8bzpwPjwv bzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PGJyPg0KWEZT IGRlZmluaXRlbHkgdGhpbmtzIGl0IGlzIDExMS4zVGlCIGluIHNpemUuPGJyPg0KPGJyPg0KPGJy Pg0KPG86cD48L286cD48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5yYmxvY2tzID0gMDxvOnA+ PC9vOnA+PC9wPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4t Ym90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPnJleHRlbnRzID0gMDxvOnA+PC9v OnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9w OjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+dXVpZCA9 IGZjOGJkZjc2LWQ5NjItNDNjMS1hZTYwLWI4NWYzNzg5NzhhNjxvOnA+PC9vOnA+PC9wPg0KDQo8 L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdp bi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+bG9nc3RhcnQgPSAwPG86cD48 L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10 b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5yb290 aW5vID0gMjA0ODxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3Rl IHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFz cz1Nc29Ob3JtYWw+cmJtaW5vID0gMjA0OTxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+ DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4w cHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+cnN1bWlubyA9IDIwNTA8bzpwPjwvbzpwPjwvcD4N Cg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDtt YXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPnJleHRzaXplID0gMzg0 PG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21h cmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1h bD5hZ2Jsb2NrcyA9IDI2ODQzNTMyODxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoN CjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQn Pg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+YWdjb3VudCA9IDExMjxvOnA+PC9vOnA+PC9wPg0KDQo8 L2Jsb2NrcXVvdGU+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48YnI+DQoxMTIgQUdzIG9mIDFUaUIg ZWFjaCAtIHRoYXQgY29uZmlybXMgdGhlIGdyb3cgc3VjY2VlZGVkIGFuZCBpdCB3YXM8YnI+DQph YmxlIHRvIHdyaXRlIG1ldGFkYXRhIHRvIGRpc2sgYmV0d2VlbiAxMDAgYW5kIDExMSBUaUIgd2l0 aG91dDxicj4NCmVycm9ycyBiZWluZyByZXBvcnRlZC4gVGhhdCBpbXBsaWVzIHRoZSBibG9jayBk ZXZpY2UgbXVzdCBoYXZlIGJlZW48YnI+DQp0aGF0IGJpZyBhdCBzb21lIHBvaW50Li4uPGJyPg0K PGJyPg0KPGJyPg0KPG86cD48L286cD48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5yYm1ibG9j a3MgPSAwPG86cD48L286cD48L3A+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUu MHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+bG9nYmxvY2tz ID0gMzIwMDA8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBz dHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9 TXNvTm9ybWFsPnZlcnNpb25udW0gPSAweDMxODQ8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1 b3RlPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9t OjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPnNlY3RzaXplID0gNTEyPG86cD48L286cD48 L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4w cHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5pbm9kZXNpemUg PSAyNTY8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBzdHls ZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNv Tm9ybWFsPmlub3BibG9jayA9IDE2PG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0K PGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+ DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5mbmFtZSA9DQomcXVvdDtcMDAwXDAwMFwwMDBcMDAwXDAw MFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAmcXVvdDs8bzpwPjwvbzpwPjwvcD4NCg0KPC9i bG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4t Ym90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPmJsb2NrbG9nID0gMTI8bzpwPjwv bzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRv cDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPnNlY3Rs b2cgPSA5PG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5 bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1z b05vcm1hbD5pbm9kZWxvZyA9IDg8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8 YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4N Cg0KPHAgY2xhc3M9TXNvTm9ybWFsPmlub3BibG9nID0gNDxvOnA+PC9vOnA+PC9wPg0KDQo8L2Js b2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1i b3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+YWdibGtsb2cgPSAyODxvOnA+PC9v OnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9w OjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+cmV4dHNs b2cgPSAwPG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5 bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1z b05vcm1hbD5pbnByb2dyZXNzID0gMDxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoN CjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQn Pg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+aW1heF9wY3QgPSAyNTxvOnA+PC9vOnA+PC9wPg0KDQo8 L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdp bi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+aWNvdW50ID0gNzI5MTUyMDxv OnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJn aW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+ aWZyZWUgPSA4NTE0PG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVv dGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNs YXNzPU1zb05vcm1hbD5mZGJsb2NrcyA9IDY2MjMxODU1OTc8bzpwPjwvbzpwPjwvcD4NCg0KPC9i bG9ja3F1b3RlPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PGJyPg0KV2l0aCAyNC41VGlCIG9mIGZy ZWUgc3BhY2U8YnI+DQo8YnI+DQo8YnI+DQo8bzpwPjwvbzpwPjwvcD4NCg0KPHAgY2xhc3M9TXNv Tm9ybWFsPi1iYXNoLTMuMSMgeGZzX2RiIC1yIC1jICdzYiAyJyAtYyBwDQovZGV2L2xvZ2ZzLXNl c3Npb25zL3Nlc3Npb25zPG86cD48L286cD48L3A+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJn aW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+ bWFnaWNudW0gPSAweDU4NDY1MzQyPG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0K PGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+ DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5ibG9ja3NpemUgPSA0MDk2PG86cD48L286cD48L3A+DQoN CjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFy Z2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5kYmxvY2tzID0gMjQxMTE0 MTgzNjg8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8cCBjbGFzcz1Nc29Ob3Jt YWw+PGJyPg0KVGhhdCdzIDg5LjlUaUIuLi48YnI+DQo8YnI+DQo8YnI+DQo8bzpwPjwvbzpwPjwv cD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPnJibG9ja3MgPSAwPG86cD48L286cD48L3A+DQoNCjxi bG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0K DQo8cCBjbGFzcz1Nc29Ob3JtYWw+cmV4dGVudHMgPSAwPG86cD48L286cD48L3A+DQoNCjwvYmxv Y2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJv dHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD51dWlkID0gZmM4YmRmNzYtZDk2Mi00 M2MxLWFlNjAtYjg1ZjM3ODk3OGE2PG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0K PGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+ DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5sb2dzdGFydCA9IDA8bzpwPjwvbzpwPjwvcD4NCg0KPC9i bG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4t Ym90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPnJvb3Rpbm8gPSAyMDQ4PG86cD48 L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10 b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5yYm1p bm8gPSAyMDQ5PG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUg c3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNz PU1zb05vcm1hbD5yc3VtaW5vID0gMjA1MDxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+ DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4w cHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+cmV4dHNpemUgPSAzODQ8bzpwPjwvbzpwPjwvcD4N Cg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDtt YXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPmFnYmxvY2tzID0gMjY4 NDM1MzI4PG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5 bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1z b05vcm1hbD5hZ2NvdW50ID0gOTA8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8 cCBjbGFzcz1Nc29Ob3JtYWw+PGJyPg0KQW5kIDkwIEFHcy4gVGhhdCB0ZWxscyBtZSB0aGUgZmls ZXN5c3RlbSB3YXMgY3JlYXRlZCBhcyBhIDkwVGlCPGJyPg0KZmlsZXN5c3RlbS4gQ2FuIHlvdSB0 ZWxsIG1lIGlmIHlvdSBhdHRlbXB0ZWQgdG8gZ3JvdyBmcm9tIDkwVGlCIHRvPGJyPg0KMTAwVGlC IG9yIGZyb20gMTAwVGlCIHRvIDExMFRpQj8gJm5ic3A7VGhlcmUgd2VyZSBidWdzIGF0IG9uZSBw b2ludCBpbjxicj4NCmJvdGggdGhlIHVzZXJzcGFjZSBncm93IGNvZGUgYW5kIHRoZSBrZXJuZWwg Y29kZSB0aGF0IHJlc3VsdGVkIGluPGJyPg0KYmFkIGdyb3dzIChoZW5jZSB0aGUgbmVlZCB0byBr bm93IHRoZSB2ZXJzaW9ucyB0aGlzIG9jY3VycmVkIG9uPGJyPg0KYW5kIHdoYXQgeW91IHdlcmUg YWN0dWFsbHkgYXR0ZW1wdGluZyB0byBkbyksIGJ1dCB0aGVzZSBwcm9ibGVtczxicj4NCmNhbiB1 c3VhbGx5IGJlIGZpeGVkIHVwIHdpdGggc29tZSB4ZnNfZGIgbWFnaWMuPGJyPg0KPGJyPg0KQ2hl ZXJzLDxicj4NCjxicj4NCkRhdmUuPGJyPg0KLS0gPGJyPg0KRGF2ZSBDaGlubmVyPGJyPg0KPGEg aHJlZj0ibWFpbHRvOmRhdmlkQGZyb21vcmJpdC5jb20iPmRhdmlkQGZyb21vcmJpdC5jb208L2E+ PG86cD48L286cD48L3A+DQoNCjwvZGl2Pg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGl2Pg0KDQo8 L2JvZHk+DQoNCjwvaHRtbD4NCg== --_000_DD534F7C25BFA14FB18E6D603135D7EA0A11DAC21Csbapexch05_-- From Jason.Vagalatos@citrixonline.com Wed Feb 24 12:06:48 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.6 required=5.0 tests=AWL,BAYES_20,FH_DATE_PAST_20XX, HTML_MESSAGE,J_CHICKENPOX_66 autolearn=no version=3.3.0-rupdated 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 o1OI6mUt039456 for ; Wed, 24 Feb 2010 12:06:48 -0600 X-ASG-Debug-ID: 1267034889-491a01490000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from SBAPEXCH05.ad.corp.expertcity.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3C1271F23F1 for ; Wed, 24 Feb 2010 10:08:09 -0800 (PST) Received: from SBAPEXCH05.ad.corp.expertcity.com (sbapexch05.ad.corp.expertcity.com [216.219.126.165]) by cuda.sgi.com with ESMTP id jycwgiLStOqdbRKh for ; Wed, 24 Feb 2010 10:08:09 -0800 (PST) Received: from SBAPEXCH05.ad.corp.expertcity.com ([10.1.6.25]) by sbapexch05 ([10.1.6.25]) with mapi; Wed, 24 Feb 2010 10:08:29 -0800 From: Jason Vagalatos To: "david@fromorbit.com" CC: "xfs@oss.sgi.com" , Joe Allen Date: Wed, 24 Feb 2010 10:08:26 -0800 X-ASG-Orig-Subj: RE: xfs_growfs failure.... Subject: RE: xfs_growfs failure.... Thread-Topic: xfs_growfs failure.... Thread-Index: Acq1dQcNWxvN0I7rQVKCkqd4cDXmogAAt4kwAADhvUA= Message-ID: References: <20100224115420.GK16175@discord.disaster> <5A88945F-EAA8-4678-8ADA-7700E3FF607B@citrixonline.com> <84A4B16519BD4C43ABD91AFB3CB84B6F097ED42EE9@sbapexch05> In-Reply-To: <84A4B16519BD4C43ABD91AFB3CB84B6F097ED42EE9@sbapexch05> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US x-ems-proccessed: oXeMnjjQeARSDE4UqeV8aA== x-ems-stamp: 18//SpP0u4fJFl9tYgBD7Q== Content-Type: multipart/alternative; boundary="_000_DD534F7C25BFA14FB18E6D603135D7EA0A11DAC231sbapexch05_" MIME-Version: 1.0 X-Barracuda-Connect: sbapexch05.ad.corp.expertcity.com[216.219.126.165] X-Barracuda-Start-Time: 1267034890 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.23362 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_DD534F7C25BFA14FB18E6D603135D7EA0A11DAC231sbapexch05_ Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 RGF2aWQsDQpUaGlzIG1pZ2h0IHByb3ZpZGUgc29tZSB1c2VmdWwgaW5zaWdodCB0b28uLiAgSSBq dXN0IHJlbWVtYmVyZWQgdGhhdCB0aGUgeGZzX2dyb3dmcyBjb21tYW5kIHdhcyBydW4gdHdpY2Uu ICBUaGUgZmlyc3QgdGltZSBpdCBlcnJvcmVkIGJlY2F1c2UgSSBvbWl0dGVkIHRoZSDigJNkIG9w dGlvbi4gIEkgcmVyYW4gaXQgd2l0aCB0aGUg4oCTZCBvcHRpb24gYW5kIGl0IGNvbXBsZXRlZCBz dWNjZXNzZnVsbHkuDQoNCklzIGl0IHBvc3NpYmxlIHRoZSB4ZnNfZ3Jvd2ZzIGdyZXcgdGhlIGZp bGVzeXN0ZW0gMnggaW50ZW5kZWQgc2l6ZSBieSBydW5uaW5nIGl0IHR3aWNlPyAgSXQgc2VlbXMg dGhhdCB0aGUgY29tbWFuZCB3b3VsZCBmYWlsIHRoZSBzZWNvbmQgdGltZSBiZWNhdXNlIGFsbCBv ZiB0aGUgcmVtYWluaW5nIHNwYWNlIG9uIHRoZSB1bmRlcmx5aW5nIGRldmljZSB3YXMgdXNlZCB1 cCBieSB0aGUgZmlyc3QgcnVuPw0KDQpUaGFua3MsDQoNCkphc29uIFZhZ2FsYXRvcw0KU3RvcmFn ZSBBZG1pbmlzdHJhdG9yDQpDaXRyaXh8T25saW5lDQo3NDA4IEhvbGxpc3RlciBBdmVudWUNCkdv bGV0YSBDYWxpZm9ybmlhIDkzMTE3DQpUOiAgODA1LjY5MC4yOTQzIHwgTTogIDgwNS40MDMuOTQz Mw0KamFzb24udmFnYWxhdG9zQGNpdHJpeG9ubGluZS5jb208bWFpbHRvOmphc29uLnZhZ2FsYXRv c0BjaXRyaXhvbmxpbmUuY29tPg0KaHR0cDovL3d3dy5jaXRyaXhvbmxpbmUuY29tPGh0dHA6Ly93 d3cuY2l0cml4b25saW5lLmNvbS8+DQoNCkZyb206IEphc29uIFZhZ2FsYXRvcw0KU2VudDogV2Vk bmVzZGF5LCBGZWJydWFyeSAyNCwgMjAxMCA5OjU3IEFNDQpUbzogJ2RhdmlkQGZyb21vcmJpdC5j b20nDQpDYzogJ3hmc0Bvc3Muc2dpLmNvbSc7IEpvZSBBbGxlbg0KU3ViamVjdDogUkU6IHhmc19n cm93ZnMgZmFpbHVyZS4uLi4NCg0KDQpIaSBEYXZpZCwNCknigJltIHBpY2tpbmcgdGhpcyB1cCBm cm9tIEpvZS4gIEnigJlsbCBhdHRlbXB0IHRvIGFuc3dlciB5b3VyIHF1ZXN0aW9ucy4NCg0KVGhl IHVuZGVybHlpbmcgZGV2aWNlIHdhcyBncm93biBmcm9tIDg5VEIgdG8gMTAwVEIuICBUaGUgeGZz IGZpbGVzeXN0ZW0gdXRpbGl6ZXMgYW4gZXh0ZXJuYWwgbG9nZGV2LiAgQWZ0ZXIgdGhlIHVuZGVy bHlpbmcgZGV2aWNlIHdhcyBncm93biBieSBhcHByb3ggMTFUQiwgd2UgcmFuIHhmc19ncm93ZnMg 4oCTZCA8ZmlsZXN5c3RlbV9tb3VudF9wb2ludD4uICBUaGlzIGNvbW1hbmQgY29tcGxldGVkIHdp dGhvdXQgZXJyb3JzLCBidXQgdGhlIGZpbGVzeXN0ZW0gaW1tZWRpYXRlbHkgd2VudCBpbnRvIGEg YmFkIHN0YXRlLg0KDQpXZSBhcmUgcnVubmluZyB4ZnNwcm9ncy0yLjguMjAtMS5lbDUuY2VudG9z IG9uIFJIRUwgS2VybmVsIExpbnV4IDIuNi4xOC01My4xLjE5LmVsNSAjMSBTTVAgVHVlIEFwciAy MiAwMzowMToxMCBFRFQgMjAwOCB4ODZfNjQgeDg2XzY0IHg4Nl82NCBHTlUvTGludXgNCg0KV2Ug a2lsbGVkIHRoZSB4ZnNfcmVwYWlyIGJlZm9yZSBpdCB3YXMgYWJsZSB0byBmaW5kIGEgc2Vjb25k YXJ5IHN1cGVyYmxvY2sgYW5kIG1ha2UgdGhpbmdzIHdvcnNlLg0KDQpDdXJyZW50bHkgdGhlIHVu ZGVybHlpbmcgYmxvY2sgZGV2aWNlIGlzOg0KDQotLS0gTG9naWNhbCB2b2x1bWUgLS0tDQogIExW IE5hbWUgICAgICAgICAgICAgICAgL2Rldi9sb2dmcy1zZXNzaW9ucy9zZXNzaW9ucw0KICBWRyBO YW1lICAgICAgICAgICAgICAgIGxvZ2ZzLXNlc3Npb25zDQogIExWIFVVSUQgICAgICAgICAgICAg ICAgMzJUUmJlLU9JRHctdTRhSC1mVW1ELUZMbVUtNWpSdi1NYVZZRGcNCiAgTFYgV3JpdGUgQWNj ZXNzICAgICAgICByZWFkL3dyaXRlDQogIExWIFN0YXR1cyAgICAgICAgICAgICAgYXZhaWxhYmxl DQogICMgb3BlbiAgICAgICAgICAgICAgICAgMA0KICBMViBTaXplICAgICAgICAgICAgICAgIDEw MC41NiBUQg0KICBDdXJyZW50IExFICAgICAgICAgICAgIDI2MzYwMjUzDQogIFNlZ21lbnRzICAg ICAgICAgICAgICAgMTgNCiAgQWxsb2NhdGlvbiAgICAgICAgICAgICBpbmhlcml0DQogIFJlYWQg YWhlYWQgc2VjdG9ycyAgICAgMA0KICBCbG9jayBkZXZpY2UgICAgICAgICAgIDI1Mzo2MQ0KDQpB dCB0aGlzIHBvaW50IHdoYXQgYXJlIG91ciBvcHRpb25zIHRvIHJlY292ZXIgdGhpcyBmaWxlc3lz dGVtPw0KDQpUaGFuayB5b3UgZm9yIGFueSBoZWxwIHlvdSBtYXkgYmUgYWJsZSB0byBwcm92aWRl Lg0KDQpKYXNvbiBWYWdhbGF0b3MNCg0KRnJvbTogSm9lIEFsbGVuDQpTZW50OiBXZWRuZXNkYXks IEZlYnJ1YXJ5IDI0LCAyMDEwIDk6MTUgQU0NClRvOiBKYXNvbiBWYWdhbGF0b3MNClN1YmplY3Q6 IEZ3ZDogeGZzX2dyb3dmcyBmYWlsdXJlLi4uLg0KDQoNCndpZXJkLiBoZSBzZWVtcyB0byBiZSBp bXBseWluZyB3ZSB3ZXJlIGF0IDExMHRiIGFuZCBzdHVmZiBpcyB3cml0dGVuIHRoZXJlLiBJIGd1 ZXNzIHdlIG5lZWQgdG8gYmUgMTAwJSBzdXJlIG9mIHRoZSBzcGFjZSBhbGxvY2F0ZWQuIHdlcmUg dGhlIG90aGVyIEx1bnMgZXZlciBhdHRhY2hlZCA/DQoNCg0KDQoNCkJlZ2luIGZvcndhcmRlZCBt ZXNzYWdlOg0KRnJvbTogRGF2ZSBDaGlubmVyIDxkYXZpZEBmcm9tb3JiaXQuY29tPG1haWx0bzpk YXZpZEBmcm9tb3JiaXQuY29tPj5uZw0KRGF0ZTogRmVicnVhcnkgMjQsIDIwMTAgMzo1NDoyMCBB TSBQU1QNClRvOiBKb2UgQWxsZW4gPEpvZS5BbGxlbkBjaXRyaXguY29tPG1haWx0bzpKb2UuQWxs ZW5AY2l0cml4LmNvbT4+DQpDYzogInhmc0Bvc3Muc2dpLmNvbTxtYWlsdG86eGZzQG9zcy5zZ2ku Y29tPiIgPHhmc0Bvc3Muc2dpLmNvbTxtYWlsdG86eGZzQG9zcy5zZ2kuY29tPj4NClN1YmplY3Q6 IFJlOiB4ZnNfZ3Jvd2ZzIGZhaWx1cmUuLi4uDQpPbiBXZWQsIEZlYiAyNCwgMjAxMCBhdCAwMjo0 NDozN0FNIC0wODAwLCBKb2UgQWxsZW4gd3JvdGU6DQpJIGFtIGluIHNvbWUgZGlmZmljdWx0eSBo ZXJlIG92ZXIgYSAxMDBUQiBmaWxlc3lzdGVtIHRoYXQNCklzIG5vdyB1bnVzYWJsZSBhZnRlciBh IHhmc19ncm93ZnMgY29tbWFuZC4NCg0KSXMgdGhlcmUgc29tZW9uZSB0aGF0IG1pZ2h0IGhlbHAg YXNzaXN0Pw0KDQojbW91bnQ6IC9kZXYvbG9nZnMtc2Vzc2lvbnMvc2Vzc2lvbnM6IGNhbid0IHJl YWQgc3VwZXJibG9jaw0KDQpGaWxlc3lzdGVtICJkbS02MSI6IERpc2FibGluZyBiYXJyaWVycywg bm90IHN1cHBvcnRlZCB3aXRoIGV4dGVybmFsIGxvZyBkZXZpY2UNCmF0dGVtcHQgdG8gYWNjZXNz IGJleW9uZCBlbmQgb2YgZGV2aWNlDQpkbS02MTogcnc9MCwgd2FudD0yMzg5OTUwMzgyMDgsIGxp bWl0PTIxNTk0MzE5MjU3Ng0KDQpZb3UndmUgZ3Jvd24gdGhlIGZpbGVzeXN0ZW0gdG8gMjM4OTk1 MDM4MjA4INGVZWN0b3JzICgxMTEuM1RpQiksDQpidXQgdGhlIHVuZGVybHlpbmcgZGV2aWNlIGlz IG9ubHkgMjE1OTQzMTkyNTc2IHNlY3RvcnMgKDEwMC41VGlCKQ0KaW4gc2l6ZS4NCg0KSSdtIGFz c3VtaW5nIHRoYXQgeW91J3JlIHRyeWluZyB0byBtb3VudCB0aGUgZmlsZXN5c3RlbSBhZnRlciBh DQpyZWJvb3Q/IEkgbWFrZSB0aGlzIGFzc3VtcHRpb24gYXMgZ3Jvd2ZzIGlzIGFuIG9ubGluZSBv cGVyYXRpb24gYW5kDQp3b24ndCBncm93IGlmIHRoZSB1bmRlcmx5aW5nIGJsb2NrIGRldmljZSBo YXMgbm90IGFscmVhZHkgYmVlbg0KZ3Jvd24uIEZvciBhIHN1YnNlcXVlbnQgbW91bnQgdG8gZmFp bCB3aXRoIHRoZSB1bmRlcmx5aW5nIGRldmljZQ0KYmVpbmcgdG9vIHNtYWxsLCBzb21ldGhpbmcg YWJvdXQgdGhlIHVuZGVybHlpbmcgYmxvY2sNCmRldmljZSBoYWQgdG8gY2hhbmdlLi4uLg0KDQpX aGF0IGtlcm5lbCB2ZXJzaW9uIGFuZCB4ZnNwcm9ncyB2ZXJzaW9uIGFyZSB5b3UgdXNpbmc/DQoN Cnhmc19yZXBhaXIgLW4gPGRldmljZT4gYmFzaWNhbGx5IGxvb2tzIGZvciBzdXBlcmJsb2NrcyAo cGhhc2UgMSBJDQpndWVzcyApIGZvciBhIGxvbmcgdGltZS4gSSdtIGxldHRpbmcgaXQgcnVuLCBi dXQgbm90IG11Y2ggaG9wZS4NCg0KRG9uJ3QgcmVwYWlyIHRoZSBmaWxlc3lzdGVtIC0gdGhlcmUg aXMgbm90aGluZyB3cm9uZyB3aXRoIGl0DQp1bmxlc3MgeW91IHN0YXJ0IG1vZGlmeWluZyBzdHVm Zi4gV2hhdCB5b3UgbmVlZCB0byBkbyBpcyBmaXggdGhlDQp1bmRlcmx5aW5nIGRldmljZSB0byBi cmluZyBpdCBiYWNrIHRvIHRoZSBzaXplIGl0IHdhcyBzdXBwb3NlZCB0bw0KYmUgYXQgd2hlbiB0 aGUgZ3JvdyBvcGVyYXRpb24gd2FzIHJ1bi4NCg0KV2hhdCBkb2VzIC9wcm9jL3BhcnRpdGlvbnMg dGVsbCB5b3UgYWJvdXQgdGhlIHNpemUgb2YgZG0tNjE/IGRvZXMNCnRoYXQgcmVwb3J0IHRoZSBj b3JyZWN0IHNpemUsIGFuZCBpZiBpdCBkb2VzLCB3aGF0IGlzIGl0Pw0KDQpJJ20gaGVzaXRhbnQg dG8gcnVuIHhmc19yZXBhaXIgLUwgIG9yIHdpdGhvdXQgdGhlIC1uIGZsYWcgZm9yIGZlYXIgb2Yg bWFraW5nIGl0IHdvcnNlLg0KDQpHb29kIC0gZG9uJ3QgcnVuIGFueXRoaW5nIGxpa2UgdGhhdCB1 bnRpbCB5b3Ugc29ydCBvdXQgd2hldGhlciB0aGUNCnVuZGVybHlpbmcgZGV2aWNlIGlzIGNvcnJl Y3RseSBzaXplZCBvciBub3QuDQoNCi1iYXNoLTMuMSMgeGZzX2RiIC1yIC1jICdzYiAwJyAtYyBw IC9kZXYvbG9nZnMtc2Vzc2lvbnMvc2Vzc2lvbnMNCm1hZ2ljbnVtID0gMHg1ODQ2NTM0Mg0KYmxv Y2tzaXplID0gNDA5Ng0KZGJsb2NrcyA9IDI5ODc0Mzc5Nzc2DQoNClhGUyBkZWZpbml0ZWx5IHRo aW5rcyBpdCBpcyAxMTEuM1RpQiBpbiBzaXplLg0KDQpyYmxvY2tzID0gMA0KcmV4dGVudHMgPSAw DQp1dWlkID0gZmM4YmRmNzYtZDk2Mi00M2MxLWFlNjAtYjg1ZjM3ODk3OGE2DQpsb2dzdGFydCA9 IDANCnJvb3Rpbm8gPSAyMDQ4DQpyYm1pbm8gPSAyMDQ5DQpyc3VtaW5vID0gMjA1MA0KcmV4dHNp emUgPSAzODQNCmFnYmxvY2tzID0gMjY4NDM1MzI4DQphZ2NvdW50ID0gMTEyDQoNCjExMiBBR3Mg b2YgMVRpQiBlYWNoIC0gdGhhdCBjb25maXJtcyB0aGUgZ3JvdyBzdWNjZWVkZWQgYW5kIGl0IHdh cw0KYWJsZSB0byB3cml0ZSBtZXRhZGF0YSB0byBkaXNrIGJldHdlZW4gMTAwIGFuZCAxMTEgVGlC IHdpdGhvdXQNCmVycm9ycyBiZWluZyByZXBvcnRlZC4gVGhhdCBpbXBsaWVzIHRoZSBibG9jayBk ZXZpY2UgbXVzdCBoYXZlIGJlZW4NCnRoYXQgYmlnIGF0IHNvbWUgcG9pbnQuLi4NCg0KcmJtYmxv Y2tzID0gMA0KbG9nYmxvY2tzID0gMzIwMDANCnZlcnNpb25udW0gPSAweDMxODQNCnNlY3RzaXpl ID0gNTEyDQppbm9kZXNpemUgPSAyNTYNCmlub3BibG9jayA9IDE2DQpmbmFtZSA9ICJcMDAwXDAw MFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiDQpibG9ja2xvZyA9IDEy DQpzZWN0bG9nID0gOQ0KaW5vZGVsb2cgPSA4DQppbm9wYmxvZyA9IDQNCmFnYmxrbG9nID0gMjgN CnJleHRzbG9nID0gMA0KaW5wcm9ncmVzcyA9IDANCmltYXhfcGN0ID0gMjUNCmljb3VudCA9IDcy OTE1MjANCmlmcmVlID0gODUxNA0KZmRibG9ja3MgPSA2NjIzMTg1NTk3DQoNCldpdGggMjQuNVRp QiBvZiBmcmVlIHNwYWNlDQoNCi1iYXNoLTMuMSMgeGZzX2RiIC1yIC1jICdzYiAyJyAtYyBwIC9k ZXYvbG9nZnMtc2Vzc2lvbnMvc2Vzc2lvbnMNCm1hZ2ljbnVtID0gMHg1ODQ2NTM0Mg0KYmxvY2tz aXplID0gNDA5Ng0KZGJsb2NrcyA9IDI0MTExNDE4MzY4DQoNClRoYXQncyA4OS45VGlCLi4uDQoN CnJibG9ja3MgPSAwDQpyZXh0ZW50cyA9IDANCnV1aWQgPSBmYzhiZGY3Ni1kOTYyLTQzYzEtYWU2 MC1iODVmMzc4OTc4YTYNCmxvZ3N0YXJ0ID0gMA0Kcm9vdGlubyA9IDIwNDgNCnJibWlubyA9IDIw NDkNCnJzdW1pbm8gPSAyMDUwDQpyZXh0c2l6ZSA9IDM4NA0KYWdibG9ja3MgPSAyNjg0MzUzMjgN CmFnY291bnQgPSA5MA0KDQpBbmQgOTAgQUdzLiBUaGF0IHRlbGxzIG1lIHRoZSBmaWxlc3lzdGVt IHdhcyBjcmVhdGVkIGFzIGEgOTBUaUINCmZpbGVzeXN0ZW0uIENhbiB5b3UgdGVsbCBtZSBpZiB5 b3UgYXR0ZW1wdGVkIHRvIGdyb3cgZnJvbSA5MFRpQiB0bw0KMTAwVGlCIG9yIGZyb20gMTAwVGlC IHRvIDExMFRpQj8gIFRoZXJlIHdlcmUgYnVncyBhdCBvbmUgcG9pbnQgaW4NCmJvdGggdGhlIHVz ZXJzcGFjZSBncm93IGNvZGUgYW5kIHRoZSBrZXJuZWwgY29kZSB0aGF0IHJlc3VsdGVkIGluDQpi YWQgZ3Jvd3MgKGhlbmNlIHRoZSBuZWVkIHRvIGtub3cgdGhlIHZlcnNpb25zIHRoaXMgb2NjdXJy ZWQgb24NCmFuZCB3aGF0IHlvdSB3ZXJlIGFjdHVhbGx5IGF0dGVtcHRpbmcgdG8gZG8pLCBidXQg dGhlc2UgcHJvYmxlbXMNCmNhbiB1c3VhbGx5IGJlIGZpeGVkIHVwIHdpdGggc29tZSB4ZnNfZGIg bWFnaWMuDQoNCkNoZWVycywNCg0KRGF2ZS4NCi0tDQpEYXZlIENoaW5uZXINCmRhdmlkQGZyb21v cmJpdC5jb208bWFpbHRvOmRhdmlkQGZyb21vcmJpdC5jb20+DQo= --_000_DD534F7C25BFA14FB18E6D603135D7EA0A11DAC231sbapexch05_ Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6eD0idXJuOnNjaGVtYXMtbWljcm9z b2Z0LWNvbTpvZmZpY2U6ZXhjZWwiIHhtbG5zOnA9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206 b2ZmaWNlOnBvd2VycG9pbnQiIHhtbG5zOmE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2Zm aWNlOmFjY2VzcyIgeG1sbnM6ZHQ9InV1aWQ6QzJGNDEwMTAtNjVCMy0xMWQxLUEyOUYtMDBBQTAw QzE0ODgyIiB4bWxuczpzPSJ1dWlkOkJEQzZFM0YwLTZEQTMtMTFkMS1BMkEzLTAwQUEwMEMxNDg4 MiIgeG1sbnM6cnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206cm93c2V0IiB4bWxuczp6PSIj Um93c2V0U2NoZW1hIiB4bWxuczpiPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpw dWJsaXNoZXIiIHhtbG5zOnNzPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpzcHJl YWRzaGVldCIgeG1sbnM6Yz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6Y29tcG9u ZW50OnNwcmVhZHNoZWV0IiB4bWxuczpvZGM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2Zm aWNlOm9kYyIgeG1sbnM6b2E9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOmFjdGl2 YXRpb24iIHhtbG5zOmh0bWw9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiIHhtbG5z OnE9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiB4bWxuczpydGM9 Imh0dHA6Ly9taWNyb3NvZnQuY29tL29mZmljZW5ldC9jb25mZXJlbmNpbmciIHhtbG5zOkQ9IkRB VjoiIHhtbG5zOlJlcGw9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vcmVwbC8iIHhtbG5z Om10PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3NoYXJlcG9pbnQvc29hcC9tZWV0aW5n cy8iIHhtbG5zOngyPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9leGNlbC8y MDAzL3htbCIgeG1sbnM6cHBkYT0iaHR0cDovL3d3dy5wYXNzcG9ydC5jb20vTmFtZVNwYWNlLnhz ZCIgeG1sbnM6b2lzPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3NoYXJlcG9pbnQvc29h cC9vaXMvIiB4bWxuczpkaXI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vc2hhcmVwb2lu dC9zb2FwL2RpcmVjdG9yeS8iIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3ht bGRzaWcjIiB4bWxuczpkc3A9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vc2hhcmVwb2lu dC9kc3AiIHhtbG5zOnVkYz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kYXRhL3VkYyIg eG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6c3ViPSJo dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3NoYXJlcG9pbnQvc29hcC8yMDAyLzEvYWxlcnRz LyIgeG1sbnM6ZWM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jIyIgeG1sbnM6c3A9 Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vc2hhcmVwb2ludC8iIHhtbG5zOnNwcz0iaHR0 cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9zaGFyZXBvaW50L3NvYXAvIiB4bWxuczp4c2k9Imh0 dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp1ZGNzPSJodHRw Oi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RhdGEvdWRjL3NvYXAiIHhtbG5zOnVkY3hmPSJodHRw Oi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RhdGEvdWRjL3htbGZpbGUiIHhtbG5zOnVkY3AycD0i aHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kYXRhL3VkYy9wYXJ0dG9wYXJ0IiB4bWxuczp3 Zj0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9zaGFyZXBvaW50L3NvYXAvd29ya2Zsb3cv IiB4bWxuczpkc3NzPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L2Rp Z3NpZy1zZXR1cCIgeG1sbnM6ZHNzaT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZp Y2UvMjAwNi9kaWdzaWciIHhtbG5zOm1kc3NpPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0 cy5vcmcvcGFja2FnZS8yMDA2L2RpZ2l0YWwtc2lnbmF0dXJlIiB4bWxuczptdmVyPSJodHRwOi8v c2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvbWFya3VwLWNvbXBhdGliaWxpdHkvMjAwNiIgeG1s bnM6bT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4 bWxuczptcmVscz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAw Ni9yZWxhdGlvbnNoaXBzIiB4bWxuczpzcHdwPSJodHRwOi8vbWljcm9zb2Z0LmNvbS9zaGFyZXBv aW50L3dlYnBhcnRwYWdlcyIgeG1sbnM6ZXgxMnQ9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5j b20vZXhjaGFuZ2Uvc2VydmljZXMvMjAwNi90eXBlcyIgeG1sbnM6ZXgxMm09Imh0dHA6Ly9zY2hl bWFzLm1pY3Jvc29mdC5jb20vZXhjaGFuZ2Uvc2VydmljZXMvMjAwNi9tZXNzYWdlcyIgeG1sbnM6 cHB0c2w9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vc2hhcmVwb2ludC9zb2FwL1NsaWRl TGlicmFyeS8iIHhtbG5zOnNwc2w9Imh0dHA6Ly9taWNyb3NvZnQuY29tL3dlYnNlcnZpY2VzL1No YXJlUG9pbnRQb3J0YWxTZXJ2ZXIvUHVibGlzaGVkTGlua3NTZXJ2aWNlIiB4bWxuczpaPSJ1cm46 c2NoZW1hcy1taWNyb3NvZnQtY29tOiIgeG1sbnM6c3Q9IiYjMTsiIHhtbG5zPSJodHRwOi8vd3d3 LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCg0KPGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PUNvbnRl bnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPG1ldGEgbmFtZT1H ZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTIgKGZpbHRlcmVkIG1lZGl1bSkiPg0K PHN0eWxlPg0KPCEtLQ0KIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8NCiBAZm9udC1mYWNlDQoJe2Zv bnQtZmFtaWx5OiJDYW1icmlhIE1hdGgiOw0KCXBhbm9zZS0xOjIgNCA1IDMgNSA0IDYgMyAyIDQ7 fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseTpDYWxpYnJpOw0KCXBhbm9zZS0xOjIgMTUgNSAy IDIgMiA0IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6VGFob21hOw0KCXBhbm9z ZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0O30NCiAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLw0KIHAu TXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwNCgl7bWFyZ2luOjBpbjsNCglt YXJnaW4tYm90dG9tOi4wMDAxcHQ7DQoJZm9udC1zaXplOjEyLjBwdDsNCglmb250LWZhbWlseToi VGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30NCmE6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsNCgl7 bXNvLXN0eWxlLXByaW9yaXR5Ojk5Ow0KCWNvbG9yOmJsdWU7DQoJdGV4dC1kZWNvcmF0aW9uOnVu ZGVybGluZTt9DQphOnZpc2l0ZWQsIHNwYW4uTXNvSHlwZXJsaW5rRm9sbG93ZWQNCgl7bXNvLXN0 eWxlLXByaW9yaXR5Ojk5Ow0KCWNvbG9yOnB1cnBsZTsNCgl0ZXh0LWRlY29yYXRpb246dW5kZXJs aW5lO30NCnNwYW4uRW1haWxTdHlsZTE3DQoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsOw0KCWZv bnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQoJY29sb3I6IzFGNDk3RDt9DQpzcGFu LkVtYWlsU3R5bGUxOA0KCXttc28tc3R5bGUtdHlwZTpwZXJzb25hbC1yZXBseTsNCglmb250LWZh bWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KCWNvbG9yOiMxRjQ5N0Q7fQ0KLk1zb0NocERl ZmF1bHQNCgl7bXNvLXN0eWxlLXR5cGU6ZXhwb3J0LW9ubHk7DQoJZm9udC1zaXplOjEwLjBwdDt9 DQpAcGFnZSBTZWN0aW9uMQ0KCXtzaXplOjguNWluIDExLjBpbjsNCgltYXJnaW46MS4waW4gMS4w aW4gMS4waW4gMS4waW47fQ0KZGl2LlNlY3Rpb24xDQoJe3BhZ2U6U2VjdGlvbjE7fQ0KLS0+DQo8 L3N0eWxlPg0KPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+DQogPG86c2hhcGVkZWZhdWx0cyB2OmV4 dD0iZWRpdCIgc3BpZG1heD0iMTAyNiIgLz4NCjwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3Rl IG1zbyA5XT48eG1sPg0KIDxvOnNoYXBlbGF5b3V0IHY6ZXh0PSJlZGl0Ij4NCiAgPG86aWRtYXAg djpleHQ9ImVkaXQiIGRhdGE9IjEiIC8+DQogPC9vOnNoYXBlbGF5b3V0PjwveG1sPjwhW2VuZGlm XS0tPg0KPC9oZWFkPg0KDQo8Ym9keSBiZ2NvbG9yPXdoaXRlIGxhbmc9RU4tVVMgbGluaz1ibHVl IHZsaW5rPXB1cnBsZT4NCg0KPGRpdiBjbGFzcz1TZWN0aW9uMT4NCg0KPHAgY2xhc3M9TXNvTm9y bWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwi c2Fucy1zZXJpZiI7DQpjb2xvcjojMUY0OTdEJz5EYXZpZCw8bzpwPjwvbzpwPjwvc3Bhbj48L3A+ DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBwdDtmb250 LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+VGhpcyBtaWdo dCBwcm92aWRlIHNvbWUgdXNlZnVsIGluc2lnaHQgdG9vLi7CoCBJIGp1c3QgcmVtZW1iZXJlZA0K dGhhdCB0aGUgeGZzX2dyb3dmcyBjb21tYW5kIHdhcyBydW4gdHdpY2UuwqAgVGhlIGZpcnN0IHRp bWUgaXQgZXJyb3JlZCBiZWNhdXNlIEkNCm9taXR0ZWQgdGhlIOKAk2Qgb3B0aW9uLsKgIEkgcmVy YW4gaXQgd2l0aCB0aGUg4oCTZCBvcHRpb24gYW5kIGl0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHku PG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9 J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNv bG9yOiMxRjQ5N0QnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNv Tm9ybWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJp Iiwic2Fucy1zZXJpZiI7DQpjb2xvcjojMUY0OTdEJz5JcyBpdCBwb3NzaWJsZSB0aGUgeGZzX2dy b3dmcyBncmV3IHRoZSBmaWxlc3lzdGVtIDJ4IGludGVuZGVkDQpzaXplIGJ5IHJ1bm5pbmcgaXQg dHdpY2U/wqAgSXQgc2VlbXMgdGhhdCB0aGUgY29tbWFuZCB3b3VsZCBmYWlsIHRoZSBzZWNvbmQg dGltZQ0KYmVjYXVzZSBhbGwgb2YgdGhlIHJlbWFpbmluZyBzcGFjZSBvbiB0aGUgdW5kZXJseWlu ZyBkZXZpY2Ugd2FzIHVzZWQgdXAgYnkgdGhlDQpmaXJzdCBydW4/PG86cD48L286cD48L3NwYW4+ PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7 Zm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPjxvOnA+ Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxl PSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQpj b2xvcjojMUY0OTdEJz5UaGFua3MsPG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1N c29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6IkNhbGli cmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFu PjwvcD4NCg0KPGRpdj4NCg0KPGRpdj4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28t bWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0byc+PGI+PHNwYW4N CnN0eWxlPSdmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIjtjb2xvcjojNEQ0RjUzJz5K YXNvbiBWYWdhbGF0b3M8bzpwPjwvbzpwPjwvc3Bhbj48L2I+PC9wPg0KDQo8cCBjbGFzcz1Nc29O b3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6IkFyaWFsIiwi c2Fucy1zZXJpZiI7DQpjb2xvcjojNEQ0RjUzJz5TdG9yYWdlIEFkbWluaXN0cmF0b3I8YnI+DQpD aXRyaXh8T25saW5lPG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+ PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1z ZXJpZiI7DQpjb2xvcjojNEQ0RjUzJz43NDA4IEhvbGxpc3RlciBBdmVudWU8bzpwPjwvbzpwPjwv c3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEw LjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiM0RDRGNTMnPkdv bGV0YSBDYWxpZm9ybmlhIDkzMTE3PGJyPg0KPGI+VDwvYj46wqAgODA1LjY5MC4yOTQzIHwgPGI+ TTwvYj46wqAgODA1LjQwMy45NDMzPGJyPg0KPGEgaHJlZj0ibWFpbHRvOmphc29uLnZhZ2FsYXRv c0BjaXRyaXhvbmxpbmUuY29tIj5qYXNvbi52YWdhbGF0b3NAY2l0cml4b25saW5lLmNvbTwvYT48 YnI+DQo8YSBocmVmPSJodHRwOi8vd3d3LmNpdHJpeG9ubGluZS5jb20vIg0KdGl0bGU9ImJsb2Nr ZWQ6Omh0dHA6Ly93d3cuY2l0cml4b25saW5lLmNvbS8mIzEwO2h0dHA6Ly93d3cuY2l0cml4b25s aW5lLmNvbS8mIzEwO2h0dHA6Ly93d3cuY2l0cml4LmNvbSI+aHR0cDovL3d3dy5jaXRyaXhvbmxp bmUuY29tPC9hPjwvc3Bhbj48c3Bhbg0Kc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1p bHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjtjb2xvcjojMUY0OTdEJz48bzpwPjwvbzpwPjwvc3Bh bj48L3A+DQoNCjwvZGl2Pg0KDQo8L2Rpdj4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0 eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7 DQpjb2xvcjojMUY0OTdEJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQoNCjxkaXY+DQoN CjxkaXYgc3R5bGU9J2JvcmRlcjpub25lO2JvcmRlci10b3A6c29saWQgI0I1QzRERiAxLjBwdDtw YWRkaW5nOjMuMHB0IDBpbiAwaW4gMGluJz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxiPjxzcGFu IHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJUYWhvbWEiLCJzYW5zLXNlcmlm Iic+RnJvbTo8L3NwYW4+PC9iPjxzcGFuDQpzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZh bWlseToiVGFob21hIiwic2Fucy1zZXJpZiInPiBKYXNvbiBWYWdhbGF0b3MgPGJyPg0KPGI+U2Vu dDo8L2I+IFdlZG5lc2RheSwgRmVicnVhcnkgMjQsIDIwMTAgOTo1NyBBTTxicj4NCjxiPlRvOjwv Yj4gJ2RhdmlkQGZyb21vcmJpdC5jb20nPGJyPg0KPGI+Q2M6PC9iPiAneGZzQG9zcy5zZ2kuY29t JzsgSm9lIEFsbGVuPGJyPg0KPGI+U3ViamVjdDo8L2I+IFJFOiB4ZnNfZ3Jvd2ZzIGZhaWx1cmUu Li4uPG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8L2Rpdj4NCg0KPC9kaXY+DQoNCjxwIGNsYXNz PU1zb05vcm1hbD48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxz cGFuIHN0eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1z ZXJpZiI7DQpjb2xvcjojMUY0OTdEJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQoNCjxw IGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBwdDtmb250LWZhbWls eToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+SGkgRGF2aWQsPG86cD48 L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQt c2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMx RjQ5N0QnPknigJltIHBpY2tpbmcgdGhpcyB1cCBmcm9tIEpvZS4mbmJzcDsgSeKAmWxsIGF0dGVt cHQgdG8gYW5zd2VyIHlvdXINCnF1ZXN0aW9ucy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQoNCjxw IGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBwdDtmb250LWZhbWls eToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+PG86cD4mbmJzcDs8L286 cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6 ZToxMS4wcHQ7Zm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5 N0QnPlRoZSB1bmRlcmx5aW5nIGRldmljZSB3YXMgZ3Jvd24gZnJvbSA4OVRCIHRvIDEwMFRCLiZu YnNwOyBUaGUNCnhmcyBmaWxlc3lzdGVtIHV0aWxpemVzIGFuIGV4dGVybmFsIGxvZ2Rldi4mbmJz cDsgQWZ0ZXIgdGhlIHVuZGVybHlpbmcgZGV2aWNlDQp3YXMgZ3Jvd24gYnkgYXBwcm94IDExVEIs IHdlIHJhbiB4ZnNfZ3Jvd2ZzIOKAk2QNCiZsdDtmaWxlc3lzdGVtX21vdW50X3BvaW50Jmd0Oy4m bmJzcDsgVGhpcyBjb21tYW5kIGNvbXBsZXRlZCB3aXRob3V0IGVycm9ycywNCmJ1dCB0aGUgZmls ZXN5c3RlbSBpbW1lZGlhdGVseSB3ZW50IGludG8gYSBiYWQgc3RhdGUuPG86cD48L286cD48L3Nw YW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4w cHQ7Zm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPjxv OnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0 eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7 DQpjb2xvcjojMUY0OTdEJz5XZSBhcmUgcnVubmluZyB4ZnNwcm9ncy0yLjguMjAtMS5lbDUuY2Vu dG9zIG9uIFJIRUwgS2VybmVsIExpbnV4DQoyLjYuMTgtNTMuMS4xOS5lbDUgIzEgU01QIFR1ZSBB cHIgMjIgMDM6MDE6MTAgRURUIDIwMDggeDg2XzY0IHg4Nl82NCB4ODZfNjQNCkdOVS9MaW51eDxv OnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdm b250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQpjb2xv cjojMUY0OTdEJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05v cm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIs InNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+V2Uga2lsbGVkIHRoZSB4ZnNfcmVwYWlyIGJl Zm9yZSBpdCB3YXMgYWJsZSB0byBmaW5kIGEgc2Vjb25kYXJ5DQpzdXBlcmJsb2NrIGFuZCBtYWtl IHRoaW5ncyB3b3JzZS48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1h bD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNh bnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0K DQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1m YW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPkN1cnJlbnRseSB0 aGUgdW5kZXJseWluZyBibG9jayBkZXZpY2UgaXM6PG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8 cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1p bHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPjxvOnA+Jm5ic3A7PC9v OnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdmb250LXNp emU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQpjb2xvcjojMUY0 OTdEJz4tLS0gTG9naWNhbCB2b2x1bWUgLS0tPG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8cCBj bGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6 IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPiZuYnNwOyBMVg0KTmFtZSZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KL2Rldi9sb2dmcy1zZXNzaW9ucy9zZXNz aW9uczxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0 eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7 DQpjb2xvcjojMUY0OTdEJz4mbmJzcDsgVkcNCk5hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsNCmxvZ2ZzLXNlc3Npb25zPG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFz cz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6IkNh bGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPiZuYnNwOyBMVg0KVVVJRCZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KMzJUUmJlLU9JRHctdTRhSC1mVW1ELUZMbVUt NWpSdi1NYVZZRGc8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48 c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMt c2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+Jm5ic3A7IExWIFdyaXRlIEFjY2VzcyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KcmVhZC93cml0ZTxvOnA+PC9vOnA+PC9z cGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTEu MHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQpjb2xvcjojMUY0OTdEJz4m bmJzcDsgTFYgU3RhdHVzJm5ic3A7Jm5ic3A7DQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDthdmFpbGFibGU8bzpwPjwvbzpw Pjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXpl OjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3 RCc+Jm5ic3A7ICMNCm9wZW4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsN CjA8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHls ZT0nZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0K Y29sb3I6IzFGNDk3RCc+Jm5ic3A7IExWDQpTaXplJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7DQoxMDAuNTYgVEI8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05v cm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIs InNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+Jm5ic3A7IEN1cnJlbnQNCkxFJm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7DQoyNjM2MDI1MzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9y bWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwi c2Fucy1zZXJpZiI7DQpjb2xvcjojMUY0OTdEJz4mbmJzcDsNClNlZ21lbnRzJm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7DQoxODxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNv Tm9ybWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJp Iiwic2Fucy1zZXJpZiI7DQpjb2xvcjojMUY0OTdEJz4mbmJzcDsNCkFsbG9jYXRpb24mbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsNCmluaGVyaXQ8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05v cm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIs InNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+Jm5ic3A7IFJlYWQgYWhlYWQgc2VjdG9ycyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAwPG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFz cz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6IkNh bGlicmkiLCJzYW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPiZuYnNwOyBCbG9jaw0KZGV2aWNl Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7IDI1Mzo2MTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxz cGFuIHN0eWxlPSdmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1z ZXJpZiI7DQpjb2xvcjojMUY0OTdEJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQoNCjxw IGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBwdDtmb250LWZhbWls eToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+QXQgdGhpcyBwb2ludCB3 aGF0IGFyZSBvdXIgb3B0aW9ucyB0byByZWNvdmVyIHRoaXMgZmlsZXN5c3RlbT88bzpwPjwvbzpw Pjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXpl OjExLjBwdDtmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3 RCc+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNw YW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNl cmlmIjsNCmNvbG9yOiMxRjQ5N0QnPlRoYW5rIHlvdSBmb3IgYW55IGhlbHAgeW91IG1heSBiZSBh YmxlIHRvIHByb3ZpZGUuPG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3Jt YWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6IkNhbGlicmkiLCJz YW5zLXNlcmlmIjsNCmNvbG9yOiMxRjQ5N0QnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4N Cg0KPGRpdj4NCg0KPGRpdj4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2lu LXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0byc+PGI+PHNwYW4NCnN0eWxl PSdmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIjtjb2xvcjojNEQ0RjUzJz5KYXNvbiBW YWdhbGF0b3M8bzpwPjwvbzpwPjwvc3Bhbj48L2I+PC9wPg0KDQo8L2Rpdj4NCg0KPC9kaXY+DQoN CjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjExLjBwdDtmb250LWZh bWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KY29sb3I6IzFGNDk3RCc+PG86cD4mbmJzcDs8 L286cD48L3NwYW4+PC9wPg0KDQo8ZGl2Pg0KDQo8ZGl2IHN0eWxlPSdib3JkZXI6bm9uZTtib3Jk ZXItdG9wOnNvbGlkICNCNUM0REYgMS4wcHQ7cGFkZGluZzozLjBwdCAwaW4gMGluIDBpbic+DQoN CjxwIGNsYXNzPU1zb05vcm1hbD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250 LWZhbWlseToiVGFob21hIiwic2Fucy1zZXJpZiInPkZyb206PC9zcGFuPjwvYj48c3Bhbg0Kc3R5 bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6IlRhaG9tYSIsInNhbnMtc2VyaWYiJz4g Sm9lIEFsbGVuIDxicj4NCjxiPlNlbnQ6PC9iPiBXZWRuZXNkYXksIEZlYnJ1YXJ5IDI0LCAyMDEw IDk6MTUgQU08YnI+DQo8Yj5Ubzo8L2I+IEphc29uIFZhZ2FsYXRvczxicj4NCjxiPlN1YmplY3Q6 PC9iPiBGd2Q6IHhmc19ncm93ZnMgZmFpbHVyZS4uLi48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQoN CjwvZGl2Pg0KDQo8L2Rpdj4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxvOnA+Jm5ic3A7PC9vOnA+ PC9wPg0KDQo8ZGl2Pg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PGJyPg0Kd2llcmQuIGhlIHNlZW1z IHRvIGJlIGltcGx5aW5nIHdlIHdlcmUgYXQgMTEwdGIgYW5kIHN0dWZmIGlzIHdyaXR0ZW4gdGhl cmUuIEkNCmd1ZXNzIHdlIG5lZWQgdG8gYmUgMTAwJSBzdXJlIG9mIHRoZSBzcGFjZSBhbGxvY2F0 ZWQuIHdlcmUgdGhlIG90aGVyIEx1bnMgZXZlcg0KYXR0YWNoZWQgPzxvOnA+PC9vOnA+PC9wPg0K DQo8L2Rpdj4NCg0KPGRpdj4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxvOnA+Jm5ic3A7PC9vOnA+ PC9wPg0KDQo8ZGl2Pg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PG86cD4mbmJzcDs8L286cD48L3A+ DQoNCjwvZGl2Pg0KDQo8ZGl2Pg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PG86cD4mbmJzcDs8L286 cD48L3A+DQoNCjwvZGl2Pg0KDQo8L2Rpdj4NCg0KPGRpdj4NCg0KPHAgY2xhc3M9TXNvTm9ybWFs IHN0eWxlPSdtYXJnaW4tYm90dG9tOjEyLjBwdCc+PGJyPg0KQmVnaW4gZm9yd2FyZGVkIG1lc3Nh Z2U6PG86cD48L286cD48L3A+DQoNCjwvZGl2Pg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2lu LXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPGRpdj4NCg0KPHAgY2xhc3M9TXNv Tm9ybWFsIHN0eWxlPSdtYXJnaW4tYm90dG9tOjEyLjBwdCc+PGI+RnJvbTo8L2I+IERhdmUgQ2hp bm5lciAmbHQ7PGENCmhyZWY9Im1haWx0bzpkYXZpZEBmcm9tb3JiaXQuY29tIj5kYXZpZEBmcm9t b3JiaXQuY29tPC9hPiZndDtuZyZuYnNwOzxicj4NCjxiPkRhdGU6PC9iPiBGZWJydWFyeSAyNCwg MjAxMCAzOjU0OjIwIEFNIFBTVDxicj4NCjxiPlRvOjwvYj4gSm9lIEFsbGVuICZsdDs8YSBocmVm PSJtYWlsdG86Sm9lLkFsbGVuQGNpdHJpeC5jb20iPkpvZS5BbGxlbkBjaXRyaXguY29tPC9hPiZn dDs8YnI+DQo8Yj5DYzo8L2I+ICZxdW90OzxhIGhyZWY9Im1haWx0bzp4ZnNAb3NzLnNnaS5jb20i Pnhmc0Bvc3Muc2dpLmNvbTwvYT4mcXVvdDsNCiZsdDs8YSBocmVmPSJtYWlsdG86eGZzQG9zcy5z Z2kuY29tIj54ZnNAb3NzLnNnaS5jb208L2E+Jmd0Ozxicj4NCjxiPlN1YmplY3Q6PC9iPiA8Yj5S ZTogeGZzX2dyb3dmcyBmYWlsdXJlLi4uLjwvYj48bzpwPjwvbzpwPjwvcD4NCg0KPC9kaXY+DQoN CjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFy Z2luLWJvdHRvbTo1LjBwdCc+DQoNCjxkaXY+DQoNCjxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0n bWFyZ2luLWJvdHRvbToxMi4wcHQnPk9uIFdlZCwgRmViIDI0LCAyMDEwIGF0IDAyOjQ0OjM3QU0N Ci0wODAwLCBKb2UgQWxsZW4gd3JvdGU6PG86cD48L286cD48L3A+DQoNCjxwIGNsYXNzPU1zb05v cm1hbD5JIGFtIGluIHNvbWUgZGlmZmljdWx0eSBoZXJlIG92ZXIgYSAxMDBUQiBmaWxlc3lzdGVt IHRoYXQ8bzpwPjwvbzpwPjwvcD4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4w cHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5JcyBub3cgdW51 c2FibGUgYWZ0ZXIgYSB4ZnNfZ3Jvd2ZzIGNvbW1hbmQuPG86cD48L286cD48L3A+DQoNCjwvYmxv Y2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJv dHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD48bzpwPiZuYnNwOzwvbzpwPjwvcD4N Cg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDtt YXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPklzIHRoZXJlIHNvbWVv bmUgdGhhdCBtaWdodCBoZWxwIGFzc2lzdD88bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3Rl Pg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUu MHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KDQo8L2Js b2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1i b3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+I21vdW50OiAvZGV2L2xvZ2ZzLXNl c3Npb25zL3Nlc3Npb25zOiBjYW4ndCByZWFkIHN1cGVyYmxvY2s8bzpwPjwvbzpwPjwvcD4NCg0K PC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJn aW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxvOnA+Jm5ic3A7PC9vOnA+ PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUu MHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+RmlsZXN5c3Rl bSAmcXVvdDtkbS02MSZxdW90OzogRGlzYWJsaW5nIGJhcnJpZXJzLCBub3QNCnN1cHBvcnRlZCB3 aXRoIGV4dGVybmFsIGxvZyBkZXZpY2U8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0K DQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0 Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPmF0dGVtcHQgdG8gYWNjZXNzIGJleW9uZCBlbmQgb2Yg ZGV2aWNlPG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5 bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1z b05vcm1hbD5kbS02MTogcnc9MCwgd2FudD0yMzg5OTUwMzgyMDgsIGxpbWl0PTIxNTk0MzE5MjU3 NjxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxwIGNsYXNzPU1zb05vcm1hbCBz dHlsZT0nbWFyZ2luLWJvdHRvbToxMi4wcHQnPjxicj4NCllvdSd2ZSBncm93biB0aGUgZmlsZXN5 c3RlbSB0byAyMzg5OTUwMzgyMDgg0ZVlY3RvcnMgKDExMS4zVGlCKSw8YnI+DQpidXQgdGhlIHVu ZGVybHlpbmcgZGV2aWNlIGlzIG9ubHkgMjE1OTQzMTkyNTc2IHNlY3RvcnMgKDEwMC41VGlCKTxi cj4NCmluIHNpemUuPGJyPg0KPGJyPg0KSSdtIGFzc3VtaW5nIHRoYXQgeW91J3JlIHRyeWluZyB0 byBtb3VudCB0aGUgZmlsZXN5c3RlbSBhZnRlciBhPGJyPg0KcmVib290PyBJIG1ha2UgdGhpcyBh c3N1bXB0aW9uIGFzIGdyb3dmcyBpcyBhbiBvbmxpbmUgb3BlcmF0aW9uIGFuZDxicj4NCndvbid0 IGdyb3cgaWYgdGhlIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNlIGhhcyBub3QgYWxyZWFkeSBiZWVu PGJyPg0KZ3Jvd24uIEZvciBhIHN1YnNlcXVlbnQgbW91bnQgdG8gZmFpbCB3aXRoIHRoZSB1bmRl cmx5aW5nIGRldmljZTxicj4NCmJlaW5nIHRvbyBzbWFsbCwgc29tZXRoaW5nIGFib3V0IHRoZSB1 bmRlcmx5aW5nIGJsb2NrPGJyPg0KZGV2aWNlIGhhZCB0byBjaGFuZ2UuLi4uPGJyPg0KPGJyPg0K V2hhdCBrZXJuZWwgdmVyc2lvbiBhbmQgeGZzcHJvZ3MgdmVyc2lvbiBhcmUgeW91IHVzaW5nPzxi cj4NCjxicj4NCjxvOnA+PC9vOnA+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+eGZzX3JlcGFp ciAtbiAmbHQ7ZGV2aWNlJmd0OyBiYXNpY2FsbHkgbG9va3MgZm9yIHN1cGVyYmxvY2tzDQoocGhh c2UgMSBJPG86cD48L286cD48L3A+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUu MHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+Z3Vlc3MgKSBm b3IgYSBsb25nIHRpbWUuIEknbSBsZXR0aW5nIGl0IHJ1biwgYnV0IG5vdCBtdWNoDQpob3BlLjxv OnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxwIGNsYXNzPU1zb05vcm1hbCBzdHls ZT0nbWFyZ2luLWJvdHRvbToxMi4wcHQnPjxicj4NCkRvbid0IHJlcGFpciB0aGUgZmlsZXN5c3Rl bSAtIHRoZXJlIGlzIG5vdGhpbmcgd3Jvbmcgd2l0aCBpdDxicj4NCnVubGVzcyB5b3Ugc3RhcnQg bW9kaWZ5aW5nIHN0dWZmLiBXaGF0IHlvdSBuZWVkIHRvIGRvIGlzIGZpeCB0aGU8YnI+DQp1bmRl cmx5aW5nIGRldmljZSB0byBicmluZyBpdCBiYWNrIHRvIHRoZSBzaXplIGl0IHdhcyBzdXBwb3Nl ZCB0bzxicj4NCmJlIGF0IHdoZW4gdGhlIGdyb3cgb3BlcmF0aW9uIHdhcyBydW4uPGJyPg0KPGJy Pg0KV2hhdCBkb2VzIC9wcm9jL3BhcnRpdGlvbnMgdGVsbCB5b3UgYWJvdXQgdGhlIHNpemUgb2Yg ZG0tNjE/IGRvZXM8YnI+DQp0aGF0IHJlcG9ydCB0aGUgY29ycmVjdCBzaXplLCBhbmQgaWYgaXQg ZG9lcywgd2hhdCBpcyBpdD88YnI+DQo8YnI+DQo8bzpwPjwvbzpwPjwvcD4NCg0KPHAgY2xhc3M9 TXNvTm9ybWFsPkknbSBoZXNpdGFudCB0byBydW4geGZzX3JlcGFpciAtTCAmbmJzcDtvciB3aXRo b3V0IHRoZSAtbg0KZmxhZyBmb3IgZmVhciBvZiBtYWtpbmcgaXQgd29yc2UuPG86cD48L286cD48 L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWJvdHRvbToxMi4wcHQnPjxi cj4NCkdvb2QgLSBkb24ndCBydW4gYW55dGhpbmcgbGlrZSB0aGF0IHVudGlsIHlvdSBzb3J0IG91 dCB3aGV0aGVyIHRoZTxicj4NCnVuZGVybHlpbmcgZGV2aWNlIGlzIGNvcnJlY3RseSBzaXplZCBv ciBub3QuPGJyPg0KPGJyPg0KPG86cD48L286cD48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD4t YmFzaC0zLjEjIHhmc19kYiAtciAtYyAnc2IgMCcgLWMgcA0KL2Rldi9sb2dmcy1zZXNzaW9ucy9z ZXNzaW9uczxvOnA+PC9vOnA+PC9wPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1 LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPm1hZ2ljbnVt ID0gMHg1ODQ2NTM0MjxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1 b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBj bGFzcz1Nc29Ob3JtYWw+YmxvY2tzaXplID0gNDA5NjxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2Nr cXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0 b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+ZGJsb2NrcyA9IDI5ODc0Mzc5Nzc2PG86 cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxl PSdtYXJnaW4tYm90dG9tOjEyLjBwdCc+PGJyPg0KWEZTIGRlZmluaXRlbHkgdGhpbmtzIGl0IGlz IDExMS4zVGlCIGluIHNpemUuPGJyPg0KPGJyPg0KPG86cD48L286cD48L3A+DQoNCjxwIGNsYXNz PU1zb05vcm1hbD5yYmxvY2tzID0gMDxvOnA+PC9vOnA+PC9wPg0KDQo8YmxvY2txdW90ZSBzdHls ZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNv Tm9ybWFsPnJleHRlbnRzID0gMDxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxi bG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0K DQo8cCBjbGFzcz1Nc29Ob3JtYWw+dXVpZCA9IGZjOGJkZjc2LWQ5NjItNDNjMS1hZTYwLWI4NWYz Nzg5NzhhNjxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0 eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1N c29Ob3JtYWw+bG9nc3RhcnQgPSAwPG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0K PGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+ DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5yb290aW5vID0gMjA0ODxvOnA+PC9vOnA+PC9wPg0KDQo8 L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdp bi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+cmJtaW5vID0gMjA0OTxvOnA+ PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4t dG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+cnN1 bWlubyA9IDIwNTA8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90 ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xh c3M9TXNvTm9ybWFsPnJleHRzaXplID0gMzg0PG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90 ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1 LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5hZ2Jsb2NrcyA9IDI2ODQzNTMyODxvOnA+PC9v OnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9w OjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+YWdjb3Vu dCA9IDExMjxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxwIGNsYXNzPU1zb05v cm1hbCBzdHlsZT0nbWFyZ2luLWJvdHRvbToxMi4wcHQnPjxicj4NCjExMiBBR3Mgb2YgMVRpQiBl YWNoIC0gdGhhdCBjb25maXJtcyB0aGUgZ3JvdyBzdWNjZWVkZWQgYW5kIGl0IHdhczxicj4NCmFi bGUgdG8gd3JpdGUgbWV0YWRhdGEgdG8gZGlzayBiZXR3ZWVuIDEwMCBhbmQgMTExIFRpQiB3aXRo b3V0PGJyPg0KZXJyb3JzIGJlaW5nIHJlcG9ydGVkLiBUaGF0IGltcGxpZXMgdGhlIGJsb2NrIGRl dmljZSBtdXN0IGhhdmUgYmVlbjxicj4NCnRoYXQgYmlnIGF0IHNvbWUgcG9pbnQuLi48YnI+DQo8 YnI+DQo8bzpwPjwvbzpwPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPnJibWJsb2NrcyA9IDA8 bzpwPjwvbzpwPjwvcD4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFy Z2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5sb2dibG9ja3MgPSAzMjAw MDxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdt YXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3Jt YWw+dmVyc2lvbm51bSA9IDB4MzE4NDxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoN CjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQn Pg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+c2VjdHNpemUgPSA1MTI8bzpwPjwvbzpwPjwvcD4NCg0K PC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJn aW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPmlub2Rlc2l6ZSA9IDI1Njxv OnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJn aW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+ aW5vcGJsb2NrID0gMTY8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2tx dW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAg Y2xhc3M9TXNvTm9ybWFsPmZuYW1lID0NCiZxdW90O1wwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFww MDBcMDAwXDAwMFwwMDBcMDAwXDAwMCZxdW90OzxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVv dGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206 NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+YmxvY2tsb2cgPSAxMjxvOnA+PC9vOnA+PC9w Pg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0 O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+c2VjdGxvZyA9IDk8 bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFy Z2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFs Pmlub2RlbG9nID0gODxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1 b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBj bGFzcz1Nc29Ob3JtYWw+aW5vcGJsb2cgPSA0PG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90 ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1 LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5hZ2Jsa2xvZyA9IDI4PG86cD48L286cD48L3A+ DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7 bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5yZXh0c2xvZyA9IDA8 bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBzdHlsZT0nbWFy Z2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFs PmlucHJvZ3Jlc3MgPSAwPG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2Nr cXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxw IGNsYXNzPU1zb05vcm1hbD5pbWF4X3BjdCA9IDI1PG86cD48L286cD48L3A+DQoNCjwvYmxvY2tx dW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRv bTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5pY291bnQgPSA3MjkxNTIwPG86cD48L286 cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6 NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5pZnJlZSA9 IDg1MTQ8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8YmxvY2txdW90ZSBzdHls ZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAgY2xhc3M9TXNv Tm9ybWFsPmZkYmxvY2tzID0gNjYyMzE4NTU5NzxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVv dGU+DQoNCjxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWJvdHRvbToxMi4wcHQnPjxi cj4NCldpdGggMjQuNVRpQiBvZiBmcmVlIHNwYWNlPGJyPg0KPGJyPg0KPG86cD48L286cD48L3A+ DQoNCjxwIGNsYXNzPU1zb05vcm1hbD4tYmFzaC0zLjEjIHhmc19kYiAtciAtYyAnc2IgMicgLWMg cA0KL2Rldi9sb2dmcy1zZXNzaW9ucy9zZXNzaW9uczxvOnA+PC9vOnA+PC9wPg0KDQo8YmxvY2tx dW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0KPHAg Y2xhc3M9TXNvTm9ybWFsPm1hZ2ljbnVtID0gMHg1ODQ2NTM0MjxvOnA+PC9vOnA+PC9wPg0KDQo8 L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdp bi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+YmxvY2tzaXplID0gNDA5Njxv OnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdtYXJn aW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+ ZGJsb2NrcyA9IDI0MTExNDE4MzY4PG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0K PHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tYm90dG9tOjEyLjBwdCc+PGJyPg0KVGhh dCdzIDg5LjlUaUIuLi48YnI+DQo8YnI+DQo8bzpwPjwvbzpwPjwvcD4NCg0KPHAgY2xhc3M9TXNv Tm9ybWFsPnJibG9ja3MgPSAwPG86cD48L286cD48L3A+DQoNCjxibG9ja3F1b3RlIHN0eWxlPSdt YXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1Nc29Ob3Jt YWw+cmV4dGVudHMgPSAwPG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2Nr cXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxw IGNsYXNzPU1zb05vcm1hbD51dWlkID0gZmM4YmRmNzYtZDk2Mi00M2MxLWFlNjAtYjg1ZjM3ODk3 OGE2PG86cD48L286cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9 J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05v cm1hbD5sb2dzdGFydCA9IDA8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8Ymxv Y2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Jz4NCg0K PHAgY2xhc3M9TXNvTm9ybWFsPnJvb3Rpbm8gPSAyMDQ4PG86cD48L286cD48L3A+DQoNCjwvYmxv Y2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4wcHQ7bWFyZ2luLWJv dHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5yYm1pbm8gPSAyMDQ5PG86cD48L286 cD48L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6 NS4wcHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5yc3VtaW5v ID0gMjA1MDxvOnA+PC9vOnA+PC9wPg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjxibG9ja3F1b3RlIHN0 eWxlPSdtYXJnaW4tdG9wOjUuMHB0O21hcmdpbi1ib3R0b206NS4wcHQnPg0KDQo8cCBjbGFzcz1N c29Ob3JtYWw+cmV4dHNpemUgPSAzODQ8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0K DQo8YmxvY2txdW90ZSBzdHlsZT0nbWFyZ2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0 Jz4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPmFnYmxvY2tzID0gMjY4NDM1MzI4PG86cD48L286cD48 L3A+DQoNCjwvYmxvY2txdW90ZT4NCg0KPGJsb2NrcXVvdGUgc3R5bGU9J21hcmdpbi10b3A6NS4w cHQ7bWFyZ2luLWJvdHRvbTo1LjBwdCc+DQoNCjxwIGNsYXNzPU1zb05vcm1hbD5hZ2NvdW50ID0g OTA8bzpwPjwvbzpwPjwvcD4NCg0KPC9ibG9ja3F1b3RlPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+ PGJyPg0KQW5kIDkwIEFHcy4gVGhhdCB0ZWxscyBtZSB0aGUgZmlsZXN5c3RlbSB3YXMgY3JlYXRl ZCBhcyBhIDkwVGlCPGJyPg0KZmlsZXN5c3RlbS4gQ2FuIHlvdSB0ZWxsIG1lIGlmIHlvdSBhdHRl bXB0ZWQgdG8gZ3JvdyBmcm9tIDkwVGlCIHRvPGJyPg0KMTAwVGlCIG9yIGZyb20gMTAwVGlCIHRv IDExMFRpQj8gJm5ic3A7VGhlcmUgd2VyZSBidWdzIGF0IG9uZSBwb2ludCBpbjxicj4NCmJvdGgg dGhlIHVzZXJzcGFjZSBncm93IGNvZGUgYW5kIHRoZSBrZXJuZWwgY29kZSB0aGF0IHJlc3VsdGVk IGluPGJyPg0KYmFkIGdyb3dzIChoZW5jZSB0aGUgbmVlZCB0byBrbm93IHRoZSB2ZXJzaW9ucyB0 aGlzIG9jY3VycmVkIG9uPGJyPg0KYW5kIHdoYXQgeW91IHdlcmUgYWN0dWFsbHkgYXR0ZW1wdGlu ZyB0byBkbyksIGJ1dCB0aGVzZSBwcm9ibGVtczxicj4NCmNhbiB1c3VhbGx5IGJlIGZpeGVkIHVw IHdpdGggc29tZSB4ZnNfZGIgbWFnaWMuPGJyPg0KPGJyPg0KQ2hlZXJzLDxicj4NCjxicj4NCkRh dmUuPGJyPg0KLS0gPGJyPg0KRGF2ZSBDaGlubmVyPGJyPg0KPGEgaHJlZj0ibWFpbHRvOmRhdmlk QGZyb21vcmJpdC5jb20iPmRhdmlkQGZyb21vcmJpdC5jb208L2E+PG86cD48L286cD48L3A+DQoN CjwvZGl2Pg0KDQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGl2Pg0KDQo8L2JvZHk+DQoNCjwvaHRtbD4N Cg== --_000_DD534F7C25BFA14FB18E6D603135D7EA0A11DAC231sbapexch05_-- From patrick@news-service.com Wed Feb 24 12:28:55 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1OISsgw040527 for ; Wed, 24 Feb 2010 12:28:55 -0600 X-ASG-Debug-ID: 1267036216-6f05023c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from pu01.news-service.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5EFA71DBAD5F for ; Wed, 24 Feb 2010 10:30:16 -0800 (PST) Received: from pu01.news-service.com (ns1.news-service.com [195.114.240.3]) by cuda.sgi.com with ESMTP id Wc0ijnKDH4BPy1VK for ; Wed, 24 Feb 2010 10:30:16 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by pu01.news-service.com (Postfix) with ESMTP id E2BDA13E26; Wed, 24 Feb 2010 19:30:15 +0100 (CET) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: Debian amavisd-new at pu01.news-service.com Received: from pu01.news-service.com ([127.0.0.1]) by localhost (pu01.nse [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2U4f2xdacGsJ; Wed, 24 Feb 2010 19:30:10 +0100 (CET) Received: from [172.25.4.18] (fw01.nse [172.25.8.1]) by pu01.news-service.com (Postfix) with ESMTP id 96FBC13E21; Wed, 24 Feb 2010 19:30:10 +0100 (CET) Message-ID: <4B85703A.60104@news-service.com> Date: Wed, 24 Feb 2010 19:30:18 +0100 From: Patrick Schreurs User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.7) Gecko/20100111 Thunderbird/3.0.1 MIME-Version: 1.0 To: Christoph Hellwig CC: Tommy van Leeuwen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Subject: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) References: <4B3F9F88.9030307@news-service.com> <20100107110446.GA13802@discord.disaster> <4B45CFAC.4000607@news-service.com> <20100108113114.GA8654@discord.disaster> <4B504B03.7050604@news-service.com> <4B6706CE.1020207@news-service.com> <20100208194226.GD9527@infradead.org> <4B712166.9010701@news-service.com> <20100209103157.GA5197@infradead.org> <4B72A9D1.8030101@news-service.com> <20100210145508.GA29047@infradead.org> <4B72D3F3.2040308@news-service.com> In-Reply-To: <4B72D3F3.2040308@news-service.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ns1.news-service.com[195.114.240.3] X-Barracuda-Start-Time: 1267036217 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23363 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean On 10-2-2010 16:42, Patrick Schreurs wrote: > On 10-2-2010 15:55, Christoph Hellwig wrote: >> On Wed, Feb 10, 2010 at 01:42:57PM +0100, Patrick Schreurs wrote: >>> Thanks for the patch. After having this patch applied we saw *a lot* >>> warnings. They all look like this: >> >> Ok, looks like that is not an issue, so you can discard that patch. >> >> I went down to the radix tree code to look for races in it's tag >> handling, but then noticed that we might have an issue with our >> usage of the radix-tree API. Can you try the patch below ontop >> of Dave's rollup, and instead of my previous one? > > Okay. This patch is currently active. Thanks. I don't have a way to > trigger it, so we'll have to wait and see what happens. Servers running with this patch applied are still running stable. The first server we've patched is running stable for 2 weeks now. Should we try to have this patches included for 2.6.33? -Patrick From Joe.Allen@citrix.com Wed Feb 24 12:36:20 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.1 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1OIaKcA040940 for ; Wed, 24 Feb 2010 12:36:20 -0600 X-ASG-Debug-ID: 1267036662-4d9a02200000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from SBAPEXCH05.ad.corp.expertcity.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EA7F71F1B57 for ; Wed, 24 Feb 2010 10:37:42 -0800 (PST) Received: from SBAPEXCH05.ad.corp.expertcity.com (sbapexch05.ad.corp.expertcity.com [216.219.126.165]) by cuda.sgi.com with ESMTP id b38GoGmha356Bt7d for ; Wed, 24 Feb 2010 10:37:42 -0800 (PST) Received: from SBAPEXCH05.ad.corp.expertcity.com ([10.1.6.25]) by sbapexch05 ([10.1.6.25]) with mapi; Wed, 24 Feb 2010 10:38:02 -0800 From: Joe Allen To: Peter Grandi , Linux XFS , Dave Chinner CC: "xfs@oss.sgi.com" Date: Wed, 24 Feb 2010 10:37:30 -0800 X-ASG-Orig-Subj: RE: xfs_growfs failure.... Subject: RE: xfs_growfs failure.... Thread-Topic: xfs_growfs failure.... Thread-Index: Acq1d9OrVKrP/bJTS0aRf8PMeobmzQAApUSg Message-ID: References: <19333.23937.956036.716@tree.ty.sabi.co.uk> In-Reply-To: <19333.23937.956036.716@tree.ty.sabi.co.uk> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-cr-hashedpuzzle: A/XN F+gO HJjz HXIw H0vT H6KP Icw6 JyKJ PiAC SzDw UYU4 Uv2x aMZN bpFn cWNQ gX1A;3;ZABhAHYAaQBkAEAAZgByAG8AbQBvAHIAYgBpAHQALgBjAG8AbQA7AHAAZwBfAHgAZgAyAEAAeABmADIALgBmAG8AcgAuAHMAYQBiAGkALgBjAG8ALgB1AGsAOwB4AGYAcwBAAG8AcwBzAC4AcwBnAGkALgBjAG8AbQA=;Sosha1_v1;7;{D712ED4C-191D-4C4C-82E8-C8FAFEAA6795};agBvAGUALgBhAGwAbABlAG4AQABjAGkAdAByAGkAeAAuAGMAbwBtAA==;Wed, 24 Feb 2010 18:37:30 GMT;UgBFADoAIAB4AGYAcwBfAGcAcgBvAHcAZgBzACAAZgBhAGkAbAB1AHIAZQAuAC4ALgAuAA== x-cr-puzzleid: {D712ED4C-191D-4C4C-82E8-C8FAFEAA6795} acceptlanguage: en-US x-ems-proccessed: oXeMnjjQeARSDE4UqeV8aA== x-ems-stamp: FsWatmjsNU1L2KhP9hwaxA== Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: sbapexch05.ad.corp.expertcity.com[216.219.126.165] X-Barracuda-Start-Time: 1267036662 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23363 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 Thanks so much for the help interpreting.=20 We are extremely grateful for your help.=20 I have tried to include some more information you all suggest might help: >> It looks like that the filesystem was "grown" from ~92TiB to ~114TiB on a storage device that is reported as ~103TiB long. Again, very strange. cat /proc/partitions [snip] 253 61 107971596288 dm-61 =3D ~100TB.=20 -bash-3.1# lvdisplay --- Logical volume --- LV Name /dev/logfs-sessions/sessions VG Name logfs-sessions LV UUID 32TRbe-OIDw-u4aH-fUmD-FLmU-5jRv-MaVYDg LV Write Access read/write LV Status available # open 0 LV Size 100.56 TB Current LE 26360253 Segments 18 Allocation inherit Read ahead sectors 0 Block device 253:61 --- Logical volume --- LV Name /dev/logfs-sessions/logdev VG Name logfs-sessions LV UUID cRDvJx-3QMS-VI7X-Oqj1-bGDA-ACki-quXpve LV Write Access read/write LV Status available # open 0 LV Size 5.00 GB Current LE 1281 Segments 1 Allocation inherit Read ahead sectors 0 Block device 253:60 >>112 AGs of 1TiB each - that confirms the grow succeeded and it was able t= o write metadata to disk=20 >>between 100 and 111 TiB without errors being reported. That implies the b= lock device must have been that big at some point... There were never 110 TB; only 100 were ever there...so I am not clear on th= is point.=20 >>My impression is that not enough history/context has been >>provided to enable a good guess at what has happened and how to >>undo the consequent damage.You suggested more context might help:=20 These were the commands run:=20 =20 pvcreate /dev/dm-50 /dev/dm-51 /dev/dm-52 /dev/dm-53 /dev/dm-54 /dev/dm-55 vgextend logfs-sessions /dev/dm-50 /dev/dm-51 /dev/dm-52 /dev/dm-53 /dev/dm= -54 /dev/dm-55 lvextend -i 3 -I 512 -l +1406973 /dev/logfs-sessions/sessions /dev/dm-50 /d= ev/dm-51 /dev/dm-52 lvextend -i 3 -I 512 -l +1406973 /dev/logfs-sessions/sessions /dev/dm-53 /d= ev/dm-54 /dev/dm-55 xfs_growfs /u01 (which failed) xfs_growfs -d /u01 (which did not error out) touch /u01/a I am sorry I don't have the output of the xfs_growfs command any longer.=20 Very shortly after someone noticed the filesystem was essentially offline -= - input output error.=20 Tried unmounting but couldn't... got out of memory errors even when doing l= s. =20 Tried rebooting and now FS is off line.=20 The FS was 90TB, the purpose of the exercise was to grow it to 100TB.=20 This is: -bash-3.1# uname -a Linux xx.com 2.6.18-53.1.19.el5 #1 SMP Tue Apr 22 03:01:10 EDT 2008 x86_64 = x86_64 x86_64 GNU/Linux rpm -qa | grep xfs kmod-xfs-0.4-1.2.6.18_8.1.1.el5.centos.plus.1 xfsprogs-2.8.20-1.el5.centos I've read about a case where Mr Chinner used xfd_db to set agcount and in s= ome cases fix things up. Don't know if I am a candidate for that approach...=20 If there is any information I can gather I am more than ready to do that.=20 -----Original Message----- From: xfs-bounces@oss.sgi.com [mailto:xfs-bounces@oss.sgi.com] On Behalf Of= Peter Grandi Sent: Wednesday, February 24, 2010 9:10 AM To: Linux XFS Subject: Re: xfs_growfs failure.... > I am in some difficulty here over a 100TB filesystem Shrewd idea! Because 'fsck' takes no time and memory, so the bigger the filesystem the better! ;-). > that Is now unusable after a xfs_growfs command. [ ... ]=20 Wondering how long it took to backup 100TB; but of course doing a 'grow' is guaranteed to be error free, so there :-). > attempt to access beyond end of device dm-61: rw=3D0, > want=3D238995038208, limit=3D215943192576 It looks like the underlying DM logical volume is smaller than the new size of the filesystem, which is strange as 'xfs_growfs' is supposed to fetch the size of the underlying block device if none is specified explicitly on the command line. The different is about 10% or 10TB, so it is far from trivial. Looking at the superblock dumps there are some pretty huge discrepancies,=20 -bash-3.1# xfs_db -r -c 'sb 0' -c p /dev/logfs-sessions/sessions magicnum =3D 0x58465342 blocksize =3D 4096 dblocks =3D 29874379776 rblocks =3D 0 rextents =3D 0 uuid =3D fc8bdf76-d962-43c1-ae60-b85f378978a6 logstart =3D 0 rootino =3D 2048 rbmino =3D 2049 rsumino =3D 2050 rextsize =3D 384 agblocks =3D 268435328 agcount =3D 112 [ ... ] -bash-3.1# xfs_db -r -c 'sb 2' -c p /dev/logfs-sessions/sessions magicnum =3D 0x58465342 blocksize =3D 4096 dblocks =3D 24111418368 rblocks =3D 0 rextents =3D 0 uuid =3D fc8bdf76-d962-43c1-ae60-b85f378978a6 logstart =3D 0 rootino =3D 2048 rbmino =3D 2049 rsumino =3D 2050 rextsize =3D 384 agblocks =3D 268435328 agcount =3D 90 [ ... ] The 'dblocks' field is rather different, even if the 'uuid' and 'agblocks' is the same, and 'agcount' is also rather different. In SB 0 'dblocks' 29874379776 means size 238995038208, which is value of 'want' above. The products of 'agcount' and 'agblocks' fit with the sizes. It looks like that the filesystem was "grown" from ~92TiB to ~114TiB on a storage device that is reported as ~103TiB long. Again, very strange. My impression is that not enough history/context has been provided to enable a good guess at what has happened and how to undo the consequent damage. _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs From pg_mh@sabi.co.UK Wed Feb 24 15:32:58 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1OLWw3F049615 for ; Wed, 24 Feb 2010 15:32:58 -0600 X-ASG-Debug-ID: 1267047259-0f62030e0000-ps1ADW X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ty.sabi.co.UK (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EDBC01F3028 for ; Wed, 24 Feb 2010 13:34:20 -0800 (PST) Received: from ty.sabi.co.UK (82-69-39-138.dsl.in-addr.zen.co.uk [82.69.39.138]) by cuda.sgi.com with ESMTP id dZ0Fs7dPAS8JUiyn for ; Wed, 24 Feb 2010 13:34:20 -0800 (PST) Received: from from [127.0.0.1] (helo=tree.ty.sabi.co.uk) by ty.sabi.co.UK with esmtp(Exim 4.63 #1) id 1NkOru-0000ZP-Rz for ; Wed, 24 Feb 2010 21:34:06 +0000 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <19333.39755.63777.969923@tree.ty.sabi.co.uk> Date: Wed, 24 Feb 2010 21:34:03 +0000 X-Face: SMJE]JPYVBO-9UR%/8d'mG.F!@.,l@c[f'[%S8'BZIcbQc3/">GrXDwb#;fTRGNmHr^JFb SAptvwWc,0+z+~p~"Gdr4H$(|N(yF(wwCM2bW0~U?HPEE^fkPGx^u[*[yV.gyB!hDOli}EF[\cW*S H&spRGFL}{`bj1TaD^l/"[ msn( /TH#THs{Hpj>)]f> X-ASG-Orig-Subj: RE: xfs_growfs failure.... Subject: RE: xfs_growfs failure.... In-Reply-To: References: <19333.23937.956036.716@tree.ty.sabi.co.uk> X-Mailer: VM 8.0.12-devo-585 under 21.5 (beta27) XEmacs Lucid (i686-redhat-linux) From: pg_xf2@xf2.for.sabi.co.UK (Peter Grandi) X-Disclaimer: This message contains only personal opinions X-Barracuda-Connect: 82-69-39-138.dsl.in-addr.zen.co.uk[82.69.39.138] X-Barracuda-Start-Time: 1267047260 X-Barracuda-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.23373 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 [ ... ] >> It looks like that the filesystem was "grown" from ~92TiB to >> ~114TiB on a storage device that is reported as ~103TiB >> long. Again, very strange. > cat /proc/partitions > [snip] > 253 61 107971596288 dm-61 > = ~100TB. That's the same as "limit=215943192576". > -bash-3.1# lvdisplay > --- Logical volume --- > LV Name /dev/logfs-sessions/sessions > VG Name logfs-sessions > LV UUID 32TRbe-OIDw-u4aH-fUmD-FLmU-5jRv-MaVYDg > LV Write Access read/write > LV Status available > # open 0 > LV Size 100.56 TB > Current LE 26360253 > Segments 18 > Allocation inherit > Read ahead sectors 0 > Block device 253:61 > --- Logical volume --- > LV Name /dev/logfs-sessions/logdev > VG Name logfs-sessions > LV UUID cRDvJx-3QMS-VI7X-Oqj1-bGDA-ACki-quXpve > LV Write Access read/write > LV Status available > # open 0 > LV Size 5.00 GB > Current LE 1281 > Segments 1 > Allocation inherit > Read ahead sectors 0 > Block device 253:60 >> 112 AGs of 1TiB each - that confirms the grow succeeded and >> it was able to write metadata to disk between 100 and 111 TiB >> without errors being reported. That implies the block device >> must have been that big at some point... > There were never 110 TB; only 100 were ever there...so I am > not clear on this point. Not clear here too; because if the fs was grown to 110TB that number must have come from somewhere. [ ... ] > These were the commands run: > pvcreate /dev/dm-50 /dev/dm-51 /dev/dm-52 /dev/dm-53 /dev/dm-54 /dev/dm-55 > vgextend logfs-sessions /dev/dm-50 /dev/dm-51 /dev/dm-52 /dev/dm-53 /dev/dm-54 /dev/dm-55 > lvextend -i 3 -I 512 -l +1406973 /dev/logfs-sessions/sessions /dev/dm-50 /dev/dm-51 /dev/dm-52 > lvextend -i 3 -I 512 -l +1406973 /dev/logfs-sessions/sessions /dev/dm-53 /dev/dm-54 /dev/dm-55 So you extended the LV twice, starting from 23,546,307 4MiB LEs ('dblocks=24111418368'), by 1,406,973 LEs each time. That is consistent with the whole story, not at all obvious how comes SB 0 got 'dblocks=29874379776' when 'dm-61' has 26360253 4MiB LEs equivalent to 26992899072 dblocks, for a difference of 11,255,784MiB. Especially as the size in SB0 tallies with the number of AGs in it. So far everything fine. > xfs_growfs /u01 (which failed) > xfs_growfs -d /u01 (which did not error out) > touch /u01/a > -bash-3.1# uname -a > Linux xx.com 2.6.18-53.1.19.el5 #1 SMP Tue Apr 22 03:01:10 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux That seems to imply RH51, which is somewhat old. > rpm -qa | grep xfs > kmod-xfs-0.4-1.2.6.18_8.1.1.el5.centos.plus.1 > xfsprogs-2.8.20-1.el5.centos BTW, I would use nowadays the 'elrepo' 'kmod' packages rather than the CentOSPlus ones (even if the 'kmod-xfs' main version is the same). And fortunately you are using 64b arch or else you'd never be able able to 'fsck' the filesystem (it could still take weeks). Also on my system I have 'xfsprogs-2.9.4-1.el5.centos' which is rather newer. I wonder if there was some bug fix for 'growfs' between 2.8.0 and 2.9.4. > I've read about a case where Mr Chinner used xfd_db to set > agcount and in some cases fix things up. Don't know if I am a > candidate for that approach... The good news from the SB dumps is that SB 2 is basically the old one for the 90TB filesystem, and that growing the filesystem does not actually change anything much in it, just the top level metadata saying how big the filesystem is. It is likely that if you revert to the SB 2 you should get back the 90TB version of your filesystem untouched. Then you got to repair it anyhow, to ensure that it is consistent, and that could take weeks. The bad news is that for some reason 'growfs' thought the block device was 110TB, and that's a problem, because perhaps that strange number will surface again. One wild guess is that something happened here: > xfs_growfs /u01 (which failed) > xfs_growfs -d /u01 (which did not error out) during the first operation, given that you have an external log, which *may* have caused trouble. Or else some 'growfs' bug in 2.8.0. BTW there is also that a 90-110TB single filesystem seems to me rather unwise, never mind one that spans linearly several block devices, which seems to me extremely avoidable (euphemism) unless the contents are entirely disposable. From SRS0+sY6z+84+fromorbit.com=david@internode.on.net Wed Feb 24 17:00:55 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1ON0sx6055279 for ; Wed, 24 Feb 2010 17:00:55 -0600 X-ASG-Debug-ID: 1267052535-1c8701f50000-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 41B0C1CF6FA8 for ; Wed, 24 Feb 2010 15:02:15 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id r8MmBVi7EnfgPhVO for ; Wed, 24 Feb 2010 15:02:15 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14947303-1927428 for multiple; Thu, 25 Feb 2010 09:32:14 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NkQF9-0003MH-Ta; Thu, 25 Feb 2010 10:02:11 +1100 Date: Thu, 25 Feb 2010 10:02:11 +1100 From: Dave Chinner To: Joe Allen Cc: Peter Grandi , Linux XFS X-ASG-Orig-Subj: Re: xfs_growfs failure.... Subject: Re: xfs_growfs failure.... Message-ID: <20100224230211.GL16175@discord.disaster> References: <19333.23937.956036.716@tree.ty.sabi.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1267052537 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23377 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, Feb 24, 2010 at 10:37:30AM -0800, Joe Allen wrote: > Thanks so much for the help interpreting. > We are extremely grateful for your help. > I have tried to include some more information you all suggest might help: > > > >> It looks like that the filesystem was "grown" from ~92TiB to > ~114TiB on a storage device that is reported as ~103TiB > long. Again, very strange. > > cat /proc/partitions > [snip] > 253 61 107971596288 dm-61 > > = ~100TB. OK. > >>112 AGs of 1TiB each - that confirms the grow succeeded and it was able to write metadata to disk > >>between 100 and 111 TiB without errors being reported. That > >>implies the block device must have been that big at some > >>point... > > There were never 110 TB; only 100 were ever there...so I am not clear on this point. Well, XFS writes the new AG header metadata synchronously to the expanded region before making the superblock changes. If they didn't error out, either: a. the block device was large enough b. the writes were silently ignored by the block device (buggy block device) c. the block device wrapped them back around to the front of the device (buggy block device) and overwrote stuff => fs corruption. SO regardless of what actually happened, you're going to need to run xfs_repair after the main superblock is fixed up. > >>My impression is that not enough history/context has been > >>provided to enable a good guess at what has happened and how to > >>undo the consequent damage.You suggested more context might help: > > > These were the commands run: > > pvcreate /dev/dm-50 /dev/dm-51 /dev/dm-52 /dev/dm-53 /dev/dm-54 /dev/dm-55 > vgextend logfs-sessions /dev/dm-50 /dev/dm-51 /dev/dm-52 /dev/dm-53 /dev/dm-54 /dev/dm-55 > lvextend -i 3 -I 512 -l +1406973 /dev/logfs-sessions/sessions /dev/dm-50 /dev/dm-51 /dev/dm-52 > lvextend -i 3 -I 512 -l +1406973 /dev/logfs-sessions/sessions /dev/dm-53 /dev/dm-54 /dev/dm-55 > xfs_growfs /u01 (which failed) > xfs_growfs -d /u01 (which did not error out) > touch /u01/a Ok, 2.8.20 is old enough to have the userspace growfs bugs, and I'd say the kernel is old enough to have the growfs bugs as well. It is entirely possible that executing it twice was the cause of this. > I am sorry I don't have the output of the xfs_growfs command any longer. > Very shortly after someone noticed the filesystem was essentially offline -- input output error. > Tried unmounting but couldn't... got out of memory errors even when doing ls. > Tried rebooting and now FS is off line. > > The FS was 90TB, the purpose of the exercise was to grow it to 100TB. > > This is: > > -bash-3.1# uname -a > Linux xx.com 2.6.18-53.1.19.el5 #1 SMP Tue Apr 22 03:01:10 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux > > rpm -qa | grep xfs > kmod-xfs-0.4-1.2.6.18_8.1.1.el5.centos.plus.1 > xfsprogs-2.8.20-1.el5.centos > I've read about a case where Mr Chinner used xfd_db to set agcount > and in some cases fix things up. > Don't know if I am a candidate for that approach... That's exactly what is has to be done to get the superblock back into the correct shape to enable a repair run to occur. First, upgrade your userspace tools to the latest so you pick up all the xfs_repair speedups and memory usage reductions. Then calculate the correct block count for 100AGs (dblocks = agcount * agblocks), modify the agcount and dblocks fields using xfs_db, then xfs_repair -n to confirm that it finds the superblock valid. If the superblock is valid, you can then probably mount the filesystem to replay the log. Unmount immediately afterwards. Note that this may replay the bad growfs transaction, so you might need to use xfs_db to reset the superblock again. Once this is done you can run repair for real after which you should have a usable filesytem. This won't have restored the filesystem to the exact size of the underlying block device - a subsequent grow would be needed to extend the fs to include a partial AG at the end to use the remaining space. Good luck! Cheers, Dave. -- Dave Chinner david@fromorbit.com From martin.geng@martinlinkingbiz.com Wed Feb 24 23:17:01 2010 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 o1P5GxL5075772 for ; Wed, 24 Feb 2010 23:16:59 -0600 X-ASG-Debug-ID: 1267075089-4144006b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from martinlinkingbiz.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 329F713D820D for ; Wed, 24 Feb 2010 21:18:10 -0800 (PST) Received: from martinlinkingbiz.com (mail.martinlinkingbiz.com [74.63.226.6]) by cuda.sgi.com with ESMTP id JFXkTFCuVai17ZvD for ; Wed, 24 Feb 2010 21:18:10 -0800 (PST) Received: from MartinThinkpad by martinlinkingbiz.com (MDaemon FREE v10.1.1) with ESMTP id md50000083837.msg; Thu, 25 Feb 2010 05:11:40 +0000 X-MDPtrLookup-Result: pass dns.ptr=115-64-174-134.static.tpgi.com.au (ip=115.64.174.134) (martinlinkingbiz.com) X-MDHeloLookup-Result: hardfail smtp.helo=MartinThinkpad (does not match 115.64.174.134) (martinlinkingbiz.com) X-Authenticated-Sender: martin.geng@martinlinkingbiz.com X-MDRemoteIP: 115.64.174.134 X-Return-Path: martin.geng@martinlinkingbiz.com X-Envelope-From: martin.geng@martinlinkingbiz.com Reply-To: From: "Martin Geng" To: "Martin Geng" X-ASG-Orig-Subj: =?gb2312?B?QmVoYXZpb3IgQmFzZWQgU2FmZXR5IEJlc3QgUHJhY3RpY2VzKNDQzqqwssir?= =?gb2312?B?1+680cq1vPkp?= Subject: =?gb2312?B?QmVoYXZpb3IgQmFzZWQgU2FmZXR5IEJlc3QgUHJhY3RpY2VzKNDQzqqwssir?= =?gb2312?B?1+680cq1vPkp?= Date: Thu, 25 Feb 2010 15:51:17 +1100 Message-ID: <2E20BE53263949AD979C64CC9C029996@MartinThinkpad> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_00E0_01CAB634.EFA987A0" X-Mailer: Microsoft Office Outlook 11 thread-index: AcpzJS/vFcipTE9OSKC93nvA+RBACwAAEi4wCT2N8oAAAJQSQAApTLqAACrB6DAAAVkGAAA12RfAADHzkfAAC51esACVMRwwADMlR5AAMCfdsAAqOOawASwqMaAAAo9cYAAEPE9AAAAmnxAAAT2BUAAoqIywAAmbggAANFBYIACZoyGwACpdWYACIv+dwAACXE+wAAjsJ0AALYrHEAABwlWwAAKdsjAAAOc2UAAlrcEQAAlU82AACXf3UAAhwdtAADLDigAAMUzNEAAAkjugAAAV/qAAArEfoAAAkXcQ X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579 X-Barracuda-Connect: mail.martinlinkingbiz.com[74.63.226.6] X-Barracuda-Start-Time: 1267075100 X-Barracuda-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.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=BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, HTML_MESSAGE, MIME_QP_LONG_LINE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.23398 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.82 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain 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_00E0_01CAB634.EFA987A0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_00E1_01CAB634.EFA987A0" ------=_NextPart_001_00E1_01CAB634.EFA987A0 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: quoted-printable =20 Behavior Based Safety Best Practices 27&28 May 2010 Shanghai, China Hello, =20 How are you?=20 =20 MARTIN LINKING is convening the Behavior Based Safety Best Practices training on 25&26 March 2010 in Shanghai.=20 =20 The Behavior Based Safety plan will focus on answering the above two issues, which can help you learn how to implement Behavior Based Safety plan in the company, it also can help you understand how to maintain your current Behavior Based Safety plan, and further combine with the company's management system, making it an organic whole.=20 =20 The training arrange a lot of discussion and exercises between classes, through a variety of exercises, you will learn to: =A8=B9 Understand why traditional safety management will fail =A8=B9 Understand the iceberg theory of safety =A8=B9 Master classification of the behavior and make key behavior card =A8=B9 Learn effective methods of safety communication =A8=B9 Analysis of the company safety culture =A8=B9 Identify false appearance in the initial phase of Behavior Based Safety plan =A8=B9 Clearly understand obstacles to implement of the plan and the solution =A8=B9 Learn to make the implementation plan of Behavior Based Safety plan =A8=B9 Develop incentive programs =A8=B9 Develop the company's vision, mission and values of the Behavior Based Safety plan =20 The training will help you achieve: =A8=B9 Clear whether the company already have the condition to implement Behavior Based Safety plan =A8=B9 The obstacles to implement Behavior Based Safety plan and solutions =A8=B9 Learn to make the implementation plan of Behavior Based Safety plan =A8=B9 Learn to make key behavior card =A8=B9 Learn to develop incentive programs =A8=B9 Learn to develop the company's vision, mission and values of the Behavior Based Safety plan =20 Two days training fee is RMB 6995. =20 Please find an agenda in both English and Chinese attached with this email and feel free to contact me for more information. =20 To register the very limited seats, simply fill out the registration form, attention it to Martin Geng and fax it to + 86 28 6552 1233. =20 Martin Geng ____________________________ Martin Linking Business Consulting Company Limited. =20 T: +86 28 65521255 F: +86 28 65521233 www.martinlinking.com=20 =20 Upcoming Martin Linking events: =20 =20 Title : Successful Project Management 2010 Date : 26th & 27th July 2010 Location: Shanghai, China Link : http://www.martinlinking.com/documents/ws/ pm2010_ws.pdf =20 Title : Effective Sales Leadership=20 Date : 12th & 13th July 2010 Location: Shanghai, China Link : http://www.martinlinking.com/documents/ws/ salesl_ws.pdf =20 Title : Lean Production Workshop 2010 Date : 24th & 25th June 2010 Location: Shanghai, China Link : http://www.martinlinking.com/documents/ws/leanp_ws.pdf =20 =20 Title : Strategic Purchasing & Supplier Management Date : 21st & 22nd June 2010 =20 Location: Shanghai, China Link : http://www.martinlinking.com/documents/ws/ spsm_ws.pdf =20 =20 Title : Behavior Based Safety Best Practices Date : 27&28 May 2010 Location: Shanghai, China Link : http://www.martinlinking.com/documents/ws/ bbsbp_ws.pdf =20 =20 Title : Best Practices in Organization Development 2010 Date : 20th & 21st May 2010 Location: Shanghai, China Link : http://www.martinlinking.com/documents/ws/ od_ws.pdf=20 =20 Title : Equipment Maintenance Management and Production Cost Control (=C9=E8=B1=B8=CE=AC=D0=DE=B9=DC=C0=ED=D3=EB=C9=FA=B2=FA=B3=C9=B1=BE=BF=D8=D6=C6)=20 Date : 11&12 March 2010 Location: Shanghai, China Link : http://www.martinlinking.com/documents/ws/ em_ws.pdf=20 =20 If you no longer wish to receive further marketing e-mails, please let us know.=20 This message was delivered by MDaemon - http://www.altn.com/MDaemon/ ------=_NextPart_001_00E1_01CAB634.EFA987A0 Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: quoted-printable
 

Behavior Based Safety Best Practices

27&28 May=20 2010

Shanghai, China

Hello,

 

How are you?=20

 

MARTIN=20 LINKING is convening the Behavior Based Safety Best Practices training=20 on 25&26 March 2010 in Shanghai.

 

The Behavior Based=20 Safety plan will focus on answering the above two issues, which can help you=20 learn how to implement Behavior Based Safety plan in the company, it also can=20 help you understand how to maintain your current Behavior Based Safety plan, and=20 further combine with the company's management system, making it an organic=20 whole.

 

The training arrange a lot of discussion and exercises between=20 classes, through a variety of exercises, you will learn to:

=A8=B9 =20 Understand why=20 traditional safety management will fail

=A8=B9 =20 Understand the=20 iceberg theory of safety

=A8=B9 =20 Master classification=20 of the behavior and make key behavior card

=A8=B9 =20 Learn effective=20 methods of safety communication

=A8=B9 =20 Analysis of the=20 company safety culture

=A8=B9 =20 Identify false=20 appearance in the initial phase of Behavior Based Safety=20 plan

=A8=B9 =20 Clearly understand=20 obstacles to implement of the plan and the solution

=A8=B9 =20 Learn to make the=20 implementation plan of Behavior Based Safety plan

=A8=B9 =20 Develop incentive=20 programs

=A8=B9 =20 Develop the company's=20 vision, mission and values of the Behavior Based Safety plan

 

The training will help you achieve:

=A8=B9 =20 Clear whether the=20 company already have the condition to implement Behavior Based Safety=20 plan

=A8=B9 =20 The obstacles to=20 implement Behavior Based Safety plan and solutions

=A8=B9 =20 Learn to make the=20 implementation plan of Behavior Based Safety plan

=A8=B9 =20 Learn to make key=20 behavior card

=A8=B9 =20 Learn to develop=20 incentive programs

=A8=B9 =20 Learn to develop the=20 company's vision, mission and values of the Behavior Based Safety=20 plan

 

Two days training fee is RMB 6995.

 

Please=20 find an agenda in both English and Chinese attached with this email and feel=20 free to contact me for more information.

 

To=20 register the very limited seats, simply fill=20 out the registration form, attention it=20 to  Martin Geng and fax it to + 86 28 6552 1233.

 

Martin Geng

____________________________

Martin=20 Linking Business=20 Consulting Company=20 Limited.

 

T: +86 28 65521255

F: +86 28 65521233

www.martinlinking.com 

 

Upcoming=20 Martin Linking events:  

 

Title   =20   :  Successful Project Management=20 2010
Date     :  26th=20 & 27th July 2010

Location:  Shanghai,=20 China
Link     =20 :  http://www.martinlinking.com/documents/ws/pm2010_ws.pdf

 

Title   =20   :  Effective Sales Leadership 

Date    =20 :  12th & 13th July 2010

Location:  Shanghai,=20 China
Link     =20 :  http://www.martinlinking.com/documents/ws/salesl_ws.pdf

 

Title      :  Lean Production Workshop=20 2010
Date    =20 :  24th & 25th June=20 2010

Location:  Shanghai, China
Link      :  http://www.martinlinking.com/documents/ws/leanp_ws.pdf   

 

Title      :  Strategic Purchasing &=20 Supplier Management
Date    =20 :  21st=20 & 22nd June 2010
  
Location:  Shanghai, China
Link      :
  http://www.martinlinking.com/documents/ws/spsm_ws.pdf  

 

Title   =20   :  Behavior Based Safety=20 Best Practices
Date    =20 :   27&28 May 2010

Location:  Shanghai, China
Link      :  http://www.martinlinking.com/documents/ws/bbsbp_ws.pdf   

  

Title   =20   :  Best Practices in Organization=20 Development 2010
Date     :  =20 20th=20 & 21st May=20 2010

Location:  Shanghai, China
Link      :  http://www.martinlinking.com/documents/ws/od_ws.pdf 

 

Title   =20   :  Equipment Maintenance=20 Management and Production Cost Control (=C9=E8=B1=B8=CE=AC=D0=DE=B9=DC=C0=ED=D3=EB=C9=FA=B2=FA=B3=C9=B1=BE=BF=D8=D6=C6) 
Date    =20 :  11&12 March 2010

Location: Shanghai, China
Link      :  http://www.martinlinking.com/documents/ws/em_ws.pdf 

 

If you no longer wish to receive further=20 marketing e-mails, please let us know. 


This message was delivered by MDaemon - http://www.altn.com/MDaemon/
------=_NextPart_001_00E1_01CAB634.EFA987A0-- ------=_NextPart_000_00E0_01CAB634.EFA987A0 Content-Type: application/pdf; name="Behavior Based Safety Best Practices.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Behavior Based Safety Best Practices.pdf" JVBERi0xLjYNJeLjz9MNCjk1IDAgb2JqDTw8L0xpbmVhcml6ZWQgMS9MIDM5ODM0NS9PIDk3L0Ug Mjc3MDk4L04gOS9UIDM5NjM5OC9IIFsgMTEzNiA2MjNdPj4NZW5kb2JqDSAgICAgICAgICAgICAg DQp4cmVmDQo5NSA0Mg0KMDAwMDAwMDAxNiAwMDAwMCBuDQowMDAwMDAxNzU5IDAwMDAwIG4NCjAw MDAwMDE4NjAgMDAwMDAgbg0KMDAwMDAwMjA3MCAwMDAwMCBuDQowMDAwMDAyMzE3IDAwMDAwIG4N CjAwMDAwMDI0NDkgMDAwMDAgbg0KMDAwMDAwMjU4NyAwMDAwMCBuDQowMDAwMDAzMDEzIDAwMDAw IG4NCjAwMDAwMDM1MzIgMDAwMDAgbg0KMDAwMDAwMzY2NCAwMDAwMCBuDQowMDAwMDAzNzAxIDAw MDAwIG4NCjAwMDAwMDQwMDAgMDAwMDAgbg0KMDAwMDAwNDI5OCAwMDAwMCBuDQowMDAwMDA0NTU0 IDAwMDAwIG4NCjAwMDAwMDQ4MDQgMDAwMDAgbg0KMDAwMDAwNTE4NyAwMDAwMCBuDQowMDAwMDA1 MjY1IDAwMDAwIG4NCjAwMDAwMDYzNDAgMDAwMDAgbg0KMDAwMDAwNjkwNiAwMDAwMCBuDQowMDAw MDA3NTYxIDAwMDAwIG4NCjAwMDAwMDgyMDQgMDAwMDAgbg0KMDAwMDAwODc5NSAwMDAwMCBuDQow MDAwMDA5NDA3IDAwMDAwIG4NCjAwMDAwMDk5OTEgMDAwMDAgbg0KMDAwMDAxOTY5MyAwMDAwMCBu DQowMDAwMDE5ODcyIDAwMDAwIG4NCjAwMDAwMjA2MTggMDAwMDAgbg0KMDAwMDA0NDA5NSAwMDAw MCBuDQowMDAwMTI3NDU3IDAwMDAwIG4NCjAwMDAxMjgzODggMDAwMDAgbg0KMDAwMDEzMTA4MiAw MDAwMCBuDQowMDAwMTM5NzE5IDAwMDAwIG4NCjAwMDAxMzk5NjggMDAwMDAgbg0KMDAwMDE0MDE4 MSAwMDAwMCBuDQowMDAwMTQ3NzU3IDAwMDAwIG4NCjAwMDAxNDgwMTIgMDAwMDAgbg0KMDAwMDE0 ODIzMCAwMDAwMCBuDQowMDAwMTY1NDk2IDAwMDAwIG4NCjAwMDAxODY5MjYgMDAwMDAgbg0KMDAw MDI3NjQyMyAwMDAwMCBuDQowMDAwMjc2NjYzIDAwMDAwIG4NCjAwMDAwMDExMzYgMDAwMDAgbg0K dHJhaWxlcg0KPDwvU2l6ZSAxMzcvUHJldiAzOTYzODcvUm9vdCA5NiAwIFIvSW5mbyA5NCAwIFIv SURbPEZCOEVEMUQwMTVGNDFBNERCQzVBMkZFQUQxMUFGNTdEPjwyNjJCMEU1MTVFRDdEQzQzOEE2 QUE0MkU0NzcwN0NBNT5dPj4NCnN0YXJ0eHJlZg0KMA0KJSVFT0YNCiAgICAgICAgICAgDQoxMzYg MCBvYmoNPDwvTGVuZ3RoIDUyOC9DIDYzNy9GaWx0ZXIvRmxhdGVEZWNvZGUvSSA2NTkvTyA2MjEv UyA0NDM+PnN0cmVhbQ0KeNpiYGBgZmBgucrAxsDAfo5BmAEBhIFi7AwsDBwTGBwYGBwFWrMZ5A6w 3WesEWDKAEqrGLCzy8UolH6/X3r8kQoDLsB4hEmIJ8Ax0Y1NamNU07Jzsja1TCIel1R95noteMTI yaahcDExRDvKwDA4nW+eXSOXSqbQsoSdFYUMLc0iAhGBjW1rkk6s3NzuL+/QKmTSGawetMJi4dpo 84ynhxfmnJqml3ASKKfiNeMXi8bE9qIr2W3nZndlLLx9CGTRRK3kFwKL/JYGlOvGmJXcCXZcJWcr dmYlQsOGmL07Cv3admY93OyWdN8m4O/kTcsFFrjVGpVqTVriUvFywytJ3mYuFuMEiFfKyys6QKAB zGNSgvA6OkA8QUGxdCgXIs2WhizNYIzQzCgoKGxcgaSWURDFKAZBY9MwJAHGBuwhD2QpMLAutgHS 6kDsAtaryiDIENZg0sD9gC2AR4O9g2EfULCZwdFBOoE3gOsCwxIOGSZBRlOG6Q2uDsofBCWmszDK MB3VPREY75B/YJkgzwHmAMYE2WKGXAZdj8ylllKvFzDrMMvwRjHENBgdEFeQDmDawFjC2MSwkj2B IYxB/IFIAMcDxgqGXQzJrKINjg7yCqwJzA1AgReMUQxbGFIcrBy4PyAnB1sG1scXgTQnMADPAmk3 BtZn84C0GDC9acNVxTGwcXwCeR2ImAACDABGIbh/DQplbmRzdHJlYW0NZW5kb2JqDTk2IDAgb2Jq DTw8L091dGxpbmVzIDYxIDAgUi9NZXRhZGF0YSA5MyAwIFIvUGFnZXMgOTIgMCBSL1N0cnVjdFRy ZWVSb290IDcwIDAgUi9UeXBlL0NhdGFsb2c+Pg1lbmRvYmoNOTcgMCBvYmoNPDwvQ3JvcEJveFsw IDAgNTk1LjIyIDg0Ml0vUGFyZW50IDkyIDAgUi9TdHJ1Y3RQYXJlbnRzIDAvQ29udGVudHNbMTEx IDAgUiAxMTIgMCBSIDExMyAwIFIgMTE0IDAgUiAxMTUgMCBSIDExNiAwIFIgMTE3IDAgUiAxMjMg MCBSXS9Sb3RhdGUgMC9NZWRpYUJveFswIDAgNTk1LjIyIDg0Ml0vUmVzb3VyY2VzIDk4IDAgUi9U eXBlL1BhZ2U+Pg1lbmRvYmoNOTggMCBvYmoNPDwvWE9iamVjdDw8L0ltMSAxMTggMCBSL0ltMiAx MTkgMCBSL0ltMyAxMjAgMCBSL0ltNCAxMjEgMCBSL0ltNSAxMjIgMCBSPj4vQ29sb3JTcGFjZTw8 L0NzNiAxMDQgMCBSPj4vRm9udDw8L1RUMSA5OSAwIFIvVFQyIDEwMCAwIFIvVFQzIDEwMSAwIFIv VFQ0IDEwMiAwIFIvVFQ1IDEwMyAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1hZ2VD XS9FeHRHU3RhdGU8PC9HUzEgMTEwIDAgUj4+Pj4NZW5kb2JqDTk5IDAgb2JqDTw8L1N1YnR5cGUv VHlwZTAvRGVzY2VuZGFudEZvbnRzWzEyNyAwIFJdL0Jhc2VGb250L0pBQ0NPTytDYWxpYnJpL1Rv VW5pY29kZSAxMDUgMCBSL0VuY29kaW5nL0lkZW50aXR5LUgvVHlwZS9Gb250Pj4NZW5kb2JqDTEw MCAwIG9iag08PC9TdWJ0eXBlL1R5cGUwL0Rlc2NlbmRhbnRGb250c1sxMzAgMCBSXS9CYXNlRm9u dC9KQUNERk0rQ2FsaWJyaS1Cb2xkL1RvVW5pY29kZSAxMDYgMCBSL0VuY29kaW5nL0lkZW50aXR5 LUgvVHlwZS9Gb250Pj4NZW5kb2JqDTEwMSAwIG9iag08PC9TdWJ0eXBlL1RydWVUeXBlL0ZvbnRE ZXNjcmlwdG9yIDEwNyAwIFIvTGFzdENoYXIgMTIxL1dpZHRoc1s3MDUgMCAwIDAgMCAwIDI1OCAw IDAgMCA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgMCAwIDAgMCAwIDAg MCA2MDYgNTYxIDUyOSA2MzAgMCA0NTkgMCA2MzEgMjY3IDAgMCA0MjMgODc0IDY1OSAwIDUzMiA2 ODYgNTYzIDQ3MyA0OTUgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNDk0IDUzNyA0MTggNTM3IDUw MyAzMTYgNDc0IDUzNyAyNDYgMCA0ODAgMjQ2IDgxMyA1MzcgNTM4IDUzNyAwIDM1NSAzOTkgMzQ3 IDUzNyA0NzMgNzQ1IDAgNDc0XS9CYXNlRm9udC9KQUNER04rQ2FsaWJyaS1Cb2xkL0ZpcnN0Q2hh ciAzOC9FbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvVHlwZS9Gb250Pj4NZW5kb2JqDTEwMiAwIG9i ag08PC9TdWJ0eXBlL1RydWVUeXBlL0ZvbnREZXNjcmlwdG9yIDEwOCAwIFIvTGFzdENoYXIgMTUw L1dpZHRoc1s3MTUgMCAyMjEgMzAzIDMwMyAwIDAgMjUwIDAgMjUyIDAgNTA3IDUwNyA1MDcgMCA1 MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyAyNjggMCAwIDAgMCA0NjMgMCA1NzkgNTQ0IDUzMyA2MTUg NDg4IDQ1OSA2MzEgNjIzIDI1MiAwIDUyMCA0MjAgODU1IDY0NiA2NjIgNTE3IDAgNTQzIDQ1OSA0 ODcgNjQyIDU2NyA4OTAgMCAwIDQ2OCAwIDAgMCAwIDAgMCA0NzkgNTI1IDQyMyA1MjUgNDk4IDMw NSA0NzEgNTI1IDIyOSAyMzkgNDU1IDIyOSA3OTkgNTI1IDUyNyA1MjUgNTI1IDM0OSAzOTEgMzM1 IDUyNSA0NTIgNzE1IDQzMyA0NTMgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMjUwIDQxOCA0MTggMCA0OThdL0Jhc2VGb250L0pBQ0ZGQitDYWxpYnJpL0Zp cnN0Q2hhciAzNy9FbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvVHlwZS9Gb250Pj4NZW5kb2JqDTEw MyAwIG9iag08PC9TdWJ0eXBlL1R5cGUwL0Rlc2NlbmRhbnRGb250c1sxMzUgMCBSXS9CYXNlRm9u dC9KQUNGTlArU2ltU3VuL1RvVW5pY29kZSAxMDkgMCBSL0VuY29kaW5nL0lkZW50aXR5LUgvVHlw ZS9Gb250Pj4NZW5kb2JqDTEwNCAwIG9iag1bL0lDQ0Jhc2VkIDEyNCAwIFJdDWVuZG9iag0xMDUg MCBvYmoNPDwvTGVuZ3RoIDIyOC9GaWx0ZXIvRmxhdGVEZWNvZGU+PnN0cmVhbQ0KaN5UULFuxCAM 3fkKjz11gHCVukRI1XXJ0GvVpN05cFKkBpBDhvx9gUapOmD0nv3sZ/NL99x5l4C/UTA9Jhidt4RL WMkg3HByHhoJ1pm0oxrNrCPwLO63JeHc+TFA2zL+npNLog3uhqG5Fyfgr2SRnJ8y8yA/PjPTrzF+ 44w+gQClwOLI+OVFx6ueEXgV/pHDFhFkxc0+O1hcojZI2k8IrRDirPJ3fpQK0Nv/eSZ/VbfRfGli R7V4EortolaKJqOs3atKl7Lh4cqsRNlwPUO1VQw5j8elYohldnnsR4ABABTYbSYKDQplbmRzdHJl YW0NZW5kb2JqDTEwNiAwIG9iag08PC9MZW5ndGggMjI3L0ZpbHRlci9GbGF0ZURlY29kZT4+c3Ry ZWFtDQpo3lRQsW7EIAzd+QqPPXWAcJW6REjVdcnQa9Wk3TlwUqQGkEOG/H2BRqk6YPSe/exn80v3 3HmXgL9RMD0mGJ23hEtYySDccHIeGgnWmbSjGs2sI/As7rcl4dz5MUDbMv6ek0uiDe6GQd6LE/BX skjOT5l5kB+fmenXGL9xRp9AgFJgcWT88qLjVc8IvAr/yGGLCLLiZp8dLC5RGyTtJ4RWCHFW+Ts/ SgXo7f88k7+q22i+NLGjWjwJxXZRK0WTUdbuVaVL2fBwZVaibLieodoqhpzH41IxxDK7PPYjwAAW kW0oCg0KZW5kc3RyZWFtDWVuZG9iag0xMDcgMCBvYmoNPDwvU3RlbVYgMTI0L0ZvbnROYW1lL0pB Q0RHTitDYWxpYnJpLUJvbGQvRm9udFN0cmV0Y2gvTm9ybWFsL0ZvbnRGaWxlMiAxMzEgMCBSL0Zv bnRXZWlnaHQgNzAwL0ZsYWdzIDMyL0Rlc2NlbnQgLTI1MC9Gb250QkJveFstNDkzIC0xOTQgMTIz OSA5NTJdL0FzY2VudCA3NTAvRm9udEZhbWlseShDYWxpYnJpKS9DYXBIZWlnaHQgNjI1L1hIZWln aHQgLTUzMS9UeXBlL0ZvbnREZXNjcmlwdG9yL0l0YWxpY0FuZ2xlIDA+Pg1lbmRvYmoNMTA4IDAg b2JqDTw8L1N0ZW1WIDgwL0ZvbnROYW1lL0pBQ0ZGQitDYWxpYnJpL0ZvbnRTdHJldGNoL05vcm1h bC9Gb250RmlsZTIgMTMyIDAgUi9Gb250V2VpZ2h0IDQwMC9GbGFncyAzMi9EZXNjZW50IC0yNTAv Rm9udEJCb3hbLTQ3NiAtMTk0IDEyMTQgOTUyXS9Bc2NlbnQgNzUwL0ZvbnRGYW1pbHkoQ2FsaWJy aSkvQ2FwSGVpZ2h0IDYyNS9YSGVpZ2h0IC01MzEvVHlwZS9Gb250RGVzY3JpcHRvci9JdGFsaWNB bmdsZSAwPj4NZW5kb2JqDTEwOSAwIG9iag08PC9MZW5ndGggMzEyL0ZpbHRlci9GbGF0ZURlY29k ZT4+c3RyZWFtDQpo3lSST2uEMBDF736KObb0kKhRuyBCsSx46B+6271nk3Er1Biie/DbN8nYLT2o /GbyeC8zsrZ77sywAHt3kzrgAv1gtMN5ujqFcMbLYCDNQA9q2Si+1SgtMC8+rPOCY2f6Ceo6YR++ OS9uhbvjsXjg98DenEY3mIuviOzz5CuHq7XfOKJZgEPTgMY+Ye2LtK9yRGBR+Fc8rhYhi5xu3pPG 2UqFTpoLQs05zxv/yXTZABr9v59UpDr36ku65HaaZ7wJlO0iiTJSTr2CerkkqogU0S5SQVRFitb1 fp8+NYlPsHmVv84UJFj3UZSmlKClBIKopCApFc9UJBfxSAnoSF5RkDwWBckFnSxJLsiooAuU7RaL goQZhf3dZq6uzvl1xCXHoYdxDwZv/4GdbJhseJIfAQYAHgeeoAoNCmVuZHN0cmVhbQ1lbmRvYmoN MTEwIDAgb2JqDTw8L09QTSAxL09QIGZhbHNlL29wIGZhbHNlL1R5cGUvRXh0R1N0YXRlL1NBIGZh bHNlL1NNIDAuMDI+Pg1lbmRvYmoNMTExIDAgb2JqDTw8L0xlbmd0aCAxMDAzL0ZpbHRlci9GbGF0 ZURlY29kZT4+c3RyZWFtDQpIiZRW224bNxB9X6D/ME+BVEQUORzeAMNALBeB09pIogX6EORhu5Yt BbADW0KD/H2HF+2utrJaQ5aXEmcO53LOUPOPzfMOzs7m14urS5Bwfn5xufileqoUbKCS4AnBBCMk wsyTEt7C86r681d4TJtKBJ/2yzZ/itu8O19sLbRbEMF6q0EY75FAoCOjYNuywfulgvstwwjVndEf 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 13UtO6NW8gi41f27SB6hrK3zkoBlhKEenkrPSO5mSMDF0MWkRjtoChvl4ej7RCHay3XTybZS5nxm FwFBEx8mmNPfyp7pXVqWtRvTIwl6l7dsr49D7ovZDRiQG9IzKEs2xsU8jRnyMXaKofabINu9OW0n ue70z/Q5+58+v7S10dUPPgnftoxvRPhnsKtHI7mjob+VLX1QEniBV56xIA6ZOEf1omrdNar1JuSI bc6Wz3mkQ9a95GfXR3sB9bPK7Srr0u17h56I0NuHm/OQeSvmoqZZ0EiLpFVvdNuqVQ64AA2Q9Zy2 hR7atXXDHvslJD31IL49G0+jNu+VNO5fUf3qz5dcVCP4J8AAEiddEQ0KZW5kc3RyZWFtDWVuZG9i ag0xMTcgMCBvYmoNPDwvTGVuZ3RoIDUxMy9GaWx0ZXIvRmxhdGVEZWNvZGU+PnN0cmVhbQ0KSIns lj1v2zAQhnf/Co4kELH8lg0ELRBkCLpWW9GBkKmYgSwKspLA/76UKUAWndZiECAdOknD6cG9d/fe CYAvRSEAoKCoVpgxCQgo7lcZJoQwUJQruLVVZcvnukfF08oH0xDLMSVjMBnibv0H/GsIESEkEwQr DjLquUMc7N2cgdcqEN74OMqFnnLRde1e5wyG6frvaUwkD6JBlNm3tTsac5jDBBbsiqiJ9k45g5p8 gP+Ere56W9pW90jiHBr0q/g+z4YmSPPtGKTZJsoql4slnbW935k5h2KukjibE6ft3GOn9zfx9OTi c7KSofR3ZqdfLBLQdVHVOV4MnFTe6YPZxoMpRApInUA/dGX6Y0ySfHGxpkFoa93ExcqTtI0DFZkE K5ZiOBoKrms/4wp2Rm+PFxUnNGkY+Mj0pExiCS3KfNdggzLmbfSII77vxJv4jG+8OcJ+kn/wLZnW 19kYPsRbiHrvp7SIhm6Xlx0S/B0mO+yd63cXC/ozDWabPjSnQ76CG+i2z2VvXRP1RmKShGf8lKar 4tV7zSF0GFoC/IMxhdf+JfduIB63P9cf9oJfClEt1bVj929vhUGhFOPVqYfGbKBGmcJicI2E3y4s wxab/CN9wUZnlxopTGE8LTTlPv8/G1cHJBMUEzmtuI88Hnn4Yyt31ryYhf+O4LcAAwBOm1b7DQpl bmRzdHJlYW0NZW5kb2JqDTExOCAwIG9iag08PC9TdWJ0eXBlL0ltYWdlL0xlbmd0aCA5NTQ3L0Zp bHRlci9EQ1REZWNvZGUvQml0c1BlckNvbXBvbmVudCA4L0NvbG9yU3BhY2UgMTA0IDAgUi9XaWR0 aCA0NzgvSGVpZ2h0IDk3L1R5cGUvWE9iamVjdD4+c3RyZWFtDQr/2P/uAA5BZG9iZQBkgAAAAAH/ 2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgXEhQUFBQSFxcbHB4cGxckJCcnJCQ1MzMz NTs7Ozs7Ozs7OzsBDQsLDQ4NEA4OEBQODw4UFBARERAUHRQUFRQUHSUaFxcXFxolICMeHh4jICgo JSUoKDIyMDIyOzs7Ozs7Ozs7O//AABEIAGEB3gMBIgACEQEDEQH/xAE/AAABBQEBAQEBAQAAAAAA AAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggF AwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNU ZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH 1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNT FWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaW prbG1ub2JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/APVVnZ31g6RgOLMjIaLBzW2Xu+YbMfNF6u/I r6ZkvxZN7a3FkczHbzXlJJcSSZJ1JPMqfl8AyWSapjyZOHYPe2fXzpDfoV3Wa9mtA/FyC3/GBgz7 sW0DxBaT+ULh0lbHKYvH7WL3pPo+B9cOj5tradz6LHwGi0AAk9twJC3F44NDI5XpP1V6v+0umNFj pyMeK7Z5P7rvmFW5jlxjAlHbqyY8nFoXaSSSVZlUoW2101ustcGMbq5zjAA+JU1wX10607Ky/wBn Uu/QY5/SR+dZ3/zVJixnJLhH1Wzlwi3dyPrv0Wlxaw2Xx+cxuh+bi1Vf/HA6fuj7Nds8fbP3T/Fc Mkro5PH1ssHvSfQcf689FtcG2erRP5z2yB/mFxW7j5NGTU27HsbbW7h7TIXkK7D/ABfHI3ZY1+z+ 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 SOSRN3qoQjVU5GR9XMXIzxlWOPpta1ooAhvtEAT4eSWf0BuTl1ZVFzsV1bQw+mIMDjbBEeC10kvc l32FK4I9nF6h9XWZFONTjWeg2hxJJEk7ol0/vaKwehYpwLMQuc59oBfe73PLhqCSfDwWkklxyoC9 lcEddN3Jwfq9i41VjbXOyLLGGsvd2aRBDRrClkdBx39NHT6XmlgcHF8SSR+9xK1EkuOV3firgjVU 51fQ8FmA/CgltgHqWH6ZI4M+XZZIxcS25/SOnFzi6Dm5jvcdrT9AH4rd6lXlW4VlWIQLngNDiYgE w4/ch9J6XV03G9Jh3WO1ss8T/cnCdAknW9B+1aYWQANO7YxcSjEqFVLYHcnUk+JKMkkoybZBopJJ JJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJfKqSSn6qSXyqkkp+qkl8qpJKfqpJfKqSSn6qSXyqkkp +qkl8qpJKfqpJfKqSSn6qSXyqkkp+qkl8qpJKfqpJfKqSSn6qSXyqkkp+qkl8qpJKfqpJfKqSSn6 qSXyqkkp+qkl8qpJKfqpJfKqSSn6qSXyqkkp+qkl8qpJKfqpJfKqSSn6qSXyqkkp+qkl8qpJKfqp JfKqSSn6qTL5WSSU/VSS+VUklP1UkvlVJJT9VJL5VSSU/VSS+VUklP1UkvlVJJT9VJL5VSSU/VSS +VUklP8A/9kKDQplbmRzdHJlYW0NZW5kb2JqDTExOSAwIG9iag08PC9TdWJ0eXBlL0ltYWdlL0xl bmd0aCAyOS9GaWx0ZXIvRmxhdGVEZWNvZGUvSW1hZ2VNYXNrIHRydWUvQml0c1BlckNvbXBvbmVu dCAxL1dpZHRoIDE2L0hlaWdodCAxNi9UeXBlL1hPYmplY3Q+PnN0cmVhbQ0KSIliYGBiYmDo6GBg UFCC0DC+EpjPBRBgAEYFBNkNCmVuZHN0cmVhbQ1lbmRvYmoNMTIwIDAgb2JqDTw8L1N1YnR5cGUv SW1hZ2UvTGVuZ3RoIDU5Mi9GaWx0ZXIvRmxhdGVEZWNvZGUvSW1hZ2VNYXNrIHRydWUvQml0c1Bl ckNvbXBvbmVudCAxL1dpZHRoIDIyNDUvSGVpZ2h0IDI0NS9UeXBlL1hPYmplY3Q+PnN0cmVhbQ0K aN7s2LENAkEQxVBC6qCRa43wuoKQOmhkaWAITlpnb6YFy7L+Ws5due/DTXe8b26643O66V6I+UMM x3DMNWLeTzcdx3AMx+wh5nM//fAcwzEcs4cYHaNjOIZjSmLsMfYYjuGYkhgdo2M4hmNKYuwx9hiO 4ZiSGB2jYziGY0pi7DH2GI7hmJIYHaNjOIZjSmLsMfYYjuGYkhgdo2M4hmNKYuwx9hiO4ZiSGB2j YziGY0pi7DH2GI7hmJIYHaNjOIZjSmLsMfYYjuGYkhgdo2M4hmNKYuwx9hiO4ZiSGB2jYziGY0pi 7DH2GI7hmJIYHaNjOIZjSmLsMfYYjuGYkhgdo2M4hmNKYuwx9hiO4ZiSGB2jYziGY0pi7DH2GI7h mJIYHaNjOIZjSmLsMfYYjuGYkhgdo2M4hmNKYuwx9hiO4ZiSGB2jYziGY0pi7DH2GI7hmJIYHaNj OIZjSmLsMfYYjuGYkhgdo2M4hmNKYuwx9hiO4ZiSGB2jYziGY0pi7DH2GI7hmJIYHaNjOIZjSmLs MfYYjuGYkhgdo2M4hmNKYuwx9hiO4ZiSGB2jYziGY0pi7DH2GI7hmJIYHaNjOIZjSmLsMfYYjuGY khgdo2M4hmNKYuwx9hiO4ZiSGB2jYziGY0pi7DH2GI7hmJIYHaNjOIZjSmLsMfYYjuGYkhgdo2M4 hmNKYuwx9hiO4ZiSGB2jYzhmg2HWQszIy1r2mHGNQcxfYjiGY64Ro2PGikEMx3DMJmLsMeMagxiO 4ZhNxOgYHXONGOfclvsJMABdHPgYCg0KZW5kc3RyZWFtDWVuZG9iag0xMjEgMCBvYmoNPDwvU3Vi dHlwZS9JbWFnZS9MZW5ndGggMjMzMjAvRmlsdGVyL0RDVERlY29kZS9CaXRzUGVyQ29tcG9uZW50 IDgvQ29sb3JTcGFjZSAxMDQgMCBSL1dpZHRoIDI1MC9IZWlnaHQgMzQwL1R5cGUvWE9iamVjdD4+ c3RyZWFtDQr/2P/uAA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUT ExgXEhQUFBQSFxcbHB4cGxckJCcnJCQ1MzMzNTs7Ozs7Ozs7OzsBDQsLDQ4NEA4OEBQODw4UFBAR ERAUHRQUFRQUHSUaFxcXFxolICMeHh4jICgoJSUoKDIyMDIyOzs7Ozs7Ozs7O//AABEIAVQA+gMB IgACEQEDEQH/xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAA 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 CwUkevViLuOif7kxme6xEkAkul1n7f8AaX/bvV9WWb/W+n9EbZnyWakkrcflacvmUkkkitUkkkkp SSSSSlJJJJKUkkkkpSSSSSmY/hp8JXTV/bZp+3fs+PRq+zfbfU/m/Rb9Gfzd3M+31N23uuWSSU9D Z+z/AFavtH271P8ABb9v+kPqbN3nu+l81DqH2X7T+rett02742enHunb33R8lgpJhXxdrqP277a7 7RPrwfH0/T2D09m7+1wiU/bv2VRu2bPXs9LfH04Zv9ffps2T/uWCkl1V+i9M3/m76Ne/7Vs9nrR6 fpbdp9XZ+fv2z6W7v9LTcqnS/V+20ejH7Rkehv8A5nbtdPqfnb1iJJKegd9u9XP9TZM5Hq7pmdt0 xt9viufSSS6J6v8A/9kKDQplbmRzdHJlYW0NZW5kb2JqDTEyMiAwIG9iag08PC9TdWJ0eXBlL0lt YWdlL0xlbmd0aCA4MzIwMy9GaWx0ZXIvRmxhdGVEZWNvZGUvQml0c1BlckNvbXBvbmVudCA4L0Nv bG9yU3BhY2UgMTA0IDAgUi9XaWR0aCAzMzgvSGVpZ2h0IDM2NC9UeXBlL1hPYmplY3Q+PnN0cmVh bQ0KaN7se2mQXNWV5n1LvtxqkUDCBtvtpXvGMz0RMx0xHQ7GNgiMhRa0AEIaJDZjLBtj2ZaNGXtM 99gxPdMRHTH9p2c6oqHBRrVm7dpVS2ZWZi2q0gYYMMYYCYT2Um25vf29M+fem/mUKkk0Kgm3I3y/ OHp6mZWV+TIrv/OdFYDBrxg7OAAWgMlOHP4Al53h0fM9cKvN96nh/XPNZWYzc5jxe4IH0JfzbNvk P9atvE9fwwMBAYHfA/wL5lcoblaIXma9C37JlsjlIV1iCjO1YkrF+E9rYnH+i0jzkpEvlGY59wXr BQR+D3S/wHrvgtwbnseF/tzUtM/vsrwFsTrlcgSXiEyuZJc+ugqhkMKJD0z+p2YmxV9EQOCjhltN fO8C8U2Xsn6mVKIi74HjeKZuKURWiaISiR9lonCTJGqk2uSKKRJRJXrkJpdNCeETEFWVFUUyjBK+ sGHpvhB6AYGPHk5A/ID1XjnONxzbBh8fUDQNvFlfX08ukFlVKHuRzyqZY1KVoUuYE+LLF0Rfi4RR 6FVVjcSiPNawHFv8RQQEPmpYjPiXYT2CKr7jsCPlKZdpxvTL8/2yrFcqlJcvE+RLkhQUBQzL9MXf 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 Jr1TQBX9TPUJdYVbhaMZ9hlVGW8zQzNPZkln8bL6svWzd2RP5LjnfL0OtY61rjtXLXdz7uh6p/W1 G6ANMRu6N2pszN84vslj09HNhM2Jm3/IM8krzXu9JWxLV75y/qb8sa0eW5sLJAr4BcPbbLfVbEdt 527v32G+Y/+OT4XswmtFJkXlRR+KWcXXvjL9quKrhZ2xO/tLLEsO7sLs4u0a2u2w+2ipdGlO6dge 3z3tZfSywrLXe6P2Xi1fVl6zj7BPuG+kwqeic7/m/l37P1TGV96pcq5qrVaq3lE9d4B9YPCg48GW GuWaopr3h7iH7tZ61LbXadeVH8Yczjj8tD60vvdrxteNDQoNRQ0fj/COjBwNPNrTaNXY2KTUVNIM Nwubp45FHrv5jes3nS2GLbWttNai4+C48Pizb6O/HTrhfaL7JONky3da31W3UdoK26H27PaZjviO kc7wzoFTK051d9l2tX1v9P2R02qnq87Inik5Szibf3bhXM652fOp56cvxF0Y647qfnBx1cXbPQE9 /Ze8L1257H75Yq9T77krdldOX7W5euoa41rHdcvr7X0WfW0/WPzQ1m/Z337D6kbnTeubXQPLB84O OgxeuOV66/Jtr9vX76y8MzAUMnR3OHJ45C777uS9pHsv72fcn3+w6SH6YeEjqUflj5Ue1/2o92Pr iOXImVHX0b4nQU8ejLHGnv+U/tOH8fyn5KflE6oTjZNmk6en3KduPlv9bPx56vP56YKfpX+ufqH7 4rtfHH/pm1k1M/6S/3Lh1+JX8q+OvF72unvWf/bxm+Q383OFb+XfHn3HeNf7Puz9xHzmB+yHio96 H7s+eX96uJC8sPCbAAMA94Tz+woNCmVuZHN0cmVhbQ1lbmRvYmoNMTI1IDAgb2JqDTw8L0xlbmd0 aCA4NTUxL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGgxIDIzODQ0Pj5zdHJlYW0NCkiJ7FZ7UFTn FT/33n0JArsIDhHBb7myYnksBcWoRFZ2l6CWIKCZXSVmL+yF3WRh6e6Kj6g1MVGDMbU1prFJ0aat Nm2qFx+BpDYxj6avxKa2M5lppo52mk7bKWnTTjKNBuj5vnsXFkaZaaf9IzN7L+d+v/M75zvfeVwu AAcAqbAbBChvbLFXhAKRIYCcQ8j62ntj5PThwU9Q/zuAPqWjp7Pr448bZgLkfQowY05naFvHrvcN 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 L8y/MP/C/AvzL8y/MP/C/AvzL8y/MP/C/AvzL8y/MP/C/AvzL8y/hEAGCBkgZICQAUIGCBkgZICQ AUIGCBkgZICQAUIGCBkgZICQAUIGCBkgZICQAUIGCBkgZICQAUIGCBkgZICQAUIGCBkgZICQAcL8 C/MvzL8w+8LsC7MvzL4w+8LsC7MvzL4w+8Lsn+wcPsWPspP9Aqf4kT2gwvhnAIndC9QNCmVuZHN0 cmVhbQ1lbmRvYmoNMTI2IDAgb2JqDTw8L1N0ZW1WIDgwL0ZvbnROYW1lL0pBQ0NPTytDYWxpYnJp L0ZvbnRTdHJldGNoL05vcm1hbC9Gb250RmlsZTIgMTI1IDAgUi9Gb250V2VpZ2h0IDQwMC9GbGFn cyA0L0Rlc2NlbnQgLTI1MC9Gb250QkJveFstNDc2IC0xOTQgMTIxNCA5NTJdL0FzY2VudCA3NTAv Rm9udEZhbWlseShDYWxpYnJpKS9DYXBIZWlnaHQgNjI1L1hIZWlnaHQgLTUzMS9UeXBlL0ZvbnRE ZXNjcmlwdG9yL0l0YWxpY0FuZ2xlIDA+Pg1lbmRvYmoNMTI3IDAgb2JqDTw8L1N1YnR5cGUvQ0lE Rm9udFR5cGUyL0ZvbnREZXNjcmlwdG9yIDEyNiAwIFIvQmFzZUZvbnQvSkFDQ09PK0NhbGlicmkv V1szWzIyNl04ODJbMzA2XV0vQ0lEVG9HSURNYXAvSWRlbnRpdHkvQ0lEU3lzdGVtSW5mbzw8L1N1 cHBsZW1lbnQgMC9PcmRlcmluZyhJZGVudGl0eSkvUmVnaXN0cnkoQWRvYmUpPj4vRFcgMTAwMC9U eXBlL0ZvbnQ+Pg1lbmRvYmoNMTI4IDAgb2JqDTw8L0xlbmd0aCA3NDkwL0ZpbHRlci9GbGF0ZURl Y29kZS9MZW5ndGgxIDIwMjk2Pj5zdHJlYW0NCkiJ7FZ/VBTXFf7e7E/ABVZQUIi8ZdgVy49FUBQ0 iLBLjZYYQE8xNekusMgegeUsq9HkpLEnraZomrS2NqbVaE1NbTUONk1NSi21iWlqsGlq0jbGNLXG xEQSE2OTaoDeNzssoLan7Un/yDm7s3fed7/73Tfv3Tu8BQxAHNZBh4LFdc7C9i2hC0BqD7GextUh 7njPuRyYlA4YPmjuWNG2862KvUBGIhCTtKJ1bXP6tmCAtKRn61t83qZTy/afAbKziCtuIcLSG1dG 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 dHJlYW0NZW5kb2JqDTEyOSAwIG9iag08PC9TdGVtViAxMjQvRm9udE5hbWUvSkFDREZNK0NhbGli cmktQm9sZC9Gb250U3RyZXRjaC9Ob3JtYWwvRm9udEZpbGUyIDEyOCAwIFIvRm9udFdlaWdodCA3 MDAvRmxhZ3MgNC9EZXNjZW50IC0yNTAvRm9udEJCb3hbLTQ5MyAtMTk0IDEyMzkgOTUyXS9Bc2Nl bnQgNzUwL0ZvbnRGYW1pbHkoQ2FsaWJyaSkvQ2FwSGVpZ2h0IDYyNS9YSGVpZ2h0IC01MzEvVHlw ZS9Gb250RGVzY3JpcHRvci9JdGFsaWNBbmdsZSAwPj4NZW5kb2JqDTEzMCAwIG9iag08PC9TdWJ0 eXBlL0NJREZvbnRUeXBlMi9Gb250RGVzY3JpcHRvciAxMjkgMCBSL0Jhc2VGb250L0pBQ0RGTStD YWxpYnJpLUJvbGQvV1szWzIyNl04ODJbMzA2XV0vQ0lEVG9HSURNYXAvSWRlbnRpdHkvQ0lEU3lz dGVtSW5mbzw8L1N1cHBsZW1lbnQgMC9PcmRlcmluZyhJZGVudGl0eSkvUmVnaXN0cnkoQWRvYmUp Pj4vRFcgMTAwMC9UeXBlL0ZvbnQ+Pg1lbmRvYmoNMTMxIDAgb2JqDTw8L0xlbmd0aCAxNzE3OS9G aWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoMSAzNjM2ND4+c3RyZWFtDQpIiaxWa3AT1xU+d3e1svYh aSXrYT1WllZayZat1cOWEQRLBUOhtgN+8TbgmIen5WECafA0DDQTpk0TJpnySNqGpJCS8oMkxRjY FIZSytDOUNo/TDotpc9Mh0nHKWnTmQSQ3Ltay+DpdKalaMb3nnu8995zvvt9515AAMDDHiBh8aIe Jb3l0I5/ACxdi71rBzcPDBcaFhwHWLwHAH00+OUdtfLHyir8/4sAhk82DG/cfOTDOScA+scATPaN m0Y2HGGGvoHn/hag1TO0fmDdn5a/+xeADT/DvuwQdvAX2VaAjXgI4aHNO3a+/eqRL+FxGEB4btPW wQE4+qtn8dxP8fjrmwd2DgtA/BxgJ44BarcMbF5fv9DUDtA9DEB9NLx1+w4cN/7t1NavHX5y/bBw 6dO38PgWgCMEBoDSdvKGwYy/MkIOOuFx6D0PPDoMLpiJro61tVU1Gi/gIQG16CpUAUKHC3aK4L3e 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 +w3QKlBmG7YO8X9a3q45/mn7S1h5lolvTokOLXw34Y8V5Pj+KUtzXBu5yP8mYtVF7Arke1vweV5g zYEbV/L2/77w6ggv1hbfRS3Qep96F99HyJFd0LIOXbb3Pq/5Cfh77u5Zesc0RU/m6R3I7mPNwaOJ vVx027H0PqV/RmIHeeYBx/e8/7wN/AL4bcAcMr1+B5C7Ej93ILsB2rn4vgCN+rUNG1vwBW3gGfGa wqcl9m7B3zvg0xP6TOLFWBUij3Zn4K+gPqEf21aNC/fUpwNLOaT9tSF8siAjFyhgE3OOOsws5Sf9 0cD/lqV8zmU/E3r2e9IVgke+SkddsrCq/qyRc5byROnzGl6ZyCa9fvMeUf5Kx1oraiDan1vVTofT kNG2qj+VNuqk/1sBL86qhVX9qTyi/Zt01/1G2NM80f8t+VYc2t4Q0Jizf6pOal+dLXX+inlF/ZpC kwX5UY7apDILe1qfmLPNwJO+blvVJuWp8W9ZVa+mnCnEPfqeuRH11ngrf+27kZ/mbhFoNEdUduRb JyvWhtqv8dH9RuC5qSdE3evyPtZbrJ0Yu0incuvoNeZ5kK+8KT/WU9080LDqfRLp6uyNvUt93qzZ ixB7Zr4Bt872TfuN8B3jUtfP6vpW9Nemus6DrDqdmcfau7aEV9Qp+jTqonao77Y20EV/PysPok16 n23qsc/L1U06UOe6OET96mxpbsCNdaA2671X12c3+Uz1rNMt5kZdnjY2yNnkr7oeFntvvMfrYqXr Jl89z3cx7zb5K+bGJtu0FuLswhm8b2l+HFm6+yZWnZ353tF3Tw/fnJ85T3dwpjNpnH9Vr5j//h54 Bf/6VuoJfl/w+1Z9S+ViH+moQy486V9/U61wfr6Es/JNG7Yltiv8O94+VtdhAfk90aNr6Y2QiR/U V5zr+X7JhKYn8eLbqSn86EvKLMLK7wz0pC3km3gdq84QMWbUsS22cK8loHKpL21gbretGiO+Oery XXOG9zHt78iZv5c8d+a2zt8dxGQFuROczS29Mfz9+XtLuU4/xtklvuc4o8V+x35OW9uQq/2kLd+M N+2JfYx8m7LSl90gW++c2LfiLO58xgGH8Vhhb4r9maXewVg1cU5a7tXdb772RW58i+g9qL7nGzCX /y3EuR34s1cwb7eEN/3NXFG+DTljXmlfjrN97Luxd2mt6H3Wsmr8W4FnV/g+a95l3jGfVX+l13xS +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 /z6Mdzjh7+cXrI/b2/uH48f6cUKzf/WvzW5CRZ4iTwdv/+w9glWGFcEFwYrggiDkr0AQCQJB3Ozw Ij4AfwIMAM3vP9gNCmVuZHN0cmVhbQ1lbmRvYmoNMTM0IDAgb2JqDTw8L1N0ZW1WIDAvRm9udE5h bWUvSkFDRk5QK1NpbVN1bi9Gb250U3RyZXRjaC9Ob3JtYWwvRm9udEZpbGUyIDEzMyAwIFIvRm9u dFdlaWdodCA0MDAvRmxhZ3MgNC9EZXNjZW50IC0xNDAvRm9udEJCb3hbLTggLTE0NSAxMDAwIDg1 OV0vQXNjZW50IDg1OS9Gb250RmFtaWx5KFNpbVN1bikvQ2FwSGVpZ2h0IDAvVHlwZS9Gb250RGVz Y3JpcHRvci9JdGFsaWNBbmdsZSAwL0xhbmcvemgtQ04+Pg1lbmRvYmoNMTM1IDAgb2JqDTw8L1N1 YnR5cGUvQ0lERm9udFR5cGUyL0ZvbnREZXNjcmlwdG9yIDEzNCAwIFIvQmFzZUZvbnQvSkFDRk5Q K1NpbVN1bi9XWzNbNTAwXTE1WzUwMCA1MDAgNTAwXTE5WzUwMCA1MDAgNTAwXTIzWzUwMCA1MDAg NTAwIDUwMCA1MDAgNTAwXTM2WzUwMCA1MDAgNTAwXTQxWzUwMF00M1s1MDAgNTAwXTUwWzUwMCA1 MDBdNTRbNTAwIDUwMF01OFs1MDBdNjBbNTAwXTY4WzUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUw MCA1MDAgNTAwXTc5WzUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAg NTAwXTkyWzUwMF05ODZbNTAwXV0vQ0lEVG9HSURNYXAvSWRlbnRpdHkvQ0lEU3lzdGVtSW5mbzw8 L1N1cHBsZW1lbnQgMC9PcmRlcmluZyhJZGVudGl0eSkvUmVnaXN0cnkoQWRvYmUpPj4vRFcgMTAw MC9UeXBlL0ZvbnQ+Pg1lbmRvYmoNMSAwIG9iag08PC9Dcm9wQm94WzAgMCA1OTUuMjIgODQyXS9Q YXJlbnQgOTIgMCBSL1N0cnVjdFBhcmVudHMgMS9Db250ZW50cyAzIDAgUi9Sb3RhdGUgMC9NZWRp YUJveFswIDAgNTk1LjIyIDg0Ml0vUmVzb3VyY2VzIDIgMCBSL1R5cGUvUGFnZT4+DWVuZG9iag0y IDAgb2JqDTw8L1hPYmplY3Q8PC9JbTEgMTE4IDAgUj4+L0NvbG9yU3BhY2U8PC9DczYgMTA0IDAg Uj4+L0ZvbnQ8PC9UVDEgOTkgMCBSL1RUMiAxMDAgMCBSL1RUMyAxMDEgMCBSL1RUNCAxMDIgMCBS L1RUNSAxMDMgMCBSL1RUNiAzNyAwIFIvVFQ4IDM2IDAgUj4+L1Byb2NTZXRbL1BERi9UZXh0L0lt YWdlQ10vRXh0R1N0YXRlPDwvR1MxIDExMCAwIFI+Pj4+DWVuZG9iag0zIDAgb2JqDTw8L0xlbmd0 aCAzNTM0L0ZpbHRlci9GbGF0ZURlY29kZT4+c3RyZWFtDQpIiexXXW/bOBZ9N7D/QU878iBiRIof 0qIosEkXgxbbwQ7ixT4U86DIiq2pLHkkO9n8+70UGUsm7VhMjLSDHRROnUg8vLw899xzL/+VNhvv 3bvLz9cfP3ih9/791Yfrv0x+n2Cv8CahF1PisYShkHhBTDGKudfkk//86FXdQ4ySuHuuH8Nv8jE8 vbxuuZe1Hkp4zCMPsTgm1ENEUIa9NoMXfrrB3qIFGIR3e/Rb3E1+2WHg7t9wEUmQ4F4UddtHDMWe EFTidCuvZpPL2Uyumd1NcChfCuGf+iaIJ1iCGA8jb7aC7RfwmWXyx8PkXRiG0fvZb/BbgBGBiGcf +j/OfjRfwBDs8I2Ty459/xPODe77i+j/Cu4fswPFGUGBQXFFBCXEI4x4nCO+q0izDlkkUAKliEEa +lIc7qBFKMICUU+AQEhYWMWoF0AFR3SkFP0+IRj0Qm1OKeznRTjWmwNKtppcflxh70MNmvOLVo9I qwdTITO5EKIQHAmiwg0QxEqkdPg3y7RaLNPiYgqRw2KiFlMUUrkrZLSTmN3henzIuH5DwuEO7XpZ VOk+EpFxPgsUQK4xV3co35NoKjgiJFaCqEpA9wXSx+E0nCFK1Wnk+7R7f7OU7/cH5zEcA3IVI0p2 78ov8O5fSWyDJxGKnwfvD9Zvg0OCcLy3zzNJo33SQtEhf04fL8ykhQl3Sb/OPwlxqJGO9BAsQhST Z2I9WB+MADflEo/G8ieHlsV0y+revr7xUJwApwA1YtA0wyghcKk31z9DKXyC7X+DDsq8By/2Pntf fg29uSoRRkOotK7yYi9Q6EEH3xVBt7F+upq0muHs8Nlkb4RrgALBuxap2zZcLieiO8vupP0FqoU8 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 nJj0WqbWNS09EkAgnOzno+GGkBXmB7lJUDrnR86vX/VaO6fXK9kuPx5HHOOSXnLUaZWHLgkjMzqz 4k33CdAF0BJ3zg+WmNCPKD+68UD47RIL4+BFgHlcLQChIQzwps4DO1tE9BMMY5ngD+b5fJrAljMN BlxQDBOE1rb6KA4w6UjhGjn3tFo8LJ6+Pz4sfgswACnyIKwNCmVuZHN0cmVhbQ1lbmRvYmoNNCAw IG9iag08PC9Dcm9wQm94WzAgMCA1OTUuMjIgODQyXS9QYXJlbnQgOTIgMCBSL1N0cnVjdFBhcmVu dHMgMi9Db250ZW50cyA2IDAgUi9Sb3RhdGUgMC9NZWRpYUJveFswIDAgNTk1LjIyIDg0Ml0vUmVz b3VyY2VzIDUgMCBSL1R5cGUvUGFnZT4+DWVuZG9iag01IDAgb2JqDTw8L1hPYmplY3Q8PC9JbTEg MTE4IDAgUj4+L0NvbG9yU3BhY2U8PC9DczYgMTA0IDAgUj4+L0ZvbnQ8PC9UVDEgOTkgMCBSL1RU MiAxMDAgMCBSL1RUMyAxMDEgMCBSL1RUNCAxMDIgMCBSL1RUNSAxMDMgMCBSL1RUOCAzNiAwIFIv VFQ5IDM4IDAgUj4+L1Byb2NTZXRbL1BERi9UZXh0L0ltYWdlQ10vRXh0R1N0YXRlPDwvR1MxIDEx MCAwIFI+Pj4+DWVuZG9iag02IDAgb2JqDTw8L0xlbmd0aCA0Nzk4L0ZpbHRlci9GbGF0ZURlY29k ZT4+c3RyZWFtDQpIiexX227bxhZ9F3D+YZ4OqKAaz/0CBAESuadIUfcWAech6AMt05Yai0pJOan/ /uzhDC/iRTSjJChOmyAxZY72zOy99lprX/wcZwf0/PnF1fL1JSLoxYtXl8t/zf6YUbRFM4KMYEha iQlDCyMoNgplyey/z1BavKTYmuJ9eA2f3Gt4e7HMFVrnCFtlFEdYGsMEwkwLSVG+hgXfvaHoLocw mFZ71Fvczn6pYtDib/NLzGKtEOfF9lxig7QWLk7xzVer2cVq5b6zup1R4hYR+OufNENaWiwV4Wi1 g+3v4N9q7f77OHtOCOEvVr/DpwXFDE68uqx/uXrWXkDhsM0Vo18bev4n3LRwf70T/a3CfbvqaU5O tGtEprBliEmGlMKq6sh2H7q2FdZaBIwA7FB3Y3OTwEOcSqSNLeJyjaVAC2hhLp7IRX/MGAXC8LsL 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 4EO0sOclbolEnchNh/57kqh9iMG2fPbpzpbn7rkjn0C+c7A9Jhg9OcYlrGwRLjh5gpMG523au5rt bCLITO63JeHc0RigaYT8yMMl8QY3w/B0p25BvrFD9jRl5F5/fmWkX2P8wRkpgYK2BYejkOcXE1/N jCAr8Q8ctoiga3/atYPDJRqLbGhCaJR6eGyPguT+zw/WZbTfhsWxrZXWrcjbO1545aarD7syZ4v1 8GqkWPCE19/EEItaCfErwADtjGqYCg0KZW5kc3RyZWFtDWVuZG9iag04IDAgb2JqDTw8L0Nyb3BC b3hbMCAwIDU5NS4yMiA4NDJdL1BhcmVudCA5MiAwIFIvU3RydWN0UGFyZW50cyAzL0NvbnRlbnRz IDEwIDAgUi9Sb3RhdGUgMC9NZWRpYUJveFswIDAgNTk1LjIyIDg0Ml0vUmVzb3VyY2VzIDkgMCBS L1R5cGUvUGFnZT4+DWVuZG9iag05IDAgb2JqDTw8L1hPYmplY3Q8PC9JbTEgMTE4IDAgUj4+L0Nv bG9yU3BhY2U8PC9DczYgMTA0IDAgUj4+L0ZvbnQ8PC9UVDEgOTkgMCBSL1RUMiAxMDAgMCBSL1RU MyAxMDEgMCBSL1RUNCAxMDIgMCBSL1RUNSAxMDMgMCBSL1RUNiAzNyAwIFIvVFQxMSA0MiAwIFI+ Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUNdL0V4dEdTdGF0ZTw8L0dTMSAxMTAgMCBSPj4+Pg1l bmRvYmoNMTAgMCBvYmoNPDwvTGVuZ3RoIDc2NDQvRmlsdGVyL0ZsYXRlRGVjb2RlPj5zdHJlYW0N CkiJzFdrb9tGFv0uYP8DPy3IIprMe4ZAEKB2ik3TTdHCKgqs2w+sTEtMJNIlZbv+93uHM5bIoR4c W/uA44gyyTv3ce655779Kas30bt3bz9ffv8hwtH79xcfLv82+XNCoiKa4EhzGolUIEyjqeYEaRnV +eTXb6KyvUlQqtv77jZ8M7fh7tvLRkbzJkKp1JJFSGhNeYSo4oJEzRwe+McViRYNmEFke8buiNvJ z1sbpP3pvkRTpGTEWHs8E0hHSnFjp33zYjZ5O5uZd2a3E4LNQxh+7JWikRIpEhKzaLaG4xfwO5ub /x4n7zDG7P3sC3ybEkTB49mH3R9n3/gPEHC2+8TJ1w5d/3+b+262pxYMK5N3KlFKIypoJCWS2wL4 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 waXiWc3vNcMWxmlgVDyXUUAJ75vuY7ftmz4iKVDHpZuc8EkQ1EQKuLp0gzMWdKDeXp399uH81dn/ AgwARD6wwQ0KZW5kc3RyZWFtDWVuZG9iag0xMSAwIG9iag08PC9Dcm9wQm94WzAgMCA1OTUuMjIg ODQyXS9QYXJlbnQgOTIgMCBSL1N0cnVjdFBhcmVudHMgNC9Db250ZW50cyAxMyAwIFIvUm90YXRl IDAvTWVkaWFCb3hbMCAwIDU5NS4yMiA4NDJdL1Jlc291cmNlcyAxMiAwIFIvVHlwZS9QYWdlPj4N ZW5kb2JqDTEyIDAgb2JqDTw8L1hPYmplY3Q8PC9JbTEgMTE4IDAgUi9JbTIgMTE5IDAgUi9JbTMg MTIwIDAgUi9JbTQgMTIxIDAgUi9JbTUgMTIyIDAgUj4+L0NvbG9yU3BhY2U8PC9DczYgMTA0IDAg Uj4+L0ZvbnQ8PC9UVDEgNDYgMCBSL1RUMiA0NyAwIFIvVFQzIDQ4IDAgUi9UVDQgNDUgMCBSL1RU NSA0NCAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDXS9FeHRHU3RhdGU8PC9H UzEgMTEwIDAgUj4+Pj4NZW5kb2JqDTEzIDAgb2JqDTw8L0xlbmd0aCAxODQwL0ZpbHRlci9GbGF0 ZURlY29kZT4+c3RyZWFtDQpIibxXS4skNxK+F8x/0GXBNpQ6Qgq9oOiDe4yxYcyaKdiD8SGfZg2z ZmYM/vv+QsrMyqqubjyXpbu6spWK9xefQg//7j79aU6nh3dPP7w1ZB4fv3379Obw8cDmv+ZAJosz oQRLzhyzsM3RfJoO//nG/K++ZFtyfb+8xn/6Gm8fnj5HM3w2tsQcvbEhZyfGuiSBzecBG75/z+a3 z1BjebNxMTEfft50cP3ZC7liUzTeV/M+2GxSEtVTJb89Hx7OZ5U5zweOqpjw056C89ZzKSYFsdmR N+cPByslmt/gy3nQP38dTkTkH8+/H44slnJkc2TrHDS+vbxjUvtVdX1KDr9kAzWlBI3sbM45qd4q top+d95lqDiO+GKfkKgcCKo0WASZnfG51AQhyiQmRRvzPkq3RBmaH8G4kmyMRiRZluaIM+dP8OZ7 fH7Ept+N9eYvyL0zv/xKZqyO0uZijdohilxjRmIQsyWStkN853yXyA2ZJIw0ulEl4IpvrpBaCy3p kLxWjG3Sth2zZeiGCb8YQJTY+pUjpq/b1iW46r+zLue9SpZOrlVWy3A5LKa/Cnf0ADiLmhOPPr+g IbYtR7jlcnMr3VGGrau2LUM8cPDZ+TuaEUPcdq/h5vt601X+VOmdNHO1SleoBLSW9vVkGf0BSErF D4s5AvTJfWkPR0kUb74UoR8PiNTWZJEJ9QmgDdlIdFbEDB8ODz988ObtH+jmjwdvs9Stx/oUoleA S4zazG2va3t/XnzXd0gg104I0oAvub7KpCZy1eGCLe5eW5StQ+vTKhpRiNYboJNajJpltN7gXCIK aJ2O5yXjC5OACCBzH9Rr8cJKNu2Jo1oTG9yuE2tan95j00KHFg65ZN4//XSwAZ25Jf52h+ZcnfDV vJ/SQBI75r5QKhlwhuedZx4mEReuvXct9fjyMYOUrvxqYHpGA7cEt6QvgnDjheNOd0jtQtmeEpCV UM9ktDNR0bhV6tZA8GLBzFKsj9pOzw18PDiUMjUhEYDReA6LEK0w4gajFyhSIg4MHwj7m5FGDLmg YlacD6Bh8pWVa038viZ3ty2FWSkydiQz/k1ZUBM/93xbK+GRCYfrDkLrebUcVm5xExlxeVclaoBF qPsz5bWP6qfK5SmspPYF4ndQDoIMG49RWKLue+5TcEMvyO2sETrg0FMX/QR0Dn7CngiUlkVdWCLm iz71jRvh5vivr68zA+YKV/3nk7tWZT09V1Q2Re6ZIvW/8vBJ/V5jwCE3rRVzI9KfOt8OvEuMElDF mD3JKFTm4mCaJM9cfFpjhZ5xrXgbJtALMbRzNVwC2dAxhHlvA/JAUegkzWNFEWYoAnCqL/hGKwCH fZahyN5WrcGiU3kMfBY079Bb38kQMcsUR3NIkjhT9vEqfh7Af15YsC0LUR7mDUW+nZ0gGe6nUcN8 CdxVZSoDdUihpibOHc0p1fUOB2CZ6CXZFhJSuLiPtR7EA88Q/i5FLHgX8uDKONPUL2WCrQVmtEv2 iXIoEJ5Wpzbm7PtERWoOODgUe+5rDoJnEunq+rKXZEJOM2qP+SPM6cXOXvO+BL0GDJRErA+KMdWj AbREdd5716vT52/ga+pHDUTrSkEqNgQTE6NqKsvOzxS7tJfV4H30g+5lpJ/F52bHD5q0q72I7+aE CDeTxNE1qEq4Wn7GJeGLqGjPI+t5qlraEazzJEIP4vuOx1K/QSbdHkueGPXtmcZIHCRIpP7FMiAl igWSod+wOIbMZcwqU0tIvtdZVmLBB6XC6abYE57yahst0y+TMZy+bWA0SEu+Nmjo5he9KakDcKQW SYZ5j9a9h37oRpdi3DfgGulrHVf1hRShanZjon0n3jSw4pEdbhuaoBtsb1hNXdwXQoZp0vA4DGnF LrjPVYwhaZsbSKbK1JS84GoNTfluTlI/4DqOZX6OS19ucYmVisv/Byzb6QBCcKCZgBNnRJK6yiT/ CH5jv5dV2nyN9ho1sp4i7MHZlyqN/U1WvCUKr4+jNyMP42+kmzvhRWwZSzGt6W/U0abOP9vks3+h Ew/tLogvz4zVMs74TOtEt0wxe5Flam5PoCdM/UnvoM3ZSzl/OSFHkzasTNqUPD0GG05UcCNdi/nr +cdDWp2oD01hZEyLmw+qq01qfXQTShJpfDwmKEM9i6JRLbUVtee0JMrB0bu2igauRxTHMbeVShSY +HCHqK3YVgkVR31HZeNF0vm4nh9AgF9Wtct4lhpA61Q0viYXngZgDXbUgptwF2ye8hxrj8k8t5VA PQikH9a5c/FAe0q1PiuOy3o35O069Posj3kbu4UAA0SIZwzBdrl3LXdO6IomJZQb0z6SjysnsqHf /+zOCTW4nvh2V4F3MeJSYBlWvd5f23gv2y3RqYqAHbgllqJISx4Xjd1NcB0en11lauRwMeX7Vxl4 Ar2lyeDKkxRHulCF3OJKaK68OXz37unN4W8BBgA600bLDQplbmRzdHJlYW0NZW5kb2JqDTE0IDAg b2JqDTw8L0Nyb3BCb3hbMCAwIDU5NS4yMiA4NDJdL1BhcmVudCA5MiAwIFIvU3RydWN0UGFyZW50 cyA1L0NvbnRlbnRzIDE2IDAgUi9Sb3RhdGUgMC9NZWRpYUJveFswIDAgNTk1LjIyIDg0Ml0vUmVz b3VyY2VzIDE1IDAgUi9UeXBlL1BhZ2U+Pg1lbmRvYmoNMTUgMCBvYmoNPDwvWE9iamVjdDw8L0lt MSAxMTggMCBSPj4vQ29sb3JTcGFjZTw8L0NzNiAxMDQgMCBSPj4vRm9udDw8L1RUMSA0NiAwIFIv VFQyIDQ3IDAgUi9UVDMgNDggMCBSL1RUNCA0NSAwIFIvVFQ2IDUyIDAgUi9UVDggNTMgMCBSPj4v UHJvY1NldFsvUERGL1RleHQvSW1hZ2VDXS9FeHRHU3RhdGU8PC9HUzEgMTEwIDAgUj4+Pj4NZW5k b2JqDTE2IDAgb2JqDTw8L0xlbmd0aCAxNTc2L0ZpbHRlci9GbGF0ZURlY29kZT4+c3RyZWFtDQpI iexX24obRxB9H/A/9KNj0GxV9R2WffDamBgcYizIQ8jDXE0Mm2BvwL+f0z0XaWZHWhsUkxAjtCup u6tOV52qOnP1c/XpL3V9ffXm9scXitTNzfMXt0+KjwWr31VBKhhRNtqSRO2C4TI49akrfnmm/siL XMaQ18dlfEvLWL26vXequVdldMFpVdoQxKhSvLGs7htsePWO1ft7mCl59nFw0RdvZxucX8eHJJbe Ka2ze23LoLw3yU4++XxfXO336cy+L5jSJsJr+ORFeRtL60ir/R3cv8d736Q/n4trItI3+w/4tuNS gHj/4vDj/tl6AwPs8Y5Hj536/N3c15n79yH6X5l7ud8oTo0CQ3FpKaMosaKcK91ckes6tNqXEaXI aA2HUjz2MDYhzb40yqNBJLM4ZY3aoYK1+cJW9LEQRr8YnBsDf0pzGJ3DSnNXXP14x+rFn+g5b8fu IWP3sANkmw4ChQcKM8AVtf8Ez6/wfo0tH1Sp1WeceqN+/Y1UW5REJjWWazK6El15kiaQsS210qYr wosevFAylRsgpfDTcGyMBLaZYdtu6MNIU8y5gwe0POx9KsT0w7B3BJ7RSSkhHNtkU5mlzewaFu3o +6ndsINmO5q55laHExbcsGUHWBIGWH7DGLZO1uYQccNWB9EblnEHN++erhu27fpFAJPRjThz9koL nm/y2cK1sgFpNyH9dRgxdhwxefftO1WGiJSURrTFkCMdhZ16d/sTqPsa086CEQGMGJhsDaEgcoEE tRuM7rLVzNXsb1y9K+5XRFyXT0ynPHjM8yQbp2tpghOfrzBf8MDj4aCLEYN2QeTXBwIXm9dKBueM GZFOk6411/ipr4/YOg1eGVzK5DKYkuZSzy7fr6g+9CBvJxqRnZcfe98sCQHMM2mSy0SH1ja68w0Z VzHXkXxEn2iZoHFYtJPWE4WmJlN31FKHHmHIsk3li7I11FtvGu5MhzJGKS9vK1QmuNv1O6JCe7UT 8XzlqOI+OWBjOwptJBuJOTqypqK+FrLBUovu6GNDlQSObUgXmC6RjO8k10fuCXYo0NXVctepdMON ODKh3/Tqe2Hb+Nlr7GptxXBET8c69jcSO0popKnNqTAmX2gxLoUz3dA4Qjg1of+mMHZzjvUYhOFi 2SRMSIVjNmitpZZWgrbIbaVztMlWfTKZkpJdtzpyi/91ZdIZ4sZMnEywODaCTDrDXaDeVMlHWjeN GMAF5K6iqm606TUZXBE+jEN7tL2HT3Og4xhX6fv2eHOOG+45Z0xat6REXDWZXcz2jF38iv1uLJjS pg0hTBt0HDeEkT8+jPx5qpYNsPQ8MytdmliTRfQs9VOO5gAjeDnHmWWOjbZ2Vbh6BfwAccdmABnN RUBO4FJ2yHcIaJVBpuycD+YxJroIJo51w6D0RO6MKWinpaoTU8A+bWrbTesUIw97HEjQrPCyOwPY XzaIqRRqn4M4B1SaPtGZ6y4KuLACx2fAyWXATU1rBMR17SmiISCi3Da0BBRO44kXgQPZFSjYekre 3LGCabk1fU6kw0OkRP7msRLUIPehWjf6CWTuXY2rpavbPJFiX+US9xhSSDB3fjWN2J8BHS5TLlPf G+l/aiZkVq4utAJrz4B1l2HjCFJsjxnf8XbUTpfsQT55n58fvC6ZBi2zjclsYzqIIjypPDA0olzM xVOKxbuem9hj7uk8G6uqzV3KiifnGt33shR+Wj/wOD/CHHTipszUUMFWjqTbJJa/SnNqyF+RI8+P iujHZSh1EhGSli3WrO4fl6Fa8CBnVjI0i03zRWJzS6eiR5w7ulSBUD/2oE2Hk5PySJwkW9dZSInu ITgWagXaR3SohEPsxOIaaV8qxCqELLrGkXCuGJOySrNMOraGe5fscqiJDfukopbhA2ke1bXrREvE c85Jij2a9YlcJ7N/kJBHjyNoixMXkiob1S07BM92+AxAc/Zejc8eWd65zau5NXuGwgeWmcOZPRfr +Q1aU2UBHOZ9BSmOQv2Clsq4I2p+JT2FTrdU4e9D6z8xtNZg1wJ0Ap2E6DfXLGtw5yfrP67vHsbq ciP0qKzk4T1O9MAoJR/PuvnIy33xpHj55vZJ8bcAAwB0UJH0DQplbmRzdHJlYW0NZW5kb2JqDTE3 IDAgb2JqDTw8L0Nyb3BCb3hbMCAwIDU5NS4yMiA4NDJdL1BhcmVudCA5MiAwIFIvU3RydWN0UGFy ZW50cyA2L0NvbnRlbnRzIDE5IDAgUi9Sb3RhdGUgMC9NZWRpYUJveFswIDAgNTk1LjIyIDg0Ml0v UmVzb3VyY2VzIDE4IDAgUi9UeXBlL1BhZ2U+Pg1lbmRvYmoNMTggMCBvYmoNPDwvWE9iamVjdDw8 L0ltMSAxMTggMCBSPj4vQ29sb3JTcGFjZTw8L0NzNiAxMDQgMCBSPj4vRm9udDw8L1RUMSA0NiAw IFIvVFQyIDQ3IDAgUi9UVDMgNDggMCBSL1RUNCA0NSAwIFIvVFQ1IDQ0IDAgUi9UVDggNTMgMCBS L1RUOSA1NCAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUNdL0V4dEdTdGF0ZTw8L0dTMSAx MTAgMCBSPj4+Pg1lbmRvYmoNMTkgMCBvYmoNPDwvTGVuZ3RoIDI0MzYvRmlsdGVyL0ZsYXRlRGVj b2RlPj5zdHJlYW0NCkiJ7FddixtHFn0X+D/Uox1Qza1b3yAGYtmYGBw2jGAfQh5a/WE2MF5iLfjv 76mubqnV0z2aUdqJWa+HsWV19f2qc8899+Yfxef/iM3m5sP2pzeCxO3t6zfbF6s/Vkr8S6xIBMPC RiuJxToYJYMTn+vVP38Qn9qHSsbQPu8e43/pMZ7ebA9OlAchowtOC2lDYCMke2OVOJQ48O5OiY8H mJHq6OPkoln9crSh2p/hSxyld0Lr1r22MgjvTbLTvvl6t7rZ7dI7u2alKB0i/ORPnoW3UVpHWuzu 4f4jfndl+uvLakNE+nb3O/63VpIR8e7N6cvdD+MDCsEOT1x8be7z/809z9y3F9F3Ze7tbqI5NfnU iOxkZMGWhXPSHTty3IepbU2MUYARwA6nbhw66XhIKyt8iK1d7aU1Yo0W1uaJXPTHihUII3s3Bt6E Vk7a1jWslPerm5/ulXjzb5DOLx19cEcfNsds04sGNOOlMjlYFrvP8PwOv+9x5HchtfiCtz6IX38j Ua0kkUnMsiGjC9aFJy4DGVtRxVVKEF509kLJVMuAlOpP+bWuDjhm8rF1JmLcU2wvDx7AeTj7kknR q3y2C7yNjiWHMLSpTGHObbauYdF2vl/aCTtg287MRlU6zFhw+cgaYXHIYfkJYzjaWzuWSJXK6sB6 wjJycMfTfbph2q4/K2AyOlFn1XqlM6BPAjoEYMlHXDuTB5pJ+m7CtGe3d0KGiAuRhrXFjCMdWTlx t/0ZsH2PYWeBhwA8ZBRzi01vSKog1snkurXZ4jT7ys/uV4cRCEe9E1PHoNOAXneGxeSUOxCuJoNL eSF/azPEao5GVRUarARKiRobZ5Dp9Qw2h1ew7k4CojBmu0vrnKnSNKoyDVW0n3CiJSlnHm+AlqCO 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 ZT4+c3RyZWFtDQpo3lRQPU/FMAzc8ys8ghiSFyEBUtXlsXTgQ7Sw5yVuiUSdyE2H/nuSqH2IwbZ8 9unOlufuuSOfQL5zsD0mGD05xiWsbBEuOHmCkwbnbdq7mu1sIshM7rcl4dzRGKBphPzIwyXxBjfD 8HSnbkG+sUP2NGXkXn9+ZaRfY/zBGSmBgrYFh6OQ5xcTX82MICvxDxy2iKBrf9q1g8MlGotsaEJo lHp4bI+C5P7PD9ZltN+GxbGtldatyNs7XnjlpqsPuzJni/XwaqRY8ITX38QQi1oJ8SvAAO2MapgK DQplbmRzdHJlYW0NZW5kb2JqDTIxIDAgb2JqDTw8L0Nyb3BCb3hbMCAwIDU5NS4yMiA4NDJdL1Bh cmVudCA5MiAwIFIvU3RydWN0UGFyZW50cyA3L0NvbnRlbnRzIDIzIDAgUi9Sb3RhdGUgMC9NZWRp YUJveFswIDAgNTk1LjIyIDg0Ml0vUmVzb3VyY2VzIDIyIDAgUi9UeXBlL1BhZ2U+Pg1lbmRvYmoN MjIgMCBvYmoNPDwvWE9iamVjdDw8L0ltMSAxMTggMCBSPj4vQ29sb3JTcGFjZTw8L0NzNiAxMDQg MCBSPj4vRm9udDw8L1RUMSA0NiAwIFIvVFQyIDQ3IDAgUi9UVDMgNDggMCBSL1RUNCA0NSAwIFIv VFQ1IDQ0IDAgUi9UVDYgNTIgMCBSL1RUOCA1MyAwIFIvVFQxMSA1NSAwIFIvVFQxMyA1NiAwIFI+ Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUNdL0V4dEdTdGF0ZTw8L0dTMSAxMTAgMCBSPj4+Pg1l bmRvYmoNMjMgMCBvYmoNPDwvTGVuZ3RoIDMxMDkvRmlsdGVyL0ZsYXRlRGVjb2RlPj5zdHJlYW0N CkiJzFfbihxHEn1v2H+ox5GhSxmZkTcYBKuR8dpgs0YNfjB+qKsvrGSsMYj9+z2Rl+qq6u6xZIy8 iNZ0V2XG9UTEief/7t793tzfP//64ctXjWpevHj56uEfh98O1PzcHFQTWDc22lbp5hiY2uCad9Ph u8+at+kltTGk9+U1fslrvH3+8Oia4bFpowvONK0NQXPTas+WmscBB754Tc2PjxDT0qLjrGI+fLvI oPRvfUnH1rvGmKTe2DY03rPISTdfng7PTye5c5oPpOSQwr/8zevG29hap0xzegP1P+JzGuS/94d7 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 Znt8KBv0wrX5ggUvT7yjZMIbS+QPntM7g+NycNrQpzrljmvmzn+B041BOyJ2XeWsNWgr1b6x//L5 sRwrSUnyrjUCZBeOT50woU1Sh3b5JQlvgpva+/tpNjyZq0AfHsYGDDHw08xz3FrtDwPHydAV3I5w zT01qpiucR24mxJs9/slwpDRs+zq5vIs+yvAADXz7J0NCmVuZHN0cmVhbQ1lbmRvYmoNMjQgMCBv YmoNPDwvU3RlbVYgOTIvRm9udE5hbWUvVHJlYnVjaGV0TVMvRm9udFN0cmV0Y2gvTm9ybWFsL0Zv bnRXZWlnaHQgNDAwL0ZsYWdzIDMyL0Rlc2NlbnQgLTIyMi9Gb250QkJveFstODYgLTI2MiAxMDgy IDk0M10vQXNjZW50IDkzOC9Gb250RmFtaWx5KFRyZWJ1Y2hldCBNUykvQ2FwSGVpZ2h0IDcxOC9Y SGVpZ2h0IDUxNS9UeXBlL0ZvbnREZXNjcmlwdG9yL0l0YWxpY0FuZ2xlIDA+Pg1lbmRvYmoNMjUg MCBvYmoNPDwvQ3JvcEJveFswIDAgNTk1LjIyIDg0Ml0vUGFyZW50IDkyIDAgUi9TdHJ1Y3RQYXJl bnRzIDgvQ29udGVudHMgMjcgMCBSL1JvdGF0ZSAwL01lZGlhQm94WzAgMCA1OTUuMjIgODQyXS9S ZXNvdXJjZXMgMjYgMCBSL1R5cGUvUGFnZT4+DWVuZG9iag0yNiAwIG9iag08PC9YT2JqZWN0PDwv SW0xIDI5IDAgUj4+L0NvbG9yU3BhY2U8PC9DczYgMTA0IDAgUj4+L0ZvbnQ8PC9UVDIgNTggMCBS L1RUNCA1OSAwIFIvVFQ2IDU3IDAgUi9UVDggNjAgMCBSPj4vUHJvY1NldFsvUERGL1RleHQvSW1h Z2VDXS9FeHRHU3RhdGU8PC9HUzEgMTEwIDAgUj4+Pj4NZW5kb2JqDTI3IDAgb2JqDTw8L0xlbmd0 aCA1Mzc0Ny9GaWx0ZXIvRmxhdGVEZWNvZGU+PnN0cmVhbQ0KSIm0V1tv29gRfhfQ/3CeiqM2osnD e7AoGtubNkWTddcq9iHbB1o+sthQpEJS9rq/vt/MHF4ku7vYBRogPhcN58z1m5mLm6Lt1TffXHy8 +nCtfPWnP11eX/1ucXHVJWrTKS9PsiRUXpxlJlKeSaM4UN2mXlz85TZQD93CBF6UKVx7UaLiOPay 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 jN2Pv3mcB0vBoiQdmqJPRjUkhaa5u+Ig3HMQOdRDN/Q4aoAoCRCHAkjtVTOkNIkOM48tEI/eXKp/ PCzsvVn5zyd1ROnnfdQKo+eT7sokBF/OQ1eQZDFBtF2akzngp/AuCpUHuTq4erl2culMploBP87V ob1j5D7O1b2iLMJq97jDwNLP+g99U3HvidHzyWU0ma3rflF6dRIbkRg+18jKth8pE3mDkEwWdP0F RA8eFVc3lUymAL7wLuk/MpN84W0H8V0eAroOf0Ky8DmOIcQunZKCJA7Ggozchj+IKVSzZP9WPAoC k8TtKzLasdtB5ETh5F1veLy3oa5lHYOvNjdxuLeGdEd22ry3BEIl9MYBwoJnQvOwOSumWvf4eMzY vTZ80ZbXgH+WnwAXsS2JV6F5C4R/UKR2UyzcxeUE/pm+xFVJVtWl8TYHhfeUuY5WZkJSKFA9IdoL y2p38NRCCPH8z9/bjJmwuCyoxAPEAJUg2016NPVSgzpEAizEr+3JenxbodrFVau851M1qG9Wb7ar BpbnH4rrRlfCEBi25bmxF4IRN5RMIIUbFIREgH5hDIW8XnXw9xN5vlv+LaQA0kertiOHoKdrYoR+ 0e84n7Ye7FSrYU/l8exkxU654YJ+gc5YC1nLfgcfduycQnjrC54crW+hbYw9UZ13rgs59m5X8KZb SOUtt9C/wi24P/y1biGPx0jXrzQL/fx1ZqENKX9tFnbi945XyGl4hfSWVfj3aBBUPJ8xCKjNNw1C cxx+3SDEdfvcxx1Cf8Uh9OEQ+nQIU2hfO4T+cYfQ9w5hqnwM7jqEtrcIbWcLcnnNI1z5gnY9mC6h fY1NiGtB+X5cnvT2P5AnaPLi4RQoYNuPKJT0EYWSmysURFIoublCye23KJS4NhiML5co3SVKnxKl vylR8oMKJX9OoLgSulIo52+nP//649vpPwEGABUNKe8NCmVuZHN0cmVhbQ1lbmRvYmoNMjggMCBv YmoNWy9JQ0NCYXNlZCAxMjQgMCBSXQ1lbmRvYmoNMjkgMCBvYmoNPDwvU3VidHlwZS9JbWFnZS9M ZW5ndGggOTM2Mi9GaWx0ZXIvRENURGVjb2RlL0JpdHNQZXJDb21wb25lbnQgOC9Db2xvclNwYWNl IDI4IDAgUi9XaWR0aCA0NzkvSGVpZ2h0IDk4L1R5cGUvWE9iamVjdD4+c3RyZWFtDQr/2P/uAA5B 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 JBKkkkklKSSSSUpJJJJSkkkklKSSSSUpJfKqSSn6qSXyqkkp+qkl8qpJKfqpJfKqSSn6qSXyqkkp +qkl8qpJKfqpJfKqSSn6qSXyqkkp+qkl8qpJKfqpJfKqSSn6qSXyqkkp+qkl8qpJKfqpJfKqSSn6 qSXyqkkp+qkl8qpJKfqpJfKqSSn6qSXyqkkp+qkl8qpJKfqpJfKqSSn6qSXyqkkp+qkl8qpJKfqp JfKqSSn6qSXyqkkp+qkl8qpJKfqpJfKqSSn6qSXyqkkp+qkl8qpJKfqpJfKqSSn6qSXyqkkp+qkl 8qpJKf/ZCg0KZW5kc3RyZWFtDWVuZG9iag0zMCAwIG9iag08PC9TdGVtViAyMDAvRm9udE5hbWUv QXJpYWwtQmxhY2svRm9udFN0cmV0Y2gvTm9ybWFsL0ZvbnRXZWlnaHQgOTAwL0ZsYWdzIDMyL0Rl c2NlbnQgLTMwOS9Gb250QkJveFstMTk0IC0zMDcgMTY4OCAxMDgzXS9Bc2NlbnQgMTEwMC9Gb250 RmFtaWx5KEFyaWFsKS9YSGVpZ2h0IDUxNS9DYXBIZWlnaHQgNzE4L1R5cGUvRm9udERlc2NyaXB0 b3IvSXRhbGljQW5nbGUgMD4+DWVuZG9iag0zMSAwIG9iag08PC9TdGVtViAxMzYvRm9udE5hbWUv VGltZXNOZXdSb21hblBTLUJvbGRNVC9Gb250U3RyZXRjaC9Ob3JtYWwvRm9udFdlaWdodCA3MDAv RmxhZ3MgMzQvRGVzY2VudCAtMjE2L0ZvbnRCQm94Wy01NTggLTMwNyAyMDAwIDEwMjZdL0FzY2Vu dCA4OTEvRm9udEZhbWlseShUaW1lcyBOZXcgUm9tYW4pL1hIZWlnaHQgLTU0Ni9DYXBIZWlnaHQg NjU2L1R5cGUvRm9udERlc2NyaXB0b3IvSXRhbGljQW5nbGUgMD4+DWVuZG9iag0zMiAwIG9iag08 PC9MZW5ndGggMzM3MS9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoMSA2MjY0Pj5zdHJlYW0NCkiJ 1FZ7cFTVGf/OOfeRJyHhERpQzrIkRLJ58pJHISG7EdZJgQQkQYHdZDfJkk027i4ZQMqEQgU22Glr yoxUa7DiAIK9Iajg0A6lBTO1xTKjHRmQ1pk4MGocbbE4MpD+7s2aASvT8R/b3t+ee77H737n+845 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 nfjn2P+G7F8HzgSS12/dRnhcWJ8unnNr3vPb/S5Xvp0hU3dty0fqTM7/Rz45+2u0rFBzbJVboA9g v0MD9nIakB3YIas3855WiLPgJBVhJ+1FaQde4fuOXrVvDxdSeztCSjbJcKc/bXt2obMectwSbY7l I5YLLLMs51k+YDnDMs3SxdLJ0sESYQmzNLPsYtnB4mJxsNhZtPDz0B/BHfADuA0+B1fAJ+ASSIE5 MAvOg2lwGrwPJsBxMAB6rTYvcdMplossH7KcYznLcprlOZYWlt0sjSyCxcliY6FwGPo9+BbcBF+B L8Ey+BRcBovgYzAD3gFHwIHO+jJ3mXu7kdYOh7uEcUYYp4QxKYxDwnhZGAeFMSiM/cLYJ4yEMOLi SblF+uUT8jH5qKyUFbJMlkivLJKF0iOldEmHtEmsYbPUHrVFeyJa1FwaoGi/3/ytJ5jWPHv2mc5g RDNLohR9IVJpNoZM20lrR5PW1uY17a0xn9rMXCVNWxub9GU0kaCK0N+vyrxaNHbkOm3WtpPAd8Oi 2PyFUNYeWA3LaiirYVkrtYUY1Uf7xpOP00Ma/uvSNvTmRbYNq+HG4vOSIonW/ayLtgIPxpP0BRKR Cu9IszW4nYHKY75rDtJmqQD/6YXYJD4ClKu2pbZFufCPplxFav+YcVUe2xnwXdNmMy4vzJuQyj8F GADLtK9hDQplbmRzdHJlYW0NZW5kb2JqDTMzIDAgb2JqDTw8L1N0ZW1WIDg4L0ZvbnROYW1lL0Fy aWFsTVQvRm9udFN0cmV0Y2gvTm9ybWFsL0ZvbnRXZWlnaHQgNDAwL0ZsYWdzIDMyL0Rlc2NlbnQg LTIxMS9Gb250QkJveFstNjY1IC0zMjUgMjAwMCAxMDA2XS9Bc2NlbnQgOTA1L0ZvbnRGYW1pbHko QXJpYWwpL0NhcEhlaWdodCA3MTgvWEhlaWdodCA1MTUvVHlwZS9Gb250RGVzY3JpcHRvci9JdGFs aWNBbmdsZSAwPj4NZW5kb2JqDTM0IDAgb2JqDTw8L1N0ZW1WIDAvRm9udE5hbWUvSkFDT0NKK1dp bmdkaW5ncy1SZWd1bGFyL0ZvbnRTdHJldGNoL05vcm1hbC9Gb250RmlsZTIgMzIgMCBSL0ZvbnRX ZWlnaHQgNDAwL0ZsYWdzIDQvRGVzY2VudCAtMjEwL0ZvbnRCQm94WzAgLTIxMSAxMzU5IDg5OV0v QXNjZW50IDg5OC9Gb250RmFtaWx5KFdpbmdkaW5ncykvQ2FwSGVpZ2h0IDAvVHlwZS9Gb250RGVz Y3JpcHRvci9JdGFsaWNBbmdsZSAwPj4NZW5kb2JqDTM1IDAgb2JqDTw8L1N1YnR5cGUvQ0lERm9u dFR5cGUyL0ZvbnREZXNjcmlwdG9yIDM0IDAgUi9CYXNlRm9udC9KQUNPQ0orV2luZ2RpbmdzLVJl Z3VsYXIvV1s1N1s3ODZdMTMyWzc0N11dL0NJRFRvR0lETWFwL0lkZW50aXR5L0NJRFN5c3RlbUlu Zm88PC9TdXBwbGVtZW50IDAvT3JkZXJpbmcoSWRlbnRpdHkpL1JlZ2lzdHJ5KEFkb2JlKT4+L0RX IDEwMDAvVHlwZS9Gb250Pj4NZW5kb2JqDTM2IDAgb2JqDTw8L1N1YnR5cGUvVHJ1ZVR5cGUvRm9u dERlc2NyaXB0b3IgMzMgMCBSL0xhc3RDaGFyIDE2OS9XaWR0aHNbMjc4IDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAyNzggMCAyNzggMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDU1NiA4MzMgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCA1NTYgMCA1MDAgNTU2IDU1NiAyNzggNTU2IDU1NiAyMjIgMCA1MDAgMjIyIDgzMyA1 NTYgNTU2IDU1NiA1NTYgMzMzIDUwMCAyNzggNTU2IDUwMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgNzM3XS9CYXNlRm9udC9BcmlhbE1UL0ZpcnN0Q2hhciAzMi9F bmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvVHlwZS9Gb250Pj4NZW5kb2JqDTM3IDAgb2JqDTw8L1N1 YnR5cGUvVHlwZTAvRGVzY2VuZGFudEZvbnRzWzM1IDAgUl0vQmFzZUZvbnQvSkFDT0NKK1dpbmdk aW5ncy1SZWd1bGFyL0VuY29kaW5nL0lkZW50aXR5LUgvVHlwZS9Gb250Pj4NZW5kb2JqDTM4IDAg b2JqDTw8L1N1YnR5cGUvVHlwZTAvRGVzY2VuZGFudEZvbnRzWzQwIDAgUl0vQmFzZUZvbnQvSkFE QkpHK1N5bWJvbE1UL1RvVW5pY29kZSA3IDAgUi9FbmNvZGluZy9JZGVudGl0eS1IL1R5cGUvRm9u dD4+DWVuZG9iag0zOSAwIG9iag08PC9TdGVtViAwL0ZvbnROYW1lL0pBREJKRytTeW1ib2xNVC9G b250U3RyZXRjaC9Ob3JtYWwvRm9udEZpbGUyIDQxIDAgUi9Gb250V2VpZ2h0IDQwMC9GbGFncyA0 L0Rlc2NlbnQgLTIxOS9Gb250QkJveFswIC0yMjAgMTExMyAxMDA1XS9Bc2NlbnQgMTAwNS9Gb250 RmFtaWx5KFN5bWJvbCkvQ2FwSGVpZ2h0IDAvVHlwZS9Gb250RGVzY3JpcHRvci9JdGFsaWNBbmds ZSAwPj4NZW5kb2JqDTQwIDAgb2JqDTw8L1N1YnR5cGUvQ0lERm9udFR5cGUyL0ZvbnREZXNjcmlw dG9yIDM5IDAgUi9CYXNlRm9udC9KQURCSkcrU3ltYm9sTVQvV1sxMjBbNDYwXV0vQ0lEVG9HSURN YXAvSWRlbnRpdHkvQ0lEU3lzdGVtSW5mbzw8L1N1cHBsZW1lbnQgMC9PcmRlcmluZyhJZGVudGl0 eSkvUmVnaXN0cnkoQWRvYmUpPj4vRFcgMTAwMC9UeXBlL0ZvbnQ+Pg1lbmRvYmoNNDEgMCBvYmoN PDwvTGVuZ3RoIDM3MjkvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aDEgNTkyND4+c3RyZWFtDQpI ieRWe1BU1xn/vnPu3V3e4AtYiN7NFSzyCKjxARtYYBciCiKLymo0e1mWBeWxBYKSmNTq2Oj6CE0d sdqqsWpKbONdoylOUiXmOVNtnaRhOtGkibHGsTU6qaO1unv77cKkxj/8o/2nMz3fnHt+33e+c77X OWcXEACiYA1wyJ1nf2SK41fX5gGIZpIudHV3SZPfubOe+G3UhUavp3Vp/mUOELmD+D2elp7GldKO o6T7JvUjTW6l4Y+vWDYCxM8kfnoTCeL28h8S7yV+YlNr16qV1bMLiaf92N2WdpeSZE4iW0jzuLZV WeVlyboZAKN7SV9qU1rdS0v8b5DuDeo2b4fbu7D/QBHNqwC8Exh4AASPSAzoocAyXqd3MSRPXRwi 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 vYm16jNxhgYhn+XAeE1AI9CaR4v1AisCisGHofdK22iIQ3ZTA3zrMVeE5wa49YjTRD7+rfn4TYk4 fVjXwJK/1Eu18NEsdgo/BCrgNs5Nt3FfMyU7C59D8G8XNuA1OSJ8nAN1WOzZ0xa7sCcnSUX7DVPC l53FzYa/DQvIf6v5BghkIx9uJkQ3re9zQypiDziEavxVCVU0xpxw2GvWz5n1ZrP28Vrwzfnc7rRQ P/cBF+vmymsgKv3FV9e6N1Tb3W3VXH/c3/pyjfvK7BPuq8D56gb3VFuD+xjgA8ah837VszXuseqx V8beGntbbCSnE6HYVyv+NLv2+XbHCseKxmSafeVvlpNfyMl5OfminByWk8/LyS45uUlO1stJTU56 5WSl7FDsik1ZqZQoRYqiSIqoCAopjnT2il/jXweHZONCEnktmm2bwGsh9/EQmCLgGmuUWnRBDweZ biwMkZ7wGHfDapoV4YtqVYPMsOukR4JlRpOmp+XsNqNR0w25f1c0xdhMDFZDmMKXLhJNsyw3HXfx w0uGGMseP+nKy1iMnOObyzbb21c3d3U+oorna+1BKdMeLnr/4cvkZof4LZO9Ni+7T8vcGoY1aVqT 3Jo0rWXlxhk9HDVmy2NGA29ky2NsPnDRP8HPO3E1NALEjRPj+8uMyYTHk/JfzB+EquKJof1cDo4Y F9WRTsOvdnpSgYlH0BOcDqidKZoIRaKpCf9I51zAHwipg52xDPWxRKp2Ztl07yxNl6Falvj3iGmW 4EPW8hn7Zh4x4wyn+/iMM3zGGT5jn7/PnDE0yjewP5pSKBjDj6wp54XiIuxF3FURCzptB9rNjWmt KDvquiQSO0fFOHOU4Pz6GMCpukBdgFNIGE6t5EfbPFV2tLXCdYmdy1M2mFerQdIOaf8oB3mhstBo JwciyWQXhMk5u7tBi2n0twADAMJOj4cNCmVuZHN0cmVhbQ1lbmRvYmoNNDIgMCBvYmoNPDwvU3Vi dHlwZS9UcnVlVHlwZS9Gb250RGVzY3JpcHRvciA0MyAwIFIvTGFzdENoYXIgMTIxL1dpZHRoc1sy NzggMCAwIDAgMCAwIDAgMCAwIDAgMCA1ODQgMCAwIDI3OCAwIDAgNTU2IDU1NiAwIDAgNTU2IDU1 NiAwIDU1NiAwIDAgMCAwIDAgMCAwIDk3NSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCA2NjcgMCAwIDAgOTQ0IDAgMCAwIDAgMCAwIDAgMCAwIDU1NiAwIDAgMCA1NTYgMCA2MTEg NjExIDI3OCAwIDU1NiAyNzggODg5IDYxMSAwIDAgMCAzODkgNTU2IDMzMyAwIDAgNzc4IDAgNTU2 XS9CYXNlRm9udC9BcmlhbC1Cb2xkTVQvRmlyc3RDaGFyIDMyL0VuY29kaW5nL1dpbkFuc2lFbmNv ZGluZy9UeXBlL0ZvbnQ+Pg1lbmRvYmoNNDMgMCBvYmoNPDwvU3RlbVYgMTM4L0ZvbnROYW1lL0Fy aWFsLUJvbGRNVC9Gb250U3RyZXRjaC9Ob3JtYWwvRm9udFdlaWdodCA3MDAvRmxhZ3MgMzIvRGVz Y2VudCAtMjExL0ZvbnRCQm94Wy02MjggLTM3NiAyMDAwIDEwMTBdL0FzY2VudCA5MDUvRm9udEZh bWlseShBcmlhbCkvQ2FwSGVpZ2h0IDcxOC9YSGVpZ2h0IDUxNS9UeXBlL0ZvbnREZXNjcmlwdG9y L0l0YWxpY0FuZ2xlIDA+Pg1lbmRvYmoNNDQgMCBvYmoNPDwvU3VidHlwZS9UcnVlVHlwZS9Gb250 RGVzY3JpcHRvciAxMDggMCBSL0xhc3RDaGFyIDExNi9XaWR0aHNbNzE1IDAgMCAwIDAgMCAwIDAg MCAwIDAgNTA3IDUwNyA1MDcgMCA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyAwIDAgMCAwIDAgMCAw IDU3OSA1NDQgNTMzIDAgNDg4IDAgMCA2MjMgMCAwIDAgMCA4NTUgMCAwIDAgMCAwIDQ1OSA0ODcg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA0OTggMCAwIDAgMjI5IDAgMCAyMjkgNzk5 IDAgNTI3IDAgMCAwIDAgMzM1XS9CYXNlRm9udC9KQUNGRkIrQ2FsaWJyaS9GaXJzdENoYXIgMzcv RW5jb2RpbmcvV2luQW5zaUVuY29kaW5nL1R5cGUvRm9udD4+DWVuZG9iag00NSAwIG9iag08PC9T dWJ0eXBlL1RydWVUeXBlL0ZvbnREZXNjcmlwdG9yIDEwNyAwIFIvTGFzdENoYXIgMTExL1dpZHRo c1s1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgMCAwIDAgMCAwIDAgMCAw IDAgNTI5IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNDk1IDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgNTAzIDAgMCA1MzcgMCAwIDAgMCA4MTMgNTM3IDUzOF0vQmFzZUZv bnQvSkFDREdOK0NhbGlicmktQm9sZC9GaXJzdENoYXIgNDgvRW5jb2RpbmcvV2luQW5zaUVuY29k aW5nL1R5cGUvRm9udD4+DWVuZG9iag00NiAwIG9iag08PC9TdWJ0eXBlL1R5cGUwL0Rlc2NlbmRh bnRGb250c1sxMjcgMCBSXS9CYXNlRm9udC9KQk5ETUYrQ2FsaWJyaS9Ub1VuaWNvZGUgNTAgMCBS L0VuY29kaW5nL0lkZW50aXR5LUgvVHlwZS9Gb250Pj4NZW5kb2JqDTQ3IDAgb2JqDTw8L1N1YnR5 cGUvVHlwZTAvRGVzY2VuZGFudEZvbnRzWzEzNSAwIFJdL0Jhc2VGb250L0pCTkVFRCtTaW1TdW4v VG9Vbmljb2RlIDQ5IDAgUi9FbmNvZGluZy9JZGVudGl0eS1IL1R5cGUvRm9udD4+DWVuZG9iag00 OCAwIG9iag08PC9TdWJ0eXBlL1R5cGUwL0Rlc2NlbmRhbnRGb250c1sxMzAgMCBSXS9CYXNlRm9u dC9KQk5FR0QrQ2FsaWJyaS1Cb2xkL1RvVW5pY29kZSA1MSAwIFIvRW5jb2RpbmcvSWRlbnRpdHkt SC9UeXBlL0ZvbnQ+Pg1lbmRvYmoNNDkgMCBvYmoNPDwvTGVuZ3RoIDI1NjkvRmlsdGVyL0ZsYXRl RGVjb2RlPj5zdHJlYW0NCmjefJlJjxy5EUbv+hV1tOFDc1+AhoDKDZiDF3jGvufClAVYrUar5zD/ 3sz31YwwMDAHKfGaZAQjSAaDUU/jD9MPL5/fb0//ePu6/9jeb+fnl+Otffv689veblv79PnlZt3t +Ly/P4j/9y/r6+2pD/7xl2/v7csPL+fX2/Pzh6d/9sZv72+/3P7000/uL+bPt6e/vx3t7fPLp/6X 4P717/6XH39+ff1v+9Je3m/m9vHj7Wjnh6fxr+vr39Yv7fbEwO9//OmX13ZzsH3o/nq0b6/r3t7W l0/t9myM8R9vzzG07eOtvRy/b/9gjdG47dz/s759+LW/Mc58vMgFKFjIO9FykdtLp2UxI3QkyN5F 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 4YKjI9hXYJ2JW1eymXQAmcjdOkecWho81LWQP2k4R17hpe8PO/UK8ostsqMxIW/V+Tch3RLCDSek CAqaBiwOQh4/dPjUE4IsxCfYrwGhKv1+0/YW56ANsqYRoVZKHZp7QbL/53fWZTBXzeK5/a4akbY3 PPPyTQ8fZmFOFsvhxUi24Agfvwk+ZLUc4k+AAQDXh2pzCg0KZW5kc3RyZWFtDWVuZG9iag01MiAw IG9iag08PC9TdWJ0eXBlL1R5cGUwL0Rlc2NlbmRhbnRGb250c1szNSAwIFJdL0Jhc2VGb250L0pC TkpHRytXaW5nZGluZ3MtUmVndWxhci9FbmNvZGluZy9JZGVudGl0eS1IL1R5cGUvRm9udD4+DWVu ZG9iag01MyAwIG9iag08PC9TdWJ0eXBlL1RydWVUeXBlL0ZvbnREZXNjcmlwdG9yIDMzIDAgUi9M YXN0Q2hhciAzMi9XaWR0aHNbMjc4XS9CYXNlRm9udC9BcmlhbE1UL0ZpcnN0Q2hhciAzMi9FbmNv ZGluZy9XaW5BbnNpRW5jb2RpbmcvVHlwZS9Gb250Pj4NZW5kb2JqDTU0IDAgb2JqDTw8L1N1YnR5 cGUvVHlwZTAvRGVzY2VuZGFudEZvbnRzWzQwIDAgUl0vQmFzZUZvbnQvSkJOTENOK1N5bWJvbE1U L1RvVW5pY29kZSAyMCAwIFIvRW5jb2RpbmcvSWRlbnRpdHktSC9UeXBlL0ZvbnQ+Pg1lbmRvYmoN NTUgMCBvYmoNPDwvU3VidHlwZS9UcnVlVHlwZS9Gb250RGVzY3JpcHRvciAyNCAwIFIvTGFzdENo YXIgNDUvV2lkdGhzWzM2N10vQmFzZUZvbnQvVHJlYnVjaGV0TVMvRmlyc3RDaGFyIDQ1L0VuY29k aW5nL1dpbkFuc2lFbmNvZGluZy9UeXBlL0ZvbnQ+Pg1lbmRvYmoNNTYgMCBvYmoNPDwvU3VidHlw ZS9UcnVlVHlwZS9Gb250RGVzY3JpcHRvciA0MyAwIFIvTGFzdENoYXIgMTIxL1dpZHRoc1syNzgg MCAwIDAgMCAwIDAgMCAwIDAgMCA1ODQgMCAwIDI3OCAwIDAgNTU2IDU1NiAwIDAgNTU2IDU1NiAw IDU1NiAwIDMzMyAwIDAgMCAwIDAgOTc1IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDY2NyAwIDAgMCA5NDQgMCAwIDAgMCAwIDAgMCAwIDAgNTU2IDAgMCAwIDU1NiAwIDYxMSA2 MTEgMjc4IDAgNTU2IDI3OCA4ODkgNjExIDAgMCAwIDM4OSA1NTYgMzMzIDAgMCA3NzggMCA1NTZd L0Jhc2VGb250L0FyaWFsLUJvbGRNVC9GaXJzdENoYXIgMzIvRW5jb2RpbmcvV2luQW5zaUVuY29k aW5nL1R5cGUvRm9udD4+DWVuZG9iag01NyAwIG9iag08PC9TdWJ0eXBlL1RydWVUeXBlL0ZvbnRE ZXNjcmlwdG9yIDQzIDAgUi9MYXN0Q2hhciAxMjEvV2lkdGhzWzI3OCAwIDAgMCAwIDAgNzIyIDAg MCAwIDAgMCAwIDAgMjc4IDAgMCAwIDAgMCAwIDU1NiAwIDAgMCAwIDMzMyAwIDAgMCAwIDAgMCAw IDAgNzIyIDAgMCAwIDAgMCAwIDAgMCA2MTEgODMzIDAgNzc4IDAgMCAwIDY2NyA2MTEgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgNTU2IDYxMSA1NTYgNjExIDU1NiAzMzMgNjExIDYxMSAyNzggMCA1 NTYgMjc4IDg4OSA2MTEgNjExIDYxMSAwIDM4OSA1NTYgMzMzIDYxMSA1NTYgNzc4IDAgNTU2XS9C YXNlRm9udC9BcmlhbC1Cb2xkTVQvRmlyc3RDaGFyIDMyL0VuY29kaW5nL1dpbkFuc2lFbmNvZGlu Zy9UeXBlL0ZvbnQ+Pg1lbmRvYmoNNTggMCBvYmoNPDwvU3VidHlwZS9UcnVlVHlwZS9Gb250RGVz Y3JpcHRvciAzMCAwIFIvTGFzdENoYXIgMTIyL1dpZHRoc1szMzMgMCAwIDAgMCAwIDAgMCAwIDAg MCA2NjAgMCAwIDAgMCA2NjcgNjY3IDY2NyA2NjcgMCA2NjcgNjY3IDAgNjY3IDY2NyAzMzMgMCAw IDAgMCAwIDAgNzc4IDc3OCA3NzggNzc4IDcyMiA2NjcgMCAwIDM4OSAwIDAgNjY3IDk0NCA4MzMg ODMzIDcyMiAwIDc3OCA3MjIgNzIyIDgzMyAwIDEwMDAgMCAwIDAgMCAwIDAgMCAwIDAgNjY3IDAg NjY3IDY2NyA2NjcgMzg5IDY2NyA2NjcgMzMzIDAgNjY3IDMzMyAxMDAwIDY2NyA2NjcgNjY3IDY2 NyA0NDQgNjExIDQ0NCA2NjcgNjExIDk0NCA2NjcgNjExIDU1Nl0vQmFzZUZvbnQvQXJpYWwtQmxh Y2svRmlyc3RDaGFyIDMyL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9UeXBlL0ZvbnQ+Pg1lbmRv YmoNNTkgMCBvYmoNPDwvU3VidHlwZS9UcnVlVHlwZS9Gb250RGVzY3JpcHRvciAzMyAwIFIvTGFz dENoYXIgMTQ2L1dpZHRoc1syNzggMCAwIDAgMCA4ODkgMCAwIDMzMyAzMzMgMCA1ODQgMjc4IDMz MyAyNzggMjc4IDU1NiA1NTYgNTU2IDU1NiA1NTYgNTU2IDU1NiAwIDU1NiAwIDI3OCAwIDAgMCAw IDAgMTAxNSA2NjcgNjY3IDcyMiA3MjIgNjY3IDYxMSAwIDcyMiAyNzggMCAwIDU1NiA4MzMgMCAw IDY2NyAwIDAgNjY3IDYxMSA3MjIgMCA5NDQgNjY3IDY2NyAwIDAgMCAwIDAgMCAwIDU1NiA1NTYg NTAwIDU1NiA1NTYgMjc4IDU1NiA1NTYgMjIyIDIyMiA1MDAgMjIyIDgzMyA1NTYgNTU2IDU1NiA1 NTYgMzMzIDUwMCAyNzggNTU2IDUwMCA3MjIgNTAwIDUwMCA1MDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDIyMl0vQmFzZUZvbnQvQXJpYWxNVC9GaXJzdENo YXIgMzIvRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nL1R5cGUvRm9udD4+DWVuZG9iag02MCAwIG9i ag08PC9TdWJ0eXBlL1RydWVUeXBlL0ZvbnREZXNjcmlwdG9yIDMxIDAgUi9MYXN0Q2hhciA1Ny9X aWR0aHNbMjUwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDUwMCAwIDUwMCA1MDAgNTAw IDUwMCAwIDAgNTAwIDUwMF0vQmFzZUZvbnQvVGltZXNOZXdSb21hblBTLUJvbGRNVC9GaXJzdENo YXIgMzIvRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nL1R5cGUvRm9udD4+DWVuZG9iag02MSAwIG9i ag08PC9GaXJzdCA2MiAwIFIvQ291bnQgNC9MYXN0IDYzIDAgUj4+DWVuZG9iag02MiAwIG9iag08 PC9GaXJzdCA2NSAwIFIvUGFyZW50IDYxIDAgUi9BIDY2IDAgUi9OZXh0IDYzIDAgUi9Db3VudCAy L0xhc3QgNjcgMCBSL1NFIDgxIDAgUi9UaXRsZShCZWhhdmlvciBCYXNlZCBTYWZldHkgQmVzdCBQ cmFjdGljZXMucGRmKT4+DWVuZG9iag02MyAwIG9iag08PC9QYXJlbnQgNjEgMCBSL0EgNjQgMCBS L1ByZXYgNjIgMCBSL1NFIDc1IDAgUi9UaXRsZShSZWdpc3RyYXRpb25Gb3JtLVdoaXRuZXkpPj4N ZW5kb2JqDTY0IDAgb2JqDTw8L0RbMjUgMCBSL0ZpdEggODQ2XS9TL0dvVG8+Pg1lbmRvYmoNNjUg MCBvYmoNPDwvUGFyZW50IDYyIDAgUi9BIDY5IDAgUi9OZXh0IDY3IDAgUi9TRSA4NCAwIFIvVGl0 bGUoQmVoYXZpb3IgQmFzZWQgU2FmZXR5IEJlc3QgUHJhY3RpY2VzX0VOLnBkZik+Pg1lbmRvYmoN NjYgMCBvYmoNPDwvRFs5NyAwIFIvRml0SCA4NDZdL1MvR29Ubz4+DWVuZG9iag02NyAwIG9iag08 PC9QYXJlbnQgNjIgMCBSL0EgNjggMCBSL1ByZXYgNjUgMCBSL1NFIDc5IDAgUi9UaXRsZShCZWhh dmlvciBCYXNlZCBTYWZldHkgQmVzdCBQcmFjdGljZXNfQ04pPj4NZW5kb2JqDTY4IDAgb2JqDTw8 L0RbMTEgMCBSL0ZpdEggODQ2XS9TL0dvVG8+Pg1lbmRvYmoNNjkgMCBvYmoNPDwvRFs5NyAwIFIv Rml0SCA4NDZdL1MvR29Ubz4+DWVuZG9iag03MCAwIG9iag08PC9LIDcxIDAgUi9QYXJlbnRUcmVl IDcyIDAgUi9QYXJlbnRUcmVlTmV4dEtleSA5L1R5cGUvU3RydWN0VHJlZVJvb3Q+Pg1lbmRvYmoN NzEgMCBvYmoNPDwvS1s4MSAwIFIgNzUgMCBSXS9QIDcwIDAgUi9TL0RvY3VtZW50Pj4NZW5kb2Jq DTcyIDAgb2JqDTw8L051bXNbMFs4NSAwIFJdMVs4NiAwIFJdMls4NyAwIFJdM1s4OCAwIFJdNFs4 OSAwIFJdNVs5MCAwIFJdNls5MSAwIFJdN1s3OCAwIFJdOCA3MyAwIFJdPj4NZW5kb2JqDTczIDAg b2JqDVs3NCAwIFJdDWVuZG9iag03NCAwIG9iag08PC9LIDAvUCA3NSAwIFIvUy9QYXJ0L1BnIDI1 IDAgUj4+DWVuZG9iag03NSAwIG9iag08PC9JbmZvIDc2IDAgUi9LIDc0IDAgUi9QIDcxIDAgUi9T L1BhcnQvTWV0YWRhdGEgNzcgMCBSPj4NZW5kb2JqDTc2IDAgb2JqDTw8L0NyZWF0aW9uRGF0ZShE OjIwMDkxMTI3MTc0NDEyKzA4JzAwJykvQXV0aG9yKFdoaXRuZXlTaGVuKS9DcmVhdG9yKFBTY3Jp cHQ1LmRsbCBWZXJzaW9uIDUuMi4yKS9Qcm9kdWNlcihBY3JvYmF0IERpc3RpbGxlciA4LjEuMCBc KFdpbmRvd3NcKSkvTW9kRGF0ZShEOjIwMDkxMTI3MTc0NDEyKzA4JzAwJykvVGl0bGUoUmVnaXN0 cmF0aW9uRm9ybS1XaGl0bmV5KT4+DWVuZG9iag03NyAwIG9iag08PC9TdWJ0eXBlL1hNTC9MZW5n dGggMTU0NS9UeXBlL01ldGFkYXRhPj5zdHJlYW0NCjw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0i VzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6 bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDQuMC1jMzE2IDQ0LjI1MzkyMSwgU3VuIE9j dCAwMSAyMDA2IDE3OjE0OjM5Ij4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3Lncz Lm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiBy ZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVt ZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5hcHBsaWNhdGlvbi9wZGY8L2RjOmZvcm1h dD4KICAgICAgICAgPGRjOmNyZWF0b3I+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAg ICAgICA8cmRmOmxpPldoaXRuZXlTaGVuPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4K ICAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgICA8ZGM6dGl0bGU+CiAgICAgICAgICAgIDxy ZGY6QWx0PgogICAgICAgICAgICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPlJlZ2lz dHJhdGlvbkZvcm0tV2hpdG5leTwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpBbHQ+CiAgICAg ICAgIDwvZGM6dGl0bGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2Ny aXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9i ZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU+MjAwOS0xMS0yN1QxNzo0 NDoxMiswODowMDwveGFwOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4YXA6Q3JlYXRvclRvb2w+UFNj cmlwdDUuZGxsIFZlcnNpb24gNS4yLjI8L3hhcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhhcDpN b2RpZnlEYXRlPjIwMDktMTEtMjdUMTc6NDQ6MTIrMDg6MDA8L3hhcDpNb2RpZnlEYXRlPgogICAg ICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIK ICAgICAgICAgICAgeG1sbnM6cGRmPSJodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvIj4KICAg ICAgICAgPHBkZjpQcm9kdWNlcj5BY3JvYmF0IERpc3RpbGxlciA4LjEuMCAoV2luZG93cyk8L3Bk ZjpQcm9kdWNlcj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRp b24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhhcE1NPSJodHRwOi8vbnMuYWRvYmUu Y29tL3hhcC8xLjAvbW0vIj4KICAgICAgICAgPHhhcE1NOkRvY3VtZW50SUQ+dXVpZDowYTI0NzVk YS1kYzcxLTQyMDAtODY5Ni1mYWUwYTg2NmViYzg8L3hhcE1NOkRvY3VtZW50SUQ+CiAgICAgICAg IDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6YjcwZDQxNjMtNDhiMi00Mjk0LTgwY2YtYzU1NjdhZTY3 YzNhPC94YXBNTTpJbnN0YW5jZUlEPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6 UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/Pg0KZW5kc3RyZWFtDWVuZG9iag03 OCAwIG9iag08PC9LIDAvUCA3OSAwIFIvUy9QYXJ0L1BnIDIxIDAgUj4+DWVuZG9iag03OSAwIG9i ag08PC9LWzg5IDAgUiA5MCAwIFIgOTEgMCBSIDc4IDAgUl0vUCA4MCAwIFIvUy9QYXJ0Pj4NZW5k b2JqDTgwIDAgb2JqDTw8L0tbODQgMCBSIDc5IDAgUl0vUCA4MSAwIFIvUy9QYXJ0Pj4NZW5kb2Jq DTgxIDAgb2JqDTw8L0luZm8gODIgMCBSL0sgODAgMCBSL1AgNzEgMCBSL1MvUGFydC9NZXRhZGF0 YSA4MyAwIFI+Pg1lbmRvYmoNODIgMCBvYmoNPDwvQ3JlYXRpb25EYXRlKEQ6MjAxMDAyMjIxNDQw NTErMDgnMDAnKS9BdXRob3IoV2hpdG5leVNoZW4pL0NyZWF0b3IoUFNjcmlwdDUuZGxsIFZlcnNp b24gNS4yLjIpL1Byb2R1Y2VyKEFjcm9iYXQgRGlzdGlsbGVyIDguMS4wIFwoV2luZG93c1wpKS9N b2REYXRlKEQ6MjAxMDAyMjIxNDQwNTErMDgnMDAnKS9UaXRsZShNaWNyb3NvZnQgV29yZCAtIEJl aGF2aW9yIEJhc2VkIFNhZmV0eSBCZXN0IFByYWN0aWNlc19FTik+Pg1lbmRvYmoNODMgMCBvYmoN PDwvU3VidHlwZS9YTUwvTGVuZ3RoIDE2NDkvVHlwZS9NZXRhZGF0YT4+c3RyZWFtDQo8P3hwYWNr ZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRh IHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA0LjAtYzMx NiA0NC4yNTM5MjEsIFN1biBPY3QgMDEgMjAwNiAxNzoxNDozOSI+CiAgIDxyZGY6UkRGIHhtbG5z OnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAg IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhhcD0iaHR0 cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDEw LTAyLTIyVDE0OjQwOjUxKzA4OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpDcmVh dGVEYXRlPjIwMTAtMDItMjJUMTQ6NDA6NTErMDg6MDA8L3hhcDpDcmVhdGVEYXRlPgogICAgICAg ICA8eGFwOk1ldGFkYXRhRGF0ZT4yMDEwLTAyLTIyVDE0OjQwOjUxKzA4OjAwPC94YXA6TWV0YWRh dGFEYXRlPgogICAgICAgICA8eGFwOkNyZWF0b3JUb29sPlBTY3JpcHQ1LmRsbCBWZXJzaW9uIDUu Mi4yPC94YXA6Q3JlYXRvclRvb2w+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRm OkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1 cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8ZGM6Zm9ybWF0PmFwcGxpY2F0aW9u L3BkZjwvZGM6Zm9ybWF0PgogICAgICAgICA8ZGM6dGl0bGU+CiAgICAgICAgICAgIDxyZGY6QWx0 PgogICAgICAgICAgICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPk1pY3Jvc29mdCBX b3JkIC0gQmVoYXZpb3IgQmFzZWQgU2FmZXR5IEJlc3QgUHJhY3RpY2VzX0VOPC9yZGY6bGk+CiAg ICAgICAgICAgIDwvcmRmOkFsdD4KICAgICAgICAgPC9kYzp0aXRsZT4KICAgICAgICAgPGRjOmNy ZWF0b3I+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpPldoaXRu ZXlTaGVuPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC9kYzpjcmVh dG9yPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6 YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eGFwTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFw LzEuMC9tbS8iPgogICAgICAgICA8eGFwTU06RG9jdW1lbnRJRD51dWlkOmZkZjc5ZDg5LTI2MzYt NGUzOS1hZDYwLTg0ODAzODJiNGFjZjwveGFwTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhhcE1N Okluc3RhbmNlSUQ+dXVpZDo1MDllNzBlYS0xZmQ5LTQ4OWUtOGQ3Ny03ZTQ0YzQyYjBhMzY8L3hh cE1NOkluc3RhbmNlSUQ+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2Ny aXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9i ZS5jb20vcGRmLzEuMy8iPgogICAgICAgICA8cGRmOlByb2R1Y2VyPkFjcm9iYXQgRGlzdGlsbGVy IDguMS4wIChXaW5kb3dzKTwvcGRmOlByb2R1Y2VyPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4K ICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/Pg0KZW5kc3RyZWFt DWVuZG9iag04NCAwIG9iag08PC9LWzg1IDAgUiA4NiAwIFIgODcgMCBSIDg4IDAgUl0vUCA4MCAw IFIvUy9QYXJ0Pj4NZW5kb2JqDTg1IDAgb2JqDTw8L0sgMC9QIDg0IDAgUi9TL1BhcnQvUGcgOTcg MCBSPj4NZW5kb2JqDTg2IDAgb2JqDTw8L0sgMC9QIDg0IDAgUi9TL1BhcnQvUGcgMSAwIFI+Pg1l bmRvYmoNODcgMCBvYmoNPDwvSyAwL1AgODQgMCBSL1MvUGFydC9QZyA0IDAgUj4+DWVuZG9iag04 OCAwIG9iag08PC9LIDAvUCA4NCAwIFIvUy9QYXJ0L1BnIDggMCBSPj4NZW5kb2JqDTg5IDAgb2Jq DTw8L0sgMC9QIDc5IDAgUi9TL1BhcnQvUGcgMTEgMCBSPj4NZW5kb2JqDTkwIDAgb2JqDTw8L0sg MC9QIDc5IDAgUi9TL1BhcnQvUGcgMTQgMCBSPj4NZW5kb2JqDTkxIDAgb2JqDTw8L0sgMC9QIDc5 IDAgUi9TL1BhcnQvUGcgMTcgMCBSPj4NZW5kb2JqDTkyIDAgb2JqDTw8L0NvdW50IDkvVHlwZS9Q YWdlcy9LaWRzWzk3IDAgUiAxIDAgUiA0IDAgUiA4IDAgUiAxMSAwIFIgMTQgMCBSIDE3IDAgUiAy MSAwIFIgMjUgMCBSXT4+DWVuZG9iag05MyAwIG9iag08PC9TdWJ0eXBlL1hNTC9MZW5ndGggMzY5 Ny9UeXBlL01ldGFkYXRhPj5zdHJlYW0NCjw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1w Q2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8i IHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDQuMC1jMzE2IDQ0LjI1MzkyMSwgU3VuIE9jdCAwMSAy MDA2IDE3OjE0OjM5Ij4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8x OTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJv dXQ9IiIKICAgICAgICAgICAgeG1sbnM6eGFwPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv Ij4KICAgICAgICAgPHhhcDpNb2RpZnlEYXRlPjIwMTAtMDItMjJUMTQ6NDI6MzgrMDg6MDA8L3hh cDpNb2RpZnlEYXRlPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU+MjAxMC0wMi0yMlQxNDo0Mjoz OCswODowMDwveGFwOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4YXA6TWV0YWRhdGFEYXRlPjIwMTAt MDItMjJUMTQ6NDI6MzgrMDg6MDA8L3hhcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDx4YXA6Q3Jl YXRvclRvb2w+UFNjcmlwdDUuZGxsIFZlcnNpb24gNS4yLjI8L3hhcDpDcmVhdG9yVG9vbD4KICAg ICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIi CiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+ CiAgICAgICAgIDxkYzpmb3JtYXQ+YXBwbGljYXRpb24vcGRmPC9kYzpmb3JtYXQ+CiAgICAgICAg IDxkYzp0aXRsZT4KICAgICAgICAgICAgPHJkZjpBbHQ+CiAgICAgICAgICAgICAgIDxyZGY6bGkg eG1sOmxhbmc9IngtZGVmYXVsdCI+TWljcm9zb2Z0IFdvcmQgLSBCZWhhdmlvciBCYXNlZCBTYWZl dHkgQmVzdCBQcmFjdGljZXNfRU48L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6QWx0PgogICAg ICAgICA8L2RjOnRpdGxlPgogICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgICAgPHJkZjpT ZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGk+V2hpdG5leVNoZW48L3JkZjpsaT4KICAgICAgICAg ICAgPC9yZGY6U2VxPgogICAgICAgICA8L2RjOmNyZWF0b3I+CiAgICAgIDwvcmRmOkRlc2NyaXB0 aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxu czp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI+CiAgICAgICAgIDx4YXBN TTpEb2N1bWVudElEPnV1aWQ6NWU0ZGM5YzItODA3Yi00MDQxLTgwMTUtMzk0ZmEzMDU4NzlhPC94 YXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eGFwTU06SW5zdGFuY2VJRD51dWlkOjVlMzQ2ZWY5 LWMxZGYtNDA5Yy04OTFiLWRmMTBhMDA3NTUyNDwveGFwTU06SW5zdGFuY2VJRD4KICAgICAgPC9y ZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAg ICAgICAgIHhtbG5zOnBkZj0iaHR0cDovL25zLmFkb2JlLmNvbS9wZGYvMS4zLyI+CiAgICAgICAg IDxwZGY6UHJvZHVjZXI+QWNyb2JhdCBEaXN0aWxsZXIgOC4xLjAgKFdpbmRvd3MpPC9wZGY6UHJv ZHVjZXI+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRh PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/ eHBhY2tldCBlbmQ9InciPz4NCmVuZHN0cmVhbQ1lbmRvYmoNOTQgMCBvYmoNPDwvQ3JlYXRpb25E YXRlKEQ6MjAxMDAyMjIxNDQyMzgrMDgnMDAnKS9BdXRob3IoV2hpdG5leVNoZW4pL0NyZWF0b3Io UFNjcmlwdDUuZGxsIFZlcnNpb24gNS4yLjIpL1Byb2R1Y2VyKEFjcm9iYXQgRGlzdGlsbGVyIDgu MS4wIFwoV2luZG93c1wpKS9Nb2REYXRlKEQ6MjAxMDAyMjIxNDQyMzgrMDgnMDAnKS9UaXRsZShN aWNyb3NvZnQgV29yZCAtIEJlaGF2aW9yIEJhc2VkIFNhZmV0eSBCZXN0IFByYWN0aWNlc19FTik+ Pg1lbmRvYmoNeHJlZg0KMCA5NQ0KMDAwMDAwMDAwMCA2NTUzNSBmDQowMDAwMjc3MDk4IDAwMDAw IG4NCjAwMDAyNzcyNDcgMDAwMDAgbg0KMDAwMDI3NzQ2MCAwMDAwMCBuDQowMDAwMjgxMDY0IDAw MDAwIG4NCjAwMDAyODEyMTMgMDAwMDAgbg0KMDAwMDI4MTQyNiAwMDAwMCBuDQowMDAwMjg2Mjk0 IDAwMDAwIG4NCjAwMDAyODY1ODAgMDAwMDAgbg0KMDAwMDI4NjczMCAwMDAwMCBuDQowMDAwMjg2 OTQ0IDAwMDAwIG4NCjAwMDAyOTQ2NTkgMDAwMDAgbg0KMDAwMDI5NDgxMSAwMDAwMCBuDQowMDAw Mjk1MDU0IDAwMDAwIG4NCjAwMDAyOTY5NjUgMDAwMDAgbg0KMDAwMDI5NzExNyAwMDAwMCBuDQow MDAwMjk3MzE2IDAwMDAwIG4NCjAwMDAyOTg5NjMgMDAwMDAgbg0KMDAwMDI5OTExNSAwMDAwMCBu DQowMDAwMjk5MzI1IDAwMDAwIG4NCjAwMDAzMDE4MzIgMDAwMDAgbg0KMDAwMDMwMjExOSAwMDAw MCBuDQowMDAwMzAyMjcxIDAwMDAwIG4NCjAwMDAzMDI1MDUgMDAwMDAgbg0KMDAwMDMwNTY4NSAw MDAwMCBuDQowMDAwMzA1OTE2IDAwMDAwIG4NCjAwMDAzMDYwNjggMDAwMDAgbg0KMDAwMDMwNjI0 NCAwMDAwMCBuDQowMDAwMzYwMDYzIDAwMDAwIG4NCjAwMDAzNjAwOTkgMDAwMDAgbg0KMDAwMDM2 OTYxNCAwMDAwMCBuDQowMDAwMzY5ODQyIDAwMDAwIG4NCjAwMDAzNzAwOTEgMDAwMDAgbg0KMDAw MDM3MzU0NiAwMDAwMCBuDQowMDAwMzczNzY4IDAwMDAwIG4NCjAwMDAzNzQwMDggMDAwMDAgbg0K MDAwMDM3NDIzMCAwMDAwMCBuDQowMDAwMzc0NzA0IDAwMDAwIG4NCjAwMDAzNzQ4MjcgMDAwMDAg bg0KMDAwMDM3NDk1NyAwMDAwMCBuDQowMDAwMzc1MTg3IDAwMDAwIG4NCjAwMDAzNzUzOTMgMDAw MDAgbg0KMDAwMDM3OTIwNiAwMDAwMCBuDQowMDAwMzc5NTg3IDAwMDAwIG4NCjAwMDAzNzk4MTUg MDAwMDAgbg0KMDAwMDM4MDE3NyAwMDAwMCBuDQowMDAwMzgwNDk4IDAwMDAwIG4NCjAwMDAzODA2 MjkgMDAwMDAgbg0KMDAwMDM4MDc1OSAwMDAwMCBuDQowMDAwMzgwODk1IDAwMDAwIG4NCjAwMDAz ODM1MzUgMDAwMDAgbg0KMDAwMDM4MzgzMyAwMDAwMCBuDQowMDAwMzg0MTE5IDAwMDAwIG4NCjAw MDAzODQyNDIgMDAwMDAgbg0KMDAwMDM4NDM5MSAwMDAwMCBuDQowMDAwMzg0NTIyIDAwMDAwIG4N CjAwMDAzODQ2NzUgMDAwMDAgbg0KMDAwMDM4NTA1OCAwMDAwMCBuDQowMDAwMzg1NDU1IDAwMDAw IG4NCjAwMDAzODU4OTMgMDAwMDAgbg0KMDAwMDM4NjM5NiAwMDAwMCBuDQowMDAwMzg2NjI0IDAw MDAwIG4NCjAwMDAzODY2NzggMDAwMDAgbg0KMDAwMDM4NjgyNSAwMDAwMCBuDQowMDAwMzg2OTIz IDAwMDAwIG4NCjAwMDAzODY5NzAgMDAwMDAgbg0KMDAwMDM4NzA4NyAwMDAwMCBuDQowMDAwMzg3 MTM0IDAwMDAwIG4NCjAwMDAzODcyNDcgMDAwMDAgbg0KMDAwMDM4NzI5NCAwMDAwMCBuDQowMDAw Mzg3MzQxIDAwMDAwIG4NCjAwMDAzODc0MjkgMDAwMDAgbg0KMDAwMDM4NzQ4NyAwMDAwMCBuDQow MDAwMzg3NTk1IDAwMDAwIG4NCjAwMDAzODc2MjAgMDAwMDAgbg0KMDAwMDM4NzY3MSAwMDAwMCBu DQowMDAwMzg3NzQ1IDAwMDAwIG4NCjAwMDAzODc5NzEgMDAwMDAgbg0KMDAwMDM4OTU5NCAwMDAw MCBuDQowMDAwMzg5NjQ1IDAwMDAwIG4NCjAwMDAzODk3MTMgMDAwMDAgbg0KMDAwMDM4OTc2NyAw MDAwMCBuDQowMDAwMzg5ODQxIDAwMDAwIG4NCjAwMDAzOTAwOTkgMDAwMDAgbg0KMDAwMDM5MTgy NiAwMDAwMCBuDQowMDAwMzkxODk0IDAwMDAwIG4NCjAwMDAzOTE5NDUgMDAwMDAgbg0KMDAwMDM5 MTk5NSAwMDAwMCBuDQowMDAwMzkyMDQ1IDAwMDAwIG4NCjAwMDAzOTIwOTUgMDAwMDAgbg0KMDAw MDM5MjE0NiAwMDAwMCBuDQowMDAwMzkyMTk3IDAwMDAwIG4NCjAwMDAzOTIyNDggMDAwMDAgbg0K MDAwMDM5MjM1NCAwMDAwMCBuDQowMDAwMzk2MTI5IDAwMDAwIG4NCnRyYWlsZXINCjw8L1NpemUg OTU+Pg0Kc3RhcnR4cmVmDQoxMTYNCiUlRU9GDQo= ------=_NextPart_000_00E0_01CAB634.EFA987A0-- From Joe.Allen@citrix.com Thu Feb 25 02:26:15 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1P8QEim087845 for ; Thu, 25 Feb 2010 02:26:15 -0600 X-ASG-Debug-ID: 1267086457-6b1f03d10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from SBAPEXCH05.ad.corp.expertcity.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 009AF1CF8852 for ; Thu, 25 Feb 2010 00:27:37 -0800 (PST) Received: from SBAPEXCH05.ad.corp.expertcity.com (sbapexch05.ad.corp.expertcity.com [216.219.126.165]) by cuda.sgi.com with ESMTP id 5dJYJToBvd11P0eB for ; Thu, 25 Feb 2010 00:27:37 -0800 (PST) Received: from SBAPEXCH05.ad.corp.expertcity.com ([10.1.6.25]) by sbapexch05 ([10.1.6.25]) with mapi; Thu, 25 Feb 2010 00:27:58 -0800 From: Joe Allen To: Dave Chinner CC: Peter Grandi , Linux XFS Date: Thu, 25 Feb 2010 00:27:28 -0800 X-ASG-Orig-Subj: RE: xfs_growfs failure.... Subject: RE: xfs_growfs failure.... Thread-Topic: xfs_growfs failure.... Thread-Index: Acq1pXyvx5inPrV8T8qRYJHf0Ue3mgATh6Gg Message-ID: References: <19333.23937.956036.716@tree.ty.sabi.co.uk> <20100224230211.GL16175@discord.disaster> In-Reply-To: <20100224230211.GL16175@discord.disaster> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US x-ems-proccessed: oXeMnjjQeARSDE4UqeV8aA== x-ems-stamp: vP89mZ/ZJHd/C5jmbW6NRQ== Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: sbapexch05.ad.corp.expertcity.com[216.219.126.165] X-Barracuda-Start-Time: 1267086458 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23408 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 Dave & Peter=20 We were successfully able to get the FS back on line using the approach you= outlined below.=20 Thank you very much for your invaluable assistance. As long as we are in DR= ,=20 We'll upgrade along the lines suggested.=20 Thanks again! On Wed, Feb 24, 2010 at 10:37:30AM -0800, Joe Allen wrote: > Thanks so much for the help interpreting.=20 > We are extremely grateful for your help.=20 > I have tried to include some more information you all suggest might help: >=20 >=20 > >> It looks like that the filesystem was "grown" from ~92TiB to > ~114TiB on a storage device that is reported as ~103TiB > long. Again, very strange. >=20 > cat /proc/partitions > [snip] > 253 61 107971596288 dm-61 >=20 > =3D ~100TB.=20 OK. > >>112 AGs of 1TiB each - that confirms the grow succeeded and it was able= to write metadata to disk=20 > >>between 100 and 111 TiB without errors being reported. That > >>implies the block device must have been that big at some > >>point... >=20 > There were never 110 TB; only 100 were ever there...so I am not clear on = this point.=20 Well, XFS writes the new AG header metadata synchronously to the expanded region before making the superblock changes. If they didn't error out, either: a. the block device was large enough b. the writes were silently ignored by the block device (buggy block device) c. the block device wrapped them back around to the front of the device (buggy block device) and overwrote stuff =3D> fs corruption. SO regardless of what actually happened, you're going to need to run xfs_repair after the main superblock is fixed up. > >>My impression is that not enough history/context has been > >>provided to enable a good guess at what has happened and how to > >>undo the consequent damage.You suggested more context might help:=20 >=20 >=20 > These were the commands run:=20 > =20 > pvcreate /dev/dm-50 /dev/dm-51 /dev/dm-52 /dev/dm-53 /dev/dm-54 /dev/dm-5= 5 > vgextend logfs-sessions /dev/dm-50 /dev/dm-51 /dev/dm-52 /dev/dm-53 /dev/= dm-54 /dev/dm-55 > lvextend -i 3 -I 512 -l +1406973 /dev/logfs-sessions/sessions /dev/dm-50 = /dev/dm-51 /dev/dm-52 > lvextend -i 3 -I 512 -l +1406973 /dev/logfs-sessions/sessions /dev/dm-53 = /dev/dm-54 /dev/dm-55 > xfs_growfs /u01 (which failed) > xfs_growfs -d /u01 (which did not error out) > touch /u01/a Ok, 2.8.20 is old enough to have the userspace growfs bugs, and I'd say the kernel is old enough to have the growfs bugs as well. It is entirely possible that executing it twice was the cause of this. > I am sorry I don't have the output of the xfs_growfs command any longer.= =20 > Very shortly after someone noticed the filesystem was essentially offline= -- input output error.=20 > Tried unmounting but couldn't... got out of memory errors even when doing= ls. =20 > Tried rebooting and now FS is off line.=20 >=20 > The FS was 90TB, the purpose of the exercise was to grow it to 100TB.=20 >=20 > This is: >=20 > -bash-3.1# uname -a > Linux xx.com 2.6.18-53.1.19.el5 #1 SMP Tue Apr 22 03:01:10 EDT 2008 x86_6= 4 x86_64 x86_64 GNU/Linux >=20 > rpm -qa | grep xfs > kmod-xfs-0.4-1.2.6.18_8.1.1.el5.centos.plus.1 > xfsprogs-2.8.20-1.el5.centos > I've read about a case where Mr Chinner used xfd_db to set agcount > and in some cases fix things up. > Don't know if I am a candidate for that approach...=20 That's exactly what is has to be done to get the superblock back into the correct shape to enable a repair run to occur. First, upgrade your userspace tools to the latest so you pick up all the xfs_repair speedups and memory usage reductions. Then calculate the correct block count for 100AGs (dblocks =3D agcount * agblocks), modify the agcount and dblocks fields using xfs_db, then=20 xfs_repair -n to confirm that it finds the superblock valid. If the superblock is valid, you can then probably mount the filesystem to replay the log. Unmount immediately afterwards. Note that this may replay the bad growfs transaction, so you might need to use xfs_db to reset the superblock again. Once this is done you can run repair for real after which you should have a usable filesytem. This won't have restored the filesystem to the exact size of the underlying block device - a subsequent grow would be needed to extend the fs to include a partial AG at the end to use the remaining space. Good luck! Cheers, Dave. From aelder@sgi.com Thu Feb 25 14:05:27 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1PK5RSp126084 for ; Thu, 25 Feb 2010 14:05:27 -0600 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 2ECEFAC041; Thu, 25 Feb 2010 12:06:47 -0800 (PST) Received: from [128.162.232.145] ([128.162.232.145]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 25 Feb 2010 14:06:47 -0600 Subject: Re: [PATCH] xfs: Non-blocking inode locking in IO completion From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1266384989-28928-1-git-send-email-david@fromorbit.com> References: <1266384989-28928-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Thu, 25 Feb 2010 14:06:46 -0600 Message-ID: <1267128406.1905.18.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 25 Feb 2010 20:06:47.0445 (UTC) FILETIME=[0F598C50:01CAB656] 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-02-17 at 16:36 +1100, Dave Chinner wrote: > The introduction of barriers to DM loop devices (e.g. dm-crypt) has > created a new IO order completion dependency that XFS does not > handle. That is, the completion of log IOs (which have barriers) in > the loop filesystem are now dependent on completion of data IO in > the backing filesystem. One comment, below . . . > + if (ioend->io_type != IOMAP_READ) { > + error = xfs_setfilesize(ioend); > + ASSERT(!error || error == EAGAIN); > } > + > + /* > + * If we didn't complete processing of the ioend, requeue it to the > + * tail of the workqueue for another attempt later. Otherwise destroy > + * it. > + */ > + if (error == EAGAIN) { It's not a problem now (and may never be), but it's conceivable error could have been set to the return value from xfs_iomap_write_unwritten() to have value EAGAIN. It might have been better to include this block inside the if (ioend->io_type != IOMAP_READ) { block, above. (I'll take it as is, however...) -Alex > + atomic_inc(&ioend->io_remaining); > + xfs_finish_ioend(ioend, 0); > + /* ensure we don't spin on blocked ioends */ > + delay(1); > + } else > + xfs_destroy_ioend(ioend); > } > > /* From aelder@sgi.com Thu Feb 25 14:31:52 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1PKVqqn127424 for ; Thu, 25 Feb 2010 14:31:52 -0600 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 463878F8092; Thu, 25 Feb 2010 12:33:12 -0800 (PST) Received: from [128.162.232.145] ([128.162.232.145]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 25 Feb 2010 14:33:12 -0600 Subject: Re: [PATCH 2/4] [PATCH 2/4] xfs: remove wrappers for read/write file operations From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: Dave Chinner , xfs@oss.sgi.com In-Reply-To: <20100217083105.GB19943@infradead.org> References: <20100215094445.528696829@bombadil.infradead.org> <20100215094604.318261333@bombadil.infradead.org> <20100217035511.GJ28392@discord.disaster> <20100217083105.GB19943@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Thu, 25 Feb 2010 14:33:12 -0600 Message-ID: <1267129992.1905.24.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 25 Feb 2010 20:33:12.0997 (UTC) FILETIME=[C0699550:01CAB659] 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-02-17 at 03:31 -0500, Christoph Hellwig wrote: > On Wed, Feb 17, 2010 at 02:55:11PM +1100, Dave Chinner wrote: > > You've changed a local variable "pos" which had the value > > iocb->ki_pos to a function parameter of the same name which has a > > different value. Given this, all the existing uses of "pos" in this > > function need to be converted to "iocb->ki_pos" as the old > > xfs_write() never saw the original "pos" variable passed to > > xfs_file_aio_write(). I think the simplest explanation is that previously, the value of "offset" passed in is simply &iocb->ki_pos, and Christoph's changes are then simply replacing "*offset" with "iocb->ki_pos". In any case, I'm convinced the old is equivalent to the new... -Alex > Oh, I should have explained this in more detail. The aio_read/aio_write > ABI both has a pos argument and the file position in iocb->ki_pos. > They were added for allowing aio that does partial I/O in each method > call using retries, but we don't actually use the anywhere. Thus these > two are always these same and we even enforce that with a > > BUG_ON(iocb->ki_pos != pos); > > in the code (both old and new). Now how does the old pos local variable > come in play? The old code didn't want to pass the kiocb to the > low-level xfs-write function, but as want the offset it passes a pointer > to iocb->ki_pos, which is called offset. We take a local copy of it > before we might start modifying it, which we call pos. pos gets updated > early in generic_write_checks if this is an O_APPEND write, but > otherwise stays immutable and marks the position where this write > started, while iocb->ki_pos (aka the old offset) gets updated by > generic_file_direct_write / generic_file_buffered_write to the new > file position after the I/O was done. > > > Such as here. Actually, I'm surprised the compiler let you take > > the address of a function parameter considering parameters may be > > passed in registers.... > > Taking the address of arguments is perfectly valid in C, the only thing > you can't take addresses of are "register" variables. This code is > the same as mm/filemap.c:__generic_file_aio_write, btw. > > > > - trace_xfs_file_direct_write(xip, count, *offset, ioflags); > > > + trace_xfs_file_direct_write(ip, count, iocb->ki_pos, ioflags); > > > ret = generic_file_direct_write(iocb, iovp, > > > - &segs, pos, offset, count, ocount); > > > + &nr_segs, pos, &iocb->ki_pos, count, ocount); > > > > But you did convert some ;) > > I did carefull convert all offset references to ki->ki_pos, but all > uses of pos stay the same. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From aelder@sgi.com Thu Feb 25 16:03:03 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1PM33Xl132573 for ; Thu, 25 Feb 2010 16:03:03 -0600 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 BB4E08F8078; Thu, 25 Feb 2010 14:04:23 -0800 (PST) Received: from [128.162.232.145] ([128.162.232.145]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 25 Feb 2010 16:04:23 -0600 Subject: Re: [PATCH 00/10] quotactl fixed and cleanups From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: jack@suse.cz, swhiteho@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com In-Reply-To: <20100216084446.377980079@bombadil.infradead.org> References: <20100216084446.377980079@bombadil.infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Thu, 25 Feb 2010 16:04:22 -0600 Message-ID: <1267135462.1905.31.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 25 Feb 2010 22:04:23.0281 (UTC) FILETIME=[7CF4AE10:01CAB666] 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-02-16 at 03:44 -0500, Christoph Hellwig wrote: > This is a first large batch of refactoring the generic quotactl code. > I started looking at this for merging the FS interfaces for "VFS" and "XFS" > style quotas now that we grow more filesystems wanting to support quota > in a more advanced way than the generic implementation can, e.g. GFS2 > and cifs. There will be another couple of patches do do the actual > work which are not quite ready, but this is a large and useful enough batch > to get review and possibly included first. > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Whole series looks good to me. I know it's late, but... Acked-by: Alex Elder From SRS0+wAYz+85+fromorbit.com=david@internode.on.net Thu Feb 25 17:11:55 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1PNBtBs137256 for ; Thu, 25 Feb 2010 17:11:55 -0600 X-ASG-Debug-ID: 1267139596-28f9039b0000-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 ACD3C1F7C95 for ; Thu, 25 Feb 2010 15:13:16 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id zFc51CVSdf4p4GHs for ; Thu, 25 Feb 2010 15:13:16 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 15136710-1927428 for multiple; Fri, 26 Feb 2010 09:43:13 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Nkmmq-0004pk-M9; Fri, 26 Feb 2010 10:06:28 +1100 Date: Fri, 26 Feb 2010 10:06:28 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH V2] xfs: Non-blocking inode locking in IO completion Subject: [PATCH V2] xfs: Non-blocking inode locking in IO completion Message-ID: <20100225230628.GB18369@discord.disaster> References: <1266384989-28928-1-git-send-email-david@fromorbit.com> <20100217192938.GA14015@infradead.org> <20100217211312.GQ28392@discord.disaster> <20100218123512.GA6016@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100218123512.GA6016@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1267139598 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23456 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, Feb 18, 2010 at 07:35:13AM -0500, Christoph Hellwig wrote: > On Thu, Feb 18, 2010 at 08:13:12AM +1100, Dave Chinner wrote: > > > The patch looks good to me - while I hate introducing random delay() > > > calls I don't really see a way around this. > > > > I thought about using queue_delayed_work(), but then the change > > became much bigger and has other side effects like increasing the > > size of the ioend structure. > > Yes, now that the normal work struct and the delayed work struct are > different it would be a pain, agreed. Version with updated commit message below. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: Non-blocking inode locking in IO completion The introduction of barriers to loop devices has created a new IO order completion dependency that XFS does not handle. The loop device implements barriers using fsync and so turns a log IO in the XFS filesystem on the loop device into a data IO in the backing filesystem. That is, the completion of log IOs in the loop filesystem are now dependent on completion of data IO in the backing filesystem. This can cause deadlocks when a flush daemon issues a log force with an inode locked because the IO completion of IO on the inode is blocked by the inode lock. This in turn prevents further data IO completion from occuring on all XFS filesystems on that CPU (due to the shared nature of the completion queues). This then prevents the log IO from completing because the log is waiting for data IO completion as well. The fix for this new completion order dependency issue is to make the IO completion inode locking non-blocking. If the inode lock can't be grabbed, simply requeue the IO completion back to the work queue so that it can be processed later. This prevents the completion queue from being blocked and allows data IO completion on other inodes to proceed, hence avoiding completion order dependent deadlocks. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_aops.c | 93 ++++++++++++++++++++++++++----------------- 1 files changed, 56 insertions(+), 37 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 66abe36..059f159 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c @@ -163,14 +163,17 @@ xfs_ioend_new_eof( } /* - * Update on-disk file size now that data has been written to disk. - * The current in-memory file size is i_size. If a write is beyond - * eof i_new_size will be the intended file size until i_size is - * updated. If this write does not extend all the way to the valid - * file size then restrict this update to the end of the write. + * Update on-disk file size now that data has been written to disk. The + * current in-memory file size is i_size. If a write is beyond eof i_new_size + * will be the intended file size until i_size is updated. If this write does + * not extend all the way to the valid file size then restrict this update to + * the end of the write. + * + * This function does not block as blocking on the inode lock in IO completion + * can lead to IO completion order dependency deadlocks.. If it can't get the + * inode ilock it will return EAGAIN. Callers must handle this. */ - -STATIC void +STATIC int xfs_setfilesize( xfs_ioend_t *ioend) { @@ -181,9 +184,11 @@ xfs_setfilesize( ASSERT(ioend->io_type != IOMAP_READ); if (unlikely(ioend->io_error)) - return; + return 0; + + if (!xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) + return EAGAIN; - xfs_ilock(ip, XFS_ILOCK_EXCL); isize = xfs_ioend_new_eof(ioend); if (isize) { ip->i_d.di_size = isize; @@ -191,6 +196,28 @@ xfs_setfilesize( } xfs_iunlock(ip, XFS_ILOCK_EXCL); + return 0; +} + +/* + * Schedule IO completion handling on a xfsdatad if this was + * the final hold on this ioend. If we are asked to wait, + * flush the workqueue. + */ +STATIC void +xfs_finish_ioend( + xfs_ioend_t *ioend, + int wait) +{ + if (atomic_dec_and_test(&ioend->io_remaining)) { + struct workqueue_struct *wq; + + wq = (ioend->io_type == IOMAP_UNWRITTEN) ? + xfsconvertd_workqueue : xfsdatad_workqueue; + queue_work(wq, &ioend->io_work); + if (wait) + flush_workqueue(wq); + } } /* @@ -198,11 +225,11 @@ xfs_setfilesize( */ STATIC void xfs_end_io( - struct work_struct *work) + struct work_struct *work) { - xfs_ioend_t *ioend = - container_of(work, xfs_ioend_t, io_work); - struct xfs_inode *ip = XFS_I(ioend->io_inode); + xfs_ioend_t *ioend = container_of(work, xfs_ioend_t, io_work); + struct xfs_inode *ip = XFS_I(ioend->io_inode); + int error = 0; /* * For unwritten extents we need to issue transactions to convert a @@ -210,7 +237,6 @@ xfs_end_io( */ if (ioend->io_type == IOMAP_UNWRITTEN && likely(!ioend->io_error && !XFS_FORCED_SHUTDOWN(ip->i_mount))) { - int error; error = xfs_iomap_write_unwritten(ip, ioend->io_offset, ioend->io_size); @@ -222,30 +248,23 @@ xfs_end_io( * We might have to update the on-disk file size after extending * writes. */ - if (ioend->io_type != IOMAP_READ) - xfs_setfilesize(ioend); - xfs_destroy_ioend(ioend); -} - -/* - * Schedule IO completion handling on a xfsdatad if this was - * the final hold on this ioend. If we are asked to wait, - * flush the workqueue. - */ -STATIC void -xfs_finish_ioend( - xfs_ioend_t *ioend, - int wait) -{ - if (atomic_dec_and_test(&ioend->io_remaining)) { - struct workqueue_struct *wq; - - wq = (ioend->io_type == IOMAP_UNWRITTEN) ? - xfsconvertd_workqueue : xfsdatad_workqueue; - queue_work(wq, &ioend->io_work); - if (wait) - flush_workqueue(wq); + if (ioend->io_type != IOMAP_READ) { + error = xfs_setfilesize(ioend); + ASSERT(!error || error == EAGAIN); } + + /* + * If we didn't complete processing of the ioend, requeue it to the + * tail of the workqueue for another attempt later. Otherwise destroy + * it. + */ + if (error == EAGAIN) { + atomic_inc(&ioend->io_remaining); + xfs_finish_ioend(ioend, 0); + /* ensure we don't spin on blocked ioends */ + delay(1); + } else + xfs_destroy_ioend(ioend); } /* From SRS0+21CU+85+fromorbit.com=david@internode.on.net Thu Feb 25 17:44:36 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1PNiZkK138837 for ; Thu, 25 Feb 2010 17:44:36 -0600 X-ASG-Debug-ID: 1267141556-6a9301df0000-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 8568B13DC7D6 for ; Thu, 25 Feb 2010 15:45:56 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id yfvlIAu2j9G0GXQn for ; Thu, 25 Feb 2010 15:45:56 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 15313407-1927428 for multiple; Fri, 26 Feb 2010 10:15:55 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NknOz-0004si-MT; Fri, 26 Feb 2010 10:45:53 +1100 Date: Fri, 26 Feb 2010 10:45:53 +1100 From: Dave Chinner To: Patrick Schreurs Cc: Christoph Hellwig , Tommy van Leeuwen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Subject: Re: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Message-ID: <20100225234553.GC18369@discord.disaster> References: <20100108113114.GA8654@discord.disaster> <4B504B03.7050604@news-service.com> <4B6706CE.1020207@news-service.com> <20100208194226.GD9527@infradead.org> <4B712166.9010701@news-service.com> <20100209103157.GA5197@infradead.org> <4B72A9D1.8030101@news-service.com> <20100210145508.GA29047@infradead.org> <4B72D3F3.2040308@news-service.com> <4B85703A.60104@news-service.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B85703A.60104@news-service.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1267141559 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23457 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, Feb 24, 2010 at 07:30:18PM +0100, Patrick Schreurs wrote: > On 10-2-2010 16:42, Patrick Schreurs wrote: >> On 10-2-2010 15:55, Christoph Hellwig wrote: >>> On Wed, Feb 10, 2010 at 01:42:57PM +0100, Patrick Schreurs wrote: >>>> Thanks for the patch. After having this patch applied we saw *a lot* >>>> warnings. They all look like this: >>> >>> Ok, looks like that is not an issue, so you can discard that patch. >>> >>> I went down to the radix tree code to look for races in it's tag >>> handling, but then noticed that we might have an issue with our >>> usage of the radix-tree API. Can you try the patch below ontop >>> of Dave's rollup, and instead of my previous one? >> >> Okay. This patch is currently active. Thanks. I don't have a way to >> trigger it, so we'll have to wait and see what happens. > > Servers running with this patch applied are still running stable. The > first server we've patched is running stable for 2 weeks now. Should we > try to have this patches included for 2.6.33? Good to hear. The fixes are already in 2.6.33 (just released), so the question is whether we backport to 2.6.32 or not. Christoph, Alex, Eric - should we push these fixes back to .32-stable? Cheers, Dave. -- Dave Chinner david@fromorbit.com From aelder@sgi.com Fri Feb 26 11:56:46 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.4 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1QHukgZ199093 for ; Fri, 26 Feb 2010 11:56:46 -0600 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 9E8828F80B6; Fri, 26 Feb 2010 09:58:07 -0800 (PST) Received: from [128.162.232.175] ([128.162.232.175]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 26 Feb 2010 11:58:07 -0600 Subject: Re: [PATCH V2] xfs: Non-blocking inode locking in IO completion From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com In-Reply-To: <20100225230628.GB18369@discord.disaster> References: <1266384989-28928-1-git-send-email-david@fromorbit.com> <20100217192938.GA14015@infradead.org> <20100217211312.GQ28392@discord.disaster> <20100218123512.GA6016@infradead.org> <20100225230628.GB18369@discord.disaster> Content-Type: text/plain; charset="UTF-8" Date: Fri, 26 Feb 2010 11:58:06 -0600 Message-ID: <1267207086.2756.7.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 26 Feb 2010 17:58:07.0381 (UTC) FILETIME=[403F0450:01CAB70D] 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-02-26 at 10:06 +1100, Dave Chinner wrote: > On Thu, Feb 18, 2010 at 07:35:13AM -0500, Christoph Hellwig wrote: > > On Thu, Feb 18, 2010 at 08:13:12AM +1100, Dave Chinner wrote: > > > > The patch looks good to me - while I hate introducing random delay() > > > > calls I don't really see a way around this. > > > > > > I thought about using queue_delayed_work(), but then the change > > > became much bigger and has other side effects like increasing the > > > size of the ioend structure. > > > > Yes, now that the normal work struct and the delayed work struct are > > different it would be a pain, agreed. > > Version with updated commit message below. This looks good and I'll be incorporating this version. Thanks for updating it. -Alex > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > xfs: Non-blocking inode locking in IO completion > > The introduction of barriers to loop devices has created a new IO > order completion dependency that XFS does not handle. The loop > device implements barriers using fsync and so turns a log IO in the > XFS filesystem on the loop device into a data IO in the backing > filesystem. That is, the completion of log IOs in the loop > filesystem are now dependent on completion of data IO in the backing > filesystem. . . . From aelder@sgi.com Fri Feb 26 12:27:46 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.4 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1QIRkld200519 for ; Fri, 26 Feb 2010 12:27:46 -0600 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 0C524AC042 for ; Fri, 26 Feb 2010 10:29:07 -0800 (PST) Received: from [128.162.232.175] ([128.162.232.175]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 26 Feb 2010 12:29:07 -0600 Subject: xfstests: honor comments in the test group file From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Fri, 26 Feb 2010 12:29:07 -0600 Message-ID: <1267208947.2756.11.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 26 Feb 2010 18:29:07.0687 (UTC) FILETIME=[95132F70:01CAB711] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean 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 ; Fri, 26 Feb 2010 13:31:02 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o1QJV2wd203852; Fri, 26 Feb 2010 13:31:02 -0600 Date: Fri, 26 Feb 2010 13:31:02 -0600 Message-Id: <201002261931.o1QJV2wd203852@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-rc5-1032-g60b341b X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: e09f98606dcc156de1146c209d45a0d6d5f51c3f X-Git-Newrev: 60b341b778cc2929df16c0a504c91621b3c6a4ad 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 from e09f98606dcc156de1146c209d45a0d6d5f51c3f (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: hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Fri Feb 26 13:31:07 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_23,J_CHICKENPOX_31,J_CHICKENPOX_42 autolearn=no version=3.3.0-rupdated 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 o1QJV7f2203960 for ; Fri, 26 Feb 2010 13:31:07 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o1QJV77n203937; Fri, 26 Feb 2010 13:31:07 -0600 Date: Fri, 26 Feb 2010 13:31:07 -0600 Message-Id: <201002261931.o1QJV77n203937@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree annotated tag, v2.6.33, created. v2.6.33 X-Git-Refname: refs/tags/v2.6.33 X-Git-Reftype: annotated tag X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 4ac8e07ee3f251ae32329a24e0b01a316b21ead9 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.33 has been created at 4ac8e07ee3f251ae32329a24e0b01a316b21ead9 (tag) tagging 60b341b778cc2929df16c0a504c91621b3c6a4ad (commit) replaces v2.6.33-rc8 tagged by Linus Torvalds on Wed Feb 24 10:52:24 2010 -0800 - Log ----------------------------------------------------------------- Linux 2.6.33 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEABECAAYFAkuFdWsACgkQF3YsRnbiHLvLdQCfWMC/Um7dmNLV1Mcq7/I6GnPY RC0An1Bh9d5jQaj/37nu/0MTk+f1c4mZ =vqXC -----END PGP SIGNATURE----- Abdoulaye Walsimou Gaye (1): ARM: 5950/1: ARM: Fix build error for arm1026ej-s processor Adam Jackson (1): drm/edid: Fix interlaced detailed timings to be frame size, not field. Ajit Khaparde (2): be2net: set proper value to version field in req hdr net: bug fix for vlan + gro issue Al Viro (2): fix LOOKUP_FOLLOW on automount "symlinks" Switch proc/self to nd_set_link() Alan Jenkins (1): Input: i8042 - fix KBC jam during hibernate Alasdair G Kergon (1): dm: sysfs revert add empty release function to avoid debug warning Alek Du (1): USB: ehci: phy low power mode bug fixing Alex Chiang (3): ACPI: processor: add kernel command line support for early _PDC eval ACPI: processor: only evaluate _PDC once per processor ACPI: dock: properly initialize local struct dock_station in dock_add() Alex Deucher (3): drm/radeon/kms/rs600: add connector quirk drm/radeon/kms: fix shared ddc detection drm/radeon/rv740: fix backend setup Andreas Mohr (1): USB: ftdi_sio: add device IDs (several ELV, one Mindstorms NXT) Anton Blanchard (2): perf: Fix hypervisor sample reporting e1000: Fix DMA mapping error handling on RX Anton Vorontsov (4): powerpc/85xx: Fix oops during MSI driver probe on MPC85xxMDS boards kfifo: Make kfifo_initialized work after kfifo_free USB: FHCI: Fix build after kfifo rework kfifo: Don't use integer as NULL pointer Arjan van de Ven (1): ACPI: fix High cpu temperature with 2.6.32 Atsushi Nemoto (1): tc35815: Remove a wrong netif_wake_queue() call which triggers BUG_ON Ben Hutchings (3): V4L/DVB: cxusb: Select all required frontend and tuner modules sfc: Fix sign of efx_mcdi_poll_reboot() error in efx_mcdi_poll() sfc: SFE4002/SFN4112F: Widen temperature and voltage tolerances Ben Skeggs (6): drm/nouveau: use mutex for vbios lock drm/nv50: make nv50_mem_vm_{bind,unbind} operate only on vram drm/nv50: more efficient clearing of gpu page table entries drm/nv50: improve vram page table construction drm/nv50: fix instmem binding on IGPs to point at stolen system memory drm/nv50: fix vram ptes on IGPs to point at stolen system memory Benoit Papillault (1): mac80211: Fix probe request filtering in IBSS mode Bhanu Prakash Gollapudi (1): [SCSI] libfcoe: Send port LKA every FIP_VN_KA_PERIOD secs. Brian Haley (1): IPv6: better document max_addresses parameter Brian Niebuhr (1): USB: gadget: fix EEM gadget CRC usage Carlos Corbacho (1): acer-wmi: Respect current backlight level when loading Carlos O'Donell (1): parisc: Set PCI CLS early in boot. Christine Caulfield (1): Orphan DECnet Chuck Ebbert (1): vfs: don't call ima_file_check() unconditionally in nfsd_open() Chuck Lever (1): NFS: Too many GETATTR and ACCESS calls after direct I/O Clemens Ladisch (1): firewire: ohci: retransmit isochronous transmit packets on cycle loss Damian Lukowski (1): tcp: fix ICMP-RTO war Dan Halperin (1): iwlwifi: set HT flags after channel in rxon Darrick J. Wong (1): ACPI: Fix regression where _PPC is not read at boot even when ignore_ppc=0 Dave Airlie (5): drm/radeon/kms: make sure retry count increases. drm/radeon/kms: use udelay for short delays Merge branch 'for-airlied' of git://git.freedesktop.org/git/nouveau/linux-2.6 into drm-linus drm/radeon: bump the UMS driver version number to indicate rv740 fix Merge remote branch 'nouveau/for-airlied' of ../drm-nouveau-next into drm-linus David Howells (1): CacheFiles: Fix a race in cachefiles_delete_object() vs rename David S. Miller (8): Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 sparc64: Tighten checks in kstack_valid(). Merge branch 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 Merge branch 'master' of /home/davem/src/GIT/linux-2.6/ sparc64: Sync of_create_pci_dev() with drivers/pci/probe.c changes. sparc64: Fix sun4u execute bit check in TSB I-TLB load. sparc32: Fix struct stat uid/gid types. Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 Dick Hollenbeck (1): serial: 8250: add serial transmitter fully empty test Don Skidmore (2): ixgbe: Fix - Do not allow Rx FC on 82598 at 1G due to errata ixgbe: fix WOL register setup for 82599 Eric W. Biederman (3): sysfs: sysfs_sd_setattr set iattrs unconditionally net: Fix sysctl restarts... net-sysfs: Use rtnl_trylock in wireless sysfs methods. Francisco Jerez (3): drm/nouveau: Force TV encoder DPMS reinit after resume. drm/ttm: fix caching problem on non-PAT systems. drm/nouveau: Fix up pre-nv17 analog load detection. Frederic Weisbecker (3): reiserfs: Fix softlockup while waiting on an inode hw-breakpoints: Accept breakpoints on NULL address hw-breakpoint: Keep track of dr7 local enable bits Greg KH (1): USB: usbfs: only copy the actual data received Guennadi Liakhovetski (1): ARM: 5944/1: scsi: fix timer setup in fas216.c H. Peter Anvin (1): mm: Make copy_from_user() in migrate.c statically predictable Hauke Mehrtens (1): MIPS: BCM47xx: Fix 128MB RAM support Hedi Berriche (1): [IA64] Fix broken sn2 build Heiko Carstens (1): tracing/kprobes: Fix probe parsing Herbert Xu (3): inet: Remove bogus IGMPv3 report handling ipcomp: Avoid duplicate calls to ipcomp_destroy xfrm: Fix xfrm_state_clone leak Hugh Daschbach (2): [SCSI] libfc: Fix e_d_tov ns -> ms scaling factor in PLOGI response. [SCSI] libfc: Don't assume response request present. Jean Delvare (1): V4L/DVB: bttv: Move I2C IR initialization Jelle Martijn Kok (1): rtl8187: Add new device ID Jens Axboe (1): Revert "block: improve queue_should_plug() by looking at IO depths" Jens Rottmann (1): geode-mfgpt: restore previous behavior for selecting IRQ Jerome Glisse (3): drm/radeon/kms: fix indirect buffer management V2 drm/radeon/kms: fix bo's fence association drm/radeon/kms: free fence IB if it wasn't emited at IB free time Johannes Berg (1): mac80211: fix deferred hardware scan requests Jonathan Brassow (1): dm log: userspace fix overhead_size calcuations Juuso Oikarinen (1): mac80211: fix handling of null-rate control in rate_control_get_rate KAMEZAWA Hiroyuki (1): memcg: fix oom killing a child process in an other cgroup Kirill Smelkov (1): perf top: Fix help text alignment Kiyoshi Ueda (1): dm mpath: fix stall when requeueing io Kristoffer Glembo (1): sparc: Fix incorrect comparison in of_bus_ambapp_match() Kuninori Morimoto (1): soc-camera: mt9t112: modify exiting conditions from standby mode Kyle McMartin (1): vgaarb: fix "target=default" passing Lai Jiangshan (1): tracing: Fix circular dead lock in stack trace Larry Finger (1): b43: Fix throughput regression Laurent Pinchart (1): class: Free the class private data in class_release Len Brown (5): ACPI: remove Asus P2B-DS from acpi=ht blacklist ACPI: fix "acpi=ht" boot option Merge branches 'bugzilla-14886', 'bugzilla-15000', 'bugzilla-15040', 'bugzilla-15108', 'pdc', 'hotplug-null-ref' and 'thinkpad' into release Merge branches 'bugzilla-14207' and 'idle' into release Merge branch 'pcc' into release Lennert Buytenhek (1): MAINTAINERS: update mv643xx_eth maintenance status Linus Torvalds (42): Merge branch 'perf-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 'sh/for-2.6.33' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 Merge branch 'reiserfs/kill-bkl' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing Merge branch 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'fix/hda' 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/ieee1394/linux1394-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-2.6-dm USB: usbfs: properly clean up the as structure on error paths Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-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/usb-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6 Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 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/dtor/input 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/sparc-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6 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 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6 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/wim/linux-2.6-watchdog 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/dtor/input Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'parisc/tracehook' of git://git.kernel.org/pub/scm/linux/kernel/git/frob/linux-2.6-roland Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 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/net-2.6 Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6 Merge branch 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6 Linux 2.6.33 Linus Walleij (1): ARM: 5951/1: ARM: fix documentation of the PrimeCell bus Mahesh Salgaonkar (1): perf: Make bp_len type to u64 generic across the arch Marcin Slusarz (1): efifb: fix framebuffer handoff Mark Brown (2): USB: r8a66597-udc: Prototype IS_ERR() and PTR_ERR() USB: s3c-hsotg: Export usb_gadget_register_driver() Martin Fuzzey (1): V4L/DVB: Video : pwc : Fix regression in pwc_set_shutter_speed caused by bad constant => sizeof conversion. Masami Hiramatsu (1): perf probe: Init struct probe_point and set counter correctly Matt Turner (1): drm/radeon/kms/atom: use get_unaligned_le32() for ctx->ps Matthew Garrett (1): Input: add KEY_RFKILL Michael Buesch (1): ssb: Fix CONFIG_SSB_SDIOHOST typo Michael Neuling (1): fs/exec.c: fix initial stack reservation Michal Nazarewicz (1): USB: g_multi: fix CONFIG_USB_G_MULTI_RNDIS usage Michal Simek (1): microblaze: Fix cache loop function for cache range Mike Christie (1): [SCSI] iscsi_tcp regression: remove bogus warn on in write path Mike Frysinger (1): [WATCHDOG] bfin: fix max timeout calculation Mike Snitzer (1): dm snapshot: persistent annotate work_queue as on stack Mikulas Patocka (1): dm raid1: fail writes if errors are not handled and log fails Nikanth Karthikesan (1): dm stripe: avoid divide by zero with invalid stripe count Oleg Nesterov (2): x86: set_personality_ia32() misses force_personality32 x86: ELF_PLAT_INIT() shouldn't worry about TIF_IA32 Pallipadi, Venkatesh (1): ACPI: Be in TS_POLLING state during mwait based C-state entry Paul Mundt (1): sh64: fix tracing of signals. Paulius Zaleckas (1): MAINTAINERS: fix my e-mail and status for Gemini and FA526 Peter Tyser (1): powerpc/85xx: Fix SMP when "cpu-release-addr" is in lowmem Peter Zijlstra (2): hrtimer, softirq: Fix hrtimer->softirq trampoline perf_events: Fix FORK events Phil Dibowitz (1): USB: storage: Remove unneeded SC/PR from unusual_devs.h Radek Liboska (1): USB: ftdi_sio: new device id for papouch AD4USB Rafael J. Wysocki (1): i915 / PM: Fix hibernate regression caused by suspend/resume splitting Ranjith Lohithakshan (1): omap: Remove DEBUG_FS dependency for mux name checking Richard Farina (1): USB: serial: add usbid for dell wwan card to sierra.c Richard Guenther (1): V4L/DVB: dvb: l64781.ko broken with gcc 4.5 Richard Kennedy (1): fs: inode - remove 8 bytes of padding on 64bits allowing 1 more objects/slab under slub Rob Love (1): [SCSI] fcoe: Only rmmod fcoe.ko if there are no active connections Roel Kluin (3): iwmc3200wifi: Test of wrong pointer after kzalloc in iwm_mlme_update_bss_table() thinkpad-acpi: wrong thermal attribute_group removed in thermal_exit() Gemini: wrong registers used to set reg_level in gpio_set_irq_type() Roland McGrath (1): Revert "parisc: HAVE_ARCH_TRACEHOOK" Roy Yin (1): Input: usbtouchscreen - extend coordinate range for Generaltouch devices Russell King (3): Merge branch 'for-rmk' of git://gitorious.org/linux-gemini/mainline ARM: Update mach-types ARM: allow alignment fault mode to be configured at kernel boot Samu Onkalo (1): Input: polldev can cause crash in case when polling disabled Santosh Shilimkar (1): ARM: 5938/1: ARM: L2: export outer_cache_fns Shanyu Zhao (1): iwlwifi: fix AMSDU Rx after paged Rx patch Shaohua Li (1): Btrfs: btrfs_mark_extent_written uses the wrong slot Simon Kagstrom (3): via-velocity: Remove unused IRQ status parameter from rx_srv and tx_srv via-velocity: Take spinlock on set coalesce via-velocity: Fix races on shared interrupts Stanislaw Gruszka (1): iwlwifi: sanity check before counting number of tfds can be free Stefan Richter (1): firewire: net: fix panic in fwnet_write_complete Steve Hodgson (1): sfc: Fix SFE4002 initialisation Steven J. Magnani (1): microblaze: Fix out_le32() macro Sujith (1): ath9k: Fix sequence numbers for PAE frames Takahiro Yasui (1): dm raid1: fix null pointer dereference in suspend Takashi Iwai (1): ALSA: hda - Correct ASUA blacklist for MSI brokenness Tanaka Akira (1): USB: SIS USB2VGA DRIVER: support KAIREN's USB VGA adaptor USB20SVGA-MB-PLUS Tejun Heo (1): idr: fix a critical misallocation bug, take#2 Tetsuo Handa (1): kernel/sys.c: fix missing rcu protection for sys_getpriority() Thomas Hellstrom (4): drm: Fix a bug in the range manager. drm/ttm: Fix a bug occuring when validating a buffer object in a range. drm/vmwgfx: Use fb handover mechanism instead of stealth mode. drm/vmwgfx: Fix queries if no dma buffer thrashing is occuring. Thomas Renninger (2): ACPI: Add NULL pointer check in acpi_bus_start ACPI: acpi_bus_{scan,bus,add}: return -ENODEV if no device was found Tomas Henzl (1): [SCSI] megaraid_sas: fix for 32bit apps Tony Luck (1): [IA64] preserve personality flag bits across exec Torgny Johansson (1): cdc_ether: new PID for Ericsson C3607w to the whitelist (resubmit) Valentin Longchamp (1): USB: otg Kconfig: let USB_OTG_UTILS select USB_ULPI option Vasu Dev (1): [SCSI] libfc: call ddp setup for only FCP reads to avoid accessing junk fsp pointer Wey-Yi Guy (2): iwlwifi: Fix to set correct ht configuration iwlwifi: error checking for number of tfds in queue Yoichi Yuasa (1): MIPS: Highmem: Fix build error Zhang Rui (1): ACPI, i915: blacklist Clevo M5x0N bad_lid state stephen hemminger (1): ethtool: allow non-admin user to read GRO settings. ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Fri Feb 26 13:31:08 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.4 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_21,J_CHICKENPOX_33,J_CHICKENPOX_54, J_CHICKENPOX_56 autolearn=no version=3.3.0-rupdated 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 o1QJV8M0203993 for ; Fri, 26 Feb 2010 13:31:08 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o1QJV7On203966; Fri, 26 Feb 2010 13:31:07 -0600 Date: Fri, 26 Feb 2010 13:31:07 -0600 Message-Id: <201002261931.o1QJV7On203966@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree annotated tag, v2.6.33-rc6, created. v2.6.33-rc6 X-Git-Refname: refs/tags/v2.6.33-rc6 X-Git-Reftype: annotated tag X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: b02c43040da3d3e4f56d34d443c4c2a0d41da367 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.33-rc6 has been created at b02c43040da3d3e4f56d34d443c4c2a0d41da367 (tag) tagging abe94c756c08d50566c09a65b9c7fe72f83071c5 (commit) replaces v2.6.33-rc5 tagged by Linus Torvalds on Fri Jan 29 13:58:00 2010 -0800 - Log ----------------------------------------------------------------- Linux 2.6.33-rc6 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEABECAAYFAktjWewACgkQF3YsRnbiHLvKYQCfeNPKmPkeSS44PKbFsD9KMbAQ 138AniUAGBVg51gEUZxEW34+8RjcdZPG =+gvF -----END PGP SIGNATURE----- Abhijeet Kolekar (1): cfg80211: fix channel setting for wext Al Viro (8): Fix a leak in affs_fill_super() Fix remount races with symlink handling in affs fix affs parse_options() Fix failure exits in bfs_fill_super() get rid of pointless checks after simple_pin_fs() fix leak in romfs_fill_super() fix oops in fs/9p late mount failure Fix failure exit in ipathfs Alex Deucher (11): drm/radeon/kms/r100: fix bug in CS parser drm/radeon/kms: fix hardcoded mmio size in register functions drm/radeon/kms/atom: fix some parser bugs drm/radeon/kms/atom: upstream parser updates drm/radeon/kms: fix atombios_crtc_set_base drm/radeon/kms/r4xx: cleanup atom path drm/radeon/kms/atom: fix crtc lock ordering drm/radeon/kms: clean up pll struct drm/radeon/kms: clean up atombios pll code drm/radeon/kms/atom: atom parser fixes drm/radeon/kms: fix legacy get_engine/memory clock Alexander Clouter (1): MIPS: Fix vmlinuz build for 32bit-only math shells Alexander Duyck (1): igb/igbvf: cleanup exception handling in tx_map_adv Alexander Graf (1): KVM: powerpc: Show timing option only on embedded Alexey Dobriyan (3): ipv4: don't remove /proc/net/rt_acct netns xfrm: fix "ip xfrm state|policy count" misreport netns xfrm: deal with dst entries in netns Anatolij Gustschin (1): [SCSI] mptsas: Fix issue with chain pools allocation on katmai Andrea Tacconi (1): drm/nouveau: add NV18 device id to call_lvds_manufacturer_script Andreas Herrmann (1): Revert "x86: ucode-amd: Load ucode-patches once ..." Andrew Patterson (1): PCI: fix nested spinlock hang in aer_inject Andrew Randrianasulu (2): drm/radeon/kms/r200: fix bug in CS parser drm/radeon/kms/r200: fix bug in CS parser Andrew Vasquez (2): [SCSI] qla2xxx: Correct FCP2 recovery handling. [SCSI] qla2xxx: Perform fast mailbox read of flash regardless of size nor address alignment. Aneesh Kumar K.V (4): ext4: Handle -EDQUOT error on write ext4: Fix quota accounting error with fallocate ext4: Drop EXT4_GET_BLOCKS_UPDATE_RESERVE_SPACE flag Btrfs: Use correct values when updating inode i_size on fallocate Anton Blanchard (1): sparc: cpumask_of_node() should handle -1 as a node Anton Vorontsov (1): phylib: Move workqueue initialization to a proper place Artem Bityutskiy (2): UBI: add more checks to chdev open UBI: fix memory leak in update path Avi Kivity (1): KVM: Fix race between APIC TMR and IRR Ben Hutchings (1): sfc: Use fixed-size buffers for MCDI NVRAM requests Ben Skeggs (23): drm/nv50: ignore vbios table's claim to the contrary if EDID says >8bpc drm/nouveau: fix handling of fbcon colours in 8bpp drm/nouveau: remove unused nouveau_channel_idle() function drm/nv50: restore correct cache1 get/put address on fifoctx load drm/nouveau: have ttm's fault handler called directly drm/nv50: prevent a possible ctxprog hang drm/nv04: differentiate between nv04/nv05 drm/nouveau: use dma.max rather than pushbuf size for checking GET validity drm/nouveau: initialise DMA tracking parameters earlier drm/nouveau: trust init table registers are safe drm/nouveau: wait on fence after bo move if validating for another channel drm/nouveau: remove PRIV0 check in nouveau_mem_close() drm/nouveau: assume no nv04 board has a DCB table drm/nouveau: less magic DCB 1.5 parsing drm/nouveau: reserve VGA area for the moment drm/nouveau: fix a race condition in nouveau_dma_wait() drm/nouveau: fix thinko in nv04_instmem.c drm/nv50: fix alignment of per-channel fifo cache drm/nv50: prevent accidently turning off encoders we're actually using drm/nouveau: report LVDS as disconnected if lid closed drm/nouveau: fix failure path if userspace specifies no valid memtypes drm/nv50: fail auxch transaction if reply count not what we expect drm/nv50: prevent switching off SOR when in use for DVI-over-DP Benoit Papillault (1): mac80211: check that ieee80211_set_power_mgmt only handles STA interfaces. Boaz Harrosh (1): [SCSI] scsi_lib: Fix bug in completion of bidi commands Bob Copeland (1): mac80211: fix sign error in pid controller Breno Leitao (1): qlge: Only free resources if they were allocated Chris Mason (1): Btrfs: Add mount -o compress-force Chris Wilson (1): drm/i915: Selectively enable self-reclaim Christian Borntraeger (1): KVM: S390: fix potential array overrun in intercept handling Christian Lamparter (1): p54pci: rx frame length check Christof Schmitt (2): [SCSI] zfcp: Issue zfcp_fc_wka_port_put after FC CT BSG request [SCSI] zfcp: Fix linebreak in hba trace Dan Carpenter (1): hwmon: (amc6821) Double unlock bug Dan Williams (1): MAINTAINERS: transfer maintainership of I/OAT Dave Airlie (11): drm/kms/fb: check for depth changes from userspace for resizing. Merge remote branch 'korg/drm-core-next' into drm-testing Merge remote branch 'korg/drm-radeon-testing' into drm-testing drm/radeon/kms: fix displayport->dvi connector DDC. Merge remote branch 'nouveau/for-airlied' of ../drm-nouveau-next into drm-linus Merge remote branch 'korg/drm-radeon-testing' into drm-linus Merge remote branch 'nouveau/for-airlied' of ../drm-nouveau-next into drm-linus Merge remote branch 'korg/drm-radeon-next' into drm-linus drm/radeon/kms: make hibernate work on IGPs drm/radeon/kms: drop unnecessary printks. drm/radeon/kms: preface warning printk with driver name David Härdeman (1): Input: winbond-cir - remove dmesg spam David John (1): drm: Keep disabled outputs disabled after suspend / resume David Miller (1): sparc: TIF_ABI_PENDING bit removal David Rientjes (1): x86: Set hotpluggable nodes in nodes_possible_map David S. Miller (11): sparc32: Update defconfig. sparc32: Fix page_to_phys(). Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 sparc64: Add perf callchain support. sparc64: Fully support both performance counters. sparc: Add missing SW perf fault events. sparc64: Update defconfig. sparc64: Fix IRQ ->set_affinity() methods. Merge branch 'master' of /home/davem/src/GIT/linux-2.6/ Merge branch 'linux-2.6.33.y' of git://git.kernel.org/pub/scm/linux/kernel/git/inaky/wimax sparc64: Fix UP build. David VomLehn (2): MIPS: PowerTV: Streamline access to platform device registers MIPS: PowerTV: Fix support for timer interrupts with > 64 external IRQs Davide Libenzi (1): eventfd - allow atomic read and waitqueue remove Denis Turischev (1): [WATCHDOG] sbc_fitpc2_wdt: fix I/O space access technique. Dirk Teurlings (1): [ARM] Orion5x: add GPIO LED and buttons for wrt350n v2 Dmitry Artamonow (1): mfd: Fix asic3 build Eric Dumazet (1): vlan: fix vlan_skb_recv() Eric Miao (3): [ARM] pxa/corgi: fix incorrect default GPIO for UDC Vbus [ARM] pxa: fix the incorrect naming of AC97 reset pin config for pxa26x [ARM] pxa: fix irq suspend/resume for pxa25x Erik Benada (1): [ARM] orion5x: D-link DNS-323 rev. B1 power-off Felix Beck (1): [S390] zcrypt: Do not remove coprocessor for error 8/72 Francisco Jerez (16): drm/nouveau: Add cache_flush/pull fifo engine functions. drm/nouveau: Pre-G80 tiling support. drm/nouveau: Make the MM aware of pre-G80 tiling. drm/i2c/ch7006: Drop build time dependency to nouveau. drm/nouveau: Fix "general protection fault" in the flipd/flips eviction path. drm/nouveau: No need to force evict=true when swapping evicted BOs back in. drm/nouveau: Drop redundant placement initialization. drm/nouveau: Clean up the nv17-nv4x load detection code a bit. drm/nouveau: Implement nv42-nv43 TV load detection. drm/nouveau: Don't skip card take down on nv0x. drm/nouveau: Allocate a per-channel instance of NV_SW. drm/nouveau: Use the software object for fencing. drm/nv04: Context switching fixes. drm/nouveau: Break some long lines. drm/nouveau: Fallback to analog load detection when the EDID block is invalid. drm/nouveau: Unset the EDID connector property when the EDID block goes away. Giridhar Malavali (1): [SCSI] qla2xxx: Update version number to 8.03.01-k10. Greg Kroah-Hartman (1): fnctl: f_modown should call write_lock_irqsave/restore Guennadi Liakhovetski (1): ASoC: fix a memory-leak in wm8903 Guido Barzini (1): sfc: Add workspace for GMAC bug workaround to MCDI MAC_STATS buffer H. Peter Anvin (2): x86: Remove "x86 CPU features in debugfs" (CONFIG_X86_CPU_DEBUG) x86: get rid of the insane TIF_ABI_PENDING bit Hannes Reinecke (1): [SCSI] aic79xx: check for non-NULL scb in ahd_handle_nonpkt_busfree Hans de Goede (1): hwmon: (fschmd) Fix a memleak on multiple opens of /dev/watchdog Harish Zunjarrao (1): [SCSI] fc-transport: Use packed modifier for fc_bsg_request structure. Heiko Carstens (3): sparc: copy_from_user() should not return -EFAULT [SCSI] zfcp: add missing compat ptr conversion [S390] irqflags: add missing types.h include Hendrik Brueckner (1): [S390] sclp_vt220: set initial terminal window size Henrik Rydberg (2): Input: add the ABS_MT_PRESSURE event Input: update multi-touch protocol documentation Herbert Xu (1): virtio_net: Make delayed refill more reliable Hin-Tak Leung (1): zd1211rw: adding 0409:0248 to supported device list Hugh Dickins (1): mm: fix migratetype bug which slowed swapping Inaky Perez-Gonzalez (1): wimax/i2400m: Add support for more i6x50 SKUs James Bottomley (1): [SCSI] lpfc: fix file permissions Jarek Poplawski (1): ax25: netrom: rose: Fix timer oopses Jeff Garrett (1): x86/PCI: remove IOH range fetching Jeff Kirsher (1): MAINTAINERS: Add Intel igbvf maintainer Jeff Mahoney (1): hwmon: (smsc47m1) Fix section mismatch Jerome Glisse (11): drm/radeon/kms: Do not unpin buffer in fb destruction drm/radeon/kms: Fix r600 blit cleanup path drm/radeon/kms: Disable AGP is aperture size < 32M drm/radeon/kms: Use radeon_agp_disable when disabling AGP drm: EDID accept separate sync video mode drm/radeon/kms: r600/r700 disable irq at suspend drm/radeon/kms: r600/r700 don't process IRQ if not initialized drm/radeon/kms: r600 handle irq vector ring overflow drm/radeon/kms: Forbid creation of framebuffer with no valid GEM object drm/radeon/kms: r600/r700 don't test ib if ib initialization fails drm/radeon: r6xx/r7xx possible security issue, system ram access Jesse Brandeburg (3): e1000: enhance frame fragment detection e1000e: enhance frame fragment detection e1000/e1000e: don't use small hardware rx buffers Jiajun Wu (1): ucc_geth: Fix full TX queue processing Jiri Slaby (1): SPARC: use helpers for rlimits John Stultz (1): sparc: convert to arch_gettimeoffset() Jon Dodgson (1): Input: lifebook - add another Lifebook DMI signature Josef Bacik (4): Btrfs: run orphan cleanup on default fs root Btrfs: do not mark the chunk as readonly if in degraded mode Btrfs: check return value of open_bdev_exclusive properly Btrfs: check total number of devices when removing missing KOSAKI Motohiro (1): kmsg_dump: Dump on crash_kexec as well Ken Kawasaki (1): fmvj18x_cs: add new id (Panasonic lan & modem card) Kevin Hilman (1): OMAP: timekeeping: time should not stop during suspend Lennert Buytenhek (1): [ARM] Orion: fix PCIe inbound window programming when RAM size is not a power of two Linus Torvalds (29): Merge branch 'for-linus/samsung' of git://git.fluff.org/bjdooks/linux Merge git://git.infradead.org/~dwmw2/mtd-2.6.33 Merge branch 'for-linus/i2c' of git://git.fluff.org/bjdooks/linux Merge branch 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6 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 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging Merge branch 'linux-next' of git://git.infradead.org/ubi-2.6 Merge branch 'kvm-updates/2.6.33' of git://git.kernel.org/pub/scm/virt/kvm/kvm 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://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6 Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip mm: add new 'read_cache_page_gfp()' helper function Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6 Merge branch 'for-linus' of git://git.infradead.org/ubi-2.6 Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus Merge master.kernel.org:/home/rmk/linux-2.6-arm 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/viro/vfs-2.6 Split 'flush_old_exec' into two functions 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/dtor/input Linux 2.6.33-rc6 Luca Barbieri (5): drm/nouveau: Fix null deref in nouveau_fence_emit due to deleted fence drm/nouveau: check pushbuffer bounds in ioctl drm/nouveau: Acknowledge DMA_VTX_PROTECTION PGRAPH interrupts drm/nouveau: Evict buffers in VRAM before freeing sgdma drm/ttm: Fix race condition in ttm_bo_delayed_delete (v3, final) Luca Tettamanti (1): hwmon: (asus_atk0110) Do not fail if MBIF is missing Maarten Maathuis (3): drm/nouveau: better alignment of bo sizes and use roundup instead of ALIGN drm/nv50: make the blocksize depend on vram size drm/nv50: wait for pgraph to idle before unloading the context Manjunatha GK (1): OMAP3: PM debug: fix build error when !CONFIG_DEBUG_FS Marcelo Tosatti (2): KVM: properly check max PIC pin in irq route setup KVM: MMU: bail out pagewalk on kvm_read_guest error Marcin Kościelnicki (2): drm/nv04: Fix set_operation software method. drm/nv50: Fix typo in PGRAPH initialisation. Marcin Slusarz (2): drm/nv50: fix fillrect color drm/nouveau: create function for "dealing" with gpu lockup Martin Schwidefsky (2): [S390] use set_current_state in sigsuspend [S390] fix single stepped svcs with TRACE_IRQFLAGS=y Matthew Slattery (1): sfc: QT202x: Remove unreliable MMD check at initialisation Miao Xie (1): Btrfs: remove tree_search() in extent_map.c Michael Hennerich (1): Input: ad7879 - support auxiliary GPIOs via gpiolib Michael S. Tsirkin (2): KVM: only allow one gsi per fd KVM: fix spurious interrupt with irqfd Mika Westerberg (1): UBI: fix volume creation input checking Mike Frysinger (1): bfin_mac: use the newer CLKBUFOE bit name via asm/dpmc.h Mike McCormack (1): sky2: Enable/disable WOL per hardware device Morten Thunberg Svendsen (1): mtd: tests: fix read, speed and stress tests on NOR flash Neil Horman (2): dccp_probe: Fix module load dependencies between dccp and dccp_probe dccp: fix dccp rmmod when kernel configured to use slub Olof Johansson (1): omap: Enable GPMC clock in gpmc_init Pallipadi, Venkatesh (1): x86: Disable HPET MSI on ATI SB700/SB800 Paul Walmsley (1): OMAP1 clock: fix for "BUG: spinlock lockup on CPU#0" Penchala Narasimha Reddy Chilakala, ERS-HCLTech (1): [SCSI] aacraid: fix File System going into read-only mode Peter Horton (1): UBI: initialise update marker Peter Huewe (1): [WATCHDOG] ixp2000: Fix build failure caused by missing include Peter Korsgaard (1): hmt: adjust for new pwm_backlight->notify prototype Peter Ujfalusi (1): OMAP3: PM: Enable wake-up from McBSP2, 3 and 4 modules Rajendra Nayak (2): OMAP4: PRCM: Fix the base address for CHIRONSS reg defines OMAP4: clocks: Fix the clksel_rate struct DPLL divs Ram Vepa (1): S2io: two branches the same in wait_for_cmd_complete() Reinette Chatre (1): iwlwifi: add license to tracing files Robert P. J. Day (1): sparc: Simplify param.h by simply including Roel Kluin (6): sparc: leds_resource.end assigned to itself in clock_board_probe() appletalk:: da.s_net not copied but assigned to itself in aarp_rcv() netlink: With opcode INET_DIAG_BC_S_LE dport was compared in inet_diag_bc_run() OMAP: dma_chan[lch_head].flag & OMAP_DMA_ACTIVE tested twice in omap_dma_unlink_lch() e1000/e1000e/igb/igbvf/ixgb/ixgbe: Fix tests of unsigned in *_tx_map() OMAP: omap3_pm_get_suspend_state() error ignored in pwrdm_suspend_get() Ron Murray (1): Please add support for Microsoft MN-120 PCMCIA network card Russ Anderson (1): x86, msr/cpuid: Pass the number of minors when unregistering MSR and CPUID drivers. Russell King (4): OMAP3: clock: Remove unnecessarily .init initializers from OMAP3 clocks Merge branch 'for-rmk' of git://git.marvell.com/orion Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 [ARM] Update mach-types Russell King - ARM Linux (1): mtd: Really add ARM pismo support Saeed Bishara (1): [ARM] Kirkwood: drive USB VBUS pin on rd88f6192-nas high on boot Samuel Ortiz (1): iwmc3200wifi: Add UMAC wifi headers to the pmkid command Sanjeev Premi (1): OMAP3: PM: Remove duplicate code blocks Sathya Perla (2): be2net: fix bug in rx page posting be2net: swap only first 2 fields of mcc_wrb Sergio Aguirre (1): PM debug: Fix warning when no CONFIG_DEBUG_FS Sheng Yang (1): KVM: x86: Fix host_mapping_level() Sridhar Samudrala (1): net: Fix IPv6 GSO type checks in Intel ethernet drivers Sripathy, Vishwanath (1): OMAP3: PM: Removing redundant and potentially dangerous PRCM configration Stefan Haberland (1): [S390] dasd: fix possible NULL pointer errors Stefan Richter (4): firewire: core: add_descriptor size check firewire: cdev: add_descriptor documentation fix firewire: core: fix use-after-free regression in FCP handler firewire: ohci: fix crashes with TSB43AB23 on 64bit systems Stephen Hemminger (1): tcp_probe: avoid modulus operation and wrap fix Subramani Venkatesh (1): OMAP3: PM: DSS PM_WKEN to refill DMA Swen Schillig (3): [SCSI] scsi_transport_fc: Allow LLD to reset FC BSG timeout [SCSI] zfcp: Introduce bsg_timeout callback. [SCSI] zfcp: Set hardware timeout as requested by BSG request. Takashi Iwai (4): ALSA: hda - Fix parsing pin node 0x21 on ALC259 ALSA: hda - Turn on EAPD only if available for Realtek codecs ALSA: hda - Fix HP T5735 automute Merge branch 'fix/hda' into for-linus Tero Kristo (7): OMAP3: PM: Ack pending interrupts before entering suspend OMAP3: PM: Enable system control module autoidle OMAP3: PM: Disable interrupt controller AUTOIDLE before WFI OMAP3: CPUidle: Fixed timer resolution OMAP3: Fixed ARM aux ctrl register save/restore OMAP3: PM: Force write last pad config register into save area OMAP2/3: DMTIMER: Clear pending interrupts when stopping a timer Thara Gopinath (1): OMAP3: hwmod: Adding flag to prevent caching of sysconfig register. Thomas Hellstrom (11): drm/vmwgfx: Don't promote updates from GMR-backed scanouts to fullscreen. drm/vmwgfx: Fix an error path causing an oops. drm/vmwgfx: Make fence sequences continous across a VT switch. drm/vmwgfx: Use bo_driver::move_notify to unbind GMRs. drm/ttm: Add a swap_notify callback. drm/vmwgfx: Implement a swap_notify callback. drm/ttm: Export symbols needed for vmwgfx suspend / resume operations. drm/vmwgfx: Implement basic pm operations. drm/ttm: Make sure system buffer objects has offset == 0. drm/ttm: Allow system memory as a busy placement. drm/vmwgfx: Optimize memory footprint for DMA buffers. Tony Lindgren (6): omap: Fix cmdline muxing omap: Fix functions for dynamic remuxing of pins omap3: Fix cpu detection Merge branch 'for_2.6.33rc_d' of git://git.pwsan.com/linux-2.6 into omap-fixes-for-linus Merge branch 'pm-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/khilman/linux-omap-pm into omap-fixes-for-linus Merge branch 'omap-fixes' into omap-fixes-for-linus Uwe Kleine-König (1): i2c: imx: call ioremap only after request_mem_region Valentin Longchamp (1): i2c: mxc: let time to generate stop bit Wei Yongjun (2): KVM: x86: Fix probable memory leak of vcpu->arch.mce_banks KVM: x86: Fix leak of free lapic date in kvm_arch_vcpu_init() Wey-Yi Guy (1): iwlwifi: Fix throughput stall issue in HT mode for 5000 Wu Zhangjin (1): MIPS: Add support of LZO-compressed kernels Xavier Chantry (1): drm/nouveau: fix edid memleak in nouveau_connector Xiaotian Feng (1): clockevent: Don't remove broadcast device when cpu is dead Yang Hongyang (1): Btrfs: fix a memory leak in btrfs_init_acl Zhenyu Wang (1): drm: fix regression in fb blank handling stephen hemminger (1): sky2: revert config space change Łukasz Wojniłowicz (1): ALSA: hda - add possibility to choose speakers configuration for 4930g ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Fri Feb 26 13:31:10 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_52 autolearn=no version=3.3.0-rupdated 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 o1QJVAIJ204030 for ; Fri, 26 Feb 2010 13:31:10 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o1QJV8Kw203998; Fri, 26 Feb 2010 13:31:08 -0600 Date: Fri, 26 Feb 2010 13:31:08 -0600 Message-Id: <201002261931.o1QJV8Kw203998@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree annotated tag, v2.6.33-rc7, created. v2.6.33-rc7 X-Git-Refname: refs/tags/v2.6.33-rc7 X-Git-Reftype: annotated tag X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 600255d9e9ec0eecc49be78197c630504cf8c263 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.33-rc7 has been created at 600255d9e9ec0eecc49be78197c630504cf8c263 (tag) tagging 29275254caedfedce960cfe6df24b90cb04fe431 (commit) replaces v2.6.33-rc6 tagged by Linus Torvalds on Sat Feb 6 14:17:24 2010 -0800 - Log ----------------------------------------------------------------- Linux 2.6.33-rc7 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEABECAAYFAktt6nkACgkQF3YsRnbiHLv6owCglCkhp1fp1UHBcdiO5OwiPtxr zJYAn0o7Wvw0qdQmsaJa9aHxHRTg1XMM =FPR2 -----END PGP SIGNATURE----- Ajit Khaparde (1): be2net: Bug fix to support newer generation of BE ASIC Alberto Panizzo (1): mx3fb: some debug and initialisation fixes Alexander Clouter (1): MIPS: AR7: Fix USB slave mem range typo Alexander Duyck (1): igbvf: fix issue w/ mapped_as_page being left set after unmap Amerigo Wang (1): perf: Ignore perf.data.old Andi Kleen (1): oprofile/x86: add Xeon 7500 series support Andreas Schwab (1): powerpc: TIF_ABI_PENDING bit removal Andrei Emeltchenko (2): Bluetooth: Remove double free of SKB pointer in L2CAP Bluetooth: Fix memory leak in L2CAP Andres Salomon (1): CS5536: apply pci quirk for BIOS SMBUS bug Andrew Morton (1): drivers/gpu/drm/radeon/radeon_combios.c: fix warning Aneesh Kumar K.V (1): Btrfs: apply updated fallocate i_size fix Anton Blanchard (1): fault injection: correct function names in documentation Anuj Aggarwal (2): ASoC: AIC23: Fixing writes to non-existing registers in resume function ASoC: AM3517: ASoC driver not getting compiled Austin Yuan (1): drm/ttm: remove unnecessary save_flags and ttm_flag_masked in ttm_bo_util.c Baruch Siach (4): mx25: remove unused mx25_clocks_init() argument mx25: properly initialize clocks mx25: fix time accounting mx25: make the FEC AHB clk secondary of the IPG Bastien Nocera (1): Bluetooth: Use the control channel for raw HID reports Ben Hutchings (2): starfire: clean up properly if firmware loading fails cdc_ether: Partially revert "usbnet: Set link down initially ..." Benjamin Herrenschmidt (5): powerpc/pci: Add calls to set_pcie_port_type() and set_pcie_hotplug_bridge() powerpc/pci: Add missing hookup to pci_slot powerpc/pci: Add missing call to header fixup Merge commit 'jwb/merge' into merge powerpc/pseries: Fix xics build without CONFIG_SMP Benjamin Marzinski (1): GFS2: Don't withdraw on partial rindex entries Catalin Marinas (3): ARM: 5904/1: ARM: Always generate the IT instruction when compiling for Thumb-2 ARM: 5909/1: ARM: Correct the FPSCR bits setting when raising exceptions [libata] Call flush_dcache_page after PIO data transfers in libata-sff.c Choi, David (1): drivers/net: ks8851_mll ethernet network driver Chris Wilson (2): drm/i915: Prevent use of uninitialized pointers along error path. drm/i915: Fix leak of relocs along do_execbuffer error path Christoph Hellwig (1): libata: fix ata_id_logical_per_physical_sectors Chuck Ebbert (1): block: fix bugs in bio-integrity mempool usage Colin Tuckley (1): ARM: 5907/1: ARM: Fix the reset on the RealView PBX Development board Dan Carpenter (1): drbd: null dereference bug Dave Airlie (9): drm/radeon/kms: fix incorrect logic in DP vs eDP connector checking. drm/radeon/kms: use active device to pick connector for encoder drm/kms/radeon: pick digitial encoders smarter. (v3) drm/radeon/kms: release agp on error. drm/radeon/kms: move radeon KMS on/off switch out of staging. drm/radeon/kms: disable HDMI audio for now on rv710/rv730 drm/radeon/kms: make initial state of load detect property correct. drm/radeon/kms: rs400/480 MC setup is different than r300. drm/radeon/kms: fix r300 vram width calculations David Howells (1): NFS: Avoid warnings when CONFIG_NFS_V4=n David Härdeman (1): x86: Add quirk for Intel DG45FC board to avoid low memory corruption David John (1): drm/i915: Disable SR when more than one pipe is enabled David S. Miller (4): Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 be2net: Fix memset() arg ordering. Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-2.6 Dimitri Sivanich (1): x86, UV: Fix RTC latency bug by reading replicated cachelines Dmitry Monakhov (1): block: fix bio_add_page for non trivial merge_bvec_fn case Douglas Gilbert (1): libata-scsi passthru: fix bug which truncated LBA48 return values Evgeniy Polyakov (1): connector: Delete buggy notification code. FUJITA Tomonori (1): x86/agp: Fix agp_amd64_init regression Felix Fietkau (2): ath9k: fix beacon slot/buffer leak ath9k: fix eeprom INI values override for 2GHz-only cards Francisco Jerez (1): drm/ttm: Avoid conflicting reserve_memtype during ttm_tt_set_page_caching. Frans Pop (1): sched: Correct printk whitespace in warning from cpu down task check Frederic Weisbecker (1): reiserfs: Fix vmalloc call under reiserfs lock Grazvydas Ignotas (1): ASoC: pandora: Add APLL supply to fix audio output Guenter Roeck (1): MIPS: 64-bit: Detect virtual memory size Gui Jianfeng (1): blk-cgroup: Fix potential deadlock in blk-cgroup H Hartley Sweeten (1): NFS: Make nfs_commitdata_release static Hans Verkuil (1): V4L/DVB: saa7134: remove stray unlock_kernel Herbert Xu (2): crypto: padlock-sha - Add import/export support random: Remove unused inode variable Hui Zhu (1): markup_oops.pl: fix $func_offset error with x86_64 Ingo Molnar (2): Merge branch 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/rric/oprofile into x86/urgent Merge branch 'iommu/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu into x86/urgent Jakob Bornecrantz (2): drm/vmwgfx: Correctly detect 3D drm/vmwgfx: Don't send bad flags to the host Jaroslav Kysela (2): ALSA: ctxfi - fix PTP address initialization ALSA: ice1724 - aureon - fix wm8770 volume offset Jason Wessel (3): x86, hw_breakpoints, kgdb: Fix kgdb to use hw_breakpoint API perf, hw_breakpoint, kgdb: Do not take mutex for kernel debugger softlockup: Add sched_clock_tick() to avoid kernel warning on kgdb resume Jean Delvare (2): hwmon: (lm78) Request I/O ports individually for probing hwmon: (w83781d) Request I/O ports individually for probing Jeff Mahoney (1): hugetlb: fix section mismatches Jens Axboe (1): Merge branch 'for-jens' of git://git.drbd.org/linux-2.6-drbd into for-linus Jerome Glisse (4): drm/radeon/kms: Bailout of blit if error happen & protect with mutex V3 drm/radeon/kms: move blit initialization after we disabled VGA drm/radeon/kms: fix regression rendering issue on R6XX/R7XX drm/radeon/kms: don't call suspend path before cleaning up GPU Jesse Barnes (2): drm/i915: handle non-flip pending case when unpinning the scanout buffer drm/i915: page flip support for Ironlake Joerg Roedel (5): x86/amd-iommu: Fix possible integer overflow x86/amd-iommu: Fix NULL pointer dereference in __detach_device() x86/amd-iommu: Fix IOMMU-API initialization for iommu=pt x86/amd-iommu: Fix deassignment of a device from the pt_domain Merge branches 'amd-iommu/fixes' and 'dma-debug/fixes' into iommu/fixes Johannes Berg (1): iwlwifi: fix pointer signedness warning John Fastabend (2): ixgbe: set the correct DCB bit for pg tx settings ixgbe: if ixgbe_copy_dcb_cfg is going to fail learn about it early John Kacur (2): drm/kms/radeon/agp: Fix warning, format ‘%d’ expects type ‘int’, but argument 4 has type ‘size_t’ drm/kms/radeon/agp: Move the check of the aper_size after drm_acp_acquire and drm_agp_info Josef Bacik (1): Btrfs: do not try and lookup the file extent when finishing ordered io Josh Boyer (2): powerpc/44x: Update PowerPC 44x board defconfigs powerpc/40x: Update the PowerPC 40x board defconfigs Julia Lawall (1): kernel/cred.c: use kmem_cache_free KAMEZAWA Hiroyuki (1): devmem: check vmalloc address on kmem read/write Kevin Hilman (2): OMAP2/3: IRQ: ensure valid base address OMAP2/3: GPMC: ensure valid clock pointer Lars Ellenberg (1): drbd: fix max_segment_size initialization Leann Ogasawara (1): x86: Add Dell OptiPlex 760 reboot quirk Li Peng (3): drm/i915: enable vblank interrupt on ironlake drm/i915: Fix the device info of Pineview drm/i915: don't trigger ironlake vblank interrupt at irq install Li Zefan (1): cgroups: fix to return errno in a failure path Linus Torvalds (35): 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/lrg/voltage-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 '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 '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 branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'reiserfs/kill-bkl' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing 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/tiwai/sound-2.6 Fix 'flush_old_exec()/setup_new_exec()' split Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus Merge branch 'sh/for-2.6.33' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6 Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block 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/jmorris/security-testing-2.6 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2 Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6 Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6 Merge branch 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6 Merge master.kernel.org:/home/rmk/linux-2.6-arm Merge git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-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 Fix potential crash with sys_move_pages Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt/drm-intel Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging Linux 2.6.33-rc7 Magnus Damm (1): usb: r8a66597-hdc disable interrupts fix Mahesh Salgaonkar (1): hw_breakpoints: Release the bp slot if arch_validate_hwbkpt_settings() fails. Manuel Lauss (1): MIPS: Alchemy: Fix dbdma ring destruction memory debugcheck. Marcin Kościelnicki (1): drm/kms: Remove incorrect comment in struct drm_mode_modeinfo Marek Skuczynski (3): sh: Fix access to released memory in dwarf_unwinder_cleanup() sh: Fix access to released memory in clk_debugfs_register_one() omap: Fix access to already released memory in clk_debugfs_register_one() Mark Brown (5): mx31ads: Allow enable/disable of switchable supplies mx31ads: Provide a name for EXPIO interrupt chip mx31ads: Provide an IRQ range to the WM835x on the 1133-EV1 module MXC: Add AUDMUXv2 register decode to debugfs regulator: Specify REGULATOR_CHANGE_STATUS for WM835x LED constraints Markus Pietrek (1): spi: spi_sh_msiof: Fixed data sampling on the correct edge Matt Mackall (1): random: drop weird m_time/a_time manipulation Mauro Carvalho Chehab (1): saa7146: stop DMA before de-allocating DMA scatter/gather page buffers Maxim Levitsky (2): ALSA: hda - Delay switching to polling mode if an interrupt was missing ALSA: cosmetic: make hda intel interrupt name consistent with others Miao Xie (1): Btrfs: remove BUG_ON() due to mounting bad filesystem Michal Simek (1): microblaze: Defconfig update Michel Dänzer (1): drm/radeon/kms: Fix oops after radeon_cs_parser_init() failure. Mikael Pettersson (1): futex_lock_pi() key refcnt fix Mike Frysinger (2): tracing/documentation: Cover new frame pointer semantics Bluetooth: Redo checks in IRQ handler for shared IRQ support Nick Piggin (2): mm: percpu-vmap fix RCU list walking mm: purge fragmented percpu vmap blocks OGAWA Hirofumi (1): GFS2: Fix refcnt leak on gfs2_follow_link() error path Oleg Nesterov (1): lockdep: Fix check_usage_backwards() error message Patrick McHardy (2): netfilter: nf_conntrack_sip: fix off-by-one in compact header parsing netfilter: ctnetlink: fix expectation mask dump Pauli Nieminen (1): drm/r100/kms: Emit cache flush to the end of command buffer. (v2) Peter Hanzel (1): drm/vmwgfx: Request SVGA version 2 and bail if not found Peter Zijlstra (2): sched: Fix fork vs hotplug vs cpuset namespaces sched: Fix incorrect sanity check Randy Dunlap (2): kfifo: fix kernel-doc notation ati_pcigart: fix printk format warning Ray Copeland (1): hwmon: (adt7462) Wrong ADT7462_VOLT_COUNT Richard Kennedy (2): drm/ttm: remove padding from ttm_ref_object on 64bit builds get_maintainer.pl: teach git log to use --no-color Richard Röjfors (1): uartlite: fix crash when using as console Roel Kluin (1): Btrfs: make error return negative in btrfs_sync_file() Russell King (2): Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 ARM: Fix wrong register in proc-arm6_7.S data abort handler Ryusuke Konishi (1): nilfs2: fix potential leak of dirty data on umount Sascha Hauer (2): i.MX25: Allow secondary clocks in DEFINE_CLOCK i.MX25: implement secondary clocks for uarts and fec Sathya Perla (1): be2net: use eq-id to calculate cev-isr reg offset Sergey Matyukevich (1): rtc-fm3130: add missing braces Shan Wei (1): ipv6: conntrack: Add member of user to nf_ct_frag6_queue structure Shaohui Zheng (1): memory hotplug: fix a bug on /dev/mem for 64-bit kernels Sriram (1): ARCH OMAP : enable ARCH_HAS_HOLES_MEMORYMODEL for OMAP Stef van Os (1): powerpc/4xx: Add pcix type 1 transactions Stephen Rothwell (1): percpu: add __percpu for sparse Steven J. Magnani (1): microblaze: fix interrupt state restore Steven Rostedt (3): tracing: Prevent kernel oops with corrupted buffer ring-buffer: Check if ring buffer iterator has stale data ring-buffer: Check for end of page in iterator Steven Whitehouse (4): GFS2: Fix previous patch GFS2: Use GFP_NOFS for alloc structure GFS2: Wait for unlock completion on umount GFS2: Extend umount wait coverage to full glock lifetime Suravee Suthikulpanit (1): oprofile/x86: fix crash when profiling more than 28 events Takashi Iwai (6): ALSA: hda - Add an ASUS mobo to MSI blacklist Merge branch 'fix/hda' into for-linus Merge branch 'fix/asoc' into for-linus Merge branch 'fix/hda' into for-linus Merge branch 'fix/asoc' into for-linus Merge remote branch 'alsa/fixes' into for-linus Tejun Heo (3): idr: fix a critical misallocation bug ahci: add Acer G725 to broken suspend list idr: revert misallocation bug fix Thadeu Lima de Souza Cascardo (1): pktcdvd: removing device does not remove its sysfs dir Thiago Farina (1): lib/dma-debug.c: mark file-local struct symbol static. Thomas Gleixner (3): clocksource: Prevent potential kgdb dead lock futex: Handle user space corruption gracefully futex: Handle futex value corruption gracefully Thomas Meyer (1): drm/i915: slow acpi_lid_open() causes flickering - V2 Tony Lindgren (4): omap: Remove old unused defines for OMAP_32KSYNCT_BASE omap: Fix 3630 mux errors omap: Fix arch/arm/mach-omap2/mux.c: Off by one error omap: Disable serial port autoidle by default Trond Myklebust (9): NFS: Fix a reference leak in nfs_wb_cancel_page() NFS: Try to commit unstable writes in nfs_release_page() NFSv4: Ensure that the NFSv4 locking can recover from stateid errors NFSv4: Don't allow posix locking against servers that don't support it NFSv4.1: Don't call nfs4_schedule_state_recovery() unnecessarily NFS: Ensure that we handle NFS4ERR_STALE_STATEID correctly NFS: Fix an Oops when truncating a file NFS: Fix a umount race NFS: Don't clobber the attribute type in nfs_update_inode() Uwe Kleine-König (3): mx35: add a missing comma in a pad definition omap: define _toggle_gpio_edge_triggering only for OMAP1 imxfb: correct location of callbacks in suspend and resume Vikram Kandukuri (1): Bluetooth: Add DFU driver for Atheros Bluetooth chipset AR3011 Vivek Goyal (1): cfq-iosched: Do not idle on async queues Vladimir Zapolskiy (1): ARM: MX3: Fixed typo in declared enum type name. Wu Fengguang (1): devmem: fix kmem write bug on memory holes Yan, Zheng (2): Btrfs: fix race between allocate and release extent buffer. Btrfs: Fix oopsen when dropping empty tree. Yang Hongyang (1): tracing/documentation: Fix a typo in ftrace.txt Yong Wang (1): perf report: Fix segmentation fault when running with '-g none' Zhao Yakui (2): drm/i915: Add support for SDVO composite TV drm/i915: Fix the incorrect DMI string for Samsung SX20S laptop Zhenyu Wang (1): drm/i915: disable hotplug detect before Ironlake CRT detect Zhu Yi (1): mac80211: fix NULL pointer dereference when ftrace is enabled anfei zhou (1): mm: flush dcache before writing into page to avoid alias stephen hemminger (1): bonding: bond_open error return value ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Fri Feb 26 13:31:11 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1QJVBEs204069 for ; Fri, 26 Feb 2010 13:31:11 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o1QJVAkQ204036; Fri, 26 Feb 2010 13:31:10 -0600 Date: Fri, 26 Feb 2010 13:31:10 -0600 Message-Id: <201002261931.o1QJVAkQ204036@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree annotated tag, v2.6.33-rc8, created. v2.6.33-rc8 X-Git-Refname: refs/tags/v2.6.33-rc8 X-Git-Reftype: annotated tag X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 22ebef85968508e596dc60d970b716024cb9a34e 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.33-rc8 has been created at 22ebef85968508e596dc60d970b716024cb9a34e (tag) tagging 724e6d3fe8003c3f60bf404bf22e4e331327c596 (commit) replaces v2.6.33-rc7 tagged by Linus Torvalds on Fri Feb 12 11:07:56 2010 -0800 - Log ----------------------------------------------------------------- Linux 2.6.33-rc8 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEABECAAYFAkt1pxAACgkQF3YsRnbiHLubpACfes8p7tiBRROhkf1rSX/opuHN JZ0AniV0qQVz55HiHVPpUtFGUljCbREi =Qu+W -----END PGP SIGNATURE----- Aaro Koskinen (1): OMAP: hsmmc: fix memory leak Abhijith Das (1): GFS2: Fix error code Al Viro (3): befs: fix leak Take ima_path_check() in nfsd past dentry_open() in nfsd_open() Take ima_file_free() to proper place. Alexander Duyck (1): igb: make certain to reassign legacy interrupt vectors after reset Alexey Dobriyan (4): af_key: fix netns ops ordering on module load/unload netlink: fix for too early rmmod netfilter: nf_conntrack: restrict runtime expect hashsize modifications netfilter: xtables: compat out of scope fix Amit Kumar Salecha (2): netxen: fix tx timeout recovery for NX2031 chip netxen: protect resource cleanup by rtnl lock Anatolij Gustschin (1): dmaengine: fix memleak in dma_async_device_unregister Andreas Schwab (1): compat_ioctl: add compat handler for TIOCGSID ioctl Andy Getzendanner (1): vgaarb: fix incorrect dereference of userspace pointer. Andy Shevchenko (1): x86, doc: Fix minor spelling error in arch/x86/mm/gup.c Aneesh Kumar K.V (1): 9p: Fix the kernel crash on a failed mount Anirban Chakraborty (1): [SCSI] qla2xxx: Obtain proper host structure during response-queue processing. Anton Blanchard (1): ixgbe: Fix ixgbe_tx_map error path Arnd Bergmann (1): compat_ioctl: ignore RAID_VERSION ioctl Ben Skeggs (5): drm/nouveau: fix non-vram notifier blocks drm/nv40: make INIT_COMPUTE_MEM a NOP, just like nv50 drm/nouveau: make dp auxch xfer len check for reads only drm/nv50: prevent multiple init tables being parsed at the same time drm/nv50: disregard dac outputs in nv50_sor_dpms() Borislav Petkov (1): amd64_edac: Do not falsely trigger kerneloops Chris Wilson (1): drm/i915: Increase fb alignment to 64k Dan Williams (1): ioat: fix infinite timeout checking in ioat2_quiesce Daniel Vetter (1): drm/i915: Update write_domains on active list after flush. Dave Airlie (7): drm/radeon/kms: change Kconfig text to reflect the new option. drm/radeon/kms: don't crash if no DDC bus on VGA/DVI connector. drm/radeon/kms: add quirk for VGA without DDC on rv730 XFX card. drm/radeon/kms: fix screen clearing before fbcon. Merge remote branch 'nouveau/for-airlied' of nouveau-2.6 drm/radeon/kms: retry auxch on 0x20 timeout value. Merge branch 'drm-radeon-linus' of ../drm-next David Daney (2): MIPS: Fix __devinit __cpuinit confusion in cpu_cache_init MIPS: Don't probe reserved EntryHi bits. David Gibson (1): powerpc: Fix address masking bug in hpte_need_flush() David S. Miller (3): Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6 sparc: Align clone and signal stacks to 16 bytes. sparc32: Fix thinko in previous change. Divy Le Ray (1): cxgb3: fix GRO checksum check Dmitry Torokhov (1): Input: psmouse - make sure we don't schedule reconnects after cleanup Eric Dumazet (2): netfilter: nf_conntrack: per netns nf_conntrack_cachep dst: call cond_resched() in dst_gc_task() Eric Paris (1): ima: initialize ima before inodes can be allocated Eric Van Hensbergen (6): net/9p: fix virtio transport to correctly update status on connect net/9p: fail when user specifies a transport which we can't find net/9p: fix statsize inside twstat 9p: fix option parsing 9p: fix memory leak in v9fs_parse_options() 9p: fix p9_client_destroy unconditional calling v9fs_put_trans FUJITA Tomonori (2): x86/agp: Fix amd64-agp module initialization regression [SCSI] compat_ioct: fix bsg SG_IO Francesco Lavra (1): V4L/DVB: dvb-core: fix initialization of feeds list in demux filter Francisco Jerez (1): drm/nouveau: Fixup semaphores on pre-nv50 cards. Gerrit Renker (2): dccp: fix bug in cache allocation dccp: fix auto-loading of dccp(_probe) Guennadi Liakhovetski (1): async-tx: fix buffer submission error handling in ipu_idma.c Hans-Christian Egtvedt (1): avr32: clean up memory allocation in at32_add_device_mci Heiko Carstens (1): [S390] Fix struct _lowcore layout. J. Bruce Fields (1): Revert "nfsd4: fix error return when pseudoroot missing" Jakob Bornecrantz (2): drm/vmwgfx: Report propper framebuffer_{max|min}_{width|height} drm/vmwgfx: Drop scanout flag compat and add execbuf ioctl parameter members. Bumps major. Jan Glauber (1): [S390] qdio: prevent call trace if CHPID is offline Jan Luebbe (1): net/sched: Fix module name in Kconfig Jason Wang (2): Export the symbol of getboottime and mmonotonic_to_bootbased kvmclock: count total_sleep_time when updating guest clock Jean Delvare (1): i2c-tiny-usb: Fix on big-endian systems Jeff Layton (2): cifs: fix length calculation for converted unicode readdir names cifs: fix dentry hash calculation for case-insensitive mounts Jesse Barnes (3): drm/i915: handle FBC and self-refresh better drm/i915: untangle page flip completion drm/i915: hold ref on flip object until it completes Jody Bruchon (1): ALSA: hda-intel: Avoid divide by zero crash Joe Perches (1): MAINTAINERS: networking drivers - Add git net-next tree Johan Kristell (1): mmc_test: block addressed cards Julia Lawall (4): drivers/gpu/drm/nouveau/nouveau_grctx.c: correct NULL test drivers/net: Correct NULL test drivers/dma: Correct NULL test MIPS: SNI: Correct NULL test Jun'ichi Nomura (1): freeze_bdev: don't deactivate successfully frozen MS_RDONLY sb Kashyap, Desai (1): [SCSI] mptfusion : mptscsih_abort return value should be SUCCESS instead of value 0. Krishna Kumar (1): ixgbe: Fix return of invalid txq Kyle McMartin (1): parisc: fix tracing of signals Linus Torvalds (37): Fix race in tty_fasync() properly Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 Merge branch 'sh/for-2.6.33' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze Merge branch 'v4l_for_linus' of git://linuxtv.org/fixes Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2 Merge branch 'for-2.6.33' of git://linux-nfs.org/~bfields/linux Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs Merge branch 'for-linus' of git://neil.brown.name/md Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6 Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc Merge git://git.kernel.org/pub/scm/linux/kernel/git/hskinnemoen/avr32-2.6 Merge branch 'kvm-updates/2.6.33' of git://git.kernel.org/pub/scm/virt/kvm/kvm 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 git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-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/roland/infiniband Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx 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 git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6 Merge git://git.infradead.org/users/cbou/battery-2.6.33 Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6 Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp Merge branch 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6 Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6 Merge branch 'fix/hda' 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/anholt/drm-intel Merge branch 'fix/hda' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 Linux 2.6.33-rc8 Luca Barbieri (1): drm/nouveau: call ttm_bo_wait with the bo lock held to prevent hang M. Mohan Kumar (1): 9p: Include fsync support for 9p client Maarten Maathuis (4): drm/nv50: align size of buffer object to the right boundaries. drm/nv50: avoid unloading pgraph context when ctxprog is running drm/nv50: delete ramfc object after disabling fifo, not before drm/nv50: make the pgraph irq handler loop like the pre-nv50 version Marcel Holtmann (1): Bluetooth: Fix sleeping function in RFCOMM within invalid context Marcel Selhorst (1): tpm_infineon: fix suspend/resume handler for pnp_driver Marcelo Tosatti (1): KVM: PIT: control word is write-only Marcin Kościelnicki (4): drm/nouveau: Add module options to disable acceleration. drm/nouveau: Add getparam to get available PGRAPH units. drm/nouveau: Fix fbcon on mixed pre-NV50 + NV50 multicard. drm/nouveau: Add proper vgaarb support. Marcin Slusarz (1): drm/nouveau: move dereferences after null checks Mark Brown (2): wm97xx_battery: Handle missing platform data gracefully regulator: Fix display of null constraints for regulators Mark Nelson (1): powerpc/pseries: Fix kexec regression caused by CPPR tracking Matt Fleming (4): sh: Correct the offset of the return address in ret_from_exception sh: Setup frame pointer in handle_exception path sh: Don't continue unwinding across interrupts sh: Remove superfluous setup_frame_reg call Matthew Garrett (1): nouveau: fix state detection with switchable graphics Mauro Carvalho Chehab (2): V4L/DVB: Fix the risk of an oops at dvb_dmx_release V4L/DVB: dvb_demux: Don't use vmalloc at dvb_dmx_swfilter_packet Michael Neuling (1): fs/exec.c: restrict initial stack space expansion to rlimit Michael Poole (1): Bluetooth: Keep a copy of each HID device's report descriptor Michal Simek (1): microblaze: Invalidate dcache before enabling it Mike Frysinger (1): [CPUFREQ] fix default value for ondemand governor Mimi Zohar (3): fix ima breakage ima: rename ima_path_check to ima_file_check ima: rename PATH_CHECK to FILE_CHECK Nagananda.Chumbalkar@hp.com (1): [CPUFREQ] Fix ondemand to not request targets outside policy limits NeilBrown (2): md: fix 'degraded' calculation when starting a reshape. md: fix some lockdep issues between md and sysfs. Nick Pelly (3): Bluetooth: Fallback eSCO to SCO on error 0x1a (Unsupported Remote Feature) Bluetooth: Do not call rfcomm_session_put() for RFCOMM UA on closed socket Bluetooth: Enter active mode before establishing a SCO link. OGAWA Hirofumi (1): ocfs2: Fix refcnt leak on ocfs2_fast_follow_link() error path Owain Ainsworth (1): drm/i915: Correctly return -ENOMEM on allocation failure in cmdbuf ioctls. Patrick McHardy (2): netfilter: nf_conntrack: fix memory corruption with multiple namespaces netfilter: nf_conntrack: fix hash resizing with namespaces Paul Mundt (2): usb: r8a66597-hcd: Flush the D-cache for the pipe-in transfer buffers. usb: r8a66597-hcd: Fix up spinlock recursion in root hub polling. Pauli Nieminen (1): drm/radeon: Skip dma copy test in benchmark if card doesn't have dma engine. Peter Huewe (1): arch/avr32: Fix build failure for avr32 caused by typo Peter Tyser (2): edac: mpc85xx fix bad page calculation edac: mpc85xx fix build regression by removing unused debug code Rafael J. Wysocki (2): pktgen: Fix freezing problem drm/i915: Fix crash while aborting hibernation Rafał Miłecki (1): drm/radeon/kms: suspend and resume audio stuff Ralf Baechle (1): MIPS: IP27: Make defconfig useful again. Rishikesh (1): MAINTAINERS: changed LTP maintainership responsibilities Roel Kluin (2): ocfs2: Fix contiguousness check in ocfs2_try_to_merge_extent_map() regulator/lp3971: vol_map out of bounds in lp3971_{ldo,dcdc}_set_voltage() Sean Hefty (1): RDMA/cm: Revert association of an RDMA device when binding to loopback Serge E. Hallyn (1): x86-32: Make AT_VECTOR_SIZE_ARCH=2 Shaohua Li (1): cfq-iosched: split seeky coop queues after one slice Stephen M. Cameron (1): cciss: Make cciss_seq_show handle holes in the h->drv[] array Steve French (4): [CIFS] Add support for TCP_NODELAY Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6 [CIFS] Maximum username length check in session setup does not match [CIFS] Don't cache timestamps on utimes due to coarse granularity Steven Whitehouse (1): GFS2: Fix bmap allocation corner-case bug Sunil Mushran (11): ocfs2/trivial: Remove trailing whitespaces ocfs2/dlm: Ignore LVBs of locks in the Blocked list ocfs2/dlm: Print more messages during lock migration ocfs2/dlm: Handle EAGAIN for compatibility - v2 ocfs2: Prevent a livelock in dlmglue ocfs2: Do not downconvert if the lock level is already compatible ocfs2: Remove overzealous BUG_ON during blocked lock processing ocfs2: Plugs race between the dc thread and an unlock ast message ocfs2/dlm: Remove BUG_ON in dlm recovery when freeing locks of a dead node ocfs2/dlm: Fix printing of lockname ocfs2/cluster: Make o2net connect messages KERN_NOTICE Suresh Siddha (1): x86, apic: Don't use logical-flat mode when CPU hotplug may exceed 8 CPUs Swen Schillig (1): [SCSI] zfcp: Report FC BSG errors in correct field Takashi Iwai (1): ALSA: hda - use WARN_ON_ONCE() for zero-division detection Tao Ma (5): ocfs2: Sync max_inline_data_with_xattr from tools. ocfs2: Fix memory overflow in cow_by_page. ocfs2: Only bug out when page size is larger than cluster size. ocfs2: Add parenthesis to wrap the check for O_DIRECT. ocfs2: Use compat_ptr in reflink_arguments. Thadeu Lima de Souza Cascardo (2): irda: unbalanced lock_kernel in irnet_ppp irda: add missing BKL in irnet_ppp ioctl Thomas Hellstrom (2): drm/vmwgfx: Update the user-space interface. drm/vmwgfx: Fix a circular locking dependency bug. Thomas Renninger (1): [CPUFREQ] Fix use after free of struct powernow_k8_data Trond Myklebust (3): NFS: Fix a bug in nfs_fscache_release_page() NFS: Remove a redundant check for PageFsCache in nfs_migrate_page() NFS: Fix the mapping of the NFSERR_SERVERFAULT error Ursula Braun (1): [S390] qdio: continue polling for buffer state ERROR Wengang Wang (2): ocfs2: fix a misleading variable name ocfs2: Fix setting of OCFS2_LOCK_BLOCKED during bast Wu Zhangjin (1): MIPS: Fixup of the r4k timer Xiaotian Feng (1): [SCSI] qla2xxx: make msix interrupt handler safe for irq Yoichi Yuasa (1): Bluetooth: Fix memory leak in Marvell BT-over-SDIO driver Yong Zhang (1): dmaengine: correct onstack wait_queue_head declaration Zhenyu Wang (3): drm/i915: Rework DPLL calculation parameters for Ironlake drm/i915: fix flip done interrupt on Ironlake drm/i915: fix pipe source image setting in flip command stephen hemminger (1): sky2: fix transmit DMA map leakage ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From Fletcher@uwyo.edu Fri Feb 26 14:28:54 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_40,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1QKSs23207199 for ; Fri, 26 Feb 2010 14:28:54 -0600 X-ASG-Debug-ID: 1267216218-0f9903570000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from aspensprings.uwyo.edu (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D332B1D01292 for ; Fri, 26 Feb 2010 12:30:18 -0800 (PST) Received: from aspensprings.uwyo.edu (aspensprings.uwyo.edu [129.72.10.32]) by cuda.sgi.com with ESMTP id 8rJjxuLx4BUjwSaQ for ; Fri, 26 Feb 2010 12:30:18 -0800 (PST) Received: from ponyexpress-ht1.uwyo.edu (ponyexpress-ht1.uwyo.edu [10.84.60.208]) by aspensprings.uwyo.edu (8.14.2/8.14.2) with ESMTP id o1QKUCvY018962 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=FAIL) for ; Fri, 26 Feb 2010 13:30:13 -0700 (MST) (envelope-from Fletcher@uwyo.edu) Received: from [10.3.32.225] (172.26.4.5) by uwmail.uwyo.edu (10.84.60.198) with Microsoft SMTP Server id 8.1.393.1; Fri, 26 Feb 2010 13:30:12 -0700 Message-ID: <4B882F5D.5090901@uwyo.edu> Date: Fri, 26 Feb 2010 13:30:21 -0700 From: "Walter R. Fletcher" User-Agent: Thunderbird 2.0.0.23 (Windows/20090812) MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: 4k sector sizes Subject: 4k sector sizes Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: aspensprings.uwyo.edu[129.72.10.32] X-Barracuda-Start-Time: 1267216218 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2322 1.0000 -0.6624 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.66 X-Barracuda-Spam-Status: No, SCORE=-0.66 using 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.23527 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 Western Digital has announced hard drives that will have 4K sized sectors instead of 512 bytes. I'm sure other manufacturers will do so too... I wonder about potential effects on performance one might see re: xfs with a 4k block size and the WD hard drives with the 4k sectors. Is this a valid question? Just a curious (xfs-using) fly on the wall... __Reid__ Reid Fletcher Chief Engineer, Wyoming Public Radio University of Wyoming Laramie, WY From sandeen@sandeen.net Fri Feb 26 14:39:59 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1QKdwgH207818 for ; Fri, 26 Feb 2010 14:39:58 -0600 X-ASG-Debug-ID: 1267216882-1a59000e0000-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 DF1EA13DEEF0 for ; Fri, 26 Feb 2010 12:41:22 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id nbGUFvMCQP1JyGRB for ; Fri, 26 Feb 2010 12:41:22 -0800 (PST) Received: from Liberator.local (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 B118BAC3592; Fri, 26 Feb 2010 14:41:21 -0600 (CST) Message-ID: <4B8831F1.4050300@sandeen.net> Date: Fri, 26 Feb 2010 14:41:21 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: "Walter R. Fletcher" CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: 4k sector sizes Subject: Re: 4k sector sizes References: <4B882F5D.5090901@uwyo.edu> In-Reply-To: <4B882F5D.5090901@uwyo.edu> 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: 1267216882 X-Barracuda-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.23523 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 Walter R. Fletcher wrote: > > Western Digital has announced hard drives that will > have 4K sized sectors instead of 512 bytes. I'm sure > other manufacturers will do so too... > > I wonder about potential effects on performance one > might see re: xfs with a 4k block size and the WD hard > drives with the 4k sectors. Is this a valid question? > > Just a curious (xfs-using) fly on the wall... Totally valid question; by and large, XFS should detect this and cope just fine. There may be one hole where if you manually specify a block size < 4k at mkfs time, it will continue without complaint, when in fact this may be sub-optimal for the drive. A lot of work has been done upstream and in Fedora, at least, to be sure that partitioning and mkfs tools can and do query the block device for this (and other) information, to be sure that the results are well-aligned and efficient. Recent userspace & kernel is needed for all this to work nicely together, though. -Eric > __Reid__ > > Reid Fletcher > Chief Engineer, Wyoming Public Radio > University of Wyoming > Laramie, WY From aelder@oss.sgi.com Fri Feb 26 15:13:59 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1QLDx3d209640 for ; Fri, 26 Feb 2010 15:13:59 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o1QLDxch209617; Fri, 26 Feb 2010 15:13:59 -0600 Date: Fri, 26 Feb 2010 15:13:59 -0600 Message-Id: <201002262113.o1QLDxch209617@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-53-g398007f X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: d67b1b03254c501fef371b0e5916c94a52bfc2c5 X-Git-Newrev: 398007f863a4af2b4a5a07219c5a617f1a098115 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 from d67b1b03254c501fef371b0e5916c94a52bfc2c5 (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: hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Fri Feb 26 15:25:22 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_72 autolearn=no version=3.3.0-rupdated 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 o1QLPMWA210591 for ; Fri, 26 Feb 2010 15:25:22 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o1QLPLNZ210305; Fri, 26 Feb 2010 15:25:21 -0600 Date: Fri, 26 Feb 2010 15:25:21 -0600 Message-Id: <201002262125.o1QLPLNZ210305@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-53-g398007f X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: 60b341b778cc2929df16c0a504c91621b3c6a4ad X-Git-Newrev: 398007f863a4af2b4a5a07219c5a617f1a098115 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 d67b1b0 fs/xfs: Correct NULL test 180040b xfs: optimize log flushing in xfs_fsync 8718551 xfs: only clear the suid bit once in xfs_write 5322892 xfs: kill xfs_bawrite 07fec73 xfs: log changed inodes instead of writing them synchronously e8b217e xfs: remove invalid barrier optimization from xfs_fsync 20026d9 xfs: kill the unused XFS_QMOPT_* flush flags V2 7d6a7bd xfs: Use delay write promotion for dquot flushing 089716a xfs: Sort delayed write buffers before dispatch d808f61 xfs: Don't issue buffer IO direct from AIL push V2 c854363 xfs: Use delayed write for inodes rather than async V2 777df5a xfs: Make inode reclaim states explicit d5db0f9 xfs: more reserved blocks fixups 388f1f0 xfs: turn off sign warnings cbe132a xfs: don't hold onto reserved blocks on remount,ro 9b00f30 xfs: quota limit statvfs available blocks bdfb043 xfs: replace KM_LARGE with explicit vmalloc use a14a348 xfs: cleanup up xfs_log_force calling conventions 4139b3b xfs: kill XLOG_VEC_SET_TYPE 0cadda1 xfs: remove duplicate buffer flags a210c1a xfs: implement quota warnings via netlink 4d1f88d xfs: clean up error handling in xfs_trans_dqresv 512dd1a xfs: kill XFS_QMOPT_ASYNC 587aa0f xfs: rearrange xfs_mod_sb() to avoid array subscript warning f0a0eaa xfs: suppress spurious uninitialised var warning in xfs_bmapi() 58c75cf xfs: make compile warn about char sign mismatches again 4a24cb7 xfs: clean up sign warnings in dir2 code a9273ca xfs: convert attr to use unsigned names b9c4864 xfs: xfs_buf_iomove() doesn't care about signedness a3380ae xfs: make xfs_dir_cilookup_result use unsigned char 2bc7542 xfs: convert dirnameops to unsigned char names 046ea75 xfs: convert DM ops to use unsigned char names e2bcd93 xfs: directory names are unsigned 4e23471 xfs: move more buffer helpers into xfs_buf.c 64e0bc7 xfs: clean up xfs_bwrite 873ff55 xfs: clean up log buffer writes e57336f xfs: embed the pagb_list array in the perag structure 8b26c58 xfs: handle ENOMEM correctly during initialisation of perag structures b657fc8 xfs: Kill filestreams cache flush 0fa800f xfs: Add trace points for per-ag refcount debugging. aed3bb9 xfs: Reference count per-ag structures 1c1c6eb xfs: Replace per-ag array with a radix tree 44b56e0 xfs: convert remaining direct references to m_perag 4196ac0 xfs: Convert filestreams code to use per-ag get/put routines a862e0f xfs: Don't directly reference m_perag in allocation code 5017e97 xfs: rename xfs_get_perag c9c1297 xfs: Don't wake xfsbufd when idle 453eac8 xfs: Don't wake the aild once per second f0a7695 xfs: Use list_heads for log recovery item lists 5d77c0d xfs: make several more functions static 6bded0f xfs: clean up inconsistent variable naming in xfs_swap_extent 3a85cd9 xfs: add tracing to xfs_swap_extents from 60b341b778cc2929df16c0a504c91621b3c6a4ad (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 d67b1b03254c501fef371b0e5916c94a52bfc2c5 Author: Julia Lawall Date: Sat Feb 6 08:45:15 2010 +0000 fs/xfs: Correct NULL test Test the value that was just allocated rather than the previously tested one. A simplified version of the semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // @r@ expression *x; expression e; identifier l; @@ if (x == NULL || ...) { ... when forall return ...; } ... when != goto l; when != x = e when != &x *x == NULL // Signed-off-by: Julia Lawall Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 180040b89ee2aed88c0a0b1fcf7ada9a512b12e3 Author: Christoph Hellwig Date: Fri Feb 5 09:57:55 2010 +0000 xfs: optimize log flushing in xfs_fsync If we have a pinned inode it must have a log item attached to it. Usually that log item will have ili_last_lsn already set, in which case we only need to flush the log up to that LSN instead of doing a full log force. This gives speedups of about 5% in some fsync heavy workloads. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit 87185517de81101da5afbc82cefdeed6eeaa38fb Author: Christoph Hellwig Date: Wed Feb 3 19:43:31 2010 +0000 xfs: only clear the suid bit once in xfs_write file_remove_suid already calls into ->setattr to clear the suid and sgid bits if needed, no need to start a second transaction to do it ourselves. Note that xfs_write_clear_setuid issues a sync transaction while the path through ->setattr doesn't, but that is consistant with the other filesystems. Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder Signed-off-by: Alex Elder commit 5322892d867e186c6b4c5fff5c99ea4863696a60 Author: Dave Chinner Date: Thu Feb 4 10:09:14 2010 +1100 xfs: kill xfs_bawrite There are no more users of this function left in the XFS code now that we've switched everything to delayed write flushing. Remove it. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 07fec73625dc0db6f9aed68019918208a2ca53f5 Author: Christoph Hellwig Date: Tue Feb 9 11:43:49 2010 +1100 xfs: log changed inodes instead of writing them synchronously When an inode has already be flushed delayed write, xfs_inode_clean() returns true and hence xfs_fs_write_inode() can return on a synchronous inode write without having written the inode. Currently these sycnhronous writes only come sync(1), unmount, a sycnhronous NFS export and cachefiles so should be relatively rare and out of common performance paths. Realistically, a synchronous inode write is not necessary here; we can avoid writing the inode by logging any non-transactional changes that are pending. This needs to be done with synchronous transactions, but it avoids seeking between the log and inode clusters as we do now. We don't force the log if the inode is pinned, though, so this differs from the fsync case. For normal sys_sync and unmount behaviour this is fine because we do a synchronous log force in xfs_sync_data which is called from the ->sync_fs code. It does however break the NFS synchronous export guarantees for now, but work is under way to fix this at a higher level or for the higher level to provide an additional flag in the writeback control to tell us that a log force is needed. Portions of this patch are based on work from Dave Chinner. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Alex Elder commit e8b217e7530c6a073ac69f1c85b922d93fdf5647 Author: Christoph Hellwig Date: Tue Feb 2 10:16:26 2010 +1100 xfs: remove invalid barrier optimization from xfs_fsync We always need to flush the disk write cache and can't skip it just because the no inode attributes have changed. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 20026d92013d7bb3abb295337191def6758fc086 Author: Dave Chinner Date: Thu Feb 4 09:48:58 2010 +1100 xfs: kill the unused XFS_QMOPT_* flush flags V2 dquots are never flushed asynchronously. Remove the flag and the async write support from the flush function. Make the default flush a delwri flush to make the inode flush code, which leaves the XFS_QMOPT_SYNC the only flag remaining. Convert that to use SYNC_WAIT instead, just like the inode flush code. V2: - just pass flush flags straight through Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 7d6a7bde52e449f21a0e86a7a4955b4e08a49d69 Author: Dave Chinner Date: Tue Jan 26 15:13:41 2010 +1100 xfs: Use delay write promotion for dquot flushing xfs_qm_dqflock_pushbuf_wait() does a very similar trick to item pushing used to do to flush out delayed write dquot buffers. Change it to use the new promotion method rather than an async flush. Also, xfs_qm_dqflock_pushbuf_wait() can return without the flush lock held, yet the callers make the assumption that after this call the flush lock is held. Always return with the flush lock held. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 089716aa1480b7197bcd678b8477774c379a2768 Author: Dave Chinner Date: Tue Jan 26 15:13:25 2010 +1100 xfs: Sort delayed write buffers before dispatch Currently when the xfsbufd writes delayed write buffers, it pushes them to disk in the order they come off the delayed write list. If there are lots of buffers ѕpread widely over the disk, this results in overwhelming the elevator sort queues in the block layer and we end up losing the posibility of merging adjacent buffers to minimise the number of IOs. Use the new generic list_sort function to sort the delwri dispatch queue before issue to ensure that the buffers are pushed in the most friendly order possible to the lower layers. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit d808f617ad00a413585b806de340feda5ad9a2da Author: Dave Chinner Date: Tue Feb 2 10:13:42 2010 +1100 xfs: Don't issue buffer IO direct from AIL push V2 All buffers logged into the AIL are marked as delayed write. When the AIL needs to push the buffer out, it issues an async write of the buffer. This means that IO patterns are dependent on the order of buffers in the AIL. Instead of flushing the buffer, promote the buffer in the delayed write list so that the next time the xfsbufd is run the buffer will be flushed by the xfsbufd. Return the state to the xfsaild that the buffer was promoted so that the xfsaild knows that it needs to cause the xfsbufd to run to flush the buffers that were promoted. Using the xfsbufd for issuing the IO allows us to dispatch all buffer IO from the one queue. This means that we can make much more enlightened decisions on what order to flush buffers to disk as we don't have multiple places issuing IO. Optimisations to xfsbufd will be in a future patch. Version 2 - kill XFS_ITEM_FLUSHING as it is now unused. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit c854363e80b49dd04a4de18ebc379eb8c8806674 Author: Dave Chinner Date: Sat Feb 6 12:39:36 2010 +1100 xfs: Use delayed write for inodes rather than async V2 We currently do background inode flush asynchronously, resulting in inodes being written in whatever order the background writeback issues them. Not only that, there are also blocking and non-blocking asynchronous inode flushes, depending on where the flush comes from. This patch completely removes asynchronous inode writeback. It removes all the strange writeback modes and replaces them with either a synchronous flush or a non-blocking delayed write flush. That is, inode flushes will only issue IO directly if they are synchronous, and background flushing may do nothing if the operation would block (e.g. on a pinned inode or buffer lock). Delayed write flushes will now result in the inode buffer sitting in the delwri queue of the buffer cache to be flushed by either an AIL push or by the xfsbufd timing out the buffer. This will allow accumulation of dirty inode buffers in memory and allow optimisation of inode cluster writeback at the xfsbufd level where we have much greater queue depths than the block layer elevators. We will also get adjacent inode cluster buffer IO merging for free when a later patch in the series allows sorting of the delayed write buffers before dispatch. This effectively means that any inode that is written back by background writeback will be seen as flush locked during AIL pushing, and will result in the buffers being pushed from there. This writeback path is currently non-optimal, but the next patch in the series will fix that problem. A side effect of this delayed write mechanism is that background inode reclaim will no longer directly flush inodes, nor can it wait on the flush lock. The result is that inode reclaim must leave the inode in the reclaimable state until it is clean. Hence attempts to reclaim a dirty inode in the background will simply skip the inode until it is clean and this allows other mechanisms (i.e. xfsbufd) to do more optimal writeback of the dirty buffers. As a result, the inode reclaim code has been rewritten so that it no longer relies on the ambiguous return values of xfs_iflush() to determine whether it is safe to reclaim an inode. Portions of this patch are derived from patches by Christoph Hellwig. Version 2: - cleanup reclaim code as suggested by Christoph - log background reclaim inode flush errors - just pass sync flags to xfs_iflush Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 777df5afdb26c71634edd60582be620ff94e87a0 Author: Dave Chinner Date: Sat Feb 6 12:37:26 2010 +1100 xfs: Make inode reclaim states explicit A.K.A.: don't rely on xfs_iflush() return value in reclaim We have gradually been moving checks out of the reclaim code because they are duplicated in xfs_iflush(). We've had a history of problems in this area, and many of them stem from the overloading of the return values from xfs_iflush() and interaction with inode flush locking to determine if the inode is safe to reclaim. With the desire to move to delayed write flushing of inodes and non-blocking inode tree reclaim walks, the overloading of the return value of xfs_iflush makes it very difficult to determine the correct thing to do next. This patch explicitly re-adds the checks to the inode reclaim code, removing the reliance on the return value of xfs_iflush() to determine what to do next. It also means that we can clearly document all the inode states that reclaim must handle and hence we can easily see that we handled all the necessary cases. This also removes the need for the xfs_inode_clean() check in xfs_iflush() as all callers now check this first (safely). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit d5db0f97fbbeff11c88dec1aaf1536a975afbaeb Author: Eric Sandeen Date: Fri Feb 5 22:59:53 2010 +0000 xfs: more reserved blocks fixups This mangles the reserved blocks counts a little more. 1) add a helper function for the default reserved count 2) add helper functions to save/restore counts on ro/rw 3) save/restore reserved blocks on freeze/thaw 4) disallow changing reserved count while readonly V2: changed field name to match Dave's changes Signed-off-by: Eric Sandeen Signed-off-by: Alex Elder commit 388f1f0c346b533b06d8bc792f7204ebc3e4b7da Author: Dave Chinner Date: Tue Jan 26 15:10:15 2010 +1100 xfs: turn off sign warnings Because they cause warnings in static inline functions conditionally compiled into XFS from the VFS (e.g. fsnotify). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit cbe132a8bdcff0f9afd9060948fb50597c7400b8 Author: Dave Chinner Date: Tue Jan 26 15:08:49 2010 +1100 xfs: don't hold onto reserved blocks on remount,ro If we hold onto reserved blocks when doing a remount,ro we end up writing the blocks used count to disk that includes the reserved blocks. Reserved blocks are not actually used, so this results in the values in the superblock being incorrect. Hence if we run xfs_check or xfs_repair -n while the filesystem is mounted remount,ro we end up with an inconsistent filesystem being reported. Also, running xfs_copy on the remount,ro filesystem will result in an inconsistent image being generated. To fix this, unreserve the blocks when doing the remount,ro, and reserved them again on remount,rw. This way a remount,ro filesystem will appear consistent on disk to all utilities. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 9b00f30762fe9f914eb6e03057a616ed63a4e8ca Author: Christoph Hellwig Date: Thu Jan 21 11:17:20 2010 +0000 xfs: quota limit statvfs available blocks A "df" run on an NFS client of an exported XFS file system reports the wrong information for "available" blocks. When a block quota is enforced, the amount reported as free is limited by the quota, but the amount reported available is not (and should be). Reported-by: Guk-Bong, Kwon Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit bdfb04301fa5fdd95f219539a9a5b9663b1e5fc2 Author: Christoph Hellwig Date: Wed Jan 20 21:55:30 2010 +0000 xfs: replace KM_LARGE with explicit vmalloc use We use the KM_LARGE flag to make kmem_alloc and friends use vmalloc if necessary. As we only need this for a few boot/mount time allocations just switch to explicit vmalloc calls there. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit a14a348bff2f99471a28e5928eb6801224c053d8 Author: Christoph Hellwig Date: Tue Jan 19 09:56:46 2010 +0000 xfs: cleanup up xfs_log_force calling conventions Remove the XFS_LOG_FORCE argument which was always set, and the XFS_LOG_URGE define, which was never used. Split xfs_log_force into a two helpers - xfs_log_force which forces the whole log, and xfs_log_force_lsn which forces up to the specified LSN. The underlying implementations already were entirely separate, as were the users. Also re-indent the new _xfs_log_force/_xfs_log_force which previously had a weird coding style. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit 4139b3b337cffd106744386c842b89dc86e31d4b Author: Christoph Hellwig Date: Tue Jan 19 09:56:45 2010 +0000 xfs: kill XLOG_VEC_SET_TYPE This macro only obsfucates the log item type assignments, so kill it. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 0cadda1c5f194f98a05d252ff4385d86d2ed0862 Author: Christoph Hellwig Date: Tue Jan 19 09:56:44 2010 +0000 xfs: remove duplicate buffer flags Currently we define aliases for the buffer flags in various namespaces, which only adds confusion. Remove all but the XBF_ flags to clean this up a bit. Note that we still abuse XFS_B_ASYNC/XBF_ASYNC for some non-buffer uses, but I'll clean that up later. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit a210c1aa7f6c90b729cc3a72d03e789b13cb6c47 Author: Christoph Hellwig Date: Sun Jan 17 22:36:19 2010 +0000 xfs: implement quota warnings via netlink Wire up quota_send_warning to send quota warnings over netlink. This is used by various desktops to show user quota warnings. Tested by running the quota_nld daemon while running the xfstest quota tests and observing the warnings. I'll see how I can get a more formal testcase for it written. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 4d1f88d75b00c4d23f4c51305ab5b779a86ef74e Author: Christoph Hellwig Date: Wed Jan 13 22:05:49 2010 +0000 xfs: clean up error handling in xfs_trans_dqresv Move the error code selection after the goto label and fold the xfs_quota_error helper into it. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 512dd1abd9539a474f2792eeaf6783c59ad7778a Author: Christoph Hellwig Date: Wed Jan 13 22:05:48 2010 +0000 xfs: kill XFS_QMOPT_ASYNC The option is unused and one of the few remaining users of xfs_bawrite, so let's get rid of it. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 587aa0feb74ffe3239b5e26ff5d017ba9f5daec9 Author: Dave Chinner Date: Wed Jan 20 12:04:53 2010 +1100 xfs: rearrange xfs_mod_sb() to avoid array subscript warning gcc warns of an array subscript out of bounds in xfs_mod_sb(). The code is written in such a way that if the array subscript is out of bounds, then it will assert fail. Rearrange the code to avoid the bounds check warning. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit f0a0eaa8da08ebc6519cacd731df05bbb4ca47ce Author: Dave Chinner Date: Wed Jan 20 10:50:06 2010 +1100 xfs: suppress spurious uninitialised var warning in xfs_bmapi() Initialise the xfs_bmalloca_t structure to zero to avoid uninitialised variable warnings. This is done by zeroing the arg structure rather than using the uninitialised_var() trick so we know for certain that the structure is correctly initialised as xfs_bmapi is a very complex function and it is difficult to prove warnings are spurious. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 58c75cfb51393a52b45262394c1fa81514b4d9bd Author: Dave Chinner Date: Wed Jan 20 10:49:18 2010 +1100 xfs: make compile warn about char sign mismatches again The -fno-unsigned-char directive has no effect anymore as the XFs build is clean. However, the kernel build hides pointer sign differences so turn that back on so that we can clean up all the mismatches prior to a userspace code resync. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 4a24cb71407dc25035d75dd3d118e0e55679e217 Author: Dave Chinner Date: Wed Jan 20 10:48:05 2010 +1100 xfs: clean up sign warnings in dir2 code We are now consistently using unsigned char strings for names so fix up the remaining warnings in the dir2 code to complete the cleanup. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit a9273ca5c6814f393e18ed66645f817b2b71e9ad Author: Dave Chinner Date: Wed Jan 20 10:47:48 2010 +1100 xfs: convert attr to use unsigned names To be consistent with the directory code, the attr code should use unsigned names. Convert the names from the vfs at the highest level to unsigned, and ænsure they are consistenly used as unsigned down to disk. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit b9c48649577dfc4a8c263c106d518effa24ea54b Author: Dave Chinner Date: Wed Jan 20 10:47:39 2010 +1100 xfs: xfs_buf_iomove() doesn't care about signedness xfs_buf_iomove() uses xfs_caddr_t as it's parameter types, but it doesn't care about the signedness of the variables as it is just copying the data. Change the prototype to use void * so that we don't get sign warnings at call sites. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit a3380ae39fa321282c407ba5e1835e14b64853d9 Author: Dave Chinner Date: Wed Jan 20 10:47:25 2010 +1100 xfs: make xfs_dir_cilookup_result use unsigned char For consistency with the result of the code. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 2bc754213d40d67c39ddd58cf240f2b948e1951e Author: Dave Chinner Date: Wed Jan 20 10:47:17 2010 +1100 xfs: convert dirnameops to unsigned char names To be consistent across the codebase, convert the dirnameops to pass the directory names by unsigned char strings. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 046ea753130fc51d885835458bf8c1d84765b9ac Author: Dave Chinner Date: Wed Jan 20 10:47:08 2010 +1100 xfs: convert DM ops to use unsigned char names dmops uses a signed char for it's namespace event. To be consistent with the rest of the code, convert them to unsigned char for the namespace string. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit e2bcd936eb95d0019ca5e05f9fdd27e770ddded1 Author: Dave Chinner Date: Wed Jan 20 10:44:58 2010 +1100 xfs: directory names are unsigned Convert the struct xfs_name to use unsigned chars for the name strings to match both what is stored on disk (__uint8_t) and what the VFS expects (unsigned char). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 4e23471a3f3aba885ea70100db47ccacb5f069f6 Author: Christoph Hellwig Date: Wed Jan 13 22:17:56 2010 +0000 xfs: move more buffer helpers into xfs_buf.c Move xfsbdstrat and xfs_bdstrat_cb from xfs_lrw.c and xfs_bioerror and xfs_bioerror_relse from xfs_rw.c into xfs_buf.c. This also means xfs_bioerror and xfs_bioerror_relse can be marked static now. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit 64e0bc7d2a6609ad265757a600e2a0d93c8adb47 Author: Christoph Hellwig Date: Wed Jan 13 22:17:58 2010 +0000 xfs: clean up xfs_bwrite Fold XFS_bwrite into it's only caller, xfs_bwrite and move it into xfs_buf.c instead of leaving it as a fairly large inline function. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit 873ff5501d8cd1a21045d6c1da34f0c3876bc235 Author: Christoph Hellwig Date: Wed Jan 13 22:17:57 2010 +0000 xfs: clean up log buffer writes Don't bother using XFS_bwrite as it doesn't provide much code for our use case. Instead opencode it and fold xlog_bdstrat_cb into the new xlog_bdstrat helper. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit e57336ff7fc7520bec7b3a7741043bdebaf622ea Author: Dave Chinner Date: Mon Jan 11 11:47:49 2010 +0000 xfs: embed the pagb_list array in the perag structure Now that the perag structure is allocated memory rather than held in an array, we don't need to have the busy extent array external to the structure. Embed it into the perag structure to avoid needing an extra allocation when setting up. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 8b26c5825e023b1bccac7afd174ebe55b8905cb1 Author: Dave Chinner Date: Mon Jan 11 11:47:48 2010 +0000 xfs: handle ENOMEM correctly during initialisation of perag structures Add proper error handling in case an error occurs while initializing new perag structures for a mount point. The mount structure is restored to its previous state by deleting and freeing any perag structures added during the call. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit b657fc82a3ca6d7ad16a59e81765f0fb0e86cdbb Author: Dave Chinner Date: Mon Jan 11 11:47:47 2010 +0000 xfs: Kill filestreams cache flush The filestreams cache flush is not needed in the sync code as it does not affect data writeback, and it is now not used by the growfs code, either, so kill it. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 0fa800fbd549736dfdc1d7761f87e33dc8cd973b Author: Dave Chinner Date: Mon Jan 11 11:47:46 2010 +0000 xfs: Add trace points for per-ag refcount debugging. Uninline xfs_perag_{get,put} so that tracepoints can be inserted into them to speed debugging of reference count problems. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit aed3bb90abaf0b42e8c8747e192f7bb97f445279 Author: Dave Chinner Date: Mon Jan 11 11:47:45 2010 +0000 xfs: Reference count per-ag structures Reference count the per-ag structures to ensure that we keep get/put pairs balanced. Assert that the reference counts are zero at unmount time to catch leaks. In future, reference counts will enable us to safely remove perag structures by allowing us to detect when they are no longer in use. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 1c1c6ebcf5284aee4910f3b906ac90c20e510c82 Author: Dave Chinner Date: Mon Jan 11 11:47:44 2010 +0000 xfs: Replace per-ag array with a radix tree The use of an array for the per-ag structures requires reallocation of the array when growing the filesystem. This requires locking access to the array to avoid use after free situations, and the locking is difficult to get right. To avoid needing to reallocate an array, change the per-ag structures to an allocated object per ag and index them using a tree structure. The AGs are always densely indexed (hence the use of an array), but the number supported is 2^32 and lookups tend to be random and hence indexing needs to scale. A simple choice is a radix tree - it works well with this sort of index. This change also removes another large contiguous allocation from the mount/growfs path in XFS. The growing process now needs to change to only initialise the new AGs required for the extra space, and as such only needs to exclusively lock the tree for inserts. The rest of the code only needs to lock the tree while doing lookups, and hence this will remove all the deadlocks that currently occur on the m_perag_lock as it is now an innermost lock. The lock is also changed to a spinlock from a read/write lock as the hold time is now extremely short. To complete the picture, the per-ag structures will need to be reference counted to ensure that we don't free/modify them while they are still in use. This will be done in subsequent patch. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 44b56e0a1aed522a10051645e85d300e10926fd3 Author: Dave Chinner Date: Mon Jan 11 11:47:43 2010 +0000 xfs: convert remaining direct references to m_perag Convert the remaining direct lookups of the per ag structures to use get/put accesses. Ensure that the loops across AGs and prior users of the interface balance gets and puts correctly. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 4196ac08c023c6dab90c3fa460d9c06deaa304c4 Author: Dave Chinner Date: Mon Jan 11 11:47:42 2010 +0000 xfs: Convert filestreams code to use per-ag get/put routines Use xfs_perag_get() and xfs_perag_put() in the filestreams code. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit a862e0fdcb8862aab2538ec2fc2f0dc07a625c59 Author: Dave Chinner Date: Mon Jan 11 11:47:41 2010 +0000 xfs: Don't directly reference m_perag in allocation code Start abstracting the perag references so that the indexing of the structures is not directly coded into all the places that uses the perag structures. This will allow us to separate the use of the perag structure and the way it is indexed and hence avoid the known deadlocks related to growing a busy filesystem. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 5017e97d52628fb8ae56e434e86ac2e72ddaac2b Author: Dave Chinner Date: Mon Jan 11 11:47:40 2010 +0000 xfs: rename xfs_get_perag xfs_get_perag is really getting the perag that an inode belongs to based on it's inode number. Convert the use of this function to just get the perag from a provided ag number. Use this new function to obtain the per-ag structure when traversing the per AG inode trees for sync and reclaim. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit c9c129714e71c890bed1bd5b61697a896c3c2d54 Author: Dave Chinner Date: Mon Jan 11 11:49:59 2010 +0000 xfs: Don't wake xfsbufd when idle The xfsbufd wakes every xfsbufd_centisecs (once per second by default) for each filesystem even when the filesystem is idle. If the xfsbufd has nothing to do, put it into a long term sleep and only wake it up when there is work pending (i.e. dirty buffers to flush soon). This will make laptop power misers happy. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 453eac8a9aa417878a38bdfbccafd5f7ce4e8e4e Author: Dave Chinner Date: Mon Jan 11 11:49:58 2010 +0000 xfs: Don't wake the aild once per second Now that the AIL push algorithm is traversal safe, we don't need a watchdog function in the xfsaild to catch pushes that fail to make progress. Remove the watchdog timeout and make pushes purely driven by demand. This will remove the once-per-second wakeup that is seen when the filesystem is idle and make laptop power misers happy. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit f0a7695380efa31cd281730917f7e907a724d5cb Author: Dave Chinner Date: Mon Jan 11 11:49:57 2010 +0000 xfs: Use list_heads for log recovery item lists Remove the roll-your-own linked list operations. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 5d77c0dc0c05c2c65aee16149fae06831a118730 Author: Eric Sandeen Date: Thu Nov 19 15:52:00 2009 +0000 xfs: make several more functions static Just minor housekeeping, a lot more functions can be trivially made static; others could if we reordered things a bit... Signed-off-by: Eric Sandeen Signed-off-by: Alex Elder commit 6bded0f383fd7971b76ad6c194dda7d5b814b871 Author: Dave Chinner Date: Thu Jan 14 01:33:56 2010 +0000 xfs: clean up inconsistent variable naming in xfs_swap_extent The swap extent ioctl passes in a target inode and a temporary inode which are clearly named in the ioctl structure. The code then assigns temp to target and vice versa, making it extremely difficult to work out which inode is which later in the code. Make this consistent throughout the code. Also make xfs_swap_extent static as there are no external users of the function. Signed-off-by: Dave Chinner Signed-off-by: Alex Elder commit 3a85cd96d3ab3c6dcf88b81fc6eaddb84e565a43 Author: Dave Chinner Date: Thu Jan 14 01:33:55 2010 +0000 xfs: add tracing to xfs_swap_extents To be able to diagnose whether the swap extents function is detecting compatible inode data fork configurations for swapping extents, add tracing points to the code to allow us to see the format of the inode forks before and after the swap. Signed-off-by: Dave Chinner Signed-off-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/Makefile | 2 +- fs/xfs/linux-2.6/kmem.c | 56 ++---- fs/xfs/linux-2.6/kmem.h | 21 ++- fs/xfs/linux-2.6/xfs_acl.c | 11 +- fs/xfs/linux-2.6/xfs_buf.c | 290 +++++++++++++++++++++++++----- fs/xfs/linux-2.6/xfs_buf.h | 52 ++---- fs/xfs/linux-2.6/xfs_fs_subr.c | 2 +- fs/xfs/linux-2.6/xfs_ioctl.c | 21 ++- fs/xfs/linux-2.6/xfs_ioctl.h | 12 +- fs/xfs/linux-2.6/xfs_ioctl32.c | 4 +- fs/xfs/linux-2.6/xfs_iops.c | 4 +- fs/xfs/linux-2.6/xfs_lrw.c | 62 +------ fs/xfs/linux-2.6/xfs_lrw.h | 3 - fs/xfs/linux-2.6/xfs_super.c | 169 ++++++++++++++---- fs/xfs/linux-2.6/xfs_sync.c | 186 ++++++++++++++------ fs/xfs/linux-2.6/xfs_sync.h | 1 - fs/xfs/linux-2.6/xfs_trace.h | 81 +++++++++ fs/xfs/linux-2.6/xfs_xattr.c | 27 ++- fs/xfs/quota/xfs_dquot.c | 47 ++--- fs/xfs/quota/xfs_dquot_item.c | 99 ++--------- fs/xfs/quota/xfs_dquot_item.h | 4 - fs/xfs/quota/xfs_qm.c | 40 +++-- fs/xfs/quota/xfs_qm_bhv.c | 2 +- fs/xfs/quota/xfs_qm_syscalls.c | 4 +- fs/xfs/quota/xfs_trans_dquot.c | 49 ++++-- fs/xfs/xfs_acl.h | 4 +- fs/xfs/xfs_ag.h | 16 +- fs/xfs/xfs_alloc.c | 96 +++++----- fs/xfs/xfs_alloc_btree.c | 9 +- fs/xfs/xfs_attr.c | 52 +++--- fs/xfs/xfs_attr.h | 3 +- fs/xfs/xfs_attr_leaf.c | 30 ++-- fs/xfs/xfs_attr_sf.h | 2 +- fs/xfs/xfs_bmap.c | 17 +- fs/xfs/xfs_bmap_btree.c | 2 +- fs/xfs/xfs_bmap_btree.h | 1 - fs/xfs/xfs_btree.c | 4 +- fs/xfs/xfs_buf_item.c | 72 ++++---- fs/xfs/xfs_da_btree.c | 4 +- fs/xfs/xfs_da_btree.h | 5 +- fs/xfs/xfs_dfrag.c | 43 +++-- fs/xfs/xfs_dfrag.h | 3 - fs/xfs/xfs_dir2.c | 8 +- fs/xfs/xfs_dir2.h | 4 +- fs/xfs/xfs_dir2_block.c | 9 +- fs/xfs/xfs_dir2_leaf.c | 2 +- fs/xfs/xfs_dir2_node.c | 2 +- fs/xfs/xfs_dir2_node.h | 2 - fs/xfs/xfs_dir2_sf.c | 2 +- fs/xfs/xfs_extfree_item.c | 4 +- fs/xfs/xfs_filestream.c | 42 ++--- fs/xfs/xfs_filestream.h | 28 +++- fs/xfs/xfs_fsops.c | 42 +++--- fs/xfs/xfs_ialloc.c | 62 +++---- fs/xfs/xfs_iget.c | 10 +- fs/xfs/xfs_inode.c | 126 +++---------- fs/xfs/xfs_inode.h | 11 +- fs/xfs/xfs_inode_item.c | 129 ++++---------- fs/xfs/xfs_inode_item.h | 6 - fs/xfs/xfs_itable.c | 12 +- fs/xfs/xfs_log.c | 383 ++++++++++++++++++++-------------------- fs/xfs/xfs_log.h | 19 +-- fs/xfs/xfs_log_priv.h | 5 - fs/xfs/xfs_log_recover.c | 222 ++++++++--------------- fs/xfs/xfs_log_recover.h | 23 ++-- fs/xfs/xfs_mount.c | 183 +++++++++++++++---- fs/xfs/xfs_mount.h | 27 ++-- fs/xfs/xfs_mru_cache.c | 2 +- fs/xfs/xfs_mru_cache.h | 1 - fs/xfs/xfs_quota.h | 9 +- fs/xfs/xfs_rw.c | 155 ---------------- fs/xfs/xfs_rw.h | 4 - fs/xfs/xfs_trans.c | 7 +- fs/xfs/xfs_trans.h | 3 +- fs/xfs/xfs_trans_ail.c | 34 ++-- fs/xfs/xfs_trans_buf.c | 27 ++-- fs/xfs/xfs_types.h | 4 +- fs/xfs/xfs_vnodeops.c | 33 ++-- fs/xfs/xfs_vnodeops.h | 10 +- 79 files changed, 1667 insertions(+), 1597 deletions(-) hooks/post-receive -- XFS development tree From aelder@sgi.com Fri Feb 26 15:33:18 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.4 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_72 autolearn=no version=3.3.0-rupdated 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 o1QLXH6p211008 for ; Fri, 26 Feb 2010 15:33:17 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id E7FFEAC049; Fri, 26 Feb 2010 13:34:38 -0800 (PST) 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 o1QLYcCP000309; Fri, 26 Feb 2010 15:34:38 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o1QLYbcp000308; Fri, 26 Feb 2010 15:34:37 -0600 From: Alex Elder Message-Id: <201002262134.o1QLYbcp000308@stout.americas.sgi.com> Date: Fri, 26 Feb 2010 15:34:37 -0600 To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update for 2.6.34-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 am planning on an additional (smaller) pull request for 2.6.34-rc1 early next week. -Alex The following changes since commit 60b341b778cc2929df16c0a504c91621b3c6a4ad: Linus Torvalds (1): Linux 2.6.33 are available in the git repository at: git://oss.sgi.com/xfs/xfs for-linus Alex Elder (1): Merge branch 'linux-2.6.33' Christoph Hellwig (15): xfs: clean up log buffer writes xfs: clean up xfs_bwrite xfs: move more buffer helpers into xfs_buf.c xfs: kill XFS_QMOPT_ASYNC xfs: clean up error handling in xfs_trans_dqresv xfs: implement quota warnings via netlink xfs: remove duplicate buffer flags xfs: kill XLOG_VEC_SET_TYPE xfs: cleanup up xfs_log_force calling conventions xfs: replace KM_LARGE with explicit vmalloc use xfs: quota limit statvfs available blocks xfs: remove invalid barrier optimization from xfs_fsync xfs: log changed inodes instead of writing them synchronously xfs: only clear the suid bit once in xfs_write xfs: optimize log flushing in xfs_fsync Dave Chinner (34): xfs: add tracing to xfs_swap_extents xfs: clean up inconsistent variable naming in xfs_swap_extent xfs: Use list_heads for log recovery item lists xfs: Don't wake the aild once per second xfs: Don't wake xfsbufd when idle xfs: rename xfs_get_perag xfs: Don't directly reference m_perag in allocation code xfs: Convert filestreams code to use per-ag get/put routines xfs: convert remaining direct references to m_perag xfs: Replace per-ag array with a radix tree xfs: Reference count per-ag structures xfs: Add trace points for per-ag refcount debugging. xfs: Kill filestreams cache flush xfs: handle ENOMEM correctly during initialisation of perag structures xfs: embed the pagb_list array in the perag structure xfs: directory names are unsigned xfs: convert DM ops to use unsigned char names xfs: convert dirnameops to unsigned char names xfs: make xfs_dir_cilookup_result use unsigned char xfs: xfs_buf_iomove() doesn't care about signedness xfs: convert attr to use unsigned names xfs: clean up sign warnings in dir2 code xfs: make compile warn about char sign mismatches again xfs: suppress spurious uninitialised var warning in xfs_bmapi() xfs: rearrange xfs_mod_sb() to avoid array subscript warning xfs: don't hold onto reserved blocks on remount,ro xfs: turn off sign warnings xfs: Make inode reclaim states explicit xfs: Use delayed write for inodes rather than async V2 xfs: Don't issue buffer IO direct from AIL push V2 xfs: Sort delayed write buffers before dispatch xfs: Use delay write promotion for dquot flushing xfs: kill the unused XFS_QMOPT_* flush flags V2 xfs: kill xfs_bawrite Eric Sandeen (2): xfs: make several more functions static xfs: more reserved blocks fixups Julia Lawall (1): fs/xfs: Correct NULL test fs/xfs/Makefile | 2 +- fs/xfs/linux-2.6/kmem.c | 56 ++---- fs/xfs/linux-2.6/kmem.h | 21 ++- fs/xfs/linux-2.6/xfs_acl.c | 11 +- fs/xfs/linux-2.6/xfs_buf.c | 290 +++++++++++++++++++++++++----- fs/xfs/linux-2.6/xfs_buf.h | 52 ++---- fs/xfs/linux-2.6/xfs_fs_subr.c | 2 +- fs/xfs/linux-2.6/xfs_ioctl.c | 21 ++- fs/xfs/linux-2.6/xfs_ioctl.h | 12 +- fs/xfs/linux-2.6/xfs_ioctl32.c | 4 +- fs/xfs/linux-2.6/xfs_iops.c | 4 +- fs/xfs/linux-2.6/xfs_lrw.c | 62 +------ fs/xfs/linux-2.6/xfs_lrw.h | 3 - fs/xfs/linux-2.6/xfs_super.c | 169 ++++++++++++++---- fs/xfs/linux-2.6/xfs_sync.c | 186 ++++++++++++++------ fs/xfs/linux-2.6/xfs_sync.h | 1 - fs/xfs/linux-2.6/xfs_trace.h | 81 +++++++++ fs/xfs/linux-2.6/xfs_xattr.c | 27 ++- fs/xfs/quota/xfs_dquot.c | 47 ++--- fs/xfs/quota/xfs_dquot_item.c | 99 ++--------- fs/xfs/quota/xfs_dquot_item.h | 4 - fs/xfs/quota/xfs_qm.c | 40 +++-- fs/xfs/quota/xfs_qm_bhv.c | 2 +- fs/xfs/quota/xfs_qm_syscalls.c | 4 +- fs/xfs/quota/xfs_trans_dquot.c | 49 ++++-- fs/xfs/xfs_acl.h | 4 +- fs/xfs/xfs_ag.h | 16 +- fs/xfs/xfs_alloc.c | 96 +++++----- fs/xfs/xfs_alloc_btree.c | 9 +- fs/xfs/xfs_attr.c | 52 +++--- fs/xfs/xfs_attr.h | 3 +- fs/xfs/xfs_attr_leaf.c | 30 ++-- fs/xfs/xfs_attr_sf.h | 2 +- fs/xfs/xfs_bmap.c | 17 +- fs/xfs/xfs_bmap_btree.c | 2 +- fs/xfs/xfs_bmap_btree.h | 1 - fs/xfs/xfs_btree.c | 4 +- fs/xfs/xfs_buf_item.c | 72 ++++---- fs/xfs/xfs_da_btree.c | 4 +- fs/xfs/xfs_da_btree.h | 5 +- fs/xfs/xfs_dfrag.c | 43 +++-- fs/xfs/xfs_dfrag.h | 3 - fs/xfs/xfs_dir2.c | 8 +- fs/xfs/xfs_dir2.h | 4 +- fs/xfs/xfs_dir2_block.c | 9 +- fs/xfs/xfs_dir2_leaf.c | 2 +- fs/xfs/xfs_dir2_node.c | 2 +- fs/xfs/xfs_dir2_node.h | 2 - fs/xfs/xfs_dir2_sf.c | 2 +- fs/xfs/xfs_extfree_item.c | 4 +- fs/xfs/xfs_filestream.c | 42 ++--- fs/xfs/xfs_filestream.h | 28 +++- fs/xfs/xfs_fsops.c | 42 +++--- fs/xfs/xfs_ialloc.c | 62 +++---- fs/xfs/xfs_iget.c | 10 +- fs/xfs/xfs_inode.c | 126 +++---------- fs/xfs/xfs_inode.h | 11 +- fs/xfs/xfs_inode_item.c | 129 ++++---------- fs/xfs/xfs_inode_item.h | 6 - fs/xfs/xfs_itable.c | 12 +- fs/xfs/xfs_log.c | 383 ++++++++++++++++++++-------------------- fs/xfs/xfs_log.h | 19 +-- fs/xfs/xfs_log_priv.h | 5 - fs/xfs/xfs_log_recover.c | 222 ++++++++--------------- fs/xfs/xfs_log_recover.h | 23 ++-- fs/xfs/xfs_mount.c | 183 +++++++++++++++---- fs/xfs/xfs_mount.h | 27 ++-- fs/xfs/xfs_mru_cache.c | 2 +- fs/xfs/xfs_mru_cache.h | 1 - fs/xfs/xfs_quota.h | 9 +- fs/xfs/xfs_rw.c | 155 ---------------- fs/xfs/xfs_rw.h | 4 - fs/xfs/xfs_trans.c | 7 +- fs/xfs/xfs_trans.h | 3 +- fs/xfs/xfs_trans_ail.c | 34 ++-- fs/xfs/xfs_trans_buf.c | 27 ++-- fs/xfs/xfs_types.h | 4 +- fs/xfs/xfs_vnodeops.c | 33 ++-- fs/xfs/xfs_vnodeops.h | 10 +- 79 files changed, 1667 insertions(+), 1597 deletions(-) From jpiszcz@lucidpixels.com Fri Feb 26 19:04:18 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_24,J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated 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 o1R14IJ2223590 for ; Fri, 26 Feb 2010 19:04:18 -0600 X-ASG-Debug-ID: 1267232740-117402cb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 957311D02071 for ; Fri, 26 Feb 2010 17:05:40 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id 1bXHzXvgvbBLEL9D for ; Fri, 26 Feb 2010 17:05:40 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 4309B4E21B7; Fri, 26 Feb 2010 20:05:40 -0500 (EST) Date: Fri, 26 Feb 2010 20:05:40 -0500 (EST) From: Justin Piszcz To: Dmitry Monakhov cc: "linux-ext4@vger.kernel.org" , "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, Alan Piszcz X-ASG-Orig-Subj: Re: EXT4 is ~2X as slow as XFS (593MB/s vs 304MB/s) for writes? Subject: Re: EXT4 is ~2X as slow as XFS (593MB/s vs 304MB/s) for writes? In-Reply-To: <87zl2vsdxs.fsf@openvz.org> Message-ID: References: <87zl2vsdxs.fsf@openvz.org> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1267232742 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23540 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, 27 Feb 2010, Dmitry Monakhov wrote: > Justin Piszcz writes: > >> Hello, >> >> Is it possible to 'optimize' ext4 so it is as fast as XFS for writes? >> I see about half the performance as XFS for sequential writes. >> >> I have checked the doc and tried several options, a few of which are shown >> below (I have also tried the commit/journal_async/etc options but none of >> them get the write speeds anywhere near XFS)? >> >> Sure 'dd' is not a real benchmark, etc, etc, but with 10Gbps between 2 >> hosts I get 550MiB/s+ on reads from EXT4 but only 100-200MiB/s write. >> >> When it was XFS I used to get 400-600MiB/s for writes for the same RAID >> volume. >> >> How do I 'speed' up ext4? Is it possible? > I don't know how to speedup, but i do know how to slowdown XFS :) > Seems that you forget to call fsync at the end of file write > In this case some data may reside in memory cache. > Please add "conv=fsync" or "conv=fdatasync" to the dd cmd. > And redone your measurements. Hi, First with a sync added in the total time (still 2x as fast) EXT3: p63:~# mount /dev/md0 -o nobarrier,data=writeback /r1 p63:~# cd /r1 p63:/r1# /usr/bin/time bash -c 'dd if=/dev/zero of=file bs=1M count=10240; sync' 10240+0 records in 10240+0 records out 10737418240 bytes (11 GB) copied, 35.4163 s, 303 MB/s 0.02user 19.85system 0:36.97elapsed 53%CPU (0avgtext+0avgdata 7296maxresident)k 0inputs+0outputs (5major+1145minor)pagefaults 0swaps XFS: p63:/r1# /usr/bin/time bash -c 'dd if=/dev/zero of=file bs=1M count=10240; sync' 10240+0 records in 10240+0 records out 10737418240 bytes (11 GB) copied, 18.08 s, 594 MB/s 0.03user 16.15system 0:18.67elapsed 86%CPU (0avgtext+0avgdata 7312maxresident)k 0inputs+0outputs (5major+1147minor)pagefaults 0swaps p63:/r1# Per your request: conv=fsync & conv=fdatasync XFS: p63:/r1# /usr/bin/time bash -c 'dd if=/dev/zero of=file bs=1M conv=fsync count=10240' 10240+0 records in 10240+0 records out 10737418240 bytes (11 GB) copied, 18.2142 s, 590 MB/s 0.03user 16.05system 0:18.21elapsed 88%CPU (0avgtext+0avgdata 7312maxresident)k 0inputs+0outputs (0major+832minor)pagefaults 0swaps p63:/r1# EXT3: p63:/r1# /usr/bin/time bash -c 'dd if=/dev/zero of=file bs=1M conv=fdatasync count=10240' 10240+0 records in 10240+0 records out 10737418240 bytes (11 GB) copied, 39.5562 s, 271 MB/s XFS: p63:/r1# /usr/bin/time bash -c 'dd if=/dev/zero of=file bs=1M conv=fdatasync count=10240' 10240+0 records in 10240+0 records out 10737418240 bytes (11 GB) copied, 18.513 s, 580 MB/s 0.03user 16.25system 0:18.51elapsed 87%CPU (0avgtext+0avgdata 7312maxresident)k 0inputs+0outputs (5major+828minor)pagefaults 0swaps p63:/r1# p63:/r1# /usr/bin/time bash -c 'dd if=/dev/zero of=file bs=1M conv=fsync count=10240' 10240+0 records in 10240+0 records out 10737418240 bytes (11 GB) copied, 39.7859 s, 270 MB/s 0.02user 24.20system 0:39.79elapsed 60%CPU (0avgtext+0avgdata 7328maxresident)k 0inputs+0outputs (5major+829minor)pagefaults 0swaps p63:/r1# It is still 2x as fast? Is there some other option I am missing here or is this correct? Justin. From jpiszcz@lucidpixels.com Sat Feb 27 05:27:54 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated 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 o1RBRrnQ002980 for ; Sat, 27 Feb 2010 05:27:54 -0600 X-ASG-Debug-ID: 1267270157-51f302840000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7E4851D02AB8 for ; Sat, 27 Feb 2010 03:29:17 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id zJ233LlCU2NTDhvT for ; Sat, 27 Feb 2010 03:29:17 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 8A0EE4E1A38; Sat, 27 Feb 2010 06:29:17 -0500 (EST) Date: Sat, 27 Feb 2010 06:29:17 -0500 (EST) From: Justin Piszcz To: xfs@oss.sgi.com X-ASG-Orig-Subj: Small change for mkfs.xfs? Subject: Small change for mkfs.xfs? Message-ID: User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1267270158 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23571 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, # mkfs.xfs /dev/md0 mkfs.xfs: /dev/md0 appears to contain an existing filesystem (ext3). mkfs.xfs: Use the -f option to force overwrite. This occurs if the filesystem is ext4. Need to differentiate between the two FS if possible? Justin. From linush@mindspring.com Sat Feb 27 16:52:47 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o1RMqktv039216 for ; Sat, 27 Feb 2010 16:52:47 -0600 X-ASG-Debug-ID: 1267311251-3e3202210000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from elasmtp-banded.atl.sa.earthlink.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DE45B1FE78F for ; Sat, 27 Feb 2010 14:54:11 -0800 (PST) Received: from elasmtp-banded.atl.sa.earthlink.net (elasmtp-banded.atl.sa.earthlink.net [209.86.89.70]) by cuda.sgi.com with ESMTP id svHawkgBDi67QoxO for ; Sat, 27 Feb 2010 14:54:11 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=dk20050327; d=mindspring.com; b=BnJoFjeB31y1duIE2a/JD9oAJpNyug8lM9mKl1v9/HuVDiOZdEtieiQnlIWuM5tl; h=Received:Subject:From:To:Content-Type:Date:Message-Id:Mime-Version:X-Mailer:Content-Transfer-Encoding:X-ELNK-Trace:X-Originating-IP; Received: from [98.114.168.230] (helo=[192.168.10.2]) by elasmtp-banded.atl.sa.earthlink.net with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.67) (envelope-from ) id 1NlVY2-0003nd-Qo for xfs@oss.sgi.com; Sat, 27 Feb 2010 17:54:10 -0500 X-ASG-Orig-Subj: Proposed patch for xfsprogs Subject: Proposed patch for xfsprogs From: "C. Linus Hicks" To: xfs@oss.sgi.com Content-Type: text/plain Date: Sat, 27 Feb 2010 17:54:10 -0500 Message-Id: <1267311250.28691.40.camel@lh10.linush.net> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-8.el5_2.3) Content-Transfer-Encoding: 7bit X-ELNK-Trace: 0f508862f5e6e2505e89bb4777695beb00ff6c36d42eb1fa178f5760dd97489425661ff42a2d89d4350badd9bab72f9c350badd9bab72f9c350badd9bab72f9c X-Originating-IP: 98.114.168.230 X-Barracuda-Connect: elasmtp-banded.atl.sa.earthlink.net[209.86.89.70] X-Barracuda-Start-Time: 1267311251 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.23608 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 my recent experience with having to reconstruct parts of an XFS filesystem that got corrupted as a result of several bad blocks, I found that some of the information displayed using "blockget -v" was pretty useless, and I am proposing the following code change to introduce a slight summarization. Repeating lines of "setting block to " and "setting inode to for {,rt}block " will be summarized down to two lines. --- a/xfsprogs-3.1.1/db/check.c 2010-01-29 14:46:13.000000000 -0500 +++ b/xfsprogs-3.1.1/db/check.c 2010-02-27 17:02:14.111418960 -0500 @@ -1509,6 +1509,7 @@ { xfs_extlen_t i; int mayprint; + int isfirst = 1; char *p; if (!check_range(agno, agbno, len)) { @@ -1520,10 +1521,15 @@ mayprint = verbose | blist_size; for (i = 0, p = &dbmap[agno][agbno]; i < len; i++, p++) { *p = (char)type2; - if (mayprint && (verbose || CHECK_BLISTA(agno, agbno + i))) + if (isfirst && mayprint && (verbose || CHECK_BLISTA(agno, agbno + i))) { dbprintf(_("setting block %u/%u to %s\n"), agno, agbno + i, typename[type2]); + isfirst = 0; + } } + if ((len > 1) && mayprint && (verbose || CHECK_BLISTA(agno, agbno + i))) + dbprintf(_(" ... until %u/%u\n"), + agno, agbno + len - 1); } static void @@ -4544,6 +4550,7 @@ { xfs_extlen_t i; inodata_t **idp; + int isfirst = 1; int mayprint; if (!check_inomap(agno, agbno, len, id->ino)) @@ -4551,11 +4558,16 @@ mayprint = verbose | id->ilist | blist_size; for (i = 0, idp = &inomap[agno][agbno]; i < len; i++, idp++) { *idp = id; - if (mayprint && - (verbose || id->ilist || CHECK_BLISTA(agno, agbno + i))) + if (isfirst && mayprint && + (verbose || id->ilist || CHECK_BLISTA(agno, agbno + i))) { dbprintf(_("setting inode to %lld for block %u/%u\n"), id->ino, agno, agbno + i); + isfirst = 0; + } } + if ((len > 1) && mayprint && + (verbose || id->ilist || CHECK_BLISTA(agno, agbno + i))) + dbprintf(_("\t\t ... until %u/%u\n"), agno, agbno + len - 1); } static void @@ -4575,6 +4587,7 @@ { xfs_extlen_t i; inodata_t **idp; + int isfirst = 1; int mayprint; if (!check_rinomap(bno, len, id->ino)) @@ -4584,10 +4597,16 @@ i < len; i++, idp++) { *idp = id; - if (mayprint && (verbose || id->ilist || CHECK_BLIST(bno + i))) + if (isfirst && mayprint && + (verbose || id->ilist || CHECK_BLIST(bno + i))) { dbprintf(_("setting inode to %lld for rtblock %llu\n"), id->ino, bno + i); + isfirst = 0; + } } + if ((len > 1) && mayprint && + (verbose || id->ilist || CHECK_BLIST(bno + i))) + dbprintf(_("\t\t ... until %llu\n"), bno + len - 1); } static void From sandeen@sandeen.net Sun Feb 28 16:36:08 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated 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 o1SMa8WX120336 for ; Sun, 28 Feb 2010 16:36:08 -0600 X-ASG-Debug-ID: 1267396652-24e6005a0000-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 791912013BC for ; Sun, 28 Feb 2010 14:37:32 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id sRCJzrlL5w0BCPbh for ; Sun, 28 Feb 2010 14:37:32 -0800 (PST) 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 624EFAC3592; Sun, 28 Feb 2010 16:37:32 -0600 (CST) Message-ID: <4B8AF02C.3070904@sandeen.net> Date: Sun, 28 Feb 2010 16:37:32 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Justin Piszcz CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Small change for mkfs.xfs? Subject: Re: Small change for mkfs.xfs? 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: 1267396653 X-Barracuda-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.23693 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 Justin Piszcz wrote: > Hi, > > # mkfs.xfs /dev/md0 > mkfs.xfs: /dev/md0 appears to contain an existing filesystem (ext3). > mkfs.xfs: Use the -f option to force overwrite. > > This occurs if the filesystem is ext4. Need to differentiate between > the two FS if possible? Why, you're just overwriting it anyway ;) FWIW, recent xfsprogs built against recent libblkid will detect ext4 correctly. libdisk could be patched if anyone really cared enough but that's deprecated going forward... -Eric > Justin. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From SRS0+9w2/+89+fromorbit.com=david@internode.on.net Sun Feb 28 21:15:27 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated 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 o213FRVu135186 for ; Sun, 28 Feb 2010 21:15:27 -0600 X-ASG-Debug-ID: 1267413410-3fa201ff0000-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 1DAD2202D64 for ; Sun, 28 Feb 2010 19:16:51 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id Efsniohs2iFVYwMd for ; Sun, 28 Feb 2010 19:16:51 -0800 (PST) Received: from discord (unverified [121.44.103.80]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 15506771-1927428 for multiple; Mon, 01 Mar 2010 13:46:49 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1Nlw7e-0000Dg-US; Mon, 01 Mar 2010 14:16:42 +1100 Date: Mon, 1 Mar 2010 14:16:42 +1100 From: Dave Chinner To: "C. Linus Hicks" Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Proposed patch for xfsprogs Subject: Re: Proposed patch for xfsprogs Message-ID: <20100301031642.GG22370@discord.disaster> References: <1267311250.28691.40.camel@lh10.linush.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1267311250.28691.40.camel@lh10.linush.net> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1267413413 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using 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.23711 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, Feb 27, 2010 at 05:54:10PM -0500, C. Linus Hicks wrote: > During my recent experience with having to reconstruct parts of an XFS > filesystem that got corrupted as a result of several bad blocks, I found > that some of the information displayed using "blockget -v" was pretty > useless, and I am proposing the following code change to introduce a > slight summarization. > > Repeating lines of "setting block to " and "setting inode to > for {,rt}block " will be summarized down to two lines. Agreed, that would certainly help reduce the verbosity of the output. However, I don't think the patch is correct. > --- a/xfsprogs-3.1.1/db/check.c 2010-01-29 14:46:13.000000000 -0500 > +++ b/xfsprogs-3.1.1/db/check.c 2010-02-27 17:02:14.111418960 -0500 > @@ -1509,6 +1509,7 @@ > { > xfs_extlen_t i; > int mayprint; > + int isfirst = 1; > char *p; > > if (!check_range(agno, agbno, len)) { > @@ -1520,10 +1521,15 @@ > mayprint = verbose | blist_size; > for (i = 0, p = &dbmap[agno][agbno]; i < len; i++, p++) { > *p = (char)type2; > - if (mayprint && (verbose || CHECK_BLISTA(agno, agbno + i))) > + if (isfirst && mayprint && (verbose || CHECK_BLISTA(agno, agbno + i))) { > dbprintf(_("setting block %u/%u to %s\n"), agno, agbno + i, > typename[type2]); > + isfirst = 0; > + } > } > + if ((len > 1) && mayprint && (verbose || CHECK_BLISTA(agno, agbno + i))) > + dbprintf(_(" ... until %u/%u\n"), > + agno, agbno + len - 1); > } This doesn't take into account that not all blocks in the extent range might be bad and the change is actually doing something. i.e. only is CHECK_BLISTA() evaluating as true is there a printout occurring (unless you specify verbose mode). Hence if only interior portions are being changed or there are multiple ranges being changed, this output won't reflect the errors being detected accurately. The other sections of the patch have the same issue. I think that changing it to something like: int last_print == -1; ..... if (mayprint && (verbose || CHECK_BLISTA(agno, agbno + i))) { if (i > 0 && last_print == i - 1) { last_print = i; continue; } if (last_print != i - 1) { dbprintf(_(" ... until %u/%u\n"), agno, agbno + last_print); last_print == -1; } if (last_print == -1) { dbprintf(_("setting block %u/%u to %s\n"), agno, agbno + i, typename[type2]); last_print = i; } } } if (len > 1 && last_print != -1) dbprintf(_(" ... until %u/%u\n"), agno, agbno + last_print); would do the trick. What do you think? Cheers, Dave. -- Dave Chinner david@fromorbit.com